From 9a816ca7635f95452976d11579dddb04eced60bb Mon Sep 17 00:00:00 2001 From: Kamil Nowinski Date: Tue, 1 Dec 2020 23:03:53 +0000 Subject: [PATCH 1/5] #12 Fixed counting rows query --- Properties/Resources.resx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Properties/Resources.resx b/Properties/Resources.resx index 896e0c6..8a65da7 100644 --- a/Properties/Resources.resx +++ b/Properties/Resources.resx @@ -139,7 +139,7 @@ FROM sys.tables t (NOLOCK) INNER JOIN sys.schemas s (NOLOCK) ON s.schema_id = t.schema_id INNER JOIN sys.partitions p (NOLOCK) ON p.object_id = t.object_id - WHERE t.is_ms_shipped = 0 + WHERE t.is_ms_shipped = 0 and p.index_id <= 1 ) SELECT SchemaName, TableName, SUM(rows) AS RowCnt FROM tbs From b1c8fd149b598f6e9e826cb2a1fb1f83fda424a4 Mon Sep 17 00:00:00 2001 From: Kamil Nowinski Date: Wed, 2 Dec 2020 00:18:50 +0000 Subject: [PATCH 2/5] Added support for Temporal tables #10 --- Properties/AssemblyInfo.cs | 4 ++-- Properties/Resources.Designer.cs | 23 ++++++++++++++++++++++- Properties/Resources.resx | 30 ++++++++++++++++++++++++++++++ ScriptWriter.cs | 21 ++++++++++++++++++--- 4 files changed, 72 insertions(+), 6 deletions(-) diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index 7c186b2..51f3087 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.2.0.0")] -[assembly: AssemblyFileVersion("2.2.0.0")] +[assembly: AssemblyVersion("2.3.0.0")] +[assembly: AssemblyFileVersion("2.3.0.0")] diff --git a/Properties/Resources.Designer.cs b/Properties/Resources.Designer.cs index 2cab982..fa35389 100644 --- a/Properties/Resources.Designer.cs +++ b/Properties/Resources.Designer.cs @@ -120,6 +120,27 @@ internal static string LoadColumnInfo { } } + /// + /// Looks up a localized string similar to DECLARE @Tablename nvarchar(100) = '{0}'; + ///DECLARE @oid BIGINT = ( + ///SELECT o.object_id from sys.objects o + ///INNER JOIN sys.schemas s on s.schema_id = o.schema_id + ///WHERE o.name = parsename(@TableName, 1) and s.name = parsename(@TableName, 2) + ///); + ///WITH cc as ( + /// SELECT c.name as COLUMN_NAME, c.is_identity, c.generated_always_type + /// from sys.objects o + /// INNER JOIN sys.columns c ON c.object_id = o.object_id + /// WHERE o.object_id = @oid + ///) + ///select c.ORDINAL_POSITION, c.COLUMN_NAME, c.DATA_TYPE, co.c [rest of string was truncated]";. + /// + internal static string LoadColumnInfo2016andLater { + get { + return ResourceManager.GetString("LoadColumnInfo2016andLater", resourceCulture); + } + } + /// /// Looks up a localized string similar to ;WITH tbs AS /// ( @@ -129,7 +150,7 @@ internal static string LoadColumnInfo { /// FROM sys.tables t (NOLOCK) /// INNER JOIN sys.schemas s (NOLOCK) ON s.schema_id = t.schema_id /// INNER JOIN sys.partitions p (NOLOCK) ON p.object_id = t.object_id - /// WHERE t.is_ms_shipped = 0 + /// WHERE t.is_ms_shipped = 0 and p.index_id <= 1 /// ) ///SELECT SchemaName, TableName, SUM(rows) AS RowCnt ///FROM tbs diff --git a/Properties/Resources.resx b/Properties/Resources.resx index 8a65da7..ad3c9c9 100644 --- a/Properties/Resources.resx +++ b/Properties/Resources.resx @@ -173,4 +173,34 @@ LEFT JOIN cc ON cc.COLUMN_NAME = c.COLUMN_NAME where c.table_name = parsename(@TableName, 1) and c.table_schema = parsename(@TableName, 2) ; + + DECLARE @Tablename nvarchar(100) = '{0}'; +DECLARE @oid BIGINT = ( +SELECT o.object_id from sys.objects o +INNER JOIN sys.schemas s on s.schema_id = o.schema_id +WHERE o.name = parsename(@TableName, 1) and s.name = parsename(@TableName, 2) +); +WITH cc as ( + SELECT c.name as COLUMN_NAME, c.is_identity, c.generated_always_type + from sys.objects o + INNER JOIN sys.columns c ON c.object_id = o.object_id + WHERE o.object_id = @oid +) +select c.ORDINAL_POSITION, c.COLUMN_NAME, c.DATA_TYPE, co.constraint_type, quotename(c.COLUMN_NAME) as Q_COLUMN_NAME, cc.is_identity, cc.generated_always_type +from information_schema.columns c +LEFT JOIN ( + select tc.TABLE_SCHEMA, tc.TABLE_NAME, kcu.COLUMN_NAME, tc.constraint_type + from information_schema.table_constraints tc + join information_schema.key_column_usage kcu on + tc.table_name = kcu.table_name and + tc.constraint_name = kcu.constraint_name + where tc.table_name = parsename(@TableName, 1) and + tc.table_schema = parsename(@TableName, 2) and + tc.constraint_type = 'PRIMARY KEY' +) as co on co.TABLE_SCHEMA = c.TABLE_SCHEMA and co.TABLE_NAME = c.TABLE_NAME and co.COLUMN_NAME = c.COLUMN_NAME +LEFT JOIN cc ON cc.COLUMN_NAME = c.COLUMN_NAME +where c.table_name = parsename(@TableName, 1) +and c.table_schema = parsename(@TableName, 2) +and cc.generated_always_type = 0 + \ No newline at end of file diff --git a/ScriptWriter.cs b/ScriptWriter.cs index 5cb1ea6..dc9e0ee 100644 --- a/ScriptWriter.cs +++ b/ScriptWriter.cs @@ -21,7 +21,7 @@ public ScriptWriter(CAMOsoft.DbUtils.MsSqlSession db, string outputFolder) { _db = db; _OutputFolder = outputFolder; - string sql = "SELECT @@SPID AS SPID, SUSER_NAME() AS UserName, DB_NAME() AS DbName, @@SERVERNAME AS ServerName;"; + string sql = "SELECT @@SPID AS SPID, SUSER_NAME() AS UserName, DB_NAME() AS DbName, @@SERVERNAME AS ServerName, @@VERSION as ServerVersion;"; _ServerInfoRow = _db.SelectRow(sql); InitTable(); } @@ -88,12 +88,19 @@ private string GetColListWithCastForPK(DataTable dt) private DataTable LoadColumnsInfo(ScriptObject so) { - string sql = Properties.Resources.ResourceManager.GetString("LoadColumnInfo"); + string queryDef = "LoadColumnInfo"; + if (IsSQLServer2016orLater()) queryDef = "LoadColumnInfo2016andLater"; + string sql = Properties.Resources.ResourceManager.GetString(queryDef); sql = sql.Replace("{0}", so.FullName); DataTable dt = _db.SelectTable(sql, "ColumnInfo"); return dt; } + private bool IsSQLServer2016orLater() + { + return (this.ServerVersion.StartsWith("Microsoft SQL Azure") || this.ServerVersion.CompareTo("Microsoft SQL Server 2016") > 0); + } + private StringBuilder SerializeRowValues(DataRow row, DataTable colInfoTable, string prefix, string suffix) { StringBuilder sb = new StringBuilder(); @@ -283,7 +290,7 @@ private void ScriptTableMerge(ScriptObject so, DataTable colInfoTable, DataTable bool useIdentity = hasIdentity(colInfoTable); w.WriteLine(String.Format("IF OBJECT_ID('tempdb.dbo.{0}') IS NOT NULL DROP TABLE {0};", tmpTableName)); - w.WriteLine(String.Format("SELECT * INTO {1} FROM {0} WHERE 0=1;", so.FullQuoted, tmpTableName)); + w.WriteLine(String.Format("SELECT {2} INTO {1} FROM {0} WHERE 0=1;", so.FullQuoted, tmpTableName, colList)); w.WriteLine(_BatchSeparator); if (useIdentity) @@ -439,6 +446,14 @@ public string ServerName } } + public string ServerVersion + { + get + { + return _ServerInfoRow["ServerVersion"].ToString(); + } + } + public DataTable TableList { get From b69c3240ab694c5fc3074100d544d16b9a2c7ad0 Mon Sep 17 00:00:00 2001 From: Kamil Nowinski Date: Wed, 2 Dec 2020 00:32:12 +0000 Subject: [PATCH 3/5] Added SqlServerTypes & updated ChangesLog & ver --- App.config | 2 +- .../CAMOsoft.DbUtils/CAMOsoft.DbUtils.csproj | 24 +++++++- .../CAMOsoft.DbUtils/SqlServerTypes/Loader.cs | 45 ++++++++++++++ .../SqlServerTypes/readme.htm | 61 +++++++++++++++++++ CAMOsoft/CAMOsoft.DbUtils/packages.config | 4 ++ ChangesLog.txt | 5 ++ DataScriptWriter.csproj | 20 +++++- Program.cs | 2 + Properties/Settings.Designer.cs | 2 +- SqlServerTypes/Loader.cs | 45 ++++++++++++++ SqlServerTypes/readme.htm | 61 +++++++++++++++++++ packages.config | 4 ++ 12 files changed, 271 insertions(+), 4 deletions(-) create mode 100644 CAMOsoft/CAMOsoft.DbUtils/SqlServerTypes/Loader.cs create mode 100644 CAMOsoft/CAMOsoft.DbUtils/SqlServerTypes/readme.htm create mode 100644 CAMOsoft/CAMOsoft.DbUtils/packages.config create mode 100644 SqlServerTypes/Loader.cs create mode 100644 SqlServerTypes/readme.htm create mode 100644 packages.config diff --git a/App.config b/App.config index bae5d6d..ecdcf8a 100644 --- a/App.config +++ b/App.config @@ -1,6 +1,6 @@ - + diff --git a/CAMOsoft/CAMOsoft.DbUtils/CAMOsoft.DbUtils.csproj b/CAMOsoft/CAMOsoft.DbUtils/CAMOsoft.DbUtils.csproj index 73d61f6..bf6d47e 100644 --- a/CAMOsoft/CAMOsoft.DbUtils/CAMOsoft.DbUtils.csproj +++ b/CAMOsoft/CAMOsoft.DbUtils/CAMOsoft.DbUtils.csproj @@ -10,7 +10,7 @@ Properties CAMOsoft.DbUtils CAMOsoft.DbUtils - v4.6.1 + v4.7.2 512 @@ -85,8 +85,12 @@ + + + ..\..\packages\Microsoft.SqlServer.Types.14.0.1016.290\lib\net40\Microsoft.SqlServer.Types.dll + @@ -109,4 +113,22 @@ true + + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + + + \ No newline at end of file diff --git a/CAMOsoft/CAMOsoft.DbUtils/SqlServerTypes/Loader.cs b/CAMOsoft/CAMOsoft.DbUtils/SqlServerTypes/Loader.cs new file mode 100644 index 0000000..ce606cf --- /dev/null +++ b/CAMOsoft/CAMOsoft.DbUtils/SqlServerTypes/Loader.cs @@ -0,0 +1,45 @@ +using System; +using System.IO; +using System.Runtime.InteropServices; + +namespace SqlServerTypes +{ + /// + /// Utility methods related to CLR Types for SQL Server + /// + public class Utilities + { + [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] + private static extern IntPtr LoadLibrary(string libname); + + /// + /// Loads the required native assemblies for the current architecture (x86 or x64) + /// + /// + /// Root path of the current application. Use Server.MapPath(".") for ASP.NET applications + /// and AppDomain.CurrentDomain.BaseDirectory for desktop applications. + /// + public static void LoadNativeAssemblies(string rootApplicationPath) + { + var nativeBinaryPath = IntPtr.Size > 4 + ? Path.Combine(rootApplicationPath, @"SqlServerTypes\x64\") + : Path.Combine(rootApplicationPath, @"SqlServerTypes\x86\"); + + LoadNativeAssembly(nativeBinaryPath, "msvcr120.dll"); + LoadNativeAssembly(nativeBinaryPath, "SqlServerSpatial140.dll"); + } + + private static void LoadNativeAssembly(string nativeBinaryPath, string assemblyName) + { + var path = Path.Combine(nativeBinaryPath, assemblyName); + var ptr = LoadLibrary(path); + if (ptr == IntPtr.Zero) + { + throw new Exception(string.Format( + "Error loading {0} (ErrorCode: {1})", + assemblyName, + Marshal.GetLastWin32Error())); + } + } + } +} \ No newline at end of file diff --git a/CAMOsoft/CAMOsoft.DbUtils/SqlServerTypes/readme.htm b/CAMOsoft/CAMOsoft.DbUtils/SqlServerTypes/readme.htm new file mode 100644 index 0000000..02d9ac8 --- /dev/null +++ b/CAMOsoft/CAMOsoft.DbUtils/SqlServerTypes/readme.htm @@ -0,0 +1,61 @@ + + + + Microsoft.SqlServer.Types + + + +
+

Action required to load native assemblies

+

+ To deploy an application that uses spatial data types to a machine that does not have 'System CLR Types for SQL Server' installed you also need to deploy the native assembly SqlServerSpatial140.dll. Both x86 (32 bit) and x64 (64 bit) versions of this assembly have been added to your project under the SqlServerTypes\x86 and SqlServerTypes\x64 subdirectories. The native assembly msvcr120.dll is also included in case the C++ runtime is not installed. +

+

+ You need to add code to load the correct one of these assemblies at runtime (depending on the current architecture). +

+

ASP.NET Web Sites

+

+ For ASP.NET Web Sites, add the following block of code to the code behind file of the Web Form where you have added Report Viewer Control: +

+    Default.aspx.cs:
+        
+    public partial class _Default : System.Web.UI.Page
+    {
+        static bool _isSqlTypesLoaded = false;
+
+        public _Default()
+        {
+            if (!_isSqlTypesLoaded)
+            {
+                SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~"));
+                _isSqlTypesLoaded = true;
+            }
+            
+        }
+    }
+
+

+

ASP.NET Web Applications

+

+ For ASP.NET Web Applications, add the following line of code to the Application_Start method in Global.asax.cs: +

    SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));
+

+

Desktop Applications

+

+ For desktop applications, add the following line of code to run before any spatial operations are performed: +

    SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);
+

+
+ + \ No newline at end of file diff --git a/CAMOsoft/CAMOsoft.DbUtils/packages.config b/CAMOsoft/CAMOsoft.DbUtils/packages.config new file mode 100644 index 0000000..94d3422 --- /dev/null +++ b/CAMOsoft/CAMOsoft.DbUtils/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/ChangesLog.txt b/ChangesLog.txt index 7a3ea4f..57cd03b 100644 --- a/ChangesLog.txt +++ b/ChangesLog.txt @@ -1,6 +1,11 @@ SQLPlayer Data Script Writer - Changes Log ========================================== +ver.2.3 @ 02/12/2020 +- Support for Temporal tables (#10) +- Support for Time data type (#14) +- Fixed: Showing the wrong number of rows in a table (#12) + ver.2.2 @ 12/06/2020 - Support for Binary and Varbinary diff --git a/DataScriptWriter.csproj b/DataScriptWriter.csproj index dc7d432..a1be3e5 100644 --- a/DataScriptWriter.csproj +++ b/DataScriptWriter.csproj @@ -9,7 +9,7 @@ Properties DataScriptWriter DataScriptWriter - v4.6.1 + v4.7.2 512 SAK SAK @@ -50,6 +50,9 @@ + + packages\Microsoft.SqlServer.Types.14.0.1016.290\lib\net40\Microsoft.SqlServer.Types.dll + @@ -85,6 +88,7 @@ + ConnectDbForm.cs @@ -105,6 +109,7 @@ Resources.resx True + SettingsSingleFileGenerator Settings.Designer.cs @@ -126,6 +131,19 @@ + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + diff --git a/Program.cs b/Program.cs index 646421f..cbfc229 100644 --- a/Program.cs +++ b/Program.cs @@ -14,6 +14,8 @@ static class Program [STAThread] static void Main() { + SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory); + Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new frmMain()); diff --git a/Properties/Settings.Designer.cs b/Properties/Settings.Designer.cs index 7facb07..47846d9 100644 --- a/Properties/Settings.Designer.cs +++ b/Properties/Settings.Designer.cs @@ -12,7 +12,7 @@ namespace DataScriptWriter.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.9.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.6.0.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); diff --git a/SqlServerTypes/Loader.cs b/SqlServerTypes/Loader.cs new file mode 100644 index 0000000..ce606cf --- /dev/null +++ b/SqlServerTypes/Loader.cs @@ -0,0 +1,45 @@ +using System; +using System.IO; +using System.Runtime.InteropServices; + +namespace SqlServerTypes +{ + /// + /// Utility methods related to CLR Types for SQL Server + /// + public class Utilities + { + [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] + private static extern IntPtr LoadLibrary(string libname); + + /// + /// Loads the required native assemblies for the current architecture (x86 or x64) + /// + /// + /// Root path of the current application. Use Server.MapPath(".") for ASP.NET applications + /// and AppDomain.CurrentDomain.BaseDirectory for desktop applications. + /// + public static void LoadNativeAssemblies(string rootApplicationPath) + { + var nativeBinaryPath = IntPtr.Size > 4 + ? Path.Combine(rootApplicationPath, @"SqlServerTypes\x64\") + : Path.Combine(rootApplicationPath, @"SqlServerTypes\x86\"); + + LoadNativeAssembly(nativeBinaryPath, "msvcr120.dll"); + LoadNativeAssembly(nativeBinaryPath, "SqlServerSpatial140.dll"); + } + + private static void LoadNativeAssembly(string nativeBinaryPath, string assemblyName) + { + var path = Path.Combine(nativeBinaryPath, assemblyName); + var ptr = LoadLibrary(path); + if (ptr == IntPtr.Zero) + { + throw new Exception(string.Format( + "Error loading {0} (ErrorCode: {1})", + assemblyName, + Marshal.GetLastWin32Error())); + } + } + } +} \ No newline at end of file diff --git a/SqlServerTypes/readme.htm b/SqlServerTypes/readme.htm new file mode 100644 index 0000000..02d9ac8 --- /dev/null +++ b/SqlServerTypes/readme.htm @@ -0,0 +1,61 @@ + + + + Microsoft.SqlServer.Types + + + +
+

Action required to load native assemblies

+

+ To deploy an application that uses spatial data types to a machine that does not have 'System CLR Types for SQL Server' installed you also need to deploy the native assembly SqlServerSpatial140.dll. Both x86 (32 bit) and x64 (64 bit) versions of this assembly have been added to your project under the SqlServerTypes\x86 and SqlServerTypes\x64 subdirectories. The native assembly msvcr120.dll is also included in case the C++ runtime is not installed. +

+

+ You need to add code to load the correct one of these assemblies at runtime (depending on the current architecture). +

+

ASP.NET Web Sites

+

+ For ASP.NET Web Sites, add the following block of code to the code behind file of the Web Form where you have added Report Viewer Control: +

+    Default.aspx.cs:
+        
+    public partial class _Default : System.Web.UI.Page
+    {
+        static bool _isSqlTypesLoaded = false;
+
+        public _Default()
+        {
+            if (!_isSqlTypesLoaded)
+            {
+                SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~"));
+                _isSqlTypesLoaded = true;
+            }
+            
+        }
+    }
+
+

+

ASP.NET Web Applications

+

+ For ASP.NET Web Applications, add the following line of code to the Application_Start method in Global.asax.cs: +

    SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));
+

+

Desktop Applications

+

+ For desktop applications, add the following line of code to run before any spatial operations are performed: +

    SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);
+

+
+ + \ No newline at end of file diff --git a/packages.config b/packages.config new file mode 100644 index 0000000..e4120d3 --- /dev/null +++ b/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file From d89fe4e51ee3830302fb122980d9befa4d7e81f1 Mon Sep 17 00:00:00 2001 From: Kamil Nowinski Date: Wed, 2 Dec 2020 00:42:51 +0000 Subject: [PATCH 4/5] Added screenshot to readme file --- README.md | 4 ++++ images/data-script-writer-selecting.png | Bin 0 -> 49523 bytes 2 files changed, 4 insertions(+) create mode 100644 images/data-script-writer-selecting.png diff --git a/README.md b/README.md index 3611c2d..17da80b 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,7 @@ https://github.com/SQLPlayer/DataScriptWriter/releases/ Blog post & video: - [Script and deploy the data for database from SSDT project](https://sqlplayer.net/2019/10/script-deploy-the-data-for-database-from-ssdt-project/) - [SSDT: Scripting static data from SQL Server (video)](https://sqlplayer.net/2020/04/ssdt-scripting-static-data-from-sql-server-video/) + + +# Screenshot +![](.\images\data-script-writer-selecting.png) \ No newline at end of file diff --git a/images/data-script-writer-selecting.png b/images/data-script-writer-selecting.png new file mode 100644 index 0000000000000000000000000000000000000000..4c87c655dea105deed0ac654c3fb44d0af176cbb GIT binary patch literal 49523 zcmbTdbx>SQ&^Jm#AOr#g5+HbRhXBFdEx3Ddhrr?<++oq+?u)x_aCdiicir8OECqsgeu5Mpd#ZT!@0c{V_Jd4Bg(QWF3Nht~D?^QzCT$QTZ;14&9$ zNX1p}xb58!teF+4&uQC&Mi*(LK|ks%|2H_)vn6kYkzSKbQ!J_ls!i0Y*3Ngr80H%! zwX48MwHjh7Z=R6Vp44=t1*bn_V%vnPE@6HNAm@04Br~4`a(VC>V*%`q>Q;Y{w7vA? zTuyt)Fc}?AOTHTBGBc&Gt8r&}p$ZP}Lx#qT{(pBtg2S)=-UTp!c%k&A8NBZ%_EAd77vE^Mj9O+Q-oWO>}Bi9%Vec*+Z?3l*1 zBC z%OKEj9Yx?sH5Z$_Vu%I$O*;(z`VF5&hly{p;H`eQsL6-UKW}spg&6mFl6j!uheE)^ z5P)9I7mx7@ty_w9>9gvkRhPy**t*+T_Em--ZC&GCE!6@C9Usgz z5jH8<buIPOBcN(ZKB%E%q396Z<=l=6+g53zSUjnn&cB+`~>4X zls>h}McO86XIDz96b<iNJUBoiB7hF7V ztz_@4Nl}s}1OE6;vexa13jv-L4T~fAuMi!L9r@-crK5a*!^6310x=o-UNxw^7 zy1Cq0J!v$o&7>a}C~RdBg+}Y%-P~8kj;+Op1qY1k63@v+Zsmq;7wB}gq{?x)+BOgG z-s_>~YLIN5^+NxyiG)RD(l9E_|0H3q#V8+II{G&2NT6wXxj9rI6yQdtbi{>jzc zv`B4K!N!j@m)1yyq`y!Q4bkBKxJzgv-mI&`b7eyhImU>&iL;DoM5zbTqYIqL7OwqY zL-T|WEbcb6#{5ORg5DeD(nGhhjddJkzEKb_jHS4%z8PS{S`SWRmpEh?w9LMryROAn zX^Lo5eswhmWIeI<1_!ZkoXQ^>3ncnrDx0NNhpqPI#I-WT==d+OLQ6tSP0dAb&lP`V zeveY2M6HgY&a=s@!w+PEGl)E}fR9rKHWNMWm+-Hayw*Z_F@0S^Og)OihazGNqz8ho zP~vNXy+TRhU}?!1K0aFMvkprPa!1;pZ;e0tEdVgCQ_3EZ@Vw;PG=~QB&gBF?dKK>l z&CekC2=w09k6Wo6DlKO=$cC{Nb*EU{ zd!am)OGM%a2SOySrho`GSJc z{1AiZMA3F>kRPWKm=;VWK_mib7UD~y<+*C-`dY-2%RBbX)f<*6z7Q&Tc+~|NWh&9# z24V<{OqlDA&?tSCWb=0TBXy~G%NaBp<9r<1jy{R4#`PqsDM?>qB0{i;d?_<@Yl&l% zMI`F|;ELQdclS*RSNP3<^{W>mVN^tmqGLkCug0-Rut@vf2E+76nt7TBxNNp6Ho*|+ z-LlcrVZ})o6I$N6EzyrS^bhyJhcSXAVvbPrkp)xCJc?QT0lhd9vz6j0nH=i%s#5@coMT zvULA#|Ns2N`Q0$&1})Pr;Gfg+tz2Is_DKqFl7VGw{tV@EEqXkpdt3C^b;3Df9}*qp zcc=B`e$ToxsH%ilm3XVm_CW&o<-7gw3LoVS(Ez*6Z;19eUplhlUNg^8{A^hn{OhuO zM-jSplKz~CkNx#z<6OUfACdm&!_q%OUWJS<&$sB5n{k}zR?loWaJcX=IxX8ib_^(;@%zX?8vWr%VT%hS<_nHr0usx;&YVO zx%#fHF`qk2;gfluiQsA>EvRlBxT;<6vmayiW%nNo0iOU#ISmKrQG~>D#H}|iNp_H^ ziWb;lG*PRrSTkpg=R@#TzguBGmUPs8FN(H4_^yC$t<6I2R1Pz6a50Ee*Yp<_Mu!JN zkI!S(!tmSu?MMz9eVKFDbGR1)zf4NgC&SYt)l%CGe(If*>i7m1_mxZ;C1@k_qFOGg zE&(1szW%f48W~3)aP7dEqcO!flCfc`Cx1-+tvvcMu2XFRW4V5VpO=}Xm6cecP0&tp zQ{p>|+1hV)^r2Ck!gA(ZrgfspyUmari1$hkIu#{B$$TOG2)viW%jkk;`KaB?6S)#= zZhPr-dLA}CVOUnPpojh3Xf#6Zyw1<1eBRH09$_b`ykVL)!=^t+<9IUND#vW1OI&e+ zo12@Xhvd!Bz?}yd-E7%Tf+{THP4=(sC*bm?bY@5nXarq(hFpa zI75TQw33(F=;>rML;EF3cIltzENvn}RGfe9Bw&H`!E`6L{q_xBkkzNb#rNmm=>E=; zW|IQ5%i(mfRNQ2y5A?y$ual4mnw|+hNH)Xvx=LMptbnEXT${6raW(_Y3@4LANE*J1 zhnsy<_t?Ce6M#`)J`xYdKIo9+;oJUd99y!IFg zqJfZ+l8PqU`0fC$)zpNg@luLXEiHI&!?S*4&^pa2{OM2n8tcfP?+U%YpEco-BBVK+C&!$&kUU&SFR zE`GdN2j~il%=Ef#(2O3fCZ=!bqYw33XTTm2OZYRGM#b;paO!lm8b!#fvB3DcRx#C? zI|Ft(9~9i~*4(aWn}l#ltd2%0{PspL&CyhF&IN2Pi3q` z#(QHIGaB@u`q8PvGyU|)DS;<^1TB7O|7EH^pl7y?Cs3_V^agh1o_u=FVb@;b@jm>t zw;?AIrMq`6id`knH_T_!oh2f5Z;Yhfbh)z!{FD%s6{&ULUN< zNj7>;7m+X~T@k~m!$K-`eIPeid$7699&qxNKKS18=Bg@JymH^Xchur^cwpI#9)60c zB$iBvaW3@g#v(N79r(}*fcSIxpo)`EZDqmQ^XJvoARuoW5xIYgT{F-2Zrt?3bIEwRO+U z0E;k^WRE-Vh&K(&3;l4NVYA^}vC^sRSo{~;o(+Z2`_Q<)7XxQD9IrAew6e66`I6RNm-M^V(3m8%~hR1J<`>-AOe^V$YeyTXF*o1y?1hvQP@bNCS6MpVd8iG@6X*a8Rx1Pbc8I~MX&H=R+_*n5umy1)Xkv#d&)a((;pN8s^& z<@KR`6921m7kV5w)SKgHx7qRa%c9qgM-xW3EoTs~ZYRb*e&BMCu63qRUlai&Q?b(R{qzqTLJkojQ1a?0=Y0@0sOX zaTiGAXO`pKHJp7cfu*?`3}4{b@<2Q1x0oWx8qOX*4VBnyKQWaootyXI-?4xDRz$#* zCQHm(njj{A@s{xMn(wgcw$7ch?JfhEqS?g=n=U+T1KOP8u4Ii!S>aW2+>5X2h5(5D z4Nx8~qN})E1{5Nrp%whw45cR|hH`})r8^xV9gW&)fSV8SBhg`Qw{ssCavRb;_fr$@ zQ19Ir25Q*YQ?K?XSlQTa$anDY)AD`Xjn>QNLP9OsQg{}OzVD7_LLK{+1@NEG+Y}-9 zG9rwaeQylZo_8L(@`o7Dhw9#(x+);Sm@rblP5k7g{p|!(; zlh&>@+NPB4z@;M@MhrB&A{kXxAa$nMhBKZ*`O~8*rW5$JV5Jt9J&{Qu2FOev`=dy# z#sXWpE953c+t#E{{->gOjl28xzVmSrG71`z?~C-{xak-^0*Ia*XXpKOF$NyBG&4i` z`7tos80s@@t?cA8r+j$a4u>DE%yM%`$I?q}tQ}|5cmd`ssZ|#%3!$%_9a3A|>3G0# zM@{>Z*g~T>J!7kQ-%dzxhnsZDb*b)##@S9az2lH2y5_Mrog5B39vP2(T6DHUSi__VAkRiU0iBqZvN9fCnpvMd>x(i z2!X(6+Sm>%3SEwWC=xMGx@S}^l0CqR?(%fqo-`7!#C*GTDyX5<{#9n9$GpQ{jxN_b zp^;|L9#W6Wkkeu8k6t@%dxRC4WhGW2ncfQ~Nj=>mLSra>x_!Y42$|eRM!cvWp_e#K zMOz2r2$dITyh-6YUb&jX7?EHos*J2jp`6?A{MD|U^47=0XpW-FFXOj#YY0NY6HHL#C%8!*7A%E7GeYZBdNb!oSXu)y_U1audDd46_!b{2ZL z1$$5Mb)BjKeL>fY-ItOy-8kH!WffN;Zq07{yjK}!fSuZ7SmSi$b8jbhB$sb22R%(t z*INi8_O6tbR*z0#|90HGc}P|s6z_sMRwa$5w$KjHC%gK#2tp-N+qS)*t@kPV0$=ZO zYMOevus=a1HQA&asrvTmMz=Mq$~=p@Tqkfa^L0k64!cE z)rgJie$R6o8PN`piH?q^AY66P6Do+4{y;UJ?}R#Sc$_<2@g(LTkGpXvxf_~?EUDPYRr;{rgG~ke{yIV=Z);t zUR)@10Gb%`y!@HZkz?Jlq2EfO8e$4x&HmHH+MlCoJ!&V9s{-CU_u)Gt{Lh&~tD4g% zQ|gF5mB-b0>N<)VAB;-5R!Uvyi;DnzhmvDJ9&N8>K%WRWL-FR}n3VqlJkgatwN>Io z49Q!1vC6i=TheuhrV>jXNQ=Y_&x$P|GwqaK4HMADi=kK_Qe>`e96y7%!F#2;Rb0`; z1F3lYsDI++GE()}*lT50-(mE@Z1nt$yHRJ@w9KZ+3|qz*t%lzVr0+cg8De_!d6-ev z_i{SAt%zUo-4WoCOs|r(GRkG`Jc;6U*;P>1FZl!aA3V3H5zpVRXgi2}#@B-x zuS6zytug)_zK4aKx_jQW30Ou%G<*KR3Pva9cPUR?UZ|;KFRcSj;KteS&8*d4sj@X{ z`iFNfgS{&cO3p^>>Njc-+Ff}w{LKy}&)4x$Sz+zklO z@l{P`Fmolx54!bhYUj9o1+}Fd&=qA3;?^91#3xZ=~=6KAi}Hv1@PfqmiyY<-GKLrLrmbD!V%}z z!|@r&(^6XGX-W!Rd1H=x#cD#rjFS`U-q_rt_3Yvz>svIU=Z(A5;|T~k&(=0Ph{$<+ z1>)5!fcq4gD!Wjh4QS!3LyfF%7_>BC2G;LOmJalYY8iqe>jdb_MxV83uFE7UAa2IB zGmBT^yWA$>$Fr`hO)g!xB79U5EB9SO{+o}tCuTKbzh@_v_LiHDjCJ{7&+zY-YxY2e z@)!IfVDs$sCv&!|M$I06=$qi79Y>ES58kaLXve3KZLKO&&VQ{j>a3BzG<}BEQVfu3 z%64(lm)U;aS-mrqesk!yJG?Q*{}OCO3AZ_#yJ>dU z%>+UuHQWw$QgJexAR|t+;q3X@*(CM{i7DdhxkDn_)BDaXlKhhe2!sK(UrX6oxZSVh zDa9&0zIbo%cvV0OTD;{U2a9dQwtP-AE0Ewdp_DrH3O$>f??<7pl5S3BSTCzzmG>jb z!@S+R9%nKHI3T)fOzwf?n;9*?XL@hdiR_zNJapPhO7EsKh#ju;kkJBWENSMS@22e= zYEP;E;*TsNVOdWR=Q9*cKwX{FP-2_s<@Ny2sbtLpDH;K%o{nc$RaM6U$jTao%TB*B z+QN!>8_FO}oZ0HApkf_=)OvMAYzLJ;>=Jk$sd?dVXS!HWYx6mNOV*>HQS&iZag&{edSNJJCa+)n=JU4B`j?>BqewoaIbr#@h~ zjSfPwIU2Lup`*J8O(CF`MkFx%#KXZZD5}FgAvLrzzwyr4iud6u0)Q zta5is8%vxhqFTQYeO2tBeD)K3+ebFqn-Out?RuVxTE~&WnM;cBi+y8CHd8k3=Tabn z$%}~K9KRKX+Tk-x5b!uZKR@6__kF~|S_l`B7O{8O5}#Yc(YyGen}6rAj-H(RY`E_u;y zuK(h7a7jd#n@oYfc^n?v(y!F8WOvw(qPZX7v@p;~lZ*)l<9v-G#@uN-p zVE3i^$ME**rdt*!CBd+5ICuRNR#!I~gp8Ew{HkK=}sQ-p*D;h|9ms&6%P z2#%JLO1WuaRYu3txXwEXdnM7c9`q}u^z6MkrO|40)6ZK}0xd?+F%#SDY%<6Ml{Tfk z^h-YIMIpF9CP@wxK3wFrb8yOMX0oiCUBw?5ZaTLd9UVzc0;QD;VqV1Gd$qB`RzH8m z0U2YPdw;mpp#S}Q#E5w8K~9ZX&!Aqo_e8WN$p5WG^RjJpUyo|~kY&wnrDhp+c;87m z;1UOa>E18+Zo!S051oj2-9FR%%->+GS=D6vlVcu-cdOeV;nx2~{uGDP+g(SVA4UQr zqb^tPmaR@^WRkft3*|FcU!pojMq8@tx^4?5@T6p9s(g>wXF#x# zq+91$3ew!BXg^)v?$5 zLgWi9Q$I^SLXNQ>TdAaBHF_QOH=8-09K#2w*N+IRmP?JcgLgEf#~#YS?5oUn{%7s~ z!m}O_yOzhVR!Of|{$ZlD^9(L+O7~rER<%+Sd8voGF3g|t|8Ujg-Wk@(jcHz*bFjaxiP_lZ@vAvc+?NMZ870F=V_~mU>3*wUp(C?Op!bDpOnKq}1 z{dEtlzdzat`~Yap9Njv*aDK#xs_W?Gd}nrcuT zr{5!M>^_hx$uW6Q!Wl^JFOVgb`}J)mq)R{b6G?X^7H(=rpOY75x3ZL<&QEi6J{f?9%Vs z4V`M0^5#A8@BZNB&FMx>E`fI2?r08dpW9OqXNDQ;JS!;!gW$z?I!if&YfiAF3BC6$ zu}QHrn3voP!6vK9I^or1JyKtypoi*agB_tA)OsLh$IxjgSe5g2Vk?&<7uC(blsGpI z$=+~e2uCTJL{A2Wz$oQ_NRFBCqSG19C5iAz=jK+$N1uU9^OF6ukJ#w>hWNxX%{H7( zG)!lUnj2qayJ|U8$RfgJxf%Emgn?IlcHGbEqQDgTh>%?NUq4&jqTfR<#MP8G$bP>r zu%Usz&;qtQxtP10fdn}_90I_SZN7CP1Fzr~3Ed7(f1~+UiidI8*`-gQE+uE4eZ>{C z_SfIUr_BZjQImN;8(h@u4)XEoX_^oieb3E*C(*OC{bh^|9o%9w*GqiF&2k_1?RAf0 zs-U#3G;}(WRC3#5o^gY@Fadwn+KiaMvtm%cBCu*HW5){j?j6ogoyj`e6BedU<6wV( z|CV?;ojvX%RxB(uMxC^xKO`Qz)q7QGG-KE$6l$EX1>tfrJv|cBV|DAnHK#dFS%$#w z7-<7yo`eUjko5MIAF>_c9Cz~kQqSt!@^SX!d9ojL%{<`)e~}H%rah;w-@N zw_YpFgR)76vYx4OZ|_q@(Lm=i+2;PJH|*GeX^3|(ky5AdrDi~_Cs2Bc7e~NqCiu$p zt_1mVrD1GE{4$E6Nnf-D)>S;lYmKgXsUX*99Na=KSMiH*JUI+`?p@l!hc33MWM?vh zWih9MLl+XcAH^>ycr!scGE%N-nWC}?tQ*iD5^~3Xe}BqzX71>mpSx_Yu%{KA7oLuy z>ldZ7#?8Ws^Cv&=WOS;(A89Z8F~Acpr-szn9>;;3l4m*Jo)A}AafAC8d|6j5{>D0E ziItT#_%oKtzD3MNJ5h3wu&?LUSEY_`n9{%{eXX^FL3*xshQ2v5^2kjsMi2bXFOa{<8)a&_fLEqQ{R0p!kfX-Rvl%qNX3B8mDFw@jSuzo<5&MndQeW!TLPT zm^?g>?6%+1-9ip{l=X2RV>QTOI=2E`$FS69i_73rBD`UZjT$myvms}GJ~_m;uBQ`5 z?%K)L3!ZAab|c!};EN#$O2Oo}q@tpbJAwQCavmy|>fFC$JK7h8y1*La+Rbd2YqVXC zmz&Ajer|_Uk!3<7PL?h)o+fg8<)d}?S|oKi4E$7Vw)%Wh6Ozt8Lc>uH#Ar#H`UDIq zusqWX3^^BzfBfYI=_B{e6lg1Rwd$&24Vv|{M(gy)Ia;S|oWQ5%t1e>QLeSs0;1~qM zxTYMNzq*jeW~`Px(B10c5DT~-8{ZCE1-cW2PB394c6Nd)X`Fwb?F% znbyt~eQ;^RN%$Ymj4&>=_Z`1G|IZHXr%QUZSyZ0(fFF=dsWCN0fNKxhahwwD;9YxX zZ-5KD4EMyE2-dCm9w$X)Hnf^e9zO<&UU`@}#-Leil0+9&fObtw!@$)fC1#`G&(K8d zuISp^znKqTxj;|2O=A&}Toy;!+ct&_r+dB9Jf)=#{fK&M4HcE`Ct^>}xpWuDoBw8% z@!yPA>?dz!dK_LxIr|SxGQRvHj?P!YI6}04jS-Yi;PjCXFeE>lJ63RoNr?3T)fZ?# zT5?(cA0@ZkT#3G^gBYrO8oFW^%xJzMtSg;b4!p4c1tFxzPDZY)GU zXfsV(mN{vNr*R&b7oGu^;)BnD1SluYh{T-fXQob;*lAUmz%w{O;wzL2eobbwPjY9WAjX9Wr35Dms+$mO+-Tmu z!~QIq+FdmB#&Th7^ndU&h0?I@pENGwl@AJH_uUiQLC;+mVTpf2;YI94TG%_{%>?II zYTu9~=zMvO|K~Y<<)#c7L%v(#F{E>}UE;EkXK%8l=vXnEOmVwp|E?x0gd%5(vf{08 zv?mI_37t43`&$Cwd!B#82k;&gGJmIEYI>oSFh+$(@jg$af7)`6^7o}R@Jejn6Fy*$ z!|)4Xp*8ehMFCtIb|{yClmYvjIRLLH0(Itdu601X<6!!;`$}m=S>h>^ekKc|#c1lU z37YR}E9uW;JXSEk%2;a&2yVo9O&kkh#I4$&fwc5$qc?{G%G8ZVTdGkq+IC7LNua)T6=uzZIeP%L5nK^SNYQ}A@b4gBbb#_T8RnNtV8y2IJ&n=#YLclH(oUbk%zh13&n(I)`kZkHC79hA@l9kAD7w5PddJ}AZb0F z#VwET;l~GD{1$nHK4qHtPZ8rT-RU2}F2|I46@qTLATu6KuulU|Xt=|2w^CpaV`4ir z-cVhT%=RByO9q_pKXCIkN04RdaldzL9{dC#G2^@#RY$Y@>GLf)?+Ehnn+o=m=rz?B z6Y+g_@y$vAn(Zai>(ito>*>cA@SCi0hN_#RUO#7?iQ=I;$NO3~sjrBl*ANfQ%eisM ziCI;jsEL-0Zfo{P;*Jku;cWs|oMl?$O?#F!T`W41pqlonKiF4wR)g+<7mD82Od`g8 zifA&NH%BI&yX${6JfeR3LswDDiKY*H5PU3ZH*@CF=sXV^TYZ*j_!i~^`EV4qys{#$ ztJxs4^JVt(COKduD7N-pc3pDxOdo#E0_qGypGH8WkGTMig=Cxrt}mKsR`_3kM~1=h zINnZ)^STt#_U2tSf(h&Mh47##7c^JwJlwQk?MKUTc}*Wx8{L{`Mt7=fsqde52hJ^vvaT;bP<7BQf50qM3d zZDhP9PQF`ZEqr@1NFdA7KxcnWmrQdVnm2`Z}KU zcWIy^&SGmK=gn!U0}>hQvvw*dL={1Q+a7ZhQKm(7?8HwOP86=ppJxO0gE|W8YxIj~ z1+`sjIy&`#N%Z~Wkhfp-xE1GOi!VHB!&62vE!DzFv;?24zl!qToZXyx7iavCmGt=H z^p%*^>#PkHLWLF5VS&CzB<~a1>pi!|nqfn0{PC24=B*JOGAy1+MRqNq<5&e$E0a67 zIU=+z74D8E4nxR!$LN2KOfl&fETz&onTi-8Z9AFw?I1K18(r{w=5)?K58{i4#&(g> z_f#i7jL|MUlGW+Ajt_qLJejt7;r$BVXRjY6z0cX+LOKXRl-yEJnnCSLhuLAA|9@cz z4n5|(+4;Ey)V~@47l3|e=cN(abTBpfUk_$90S3^Br1upiYyyM$xv<0a0-Z(co4}aR z?k4ut5(BnOrRM1;8KxAHrk>8s7?g-&Ps4#e@pm-xBDRC_Uymr9(g+EEIrIhH!_3%Sjt^ba_8@*aa_Hf_HwX4oBo<-=fZT{;kmS$JV zoT3bQex@(XbAJDo7nBFi&W1T__gSF^S(ohC!TBvj?w_h;wY zxd=>m_?RO!Bm}h-65@!-;#4tBMyL6h)Yl~zT9DW;H`=J^t~N=wjb_6}!^OBut?1vU zI+UPu4QDlNqL#m%CQK7{c`l}?rQDJCrIcrn-)r7&x2UvgmJp+dH0OblB7NIok_ph# zzh%!BE5Vt~d64wX&y=^maIt)^PcjT*N1@@m1Xz5giN}rxg^7xbsAMSF5I`{Gn5Za# z-nO%4opKA}H`TFQ2nB@H32DfQKAsfJe7}* zPlidA##xG6qM^A(;BTNR#B}tThMY095(&9?S8!4Bg%D7DB4S*}YkC8u6-BU6fLdZ1 zQ|0N0e@RGd`6Y#Gc4QISG--K6l2?|BLP#_f?~gd9X`Yrcbvh-HW)|HnnY=*S6p5&F^xaK29@!~bQY$iVe3U1_Hip%&K(eS$QgFWsH;OM>otwm zV7s|V_KN)!+bOw-sc~u$y=f4?snW`2Am3VE#Mdw}J^*q_8B?j9;NA_;?lo;OCdG+4 z*NBSRSk}+q*IiCAt?6NWVVJawtenreZ!C$mO>x*!(4r!ynf(v(JZG7z)`IY+9Ukee zPAmmI{Zs(9VdZ9~!wD5C^eEXMEKxf?NagV(A?RbcG-rHK!4wfT!N}&15sNOU{@^Xl z$i;VxDBF9mfagF-4cJ=5QtB1EjN(vF4<^ujVKpY=$n+wFe6!`%>a%BT9Po&UW=p3K z?P9gD=v1c{SO{&^zWoEN2e3Kd?pc3;FV^{EZ_~$?Gt1h?b9g^ql31pJk&t}32eBCx z0Uv%H;O8~SHeV*6A(0pE!R9*uLNu8Eu8DMkOs2FxCN{iQ!M2vz)fgkwW1EC*Pn+*w z&=F4G*n_-K|AjoAp)L65KKbg{|!(bDuJM-DNo&7Au!b~FbaUOx41xYm53qU>d3amm$qPs&VSTT?~wqB=6TICg3g=q1682$P~C{$oDnE;(4 zy#JSW(R;aM!WuDc8^s)>==Y2KdGFnf6ZquG0CDD3e{JxGc>QD!){PM3p*ReQ|GZ#D zAdQ|fH-bvk7x_{i>oqNc-Cm%&)vi~};;+kZz47c`Vzosy48(bXM`#b~;Uo;U%sGqw znUYx)*dMkkv5 zMedhhXxQXcIAn}n!b>Nn6uL5XcSK5c+U#FR6uXY4#n|cyU+8BvO^fr&FwfKGf0no| zwFi&;#p_@R9#fRVwlRCC(y4BPK3URo37I6yGzX3&5W5A2dSI_}+!Qg9H*0OfSpn`Q}9)8UGPR<_#Tp1SU|nV?z( zqwfd6O?hmoIXZ3@JSi+p+}B*O{Wy|{1EKcY*%5)|u~DQ~8bP4p@H`<9_N2`=Ff1&d zV8MouUJ?G@AB~r#Y@#@fTt-M?)U#4G44*hBO5CYhLMb@|2J`rv2$6`2pVC`lmB|R6GrrIe${C8~S$De7$C;GS6rtq5|r(}5yC`kI8&ocmH~A4L5g$Z&;|X@? z`SO0))W=bHk;#$oI6wbSd+t1o^iyk4nJq3(=|cc%}I%4V0bh=Uh>&thdX*!4i|-?N1vt>hkh1` zF+NXc3!fSbAEJOp6wMY(dd}wHFM%Ce%6#UXwLD4iXoB)@Lw8StFVlvACbX{*wR-s|co5;N6+en(SD(P~$-Tr> z?6$n?DB;}>X_Ae%kY_U=&bLq9JXNlCX$7?b-!8EA+ymmmx{s(o@|7ZyYz6!>PAkn2 zxc;y(hBvcT65TLa;ynz|-7PCqY~~G=OKxx2+@G ze4)>uRw5tz@i7!uGNGEi-3TNIWnZPE)FT^qN);>@J4J41Kr{#TU7u3wiE8qe69z7; z$VsdXV6VP9C@B;^cl)I?@UBhrNXdS`V!Dsi=S;d*RkFY0?MspUiyGr;S<#+rn#(-1 z7N{+Ng|JZtTqcR}V7wxq^tXFw;9+Fm?=X?KIS?@%+G_VV_{?R%HA+*+=hcpa>olE;5RihwFXi%Q+szBr91}h(%XARrvPER`fwt%jlH+yJUKdFIfWF?%7pCA26b( zGGul3wgyd%@ckNz{0QNL2+BljkDE1O8(h{1<1EMfMu&CUZ-H)5Ecd>GZN@X?Gv zHP#$(8zb5`gyZ-k&BTCQOO7zEc`HA^?`XO+(0)U+jyjl~-c2HFCKYgTD?+u@1?L+D zXBYe6Qzpb-o5&zyib-J9Sn!@xyrt^PHhN;FK?_AG;O=dvn)tYFK>AM$i(lEpFGp!!&9KzJ%L&CkH`NYS6Jlu70h*6; zJ?5ZkMuc}D;mPh&$7l(Lz+XxeW~FskQi~BWWvhrWGBZcL4%poE@sF2Y%>M>t5#!P# zr!gWEGqs<)s&G*JrX4|X$&y-z?-P}Poqs(MmgQ-i%@f$TQ4z&c*<$abNM=ztKV-A= zq;WXfgn!7poi_>ea;Og3-q03u3o#SJe=z#M8}~b7_O$8++vtZfL{XE_&@pF5W1IA4 zBkd-K{IuN=N=bh-!{h9hXCV%-sEf^a>U*KbSS!wJL3OTwH8GBhl_K(j^71<(RA8=?1 z=k~qNh_P`yHf@|#qoZDsB<>0Pa{d(pdUl)_NVOOM8gt*sJaK?Uq;k5HI8 zc#s;qDGpzlXp)pXwBI7y^U^$rBWg^mbf>1=$!q~iBFF5zV{`{VkZVcD-Yv&hoU*2-Q1DqdV-kDYWyxEJKOSH1On?h?^}Ab zat!b1O}rwtX&9=o`C|@uEu}0u+m)1r<@lMS02B#7I)+O{ey z?2P$DHid3CS8vN~D%fWx?5*3gXxHv+*`%JXJyxFJRu9+d=8%0FJ$D0es8x0}yLPR?r({(J{BFF!{R0+N}?`He7=<~zQdH4Ml zCHe<0ErfG5nD3D^(DDat{&&qw(fqnFout7QrFOGVBbw>*!i&xT zgIYrKqlxtN;sc^g$B{ooY`ePKE6J;Eg<+PX0^{wdjp`McCaXS-?pgI>o&XgEJ7-Iu zx>6UgUR8Y%#H@RQ_oc8nKe`R9hbi(a7ytRzA0~HdJ1=N|3t%)@d2yH%D$*4}*0tJ^ z(u_;`QH-yjSrf6R9-XMC1wvn)(UPzBe_Bsv`T1RT0Hbp=f&Q8FI?>z@q0xs?4-5?G64qU6!*)i^9=Sgvh%QCZS6 zsWG+&M?WY066_?&?n*KqD8?|~7U`Nrl2PHXa(vnF)Fup3GPi$syOd+m6wc5=rm-L= zCJs)(eoQzQJH^>ZnZzWt)N_5KA09xeoL%fX%3Z!qo#LvMXx1}Bf)%<)5TaL$7Yzxy=TT@V;a**vVotTF4<7)k)hWL+x4FlSheU-<@C}xm6lptt7pmo6y(2?bb5FB- z&B0!$`$`#M`F0m17ya?;G;y_+)No7xhwYx`x4|DUSAzTj}YOq=tNG6D3KP?GIFi6+um5-V`Za!s0`>d*F)%F z(0YwapV+95EjZsO7U|$1)54?s9Pg@hF>xuo_QY z3pl(uVtCRkFd!!MW~Ynr?n3OLw4hJyD}VXnCBfp+vidgp&FmR1ekhlv-CV-7ba%LqMU@ALtpG>eL4`Mr^y#5{_Pk%XN>kF*KDywfALy6oxjlQJAZ&su zKw753#9%oY+P6`P;fgf7a&$1 zA6&ZNfX$^E6`#hSwX-=wPu)rwIq9LxIsG{)<0QR^a^}LBStIWIy~HW!zA}7M96WG@ zx`Za7n%#f=opyQ|c{fR;#`Phg$L+9%!?t2U!9oAcE4XnsjFY@;OB?1U!8goLIiyk@ z6D+TH&oZM;C)78vNPGLYljNd{gTu1rrFUeh`I@Dm{S@UZ0b=Hyrz9s?^rR^@-{3At+^9*KPIzf{Ib#o=Evzt*4<5lhxg-8o%?vPC7Ln6YrdU$#5-sV7kz~0wpGfqWhb8 z(a#jC#_Of8Z*D*cgn_u)iql) z?!+ikz1(&EMwg=`s0&!znO%WDG}3XD72OExbP>b#OLjkS8^kRP^8E-gT@{lh@DqF| zay&D&Cui02Qmfcj1^+mACZHlv=>x}5XhP)cd(-g=?Dbb)kAB#4=8w(C;2{~#o)^3v z3KP?&PucnsFv|Wz7$~|c1-5jeCC>ivd^ODwFU^gb{o#E-1xsv!;-T#CeF=b$_;^KR z=||i_k1ZW?z29tuh9~0EayPvfH^{h!Nl`H-yE&qc{WED7oX`~w)y;^I>h}Z$|A)1= zj*8>kxWRlTcv?^<)sHP_r27$OD%g0PYpIl8Qea*F&OX(@gppU--g4c+K?`uu4{ zTwUoJ$N;Ih+u&fIFlDv4-6lLrPPK2|+q+Lzsc+1w0wv3^bw#3cF}()9qr*3OIMl2W z>eY%!oOTDd&*bhYv?}sI`( zCx6&1N}Knk;2EaLYC63C9`wL3B=h+SDZbRX4fK$0Nrdh15`|SW5^(fzfh++_b^wmO z-YnV=f>$xnxg1l|VV7r2`>^tmlnLMoNyH#?#jxyULN`nH+zZ9M^V|!ecc@mH%8#I! z@>XcJ5&o^_I7BM3R$P$skIl{xV=@qF9UHNI2ggJd#RSABvM zDXL8pZ>**1NjKJV2O*%9%AADA3BlS2$Dw12dTd!NmXWN(HScG&7n-dGg4=f;3~9l2 zd%+j8{Y&J{1hd8INnFmz&);t`xoCNFKu-hbNuKJ>EBsxrl^Q&jxzJ#?Hgt>^{HCQ# zJMFC)(vkt$Vyh^k_t@UMy;|aiRGTw|$QVqqeVr@iR3eE{Y_(>nYW6u_Ho@>lZ#$x% zsKvMxFbfsUL@4IPD^!lbYKM;F2I+&Pk*qjTcCsKy$j(Q>x6$RFUv&?7eb7ar&#n3F zyi@KI?ItxssstX{WDb<3D{B3|-gXvTy86D*pT^`x=?~_CYr3R3G-k$|t#YI&rFEl% zMH&>ce(_`_@3`=?C_sFqXc632BU>nuhI^Bv^UlbAYpY45Oipy|J6)x?NN^4uZC&4y zobbTVEY~YXiM`+ z&xdhHsK>YPE5_)SPE&o*fNYox=$^x$}Q zcq~VRlox}_0>$lM%e|VhmN|8k7fvklZ z%`WyGza7+z^tjCou(BM1H<#)!8{y>#En+C+HNsc7wuJE!)0!&FjLrEUQr<|{*=Uc# zCxF=r(+hd~Qc*P$6blCx@+FVY8`f5nJnd|m@=DJWCN@qr*4HaH+AFX+f^d|Ox#5o& zx#=s)CYg)Iv0C1nNiWG^!IY2lxdg`%8?5H>K?Z%5yLZ0)Ih!;@w1PL=k)2y*4^62U z3eCc0?zWb~q4^b`Xaonka2re|2t+=gmfHeTYO|h%{4=YId3WPx+(0Tbw=el-q;upe zq5eXIRvNFGakpp!l96beD5RcrZ1m7n*9@EqX3xERGy7|rIJ?`^#W~E|&!@H}d zryw6fk5i$7g0`^&8~j!Se{dT5k1DfQth!|2xO-HH3pZVwM#@mwicFdQhPWYs#3r2FT*qXH-szLg?eL|qUO0rq!^-YJF>1}DvkRi zu5M_nw?nj`@sEm-fu^J8hCU6ux9O_C^SkT>x+o)uQu*Ifd`^(;P@_nZ?#5_q6v3x7 z2;Tfv@_EM9jbmxuZ-68pF3^Twvx(COb>J3!)Hu;R6UjwQ)?-0lv9--CL5j*;)vBwY zm{uyMFp2pT`~ERIf@>%-B;FK%rK0^ zG8(RoCVe(YS=ZZaeMp)dwlsxAW6qSuSnYbnq)qKs1~%Fux9@RR5I;Hn;24aZC#%2Z zQD5hk|3e`$c_sO%^7E%AfX?2Ftoq0~=t+nT$b}S~`4fmc+L0E}@{DazR$`yY#)YFb zjO$@q3(XgFpax$Aa{pUe_ePo4%TJ}Ew1bKTU|O|TbIKM zZxG;teKRP{Iqea$#0CTYq(%vey|8QJKxw)d^)7St)m+aMVvpoifTJ8ITZSQ&?6D(V zFXr}TFx-)IhvM=<((SMC%?_udgSiy#MG=H)%^BAPzBU?iCCi(SpPreOL($;^o^mS# zufpXO8v4k|XQUT}k!j)NM7A*C3+=!6Vu&7%4T*+ND!RQG2qowqrBgFuVy(BTsV5NF zDN1$B*YUWoYvL4YrvD5H3RaE`oEIhC&aqc0?tV=#iXGHV`m!zotZIb@$C3?2`E_aF;#_~t+%RxgJ7mK5NfWj+Wb zsZVBFU4P~-TdofwZ^<&Jwbge}R?Ye%6oY=I;U6uw=r5US^v50HxXGUDWJlci8OLZ-!U*@B$=rc&)v%Pg!u9Ea`ehyLmDS9PtA3Rw)qKJ{HBpJZ7f#Func zB)v(N?7F6%>)M~xbYYDZ^LL>0t{_bRRlp$nx8mZ!TEO$RG`A2Nci1ZWWP5J*s21Pt zXS2%y0Sv}`2prNUeW8^vq*T{gM@UKzntr>%>*enPD^FSr(AmNwzO#wH4Ohl6ue^OH zr&4$@>!s%WXwCFUM5k!q)1ky`uU!)GhM)FPxxsgu!_9$)*oK0=koVF5?nVzIv^@1` zoOn!-8b`%`Z>);#dP_5;{)U8Bj$tAyD%(D4OS|U$-i~^2Yf=idbrLxi3j5vkrcu@fiVD(2| zLBwN8bj~xC$0gd(D)}G%PHn3mHmG2GTGUiWNd!zFpJbu6@>Tz8ORgAXK2S?XNxqGk335oxakmjlE_HGGm-=BxM5);6osNZAOgbDKHx4t#((52ZcT`zePf$?xjoJ7g|&Oy^14>g zErK;n+DuX;*z4v*1rPW+ZkKH`6P$TKfD$$4(w;MkE>itDz@MN#(W%&a03 zVIh>utm&MPWwZ4e`Oi@ri(PenhZT|4p_OpWwosBUu~=61r>~ zyj5Ya=VUm`=QmQVCi&s=tw7B~L67+%XlksSE=I)j4{2rc)O<`7`J~hju`s-{ziL<* z62jRE@D+e|R1J>4AA4yfCbxS##b^uKCur{e_Lbs+jmYTnIf3J>W&fUyA2zBGZ6NFT zDd>Icc4J(REi*3DmhX?~H=H<3&4dTkYoIA6Op?yBsZ&>@4nxi)`)=f<;*!ihY2+i*YJCAT^tfPwaa8dOm zPPDL}uVv=J0-xLdbytG;V}*@$~1c!CMtoARV}!MZF-(-J}Dnxn;YF_jv+WzAaCUB{pD(GytvX(qsT=x^DIT5Wr^6W^WR zQ{}@Smu7+TJRY&*M9V<-9#dh=mr_rM5RiM*^E1KPT7+Jl#9(v?q(U}qlFAuz0usXN zj#MyAT8_|zuNb^;-{b2)9Sn3Ds+J^CVihIWhmKcVi(tBvk~>e70s)@3IZB_<@2vBeVm^*PuapNkVOBuP=3}_rtft<I)x) zZ*xy4F6>=-+O>OtiQI?}sMFoS=wf9fV#CnP{BuS!ZtUyc9RCg<_NXKEC&+ZJLOY{>sdf! zE3U7D>bAEinkncyr8-?+c`L^@jCt^>lUGYY0fRoVpezu*bMM3vmlP`x#;Ll3ksAHWefR$?Tn!|Idk#s` z70O(i(Bs8FWJej>9-KQpY#@&C$m3t6tnsFAICesW3c9~c{j6xm8ZV1hi9yn^rYMN` z%IGL~KSC4jM_A7PQqZtYrulrMx6nNOp{0EsJ!eF`zW1r4Si`0C@eBBSyMZ*)%=U

2X!CUB>$`5H^gkZuLlO{6S6t<4Qg99u`IsQOa1JAO%>To-?z%|yN_R{L^Y2H^OO3~r$ou_ zfro9qiWKdAa`jjVh9wS*eo?~S#pEv>o=t!(?4eTJKU41^BzI2oQnvWY-z&)8;ne5@wKZJ=HYkam+FiyI`^Vd!iveImR`pJ7xqwRfn z(ZdjU!IlPcFhI1P(4kW>Q9qj2Kud`lB^I&~W^)9tF1rl#*W)R7rP&dq3`ZRduxmp{ z`*>}?U<q&d^c*~_x)TZN= z+ph$}iGO=)U=G{;MiLK3nSetPsfjEYv|V^6XGb=_a&(TF1I;ujuMaifwY6y1$6&pY z<(*WoKd}d{)xT!;Gkc<)<=O54Fl5aR=82w1{XZV4RFJRn?+745u8NNJYUz$GwgLao zq6Y6aLBB;Nyi%p}%CAh9*w;t|{~5Eb?>zW)Wu7rE4Epl_wtPKgAG*CIIHu7PfB*Q{ zGB86oYW}JNby6K&H>1ai3K)JQl-MLSjmP}9S|V{`Jl|M)C?Sc<_{_K8IY(BKSkP|0 zz8cw3sduGp9jL(qU|_X6IRV_TNI$ItaW6bGWj;ziN99O_4T(-*RQ8cEglqOqI!rSa?4i_<$#l?yy4sFCZ(_GWXwa`H zqRx_xV0IqMPV!Ukg&iA(K?bI~?z#T{DsB}k$Z(hv7jP|-U6z9$!Pi7wzWe~dGPlxN zw2|{2-UhM)8m({}j0yp=yIxUk9D=#J{7}GCRVSsIkhO<5_nTbuxg;-e{%`3othmJ9 z!`b1WkMD0O+c;_&ZR+@Vd5fI6wbI{X#9syyjzYM8*>-&c0l$QX1O}=`!tAc+Fghr2 z8kI8ksSN@b`IeZ`SrVNuJ?hPj$+~3Vb{Voevj7+$b{V&jGY6}bXpa3BuHTsuEEtfOIsQ2z`I_!Tg1Cz_YG9?&55&l<+_U{JD1w3GK zu~%w8w=oD7q;7y)1y-{=$<9!X;=j&;8uyMY>9RV1w{`gEQ{oe5R$LJOa&fxqI~hc-`bdCm(G*nbzIIVa>Fj*YGD!r`geV=yfs?_QEN_Q5&WE)!HqV(gl3p7hXH9Uo0zWdjIg@m`K~Z zI50kA7^Yq1BZM7mq}Sq;hs_#2Q& z03QJSqm9Uh=b@EFPn#b?NlT10G7Wj;`SNk4pn#^hCXk7sZeeM3l*M@bY7|J#s=XnL z7ef*g`7#43aUe!RgPzH1+GuL&R&qzh+v`BA-dq{HWZp+7Y+!DD6hjc;B?5@`&!3h0 z%szyz$v&sqXIQf&Y@r!!HGHZNA%{oH1_7P<&30pD zKD&4LU8?qK_D(yh_uvm?#jJWZy-lc_+9uU##_%Zh?eP7?JF*|O2m)ZD5Nn7l^Zbf; zavjXe!7OXGsK^Who8ctqG zsU4stI?Wy&bZ*0~B>W$fLg!{8m@u#Sogw+=$B&+axSRGrW9q60ZX++QwfKwMY;Oea zTcmVxmWRUM(YH8ue{+RDkn)RHA#Stwsu1DnP3e3&NIYVEzqxOP5gfB< z+P_ns5cV40edQesWBrE=)3OcL%eu3yhi-zEU_+||DyVzIbv$u=E7fKy+V}3o2JjBZ z3H`CsCWlZ>WW&8zLt-#u(t_7ng2?4PK=trNdp+%b*iEpvJS{mh z=LoC?uR*bFgIvy$Hwtgr%KVV@wanvgFJ3Z8uhDymF`VHxR&xFDErtLYS#ce%M6fHFH-|`JTRLNl#}$PC;(-&1^YoYz9{&6D$m z*=2iCb~II}8Z0oC58q^MsekspBzsk*YV+Wm8yei?*fAL;$5kwvThH*QF{i`oxFIKU zuw{FycmoY-NaA?pJDmQ+z8vw$*hYMIMqI~=bJb!>Oib1IQ59r_D^V-p43QH4995Ub zaM$qX9ivyFflqA^w%PK>FFi7MCp#41nwR!|&U2D8DK8}}+$;)&`5W&xVV$Q#3k?yc zn`>G7N6O)g-anqHK54$=-dHmywu#fUKFAB5pgI9z1~x#GWKjkNoTp+f(_Hlfn%nNJ zvpOjlK2iUk%~rbTKW!6XRCyL5S;Lr^ydAo6(2z0E>mbjLk7Vf6E224 zbhm9Ve%2hteD8jbI477?h$C+OWJaYi=>r2yezdU{yAxI)42otGWHzoH7o=fWckCNx zns1iTyiQVQXLS|E#?S;D(uZ*zIBKU(!Wu{{Mhq%yS`s!4OR#zs$$Q+Xsw1Z<^hx{r z2B3$iMq_I{{2*Zo!|%(;rxR!zh2-BDiXCDo3n_l|$Pm_gVX65i`Ms`1!}5kb*_rke z!jzfqqEC2w6^QN_ZjtJQE#9z`8)ZP6`8l6RP2ODndjNF@khAcZv}U$k>xi6k}qGY0Iw-%cJ5#*{bHr5f3)0$knW-7*8xyL z=(HYRr@XyMf0vW&tvSli(0YtgR&MLEIfj^%maTUdE%H)glzpbX-m|rt{*lbI5A~_^ z^{*~Z+t(UYR#0MlWSVWzP0mS@Wtp_3B)`+2u4%@n`kk~_*rR#%OGjU9^KABOK9sKg z-j>@UQ65NWAV}mIcO#XzEP`0LUD@@qeO17_lj2Rx?^}RLr8-Ch0pefMOb03U{MOKi z_HZfl+y$<9i#qP%u4W5YiL7F@RJXh`n^An0%iWUe3m00xyY{w8gD*Ls?>bM%VHNtv z?d!dczolKB-Z))?y_kJ+h^ld-6UZF|cFH%AfHk4KzCL`c((JidEr8vVM)e71srqbc zO7I#so#LwP>CW4ENg&rf{Ahf6`+9~e5b(9rOumJaK%KkoPotgxG8(r+AgW2J#ceH} z^ug(u=K8hPdQWae{4}0vgZYw+HZ2Ogn3J#g`XAvS70ma&AG8rZioYLo-*AB>;^9$V z%wuOA;alibA!$o(^vKdJG@B{S<=AC*rSIjO=s9jB?Ofx*N;J0J0}X2{2rI(h!+ti1 z?R>o)y+Kqf@QaWidNM2rQ4@draGneYjlN@zm^V>}cMKB$uX|&teUy}uEL%)rHt8c$ zKc_F{wprM|oarIx4kY<~%CxMM#=8bhI_Eqt)w%i&?@Vv0C2TNkQgt}1(g=3GDKqFj z62R`JybHRDDz2VmP?aLM8o7D(vOiK4vvz(~X+Uny);Qd+ts6BxP8q6%!Mh!|108nx zpdjLv=Mk_^gb^L;1=@}id)!4Itb=%~Q8qmJk+yA3%)*-CnCF6xWuzK*CaO(ER3`T8l0~3H}yS=KNp~_b*oY=4y&rdJ;DmU+LF8F^rk{} zU`jd~V;ym4Z_(Y#rj_0>mm|s92 zxA03Aq-R)E{aE%9?6=S-<+vdp;&wYrB!@x?S+)H*!hu)Zv%z@= zs<3r`=SrIz<2RPgOYY@{2h~?qKj}dRWw`=i!`4jQ#idBvxhAw|@F%?Q?@&8XH4G(C zJ`VYDo*}K@VgYP#C;Z>tI$-qwmffCH%L$Od5pX5*Fr^A0>vC{m+pw(#*U_w0B;6;{ zSKFSBuUAjqWBGS5tp~_=W_@K>-6UXSS3Ti~rO(^L*=pv2hk0>0&CV?V9=|Y;X3Ni& z8%#)G<+L8yM2K zhp7_rYpSSt{wiwRm%q#u?tMc9a@zcQxklc*^!_n)8Yx|Rvrhu}?RI4d zLtOmKIBJ`x$pH5oF@OSo6!I!L#pQ*=;q`W#4i8Ke}%jhtdhlu+GkipzXC zT~|%0fSmvKL{(CfcY~#vKdiA?%VNcs9JTRf7&iN#Q}9d?rJ@yhj?PQbN>lzeU~St! zX7QYXd^LG(zRGl@(D9*@BpNaF_c*d9d+& zI%uo*B-K8sqC{LfkZp%aQG%v4i2S0a&jNwgk`W8W=gYeYw#hQ=*v$PjNV7e@1qmZ( zai79bslR58^690>gHyzQa{@&6axOWDuM~Ql^7gS9io;nS@XEpFU684^$a}pJ_P9^X z$%R7~GvzF+iiYVo9T&}8>jkb7THr z(~e_$0s;;7Lb@%xnz#4AY8t{3Tieas(s=6l0^$rYFs6f9hBOoF!i@8P+@qgH zQ>}pMk4UbtUd$3UzNKkkG2kO3wH0J8$q=m-MFnj=;ZyA|B(gj;lEtTrU&I24(Qu-71WJ;~Y|G&4CGTjY;Aac^1Z zxt&t-nz(;HUGEncy^6NVi|u(!URoOZ6%{^J!G;fZxxY%JQKq>N`MEFGZ_3C7`taXo z40-usd|$;hgm}d;>Z*PQjZeFIIw`;Pe=k%68Pe%~e~RJ&(?|imrm#~JmOPSxS_O!C z&sUg+ZEAk$HmR7M*Bv^wOSy1}Qg1dDA{dsy!SM+xsSa^UXcO_@VYy?qt)eQEIcxQv zewk-(N_>qVMY(pXxg2PL6ZZw}2gK}~6WQ-?F_F(WhzLt4LVLfGY_28qwT_H>eA&;k z3pc!ixTrGCrpR&*Z^OO&-q%=DGBq;}ir3{y5PfP?+o%cqF5$4p7og`GN_GA;LIO^N zKSKP<+P`_1XptoGJ(ocvw*6_o*Axe`<^O{?vUv#C6H%ohxuU}*VjSnJ3H71~?)S0F z)mz4q@iLP^Drv1!A&z-)LacJK=1I332Fh07VDt}p19eS;;Rf^q&M8w)S9dX3GbOk; z;+z^+A?Fd3?tr5MJ2h#p07qMbYU5V6!67s+F+nZ0($`&4a6MmlRX2`{kNaWpPaE;? zZVI)Psl31t<o9fZ?spv48#pR4pEAU@xms#G2+>Vg+9kWn zi%=&lurFmmLY2Ces^w~is&EmP6hWa~30ugv__d+Z-d>Naw>RpNYNhdD=y2q8Xs;Hz z{wf|Hj0<9+WXA@ce=!V_#40Rpi<4i0`%ldo2Dq8=`is3>;$cRbG!RJn+?<#8UhPm_ zAY3p=D$3^YesjDMMu*`(jD50U&wCl6yKaba3CNsBNmn7BgA(NTNhxnvQrr`OQBh1= zaV>=D@Qe)xRAbVNcC*iuA7xrN+deFPw+Oj{`yvSTO_==y!T1L>1J$}wTy!M@D7n2+TK zDKBYZl+W-U`3O2?VARLWPfP^QRPx9)r%qkv^j(?cs#=Ge+MAJp=$&t?ih{cX%-^aA za<^QUb#TNkdCv{koW*h4H&~#-?C(J(E zP~|Yh&19y13WPBHczgQe#OM~V8+VGw@2SqY=B;!8Ht%wdy0EC0yPvO#N^tJ&N=7_< zTE6@XImk?^!|>u&_KaWhd+rMiyy%E%MqA09#+gZfCUR>bbt`R`YfcA=)^L*h;Qrhh4X|u} z|LA#MyBG~I(gxQSBJ_at9Ha(9I1%Y)zBbKxJ{^{d4qmNrH3x71PC7ndCDu^tzn{=O zk;;YHjrq&UnxRJJ$#4B)~6`d)|+qM^P_TV@S`dU;BC?8GVw4uS8eogBq}v*W0V^&fDO4q@7Ck%>>-w?$F~EV=?SX_ zkymR?bt`UFnlNiWQ`r51PX1k*=OS~*186;)Dh6%c+gtZw+;#4ie-1nI9c=6r}2v6~0L9odv7ya!=N~X`DQZuAE?I{)s9{DjOXj{H-pEt2agcIu?UJUR~es<(_#nn z4QJd&06f7?EtAeg3)Z}?4hh6pn#hw*W4Q?fd@MGoWeMZC^sV-<7gYFxVe5y23I>+0 zR+jUJQYzX!4*Dz8gPp@(C7t$YMT1mWk6i<0-tDlH&`+!bOxugBrPkpjR>$?V&faTN zb$oDecm*5U6-)TSp?bSLKhk&+vLaXhwx_ccHX+9cvmz z&}xltu};r6RFb*QU0M7rVKj8f<(%Rk*=`tMGdU{Oyu7=>S7@T?D-R2_z%PhGEc|_c zmDr$(Z&bsrWT9Ah-70&>?3F^0= z&63yQT`N{s)4BD3a80SHAEsDdQ@TWM53O?gdcd4OYI!oYlutmr);4;7ua8zJnk`5iP2@F@)mfa_aT z6v{TuknyP#j$q7KYXJlONJ0vg&*hCo71ytIl(OO|Q^7nRx}Zce)&5*2`Y1jHG?`!L z)Ss@umR61iMa|&6z#Gql|9!rey=2aVIspfaTvRhGLPiP2ARYCNJ|4YmGKYP!F`fj14Ac$2#|>ixA)$@5%X;|=g}hNqS13cOwxJF1g89s#<^$Zw$RhWA?;Mm z%9#=)aQBa5+Hl4%5I?*DTUi9ID7{~CviRFtxntr^uGiN;GjVym%XZWE67&N z##R`AvkHO_(`#?0q~mRH%hrT8SG77^&j>G=xvVQ$5y8GNOyHxeXeXCJPnC4m(F@I^AJQ?sP#?Q0!w$HS;QslDJxC^$r%*u4=oi7ku>d z2|@g9O> z8Yo?9pD&nfZ7W-waS)}!uQnAr3BbH=f{lW#pg@O2`t{*UnW2J-;)!PdL`12%-s$OQzPuQJPv=u%k%D; zqNELWlnSb38yN?wPi{6v`_r%QhiYi8&x;d*Br4Z+D$7~xS|aBn<%uf!Bru}^j*~g= zz9D=;tL>2FevO;U0|lpTUokf;nCHA<`)*8Et|~5$m|Rxu*w^V7Y? zQgq=$^u;A=?70OAA;9RnCB<6w<(GqK^e|5LAl3Or50+u!BHq%>yX-SEle_|NT$NSt zbcbEGm5jOhUp`iu_Klz6VqAm7Z94GMBZ8^OF<6o`S-w;w27@so#LyW{K8!!gRoN_` zxvp(PP*CfzBj`u9*SIPpQic8rI6^|uY>D8f1W41Ci6B*a5!D4q$39O131q~)!=(1Y zeVf-z6FHsYcm9hHXJ=8B33x%{+rr>i;ok*qX3|z|`h$@?-c#WI;2|AFnQ*8`4*AGI z{RYMdiUCIRep=rCfK321dZbHII^iHa9Cv7SVb%+w)XQL5&69u^7Zze`hP^%Sxrkv9cOk%*XU&QLRMs(t6%^1#XN}g~$+jHw8UgAj81; z051a|@)MWvYC4{nsi*)oiv1$tDgQS_d=A&Mk)2ci;e^ia{B*jAT@}1odaAHQi7cgA z9{^Lc43+-@pTcj=xZNE3f)j5U7iyK5zpRG*5%Gtb@?{Y1rBgBL1TVl(RO6~5xav%I z3wfj#I#T*Kqtd&Ca(XOtc$a-R`kBPA7=nEx8Vos@7^;~REcLcVw`*3>oKE~kKXrhK zX01w(zFLA@%WEhythZTu0y=MAPagL6JQ) z70xwbSI#ym7)KP}F|F>04_(IVyN%aV7@Yg!LkMizx)@{Xhc!Rd#h!)9EC#s>Be?R%G`a5c=Jbw5 z;T;e8t~BA`zopTF;lT7Scu8U`A&YXn;%1-`=|bLY8}7GU_{%u0a*>}|F3|-Iwp>Rm zj@jf~Z&F1;+i66)sUYqpdwBE;=qLv0pL?7;y3F4%bYHDt|gISicnethX zXKOOv{l^hu8mNsUK!MI2iiC zQ<(PEKf_eg==pV1jKd4ylPt`)4{y#hlP;x0wSqD*^E| zjdwW+Gd7!iq<;w_CAjq14B?25V`1r)WbQDR0XrboXRNVh3(rZmEab69S2j)1M2Ywn zsG8xIptgf3@`Yh3-wpojm>EQ0Rngj_9rvJ{=B+ucMb-e3gpwj&uvGfU03o*f-eZW5 zc>mscG#pg_cBsYd(mKw=(Pdxk9+RpkaGpwQv`|88x1g^dC9g~B}w}`#Z(k< z*Ku{F4%zh*((1I+4Ois?RDToOx^i3#gp=Aw7sIb&0vS};uNN3#oZw-L*MttRC&*ZT zq2h?h9eUhdmu2^@GIHtQ_d0=&RloFc3pz{rS9UIMJn#Z+1g1nJxAp+0M=mWFYI_JM zql?FkYBNxy3$J?clhHK_?+=naJ*e2#@_qks($8tL8uM*cApB`SH;f!E{4IJts_w>n zUOEnIUp}N&M=eDl;s}sX)sk@7d`OcQab6sCA5*J_dFVg6>!&9!NW03gs@?FA&Q#bn}wpYzw&3>9ZF9MOV>FfggoGH_f9A7Ko4dmpQbqA{(Ha~cFpln>!T;tP+IFeYCrsvV7 z86ZEurISC5(@Lot)7WPCe$x8>@j8Y&P3~xjQ*Z$NtK)a~LfHC`*YKtus>tQ$kLR3> zz^3Z0oY2eT<@iEC6Sy-n&bm^c@%=gAn*x%fW>Z<{$llV|Ggvh=)AKk8F(9HFU*wg9 z9uaUk{L+NU=$y#3EHQN4#`@zI5e=B`3Qwyyrs=KLysKtDL(1xY7SjX5ygNY2Z&R1X z^M5E%t$n|uBv0y;68@MBjx55rU`Dc?&o@09|91E4S*HgG{RP0O@E1dV%x(}u02&Y> zJPY`C4P+UA{6a8bk_J#!M(5v35uizY5oYosE4Tsb!HN7A0n~p~hAj4BbjD`7cJ)9N zL4W@^`u3AkufQs<_S-pr{_s7`&m+{Q*EN>R+EQ z{@7XaKW0+^MPdp-Tr$PqeVG~qHnS)$Dne6LQ6nk>Iqc46b^@DImVrDr>lZrP#^yf( zPlHSbZS`Q))xHJbKoD^xHdn=O%>WoYd%!4W+)o| z1?REQ6T3Y0q?Tr~(M7Pa&RF+8%VQ5AL%5y3=vLZjJ4n*lJeB3lgwn#D{*0B<-26=` z6Au!x3sG{D2qR0J;FSpIc2p4IR>wx)pkcpNxn=>4Y%MhsGYnCXDYx0P%qAqtZZ6Kp@Du9n~r7y%z^3r6x?pkKN-(O+&>vl;8gQ^f0DF~442MV z$G=HWV`^TlMMt9pA!IO(bnlKD9MC7nNY zYx`8n@=v37q-~%>&ADtnNaZ7UR5L3-N7s!sFFBRRP;#&FE#ss7))}IC-6nj-#qMtfdBUdTm}IqS z&omM@Y0wfFVcz|%`uX%|#RF&}rp0mr{0t@tkjopSm-?;s$dVPtC8}m6!QMYh4H9(I!$-YK~eQ*YKg3+-V2+q<^5xyWxOc`~2_eUY;e7;V>)m z#l26By_GLoR8IcgU>&+S?5@WL6ma5k;HqgRA7$+-=@V<5)1O501|0PY4Tf4STrl*) zK~<3yD%G5t!<6lmRax@EuyT>o?do^Q>ymmOJ+^;iaTExs{4Fm>Uo@G0-<8by7d*IS zyB46?>f~b?x5vpt7{Y-GttKS3%X@qB&Y)4?q};aIz|v7ssFVcPg0xo!FvYW5%LpoU zH!|Az7LTd>si>vhhUz*nnvax9N$v(Z;(G=S@z5o$Rno*@K#kg#AtgzCZffJGPyV{ zlx;0u&Js!e5ZNaFH8=xnKwQ%z4o69!S0>~W3BxbQkoC3>Y`1o|5iuX8Ra(Tb?EI)TLJ&qYLI6;=FbW;&p$lRLA(zc>>!gEozwUL)PF9T$fY$DS(;qp zc5i0*o`zjEq}5aE*{J=_JoG;m68=_no!^*SXNZ(gJ-RThIvfTFHXXL$oubA}=PD%; zY^*&twXWoYn_9bcF%beHsna=n)0^bt!-xMXzo&AW~0x82R(!4 zR73-yQUnOLL;jK(fd7KwWJ*IM`A>S`^MKI9T#x5}!ej_UfVZE8%>Tsde~Ile{@EuL zW)vTga6cc0WH^6_iavmg=>ZGpK>P24{(0{N$N%5+{A+GaKANzp#A_zdZeK&rN^Bs?yxZtu2@0_s_Dlk)JZDfN1M z`m<1+2gM<~l7!6OO~++HMhnK>7`&p!D~n@G)-<9;{1HwGz(6PR|9f?!6U1Kk#mWBc zj|?{IL=5t`S}Gp$;%m;_I>O>~=2lgil5K3cX(M|ek@xv0k)Jx`_+RCHWmFvb-X=jp z5=cmJ2o{376P(}#C%6W8cWqpQySrO(w*bN2-5YoJEt1LX%-nn5efR91{jwkF)75lU zSJhLG{r;7*NE2B`w3C3Hahxb>u!m0uk@VG4aD+^;+bSHDt6u`2E0Dt}$QIvNJ+33% zx1*o}b8nh{L*rw6V*d;nh{uTQ?J{!QO`Zll?zPLHfzX!O-APKfKM}*s>}ytjbo$(gkkLfF{Pr3amiC zZ&g<`M&D^1qVg!T&b=zeGHq_Fs6nefneUuK>=_U8+c(q@8)Nu;&&A*MerGUz{~6m# zn`B;)^PLhM%BLgx2`WOk4n-oH(`=ZmkjpcWC2+h|5^JQ_%IUhLaA+PGxSolK@!=m3aOhiJe@rqW%-k$}@8yAUx%0*e@p7;rq6^5y17jP+D1A(4`j*aM zlZrY*kv}m}zwkd`B3O>6c?OOfZv-btB-b_q3tn+&Q?p>PedMf`ggT_R8c1b*EN+9a z)&(wWkcqy#1zyJ@Vuf<>BSTaGqCru71oyu7-3X29xu{$YgGk}Ip-o+d$Zy<%|BJJ+m%gMPfU1K@y(^@S;vPaCt@M(xk3HWf^jI!W+bbT_Ruu92BA1&)uL!-$~& z2ska>_`~NIX4DZ6-#-7zVuNXPgj;u46w^1<4{n)Pf795W6K|L-O9+v5gAl#Iay}x( z+R>E$DrREkA)9WBL?m zfj;z-oO9l}Uf`L6J_v>&iv{J|uPFJ{;-OWc64%HGi&N#3#_`EHn%PtlA=z=GD`d}E z-=}x#4O->p=Z|97H1l)TqZR_cK{XJo6se86=<8l!X?!crxwO4(yl~9IxdBs${Fq+k z4%!o4()W39JvMU%R9jcgy)LKgPPmz?+qPbc?t2sL$O6yZU@ z2(|-|uNOODvEzc(`7IEiKyc3v1IqWFZT;N-+hSbX)w4E%dGo!^w-Ex1kqo+HhqM`j zG;j}NO#zbv_R6me`B(G`CE=989n?KBY7nf*4e1NUXjE4GS!EUC5Dw*tm3R0r@_JB4 zO{=QwLPPDA;Y+lvs&ip}9B%}~f64vvy3!wD?(yU$Tw8Y@C(83`Bio;rlEywNZ%{lj!JUISp}|1Cc$IWYkUI?6O`EDq<{ z0p12Z))wZ!BZL70F)wOevsHlrDZ&35@knbQmG4+1dXX0n;@K6sxTz;RWP1+L8qQd0 zET~C;Ri-BZ2UKT;?6X?dZ?$>n(nS6K$4g<}6_PQ)w4c8%dbI3mr6ntj z50J|!L^Dtc$7uz9MqJjA(g{ER#j!7_(Rn0_@LDg`{ypTa1^yezdla1kp2+=gd7@!W z?fKJ8Iy3BE(GZb@a4CWT>fj6ZWAd~s0z{w>*FAIiOKvWghDvcu5wfY@i`WuanmNGR9=csflEAL$2!n^6np?$V5AKs%Ji(tYcazZIyKX=ffKM8M$Q;D zu&BQyk%J>CO2$tk)t)U7wz)oir4}63U@ERQN+D$sXSehRk&eQMgB-$ww zcev-QB&4@QUi%Embf*OvzMs~G>ZpdJXPDzUCuBk2!cFf1c5FOka+sXnp*TZmI_+f; z7|m>=SR`%qH(sgq-tgq#^GdQ<>@N&6dJ6&tde~VM%iW*3(mmh7hWu4kws(3Rzcx+o zX@mIIz?AT`pwShuUe`8@I9&IYvV$tBJSu#_Xrt$*SGfv1`K@t?oS7WrF_L>kEa=B> zBOP)vU~3mSW(bSv9bm@llg&gwR_YQnOUsjMZ;|+_KAAj5;NJGv_yI(n4uy-W!ItDv zgXgdKfhLf9$T&MZc`A(Fa9Ge+ww^XC&5M-`h5I(WUcx3x+JRMWaCMMCI-}+vgcBj> z-x5wQMu2c4#TuHqEmOH##bpJhv&vxr?F;u$=+JeOWOw?e?yMXM>OwjN`CYypZR+U}k^fm&H-K_2J!GfvK$6$dru7UGE z31?V*3@Ncs;FY#a-hbkpJ;@H!=1+Tk>t9C=sW?SV2LeIF;EHQ_zo%3h+`C&_9Y)hw zjBL<)pJFqvjk16osscHXLlsV0sYP`+GcL$$wtF}D4SY;XrRXUSOSQ!6>NK>^mYa9nus{eD&%1ramd1nw1Dj$Ah zF8pufHv{~$G=LE=XlzWq{;O2F=l<7R-tXZrzjAiK>belWw;eTAcav-iU4na^D)RqM zvz=@LG}{bWsYGB^UvpXmX4(zgdR5blmy-zfN7ot|rZu*wLBbhkpD^hSFJp(_$9jVd z)jN#dH<&!HBwsiXGL1uPCQ)|;B4~#J`AyF8wdvA|O2qyRivBYTbt zCS6sbD}~GLFz&Kf5h??Q7x6WaNTnp=;Bn5@Tt+Ji9|`cTsmXT(K#s z(4d%X^{9J+7ip0yA51DePu(xjZS9oa7g8dW@B$`acoawcQTeG6tX&bm3Gx=LNLAKW;PYVL=;Rr-(}neoBh;l!#sZLwFeRAKMsb=L6?L?KDPhoi{4HQ*?bQ0AYGxzTXxj^4Tgm{Xp(60O zKL@>Lj6jl)m8m)nJX#_I{}J;04=6jo!ghQd;MEG(+(V&^Q>R1IzRaSX zbu1G1Cy#}GQOOMO*g!QeqH-A3SW#8qBU7?HTI_%Nw{vcT99J8o(AI6E(d)tv#!sB6 z+Q&S=iIM`B`l^7F%hBNhenmxe9#`Anz?k)ju)-#Fz#eoguljzB!U9;!e1+c?;g@DZdu0_o%GX2 zm?=?gchkmBR%I}%F?}nw`KFsm+cHue?Uj8fN8oEB-EUjt!k{HQN@8LI3pwx{e_UCK z8dIYC@iG-3A%Vq&&$^>D2119=qpmdkl+p==~!`qyKS zXA;C@Qm$FyceF7--Uum+!&3|JO*JprWAepeAL>tSZxSbKB9$Em6L*tF>zCJ{ig5SjIR^Vx8mvVb6IIrl)^W6{nU`LCG$Yc>T0w;sgrZ4IiaxqgPh(<{blNVPqG)lKtq4P z1Td|hUAJ8{zx(#K1ea;s$4GE7mf<=(lQzRA1cSpv@iOOJwt?yUY?Txn8W5aQnxdn2 zm1;VL97R<-O z|BkDQ^q*bT#^#TNt=Pne#1?*rb<)vmnTPwO#L*}~t?_g zb3To4)=%E_O^7LBU6Xmq{LZk_H5i)9vw;(gvjAn4Fy{A4ILv2yv1G{Hh0a?D-& zHhOP=@nL}(K?B&3*<&`QOEDLu1{2{Oda1vcydf>CbKb~% zj_~45+#+cy48qk;!@qN1ZLJ%UD(ExdTyzvIerVTba`2H9 zcOfG*x}1jcOBIBE=K8ZBx-7TJ*Q0yxf5x+5Y9-+;&4{0?RCh%AkyY)7h20GgLgKe$ z5LnTSgUVvVFU>ss-SiYAjGn|qK5EYKH;*o?MXt=N7+@X&knVMWP)$fB%>u>|K(JC- zx5dR6?0x|w$w+fadm>;QbB;%`6FlFZ438kc zxLnJu=Ma#_$0&@L5=xNyPBe%YY<6cR7cRGC7ws-00$8*Rl?iKKx|9SvRh#{@cC4h- zaLf+*ZYHB;A>BmUemS&M>}b<5%}bbfGkO(H%Dr2i19^?m=NWy=o) zvwnHD6o2t-TTiSDlRHy{(|+jgIkPeqV*JeS7q{7mM4rb67s>z{zqtLM67>_D1pM3M zT1lS7kBFb|a>f(Fp=Y4)2v(rkdqra>5DzV%Q<41ycJkCmU>C^ZJ%6Omx(RMH-XZjt zBrKf){MRx|AroqB4DNPHT+}5$fJa2yK=C#%5}~!Fc}qS31Q3mw5==UaN0RD$?NHck z5AsN;rsW%ARI>VYOO+z|NRmCA@F~KKPt%0EhJr<5bdR2 zs&kEz4WaQ0JYwuNDE{#>OZC`ZcNUKBJ)k)0bdDya*O&NuvH-}ahdovcM}0Y50Ut^J zL9SH@Kl<{`g*ocg4pUaRJR3#bD3euL%UUn&S0OGIcb5FV;nT@QBB^~Zs_+ds3FkRC z7^&9f7U+qcHcm}H{GJ^EObXbP{+WvUbNs2%#-Kx(9QoX>qQ-I+q$Nx|`J4c1+2`Cp zL(sr%qnM|2dVfqh`r}a|^B=7~;Mw8FpDMWFz`qGib+K4|>Qh}3;rGxl=y#N#>9_|c@ZO> z7ki_6dQwNZ!^~f6uZU18d8MvmFc5CDq$$x^zJc9^wUV#ihR`^Upj)n)AwJA`fI+3X zDtGAAdz+mT(8}bC>4ajZVLcy|qrD!-JOEjOtnu%uVkrDy9_QR3$YB?;+E?V~Uw@Ic z8Bg2h^$m`S{BVD;cOj9)o^-X>eMh~Mlm4kj_>XM^R}$Pg5OFlgqx`@GRS)y*Epq@4iSWU@XherKR50Ue1cK53X z526VS_vfY6x%QZW`(%ly_r&VX!lqK1SFSpZQ|M$lbA@NPccRZ8q?@tZB#XjLD2fD68M=kNN)+R<>%V#dg zRdE}A^Z0p6RmRFG46Z8lwh6U~i7p`L7VS5O;m~DPPq|KcZ{SL9;8&l{K#8FGC!(3W z;cam=;9bWGHKUZV!3P%p5eTH$pTqXgLNOVJeau=~E1v$iE{^K393~LrfxpP>LR=&u zdWolL=tzqE(Fx4nS1^V7_U&X-gwtAAX`vH6b+cvato+6sB)SvVPdn%0d~X?6S;n_2 zfrCXWM*_ViEw+waLXm=Znnw%1989_Qyt}{$ANcOC)`=q8iD}ZR7gA7&_Gu^7Y)-2W zv`^u8hPJhNRwf##ZtbYAvlWzm53}wp>L0SS6deT?>iljscf2nVtKoKR7PvnX1GMkB z?vWncdm|m1_28mDAVK%Xy|^0FB;shO5L?HJH1pV@T4m%tLRJ?Ilruvp^7F-k z(n0iIu}>XRQr+iKv&8J|HP)kx3hVbHX_L?sdX57}p1gw$aNKT|`BaTHN2?KDscSTDqG84$`jw@=(8jn5ZtFl@m)P(1@69%I+8++pADGl!Z<8O?vUz$?pe8iO ze$MQ>S?T2;wXD9%6(6C!wx+^;vNKqXdc4=*g0zT;yT$s!Jxc!8WOSj`bJaAd!ftjV zz{MZwtJTts2Wn(F1}xEjlimTztybD$waGx*bNgpsWp>G5WqUqeqC>$Ia!|na$m{#E zJCXBhtb3GP-DxN2;jR~L_Q7T&DWY@E`8|vxR90-79gIb7{!6!QY!RggIUS96xJu`O zKMHSq@i~8phVP#dN7&0JiqBmh?T#~MIagQ@)v!%vi&4B&gCX^>(>!wT2;nl5Q zTzK{BnY9YLatCI-4fKnH+a`)4J!vN;1Cg{)!EHjRbYQo$(QK2 z_DUI}#+qi;YXYg`6V4zg%|6>lsEo4Pym4z$cN4<6DLP@SB$!ci(y`gE3(@Vn9k@f# zrKMWlZ0^*pG?_nV)(U?mzP{bLPny!YNG}gS$H{cL$(_(4KQIaa7PWk%y?jVH`s=iH zy`zR2dFoopD_7<|Cfvuv>Hho-=2>9JNP!*#{?5V{EiJ71YYhBwAW`xDt*|_tYe*vzh3HG+t!PyiDmotrMh=I*Z6VM zO%+N=@-lDCV!Fl%}bk{-a~^7Bfk9{AG?&;>J!*^3EHbt?^M-eQr@1 zZD_De)w?Gsz<7oxtPkdw*$F;^{QS#hi13J3FJHb?2Q@kkrIJTJhZrKvn`;IMc{G*| z=KY!7A3~*~VnrChI(BS>SpqLbP=k)#5vpB6F(Bfw` zWR0zb_jO#SD%=Cf9H8|mD536UTYU6e&e?TV=SzhWHI85VQe2Ef^94fn^_V3da9U8p z9`7RIY)vq8mI-nN5{6@y3n&)O8&~D}`T6a;IPN}7aur&vZc!;^8DN_%TqE5(sC})p zrtxC`c6xQIv+%-^{UbK^C6wU6os(IA`>e04m9_J_;>EGVIWS@`{kU)=n%0)?-pOq5 zzD-ZqI~LK>4)22aGj1%=oWuf)_A5fc0&u}a`3+mocK4hoQAYDg|KZZ&{XWJ`P(jVZ z&a$F4MeCyqKs}S-qESe)3JTM zeN4DO>&fUb`4TSqqvO)OlIZ5<(=W>@Mi+OZ(@QU=R(uV8ZfE1a?3K`FgE&WU`mQ!e zDcNyJ`Qv-i_y<54GlOrW`(S)tOyEx#`8%Qca5}fqSng-$CY$xnYMBHpG^^obDxyNujB&5dCx};<0YHOL* z@?756M$L1&-`$zP^0@_ok!lH@YZ+GEMfcSfiYc&0f{k}K$vwT8U}wBv2EC-xYePc; z`EOaZk2?vfXs!kGg6?OFxp280G6f{%<##MuWFdoEvtZYvkLU=>KGm8pec@k8E%2W7 zEy$*Hah-{pn=Ip?5j2rEV%pPe5kZLeozVeSAqoHnR_1x9)~LRu3MgO^er~B+x1Ar&sKXa8zGX_%MvFV}^7qKWQo{ zympCv1^J)FC$zBr>ogbzGP z(Ffr$v2KjF*8SrnR-=hIrYp&wwGv`Z=B#!S&4M0sAs8+9>nAZ1{@VdFje#$6G^%5y4CN`M;pQ& z5sH>;FWqe0a_8WI(O6*EWgEwI&Tr z!T2e2UuZVWr+`h_D*Jk^^w{O)#657!j|^4G)fHl7b;mTCPghz_;9=JDxh!#hhqkfS zR4t<%IRK*kk;+oS&gJWCX^_UwX{!?!=2=XhNpa+FpzlGgSx?%LC~15DA!*=FR?iH} z;w&4xb9<)-9i%tg1dD2RJzvkiVVHDgQ+$2>aTL7X1AJ>Cj^twV1 z8WQWTFYM&6__Nm@m=y$E&)9hFeLO(Mi;+y=w{v!z2g*}Z56z8M?uIL$Rxe+3<3v@% zAih@0DB9nGGLn2TWjbW5T92}AIL~Q4J3l&8r%*ZLJI)zA!I@_gHDTg3U|2spdM4F^ zlUwgpRTv=YM`CL?d#xWTMCA4w4YnW-bXbrk`a*Xnp;(QBxby;LfU;TQML+GSKDNP{(|S z{b;IOoqfTF2-uXtx$=Wdr_M$_l-i(Yaa4HB)z3_mr?zd3^2ry}UTu&o<$B^{nMRsh z_~~4wGmaZ`KlGcQzi-<}fK74`QSS%`q!p`6e+O;wzx@K(!4uwazeK!y@Q;a_sW- z5`IX$`*y*@semI3jn#pD+R=xwrzr7}fg*QadcZGEq7?JZ9*HCm3Upqo*30LqoMr8^ z5k;<6c3@qVdX@wVRy9_pgrGGVnlInY&*?902np6db^qBI9x-EZdZSxsTFeR$Zfzo(B9vXyS)>5thYimq`Y8Ey4sVZnrUjR2|Mps zep+1JG^GUjs%F{GzruqcN@ul^+aW5yO1}zU(nS9`I20fA&%Q5WiKfj=cxEcC|tTkzTK9SAVk2jZII- zWPkn5wFCcX6wKrtNsM>|VXw5k?~?VkgD#alIuGy7QzKA5o&uK|hg-reIf~N9lfBUt z0`$JFQk<@?NGH0QfT>p4Oi1{AObv=LzTMG9HF!r4MD9vlZmSMVKNrvbhl4RQn!EDz z*lL&-%~vL&xJxyx#zJm(n_oGupG1TO2Kp!Bi$GdvtYhg$%n#}9jVrgbny$LU1U?H8 zBu6NgoyZSvb31lgWV^H=6izki?sDH4V2FgoQ0lY>De6Go=xvhF0dc2d=|WyO53T|_e2P( z>TdvrT+g(pV|>>0_Vq=wLy$H=?fWK|;9d2O(vHfLfog7o8%4SCzVyd;Rr@;IdGgM; zYtx0el`eQ4hYZCEHr4}9vuK}M@tZFu?T!;*hRzlB=okCSC|F8hcK9_iPHLkBX45D^iLi(xTrl2C{WvTD8IdjWIk_ zk2tl0qVJVQqk8Ar&K^WbAuF47$cZ;rY02x@q}?%V<5QrzQT)y zH>Ic~rXY{)z?#k@V)?^@{?gN@SXeqU@V6%#YGAfE!W>e^DhxUI`(4YC|f4j@ZpS})jXH&ZHoYf-GG ze#=9+{|@2x-x=C)!-YdP*4|{X|ZQsWt`3ET$T^8rc2y#|VyWJ1A zGvIQH>y&HpSy^Wm-}QErkGP)4$;~}A@F^%Rl%}^M!ce6W_ny49XML^5$hRia+hO1g zN6O-L;RD|fr$mV%qCHjPmcty069=Qm-a~>J0CJL`ook0DzkZU`965ydSs+dF2f2oZ z1_4^^HyVEqidyBnd2R{cdCf2AIAhqW6>tr0h837j*Y(OaJl0Ble9#6oUa1<-sCa-| zTnX8;k&qa!?KB};ILn0?=H?8)udzqSviYEoLo#0(P+tp0L*PhMISOXI60Xaam+z|F zdq@7V*)9C0t`s9uMN^ZVR$~btSG2FyA}XsB%j82*Vq6bfqWA&^3h8nZeCFo!H?PTef41@k~8M0n@nb|xI5Ov&euem*86hGNCHPIn##5Wp%ytH zr9hU95+~;Ct7?1_DCT$X!gGu-F_um zgEuhL?cU1@p`NL=y?T399-ygJ^5WDzQcPE=n<;fPMarm5`;yv0W4r7;W@QWiWOe$e zRq^bm`bXQlB6j=hCqvT>i!KWVN>MK$Bp8cPIG`?(Di~KV)RnG!Ua<7$`=F-bn)LgG zqZKq%5N`(~Vruu0AotkAbOyg!Nt`!DDBo#&pYc+4Cip-iiR1R7To7{r>+W2%?E*Vq zjkg4Yijc{Lty59hGYuM^cWve1ZJ|pB7ycJ6wfih5I;P?Q3`9A|Ajnd!@q0PO_Ev-t zr(0j0CD581v)0@4Qe!{OBYM==e9`t!9xtZK-^iP=%hinB^k(70Nn45$2Sj>5e}1G? z6`?>&gXIX-K3z%qs{Z9mPUMfTPaE$*oI}UAK7{qnBjXSCJ9)6kER#93;@KIK4W>>e z%l#vZ5BOR;39vXS;q;`02B){SMkfQlZ%=Gvz~L+F*;&pN3Kf|FnnNJW{b2=C;FsNzx2Tf(G$1LQ#I-4ZeqP~KD{jH3&# z3lyJu;yyEXW+uTKByS#!m_!acrj6_b3c29OI}HX*N6tmb1_NHc5o6(Yf`v@W)0B$y zB%C1yHsvuye{$7i^V~Yh)wB!g&!2@8$UQZdjZZZg;xT23hvQXv*b8>NZj(;TVC(r1 zafrf17ir03W1(t0Pn>%}1I!HNM!3y8Jn9NIE;qI3oC06gB341N_Wg|A#dZrN-Gfp6 z4HlpH_}X(Fq@Hx;fg5m1GpW3Lv#`a8Mg>86`pqq-4yHCLb10_?!doahw zLaMKfEr-)WeZUhgTU;dY65L)5;xJzeuAN++sS)-9JK=Wsy!YW=ERO8@+^>nCMSlnZQ>$HZiWHKiwi{U22tY@@{p&k z$I@3}>kcBpEFF=JTe`cM9jdeW!pI?-cu}$Z&nHn=M+)5z8>>f?b}Kz|Uz2JT`Zz4U z<0$m`Kl6a_#dr;}m&6Zq^MTq-@6v(hDd~Vziu3pPcdtbWisU{$lcHsY#G#Fe6@#P@e{8LVINp7Eh5?o}fR-AxLNr87RE&^m=k5xkOioZWk+Ebum%h)4HTN0(Sl*&oMbZj@nrSz{JMZz|=f%Q7`?1utah~rAJ7TRxs_W759(f1A&qcxv?3N zB*-s-GobC#k3}=**B@zLvAaT^Mj(3gq&>c%W86yf041n^h#jUwoBk;63G<8d74v-Y F_#Yj07GD4W literal 0 HcmV?d00001 From b4012e7ae819e944afe92863e07bc462efdc8a7f Mon Sep 17 00:00:00 2001 From: Kamil Nowinski Date: Wed, 2 Dec 2020 00:44:25 +0000 Subject: [PATCH 5/5] Examples of generated files --- OUTPUT/Application.TransactionTypes.sql | 44 +++++++++++++ OUTPUT/Person.AddressType_INSERT.sql | 36 +++++++++++ OUTPUT/Person.AddressType_MERGE.sql | 48 ++++++++++++++ OUTPUT/Person.ContactType.sql | 62 +++++++++++++++++++ OUTPUT/Person.PhoneNumberType.sql | 33 ++++++++++ OUTPUT/Person.PhoneNumberType_INSERT.sql | 33 ++++++++++ OUTPUT/Person.PhoneNumberType_MERGE.sql | 45 ++++++++++++++ .../Person.PhoneNumberType_MERGE_NEW_ONLY.sql | 40 ++++++++++++ ...n.PhoneNumberType_MERGE_without_DELETE.sql | 43 +++++++++++++ 9 files changed, 384 insertions(+) create mode 100644 OUTPUT/Application.TransactionTypes.sql create mode 100644 OUTPUT/Person.AddressType_INSERT.sql create mode 100644 OUTPUT/Person.AddressType_MERGE.sql create mode 100644 OUTPUT/Person.ContactType.sql create mode 100644 OUTPUT/Person.PhoneNumberType.sql create mode 100644 OUTPUT/Person.PhoneNumberType_INSERT.sql create mode 100644 OUTPUT/Person.PhoneNumberType_MERGE.sql create mode 100644 OUTPUT/Person.PhoneNumberType_MERGE_NEW_ONLY.sql create mode 100644 OUTPUT/Person.PhoneNumberType_MERGE_without_DELETE.sql diff --git a/OUTPUT/Application.TransactionTypes.sql b/OUTPUT/Application.TransactionTypes.sql new file mode 100644 index 0000000..9cdbd6e --- /dev/null +++ b/OUTPUT/Application.TransactionTypes.sql @@ -0,0 +1,44 @@ +CREATE PROCEDURE [dbo].[Populate_Application_TransactionTypes] +AS +BEGIN +/* + Table's data: [Application].[TransactionTypes] + Data Source: [DEV19].[WideWorldImporters] + Created on: 02/12/2020 00:13:12 + Scripted by: DEV19\Administrator + Generated by: Data Script Writer - ver. 2.3.0.0 + GitHub repo URL: https://github.com/SQLPlayer/DataScriptWriter/ +*/ +PRINT 'Populating data into [Application].[TransactionTypes]'; + +IF NOT EXISTS (SELECT TOP (1) * FROM [Application].[TransactionTypes]) +BEGIN + + ;WITH cte_data + as (SELECT [TransactionTypeID], [TransactionTypeName], [LastEditedBy] FROM + (VALUES + (1, N'Customer Invoice', 1) + , (2, N'Customer Credit Note', 1) + , (3, N'Customer Payment Received', 1) + , (4, N'Customer Refund', 1) + , (5, N'Supplier Invoice', 1) + , (6, N'Supplier Credit Note', 1) + , (7, N'Supplier Payment Issued', 1) + , (8, N'Supplier Refund', 1) + , (9, N'Stock Transfer', 1) + , (10, N'Stock Issue', 1) + , (11, N'Stock Receipt', 1) + , (12, N'Stock Adjustment at Stocktake', 1) + , (13, N'Customer Contra', 9) + ) as v ([TransactionTypeID], [TransactionTypeName], [LastEditedBy]) +) + INSERT INTO [Application].[TransactionTypes] + ([TransactionTypeID], [TransactionTypeName], [LastEditedBy]) + SELECT [TransactionTypeID], [TransactionTypeName], [LastEditedBy] + FROM cte_data; + +END + +-- End data of table: [Application].[TransactionTypes] -- +END +GO diff --git a/OUTPUT/Person.AddressType_INSERT.sql b/OUTPUT/Person.AddressType_INSERT.sql new file mode 100644 index 0000000..80214f6 --- /dev/null +++ b/OUTPUT/Person.AddressType_INSERT.sql @@ -0,0 +1,36 @@ +CREATE PROCEDURE [dbo].[Populate_Person_AddressType] +AS +BEGIN +/* + Table's data: [Person].[AddressType] + Data Source: [DEV19].[AdventureWorks2014] + Created on: 18/10/2019 15:00:40 + Scripted by: DEV19\Administrator + Generated by Data Script Writer - ver. 2.0.0.0 +*/ +PRINT 'Populating data into [Person].[AddressType]'; + +IF NOT EXISTS (SELECT TOP (1) * FROM [Person].[AddressType]) +BEGIN + + ;WITH cte_data + as (SELECT [AddressTypeID], [Name], [rowguid], [ModifiedDate] FROM + (VALUES + (1, 'Billing', 'b84f78b1-4efe-4a0e-8cb7-70e9f112f886', '20080430 00:00:00.000') + , (2, 'Home', '41bc2ff6-f0fc-475f-8eb9-cec0805aa0f2', '20080430 00:00:00.000') + , (3, 'Main Office', '8eeec28c-07a2-4fb9-ad0a-42d4a0bbc575', '20080430 00:00:00.000') + , (4, 'Primary', '24cb3088-4345-47c4-86c5-17b535133d1e', '20080430 00:00:00.000') + , (5, 'Shipping', 'b29da3f8-19a3-47da-9daa-15c84f4a83a5', '20080430 00:00:00.000') + , (6, 'Archive', 'a67f238a-5ba2-444b-966c-0467ed9c427f', '20080430 00:00:00.000') + ) as v ([AddressTypeID], [Name], [rowguid], [ModifiedDate]) +) + INSERT INTO [Person].[AddressType] + ([AddressTypeID], [Name], [rowguid], [ModifiedDate]) + SELECT [AddressTypeID], [Name], [rowguid], [ModifiedDate] + FROM cte_data; + +END + +-- End data of table: [Person].[AddressType] -- +END +GO diff --git a/OUTPUT/Person.AddressType_MERGE.sql b/OUTPUT/Person.AddressType_MERGE.sql new file mode 100644 index 0000000..78068b6 --- /dev/null +++ b/OUTPUT/Person.AddressType_MERGE.sql @@ -0,0 +1,48 @@ +CREATE PROCEDURE [dbo].[Populate_Person_AddressType] +AS +BEGIN +/* + Table's data: [Person].[AddressType] + Data Source: [DEV19].[AdventureWorks2014] + Created on: 18/10/2019 14:59:12 + Scripted by: DEV19\Administrator + Generated by Data Script Writer - ver. 2.0.0.0 +*/ +PRINT 'Populating data into [Person].[AddressType]'; + +IF OBJECT_ID('tempdb.dbo.#Person_AddressType') IS NOT NULL DROP TABLE #Person_AddressType; +SELECT * INTO #Person_AddressType FROM [Person].[AddressType] WHERE 0=1; + +INSERT INTO #Person_AddressType + ([AddressTypeID], [Name], [rowguid], [ModifiedDate]) +SELECT CAST([AddressTypeID] AS int) AS [AddressTypeID], [Name], [rowguid], [ModifiedDate] FROM +(VALUES + (1, 'Billing', 'b84f78b1-4efe-4a0e-8cb7-70e9f112f886', '20080430 00:00:00.000') + , (2, 'Home', '41bc2ff6-f0fc-475f-8eb9-cec0805aa0f2', '20080430 00:00:00.000') + , (3, 'Main Office', '8eeec28c-07a2-4fb9-ad0a-42d4a0bbc575', '20080430 00:00:00.000') + , (4, 'Primary', '24cb3088-4345-47c4-86c5-17b535133d1e', '20080430 00:00:00.000') + , (5, 'Shipping', 'b29da3f8-19a3-47da-9daa-15c84f4a83a5', '20080430 00:00:00.000') + , (6, 'Archive', 'a67f238a-5ba2-444b-966c-0467ed9c427f', '20080430 00:00:00.000') +) as v ([AddressTypeID], [Name], [rowguid], [ModifiedDate]); + + + +WITH cte_data as (SELECT CAST([AddressTypeID] AS int) AS [AddressTypeID], [Name], [rowguid], [ModifiedDate] FROM [#Person_AddressType]) +MERGE [Person].[AddressType] as t +USING cte_data as s + ON t.[AddressTypeID] = s.[AddressTypeID] +WHEN NOT MATCHED BY target THEN + INSERT ([AddressTypeID], [Name], [rowguid], [ModifiedDate]) + VALUES (s.[AddressTypeID], s.[Name], s.[rowguid], s.[ModifiedDate]) +WHEN MATCHED THEN + UPDATE SET + [Name] = s.[Name], [rowguid] = s.[rowguid], [ModifiedDate] = s.[ModifiedDate] +WHEN NOT MATCHED BY source THEN + DELETE +; + +DROP TABLE #Person_AddressType; + +-- End data of table: [Person].[AddressType] -- +END +GO diff --git a/OUTPUT/Person.ContactType.sql b/OUTPUT/Person.ContactType.sql new file mode 100644 index 0000000..9fa7b25 --- /dev/null +++ b/OUTPUT/Person.ContactType.sql @@ -0,0 +1,62 @@ +CREATE PROCEDURE [dbo].[Populate_Person_ContactType] +AS +BEGIN +/* + Table's data: [Person].[ContactType] + Data Source: [DEV19].[AdventureWorks2014] + Created on: 18/10/2019 15:02:26 + Scripted by: DEV19\Administrator + Generated by Data Script Writer - ver. 2.0.0.0 +*/ +PRINT 'Populating data into [Person].[ContactType]'; + +IF OBJECT_ID('tempdb.dbo.#Person_ContactType') IS NOT NULL DROP TABLE #Person_ContactType; +SELECT * INTO #Person_ContactType FROM [Person].[ContactType] WHERE 0=1; + +INSERT INTO #Person_ContactType + ([ContactTypeID], [Name], [ModifiedDate]) +SELECT CAST([ContactTypeID] AS int) AS [ContactTypeID], [Name], [ModifiedDate] FROM +(VALUES + (1, 'Accounting Manager', '20080430 00:00:00.000') + , (2, 'Assistant Sales Agent', '20080430 00:00:00.000') + , (3, 'Assistant Sales Representative', '20080430 00:00:00.000') + , (4, 'Coordinator Foreign Markets', '20080430 00:00:00.000') + , (5, 'Export Administrator', '20080430 00:00:00.000') + , (6, 'International Marketing Manager', '20080430 00:00:00.000') + , (7, 'Marketing Assistant', '20080430 00:00:00.000') + , (8, 'Marketing Manager', '20080430 00:00:00.000') + , (9, 'Marketing Representative', '20080430 00:00:00.000') + , (10, 'Order Administrator', '20080430 00:00:00.000') + , (11, 'Owner', '20080430 00:00:00.000') + , (12, 'Owner/Marketing Assistant', '20080430 00:00:00.000') + , (13, 'Product Manager', '20080430 00:00:00.000') + , (14, 'Purchasing Agent', '20080430 00:00:00.000') + , (15, 'Purchasing Manager', '20080430 00:00:00.000') + , (16, 'Regional Account Representative', '20080430 00:00:00.000') + , (17, 'Sales Agent', '20080430 00:00:00.000') + , (18, 'Sales Associate', '20080430 00:00:00.000') + , (19, 'Sales Manager', '20080430 00:00:00.000') + , (20, 'Sales Representative', '20080430 00:00:00.000') +) as v ([ContactTypeID], [Name], [ModifiedDate]); + + + +WITH cte_data as (SELECT CAST([ContactTypeID] AS int) AS [ContactTypeID], [Name], [ModifiedDate] FROM [#Person_ContactType]) +MERGE [Person].[ContactType] as t +USING cte_data as s + ON t.[ContactTypeID] = s.[ContactTypeID] +WHEN NOT MATCHED BY target THEN + INSERT ([ContactTypeID], [Name], [ModifiedDate]) + VALUES (s.[ContactTypeID], s.[Name], s.[ModifiedDate]) +WHEN MATCHED THEN + UPDATE SET + [Name] = s.[Name], [ModifiedDate] = s.[ModifiedDate] +WHEN NOT MATCHED BY source THEN + DELETE +; + +DROP TABLE #Person_ContactType; + +-- End data of table: [Person].[ContactType] -- +END +GO diff --git a/OUTPUT/Person.PhoneNumberType.sql b/OUTPUT/Person.PhoneNumberType.sql new file mode 100644 index 0000000..c180505 --- /dev/null +++ b/OUTPUT/Person.PhoneNumberType.sql @@ -0,0 +1,33 @@ +CREATE PROCEDURE [data].[Populate_Person_PhoneNumberType] +AS +BEGIN +/* + Table's data: [Person].[PhoneNumberType] + Data Source: [DEV19].[AdventureWorks2014] + Created on: 18/10/2019 15:07:03 + Scripted by: DEV19\Administrator + Generated by Data Script Writer - ver. 2.0.0.0 +*/ +PRINT 'Populating data into [Person].[PhoneNumberType]'; + +IF NOT EXISTS (SELECT TOP (1) * FROM [Person].[PhoneNumberType]) +BEGIN + + ;WITH cte_data + as (SELECT [PhoneNumberTypeID], [Name], [ModifiedDate] FROM + (VALUES + (1, 'Cell', '20171213 13:19:22.273') + , (2, 'Home', '20171213 13:19:22.273') + , (3, 'Work', '20171213 13:19:22.273') + ) as v ([PhoneNumberTypeID], [Name], [ModifiedDate]) +) + INSERT INTO [Person].[PhoneNumberType] + ([PhoneNumberTypeID], [Name], [ModifiedDate]) + SELECT [PhoneNumberTypeID], [Name], [ModifiedDate] + FROM cte_data; + +END + +-- End data of table: [Person].[PhoneNumberType] -- +END +GO diff --git a/OUTPUT/Person.PhoneNumberType_INSERT.sql b/OUTPUT/Person.PhoneNumberType_INSERT.sql new file mode 100644 index 0000000..c180505 --- /dev/null +++ b/OUTPUT/Person.PhoneNumberType_INSERT.sql @@ -0,0 +1,33 @@ +CREATE PROCEDURE [data].[Populate_Person_PhoneNumberType] +AS +BEGIN +/* + Table's data: [Person].[PhoneNumberType] + Data Source: [DEV19].[AdventureWorks2014] + Created on: 18/10/2019 15:07:03 + Scripted by: DEV19\Administrator + Generated by Data Script Writer - ver. 2.0.0.0 +*/ +PRINT 'Populating data into [Person].[PhoneNumberType]'; + +IF NOT EXISTS (SELECT TOP (1) * FROM [Person].[PhoneNumberType]) +BEGIN + + ;WITH cte_data + as (SELECT [PhoneNumberTypeID], [Name], [ModifiedDate] FROM + (VALUES + (1, 'Cell', '20171213 13:19:22.273') + , (2, 'Home', '20171213 13:19:22.273') + , (3, 'Work', '20171213 13:19:22.273') + ) as v ([PhoneNumberTypeID], [Name], [ModifiedDate]) +) + INSERT INTO [Person].[PhoneNumberType] + ([PhoneNumberTypeID], [Name], [ModifiedDate]) + SELECT [PhoneNumberTypeID], [Name], [ModifiedDate] + FROM cte_data; + +END + +-- End data of table: [Person].[PhoneNumberType] -- +END +GO diff --git a/OUTPUT/Person.PhoneNumberType_MERGE.sql b/OUTPUT/Person.PhoneNumberType_MERGE.sql new file mode 100644 index 0000000..9e4e9b5 --- /dev/null +++ b/OUTPUT/Person.PhoneNumberType_MERGE.sql @@ -0,0 +1,45 @@ +CREATE PROCEDURE [data].[Populate_Person_PhoneNumberType] +AS +BEGIN +/* + Table's data: [Person].[PhoneNumberType] + Data Source: [DEV19].[AdventureWorks2014] + Created on: 18/10/2019 15:06:49 + Scripted by: DEV19\Administrator + Generated by Data Script Writer - ver. 2.0.0.0 +*/ +PRINT 'Populating data into [Person].[PhoneNumberType]'; + +IF OBJECT_ID('tempdb.dbo.#Person_PhoneNumberType') IS NOT NULL DROP TABLE #Person_PhoneNumberType; +SELECT * INTO #Person_PhoneNumberType FROM [Person].[PhoneNumberType] WHERE 0=1; + +INSERT INTO #Person_PhoneNumberType + ([PhoneNumberTypeID], [Name], [ModifiedDate]) +SELECT CAST([PhoneNumberTypeID] AS int) AS [PhoneNumberTypeID], [Name], [ModifiedDate] FROM +(VALUES + (1, 'Cell', '20171213 13:19:22.273') + , (2, 'Home', '20171213 13:19:22.273') + , (3, 'Work', '20171213 13:19:22.273') +) as v ([PhoneNumberTypeID], [Name], [ModifiedDate]); + + + +WITH cte_data as (SELECT CAST([PhoneNumberTypeID] AS int) AS [PhoneNumberTypeID], [Name], [ModifiedDate] FROM [#Person_PhoneNumberType]) +MERGE [Person].[PhoneNumberType] as t +USING cte_data as s + ON t.[PhoneNumberTypeID] = s.[PhoneNumberTypeID] +WHEN NOT MATCHED BY target THEN + INSERT ([PhoneNumberTypeID], [Name], [ModifiedDate]) + VALUES (s.[PhoneNumberTypeID], s.[Name], s.[ModifiedDate]) +WHEN MATCHED THEN + UPDATE SET + [Name] = s.[Name], [ModifiedDate] = s.[ModifiedDate] +WHEN NOT MATCHED BY source THEN + DELETE +; + +DROP TABLE #Person_PhoneNumberType; + +-- End data of table: [Person].[PhoneNumberType] -- +END +GO diff --git a/OUTPUT/Person.PhoneNumberType_MERGE_NEW_ONLY.sql b/OUTPUT/Person.PhoneNumberType_MERGE_NEW_ONLY.sql new file mode 100644 index 0000000..faa0b84 --- /dev/null +++ b/OUTPUT/Person.PhoneNumberType_MERGE_NEW_ONLY.sql @@ -0,0 +1,40 @@ +CREATE PROCEDURE [data].[Populate_Person_PhoneNumberType] +AS +BEGIN +/* + Table's data: [Person].[PhoneNumberType] + Data Source: [DEV19].[AdventureWorks2014] + Created on: 18/10/2019 15:08:00 + Scripted by: DEV19\Administrator + Generated by Data Script Writer - ver. 2.0.0.0 +*/ +PRINT 'Populating data into [Person].[PhoneNumberType]'; + +IF OBJECT_ID('tempdb.dbo.#Person_PhoneNumberType') IS NOT NULL DROP TABLE #Person_PhoneNumberType; +SELECT * INTO #Person_PhoneNumberType FROM [Person].[PhoneNumberType] WHERE 0=1; + +INSERT INTO #Person_PhoneNumberType + ([PhoneNumberTypeID], [Name], [ModifiedDate]) +SELECT CAST([PhoneNumberTypeID] AS int) AS [PhoneNumberTypeID], [Name], [ModifiedDate] FROM +(VALUES + (1, 'Cell', '20171213 13:19:22.273') + , (2, 'Home', '20171213 13:19:22.273') + , (3, 'Work', '20171213 13:19:22.273') +) as v ([PhoneNumberTypeID], [Name], [ModifiedDate]); + + + +WITH cte_data as (SELECT CAST([PhoneNumberTypeID] AS int) AS [PhoneNumberTypeID], [Name], [ModifiedDate] FROM [#Person_PhoneNumberType]) +MERGE [Person].[PhoneNumberType] as t +USING cte_data as s + ON t.[PhoneNumberTypeID] = s.[PhoneNumberTypeID] +WHEN NOT MATCHED BY target THEN + INSERT ([PhoneNumberTypeID], [Name], [ModifiedDate]) + VALUES (s.[PhoneNumberTypeID], s.[Name], s.[ModifiedDate]) +; + +DROP TABLE #Person_PhoneNumberType; + +-- End data of table: [Person].[PhoneNumberType] -- +END +GO diff --git a/OUTPUT/Person.PhoneNumberType_MERGE_without_DELETE.sql b/OUTPUT/Person.PhoneNumberType_MERGE_without_DELETE.sql new file mode 100644 index 0000000..0974074 --- /dev/null +++ b/OUTPUT/Person.PhoneNumberType_MERGE_without_DELETE.sql @@ -0,0 +1,43 @@ +CREATE PROCEDURE [data].[Populate_Person_PhoneNumberType] +AS +BEGIN +/* + Table's data: [Person].[PhoneNumberType] + Data Source: [DEV19].[AdventureWorks2014] + Created on: 18/10/2019 15:07:40 + Scripted by: DEV19\Administrator + Generated by Data Script Writer - ver. 2.0.0.0 +*/ +PRINT 'Populating data into [Person].[PhoneNumberType]'; + +IF OBJECT_ID('tempdb.dbo.#Person_PhoneNumberType') IS NOT NULL DROP TABLE #Person_PhoneNumberType; +SELECT * INTO #Person_PhoneNumberType FROM [Person].[PhoneNumberType] WHERE 0=1; + +INSERT INTO #Person_PhoneNumberType + ([PhoneNumberTypeID], [Name], [ModifiedDate]) +SELECT CAST([PhoneNumberTypeID] AS int) AS [PhoneNumberTypeID], [Name], [ModifiedDate] FROM +(VALUES + (1, 'Cell', '20171213 13:19:22.273') + , (2, 'Home', '20171213 13:19:22.273') + , (3, 'Work', '20171213 13:19:22.273') +) as v ([PhoneNumberTypeID], [Name], [ModifiedDate]); + + + +WITH cte_data as (SELECT CAST([PhoneNumberTypeID] AS int) AS [PhoneNumberTypeID], [Name], [ModifiedDate] FROM [#Person_PhoneNumberType]) +MERGE [Person].[PhoneNumberType] as t +USING cte_data as s + ON t.[PhoneNumberTypeID] = s.[PhoneNumberTypeID] +WHEN NOT MATCHED BY target THEN + INSERT ([PhoneNumberTypeID], [Name], [ModifiedDate]) + VALUES (s.[PhoneNumberTypeID], s.[Name], s.[ModifiedDate]) +WHEN MATCHED THEN + UPDATE SET + [Name] = s.[Name], [ModifiedDate] = s.[ModifiedDate] +; + +DROP TABLE #Person_PhoneNumberType; + +-- End data of table: [Person].[PhoneNumberType] -- +END +GO