diff --git a/.gitattributes b/.gitattributes
index 57fa5393..130dab4a 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,2 +1,66 @@
-/*.sql diff
-*.sql diff
+# Custom for Visual Studio
+*.ascx text
+*.cmd text
+*.ps1 text
+*.psm1 text
+*.coffee text
+*.config text
+*.cs text diff=csharp
+*.csproj text merge=union
+*.css text
+*.cshtml text
+*.htm text
+*.html text
+*.js text
+*.msbuild text
+*.resx text merge=union
+*.ruleset text
+*.Stylecop text
+*.targets text
+*.tt text
+*.txt text
+*.vb text
+*.vbhtml text
+*.vbproj text merge=union
+*.xml text
+*.xunit text
+*.sln text eol=crlf merge=union
+*.settings text
+
+# STANDARD TO MSYSGIT
+*.DOC DIFF=ASTEXTPLAIN
+*.DOC DIFF=ASTEXTPLAIN
+*.DOCX DIFF=ASTEXTPLAIN
+*.DOCX DIFF=ASTEXTPLAIN
+*.XLS binary
+*.XLS binary
+*.XLSX binary
+*.XLSX binary
+*.PPT binary
+*.PPTX binary
+*.DOT DIFF=ASTEXTPLAIN
+*.DOT DIFF=ASTEXTPLAIN
+*.PDF DIFF=ASTEXTPLAIN
+*.PDF DIFF=ASTEXTPLAIN
+*.RTF DIFF=ASTEXTPLAIN
+*.RTF DIFF=ASTEXTPLAIN
+
+
+*.JPG BINARY
+*.PNG BINARY
+*.GIF BINARY
+*.ICO BINARY
+*.BMP BINARY
+*.MDF BINARY
+*.LDF BINARY
+*.MAFF BINARY
+
+# EOL = lf
+*.HTM eol=lf merge=union
+*.HTML eol=lf merge=union
+*.MD eol=lf merge=union
+
+# T-SQL files
+*.sql eol=crlf merge=union
+/*.sql diff
+*.sql diff
diff --git a/.github/bug_report.md b/.github/bug_report.md
new file mode 100644
index 00000000..cfaa64e5
--- /dev/null
+++ b/.github/bug_report.md
@@ -0,0 +1,16 @@
+---
+name: Bug report
+about: Create a bug report to help us improve
+
+---
+
+Include the version number of the script you're using.
+If it's not the current version, upgrade to the current version and test that before reporting a bug - we fix a lot of stuff in each new build.
+
+**What is the current behavior?**
+
+**If the current behavior is a bug, please provide the steps to reproduce and if possible a minimal demo of the problem via http://sqlfiddle.com**
+
+**What is the expected behavior?**
+
+**Which versions of SQL Server and which OS are affected by this issue? Did this work in previous versions of our procedures?**
diff --git a/.github/feature_request.md b/.github/feature_request.md
new file mode 100644
index 00000000..257aee58
--- /dev/null
+++ b/.github/feature_request.md
@@ -0,0 +1,25 @@
+---
+name: Feature request
+about: Suggest an idea for this project
+
+---
+
+Fixes # .
+
+Changes proposed in this pull request:
+ -
+
+How to test this code:
+ -
+
+Has been tested on (remove any that don't apply):
+ - Case-sensitive SQL Server instance
+ - SQL Server 2008
+ - SQL Server 2008 R2
+ - SQL Server 2012
+ - SQL Server 2014
+ - SQL Server 2016
+ - SQL Server 2017
+ - SQL Server 2019
+ - Amazon RDS
+ - Azure SQL DB
diff --git a/.github/sql_help.md b/.github/sql_help.md
new file mode 100644
index 00000000..383c7685
--- /dev/null
+++ b/.github/sql_help.md
@@ -0,0 +1,9 @@
+---
+name: SQL HELP
+about: Describe your problem and get help
+
+---
+
+1. Operation system with detailed version (Windows, Ubuntu, Macos etc.). Example: `Microsoft Windows [Version 10.0.16299.248]`
+2. Relation database type (SQL Server preferred, Orcale, MySQL, PostgreSQL, SQLite etc.) with detailed version. Example: `Microsoft SQL Server 2017 (RTM-CU1) (KB4038634) - 14.0.3006.16 (X64) ... on Windows 10 Pro 10.0`
+3. Demo script (if necessary) to reproduce your problem.
diff --git a/Articles/Arrays and Lists in SQL Server 2008.htm b/Articles/Arrays and Lists in SQL Server 2008.htm
deleted file mode 100644
index 880f43b4..00000000
--- a/Articles/Arrays and Lists in SQL Server 2008.htm
+++ /dev/null
@@ -1,1087 +0,0 @@
-
-
-
-
-
-
-Arrays and Lists in SQL Server 2008
-
-
-
Arrays and Lists in SQL Server 2008 Using Table-Valued Parameters
In the public forums for SQL Server, you often see people asking How do I use
-arrays in SQL Server? Or Why does SELECT * FROM tbl WHERE col IN (@list)
-not work? The short answer to the first question is that SQL Server does not have
-arrays – SQL Server has tables. Upto SQL Server 2005, there was no way to pass a table
-from a client, but you had to pass a comma-separated string or similar to SQL Server, and then you would unpack that list into a table in your stored procedure.
-
This changed with SQL 2008. The
- advent of table-valued parameters makes it dirt simple to pass a comma-separated list to SQL Server. In this article I will introduce a simple and perfectly reusable class for this task. Table-valued parameters are also great when you want to load data to SQL Server through a stored procedure; you no longer have to build XML documents that you shred in SQL Server. In this article I show you how to load a master-detail file into SQL Server tables in two different ways: read the entire file into memory or stream it directly. What I am not showing – because it's so simple – is that if you already have your data in a DataTable object, you can pass that DataTable as the value for your TVP.
-The examples are in C# and VB .NET, using the SqlClient API, and the main body of the article covers this environment. For other environments such as Java or Entity Framework, there is a quick overview of what is possible at the end of the article.
-
There is an accompanying article: Arrays and Lists in SQL Server 2005 and Beyond
- (and an even older for SQL 2000) where I in detail describe various methods to pass a list of values in a
-string and unpack them into a table in SQL Server. For the hard-core geeks there are two performance indexes, one labelled SQL 2008 and an older labelled SQL 2005, where I relate data from performance tests of the methods described in
-the articles, including table-valued parameters.
Some of the sample code in this article refers to the Northwind database.
- This database does not ship with SQL Server, but you can download the script to
-install it from Microsoft's web site.
You have a number of key values, identifying a couple of rows in a table, and
- you want to retrieve these rows. If you are the sort of person who composes
- your SQL statements in
- client code, you might have something that looks like this:
-
cmd.CommandText = "SELECT ProductID, ProductName FROM Northwind.dbo.Products " & _
- "WHERE ProductID IN (" & List & ")"
-reader = cmd.ExecuteReader()
-
List is here a string variable that you somewhere have assigned a comma-separated list, for instance "9,12,27,39".
-
-
This sort of code is bad practice, because you should never interpolate
- parameter values into your query string. (Why, is beyond the scope of this
- article, but I discuss this in detail in my article
- The Curse and Blessings of Dynamic SQL,
- particularly in the sections on
- SQL Injection and Caching
- Query Plans.)
-
-
Since this is bad practice, you want to use stored
- procedures. However, at first glance you don't seem to find that any apparent
- way to do this. Many have tried with:
-
CREATE PROCEDURE get_product_names @ids varchar(50) AS
- SELECT ProductID, ProductName
- FROM Northwind.dbo.Products
- WHERE ProductID IN (@ids)
-
But when they test:
-
EXEC get_product_names '9,12,27,37'
-
The reward is this error message:
-
Server: Msg 245, Level 16, State 1, Procedure get_product_names, Line 2
-Syntax error converting the varchar value '9,12,27,37' to a column
-of data type int.
-
This fails, because we are no longer composing an SQL statement dynamically,
- and @ids
- is just one value in the IN clause. An IN clause that could also read:
-
... WHERE col IN (@a, @b, @c)
-
Or more to the point, consider this little script:
-
CREATE TABLE #csv (a varchar(20) NOT NULL)
-go
-INSERT #csv (a) VALUES ('9,12,27,37')
-INSERT #csv (a) VALUES ('something else')
-SELECT a FROM #csv WHERE a IN ('9,12,27,37') -- Returns one row.
-
So now you know why col IN (@list) does not work. Or rather: you know now that it works differently from
-your expectations. In the following we will look into how to solve this kind
-of problem with table-valued parameters.
-
Before I go on, I should add that sometimes you may find yourselves in the (very
-unfortunate) situation when you have a delimited list in a table
-column in your database. To unpack such a list, you would need any of the methods that I discuss in
-Arrays
-and Lists for SQL 2005 and Beyond;
-TVPs cannot help you here.
Let's first look at how to use TVPs in T‑SQL without involving a client. To be able to declare a TVP, you first need
- to create a table type like this:
-
CREATE TYPE integer_list_tbltype AS TABLE (n int NOT NULL PRIMARY KEY)
-
That is, after CREATE TYPE you specify the type name followed by AS TABLE and then
-comes the table definition,
-using the same syntax as CREATE TABLE. You cannot use everything you can use with CREATE
-TABLE, but you can define PRIMARY KEY, UNIQUE and CHECK constraints, you can use IDENTITY and DEFAULT definitions,
-and you can define computed columns. Once you have this table type, you can use it
-to declare table variables:
-
DECLARE @mylist integer_list_tbltype
-
However, you cannot use the type with CREATE TABLE (it could have been nutty with temp tables!), nor can you use it for
-the declaration of the return table in a multi-step table function. The raison d'être for table types is to make it possible to declare table-valued parameters for stored procedures or user-defined functions. Here is one example:
-
CREATE PROCEDURE get_product_names @prodids integer_list_tbltype READONLY AS
- SELECT p.ProductID, p.ProductName
- FROM Northwind.dbo.Products p
- WHERE p.ProductID IN (SELECT n FROM @prodids)
-
The body of the procedure brings no surprises. The code looks just as it would have if @prodids had been a local
-table variable. The parameter declaration on the other hand includes a keyword hitherto not seen in this
-context: READONLY. This keyword means what it says: you cannot modify the contents of the table parameter in any
-way in the procedure. As an aside, this restriction makes TVPs far less useful than they could have been;
-often you want to pass data between stored procedures as I discuss in my article How to
-Share Data Between Stored Procedures. However, for the task at hand, passing data from a client, the READONLY
-restriction is no major obstacle.
(Here I use the new syntax for INSERT that permits me to specify values for more than one row in the VALUES clause.)
-You can also use TVPs with sp_executesql:
-
DECLARE @mylist integer_list_tbltype,
- @sql nvarchar(MAX)
-SELECT @sql = N'SELECT p.ProductID, p.ProductName
- FROM Northwind..Products p
- WHERE p.ProductID IN (SELECT n FROM @prodids)'
-INSERT @mylist VALUES(9),(12),(27),(37)
-EXEC sp_executesql @sql, N'@prodids integer_list_tbltype READONLY', @mylist
-
There are a few peculiarities, though. This does not work:
-
EXEC get_product_names NULL
-
but results in this error message:
-
Msg 206, Level 16, State 2, Procedure get_product_names, Line 0
-Operand type clash: void type is incompatible with integer_list_tbltype
-
It is quite logical when you think of it: NULL is a scalar value, not a table value. But what do you think about
-this:
-
EXEC get_product_names
-
You may expect this to result in an error due to the missing parameter, but instead this runs and produces an empty
-result set! The same happens with:
-
EXEC get_product_names DEFAULT
-
The scoop is that a table-valued parameter always has the implicit default value of an empty table. Whether this is
-good or bad can be disputed, but if there were to be explicit default values, Microsoft would have to invent a lot of
-syntax for it. And in most cases, the default value you want is probably the empty table, so it is not entirely unreasonable.
-
Permissions
-
One thing with table types which is not apparent is that you need permission
- to use a table type. This can be demonstrated in this script:
-
CREATE USER testuser WITHOUT LOGIN
-go
-EXECUTE AS USER = 'testuser'
-go
-DECLARE @p integer_list_tbltype
-go
-REVERT
-go
-DROP USER testuser
-
(What we do here is to create a loginless user, and then impersonate that
-user. This is a quick way to test permissions. For more details on impersonation,
-see my article Giving Permissions through Stored
-Procedures.)
-
The output from this script is puzzling:
-
Msg 229, Level 14, State 5, Line 1
-The EXECUTE permission was denied on the object 'integer_list_tbltype',
-database 'tempdb', schema 'dbo'.
-
But the message is to be taken by the letter. To be able to use a table type,
-you need to have EXECUTE permission on the type. (This does not apply to normal
-scalar types, but it does apply to user-defined CLR types.) To grant permission
-on a type, the syntax is:
-
GRANT EXECUTE ON TYPE::integer_list_tbltype TO testuser
-
The TYPE:: prefix is needed to specify the object class.
-
Restrictions
-
It is maybe not so surprising that you cannot use table-valued parameters across linked servers, given that there are many restrictions with linked servers. But it does not stop there: you cannot even use table-valued parameters across databases. If you try something like:
-
USE tempdb
-go
-CREATE TYPE tobbe AS TABLE (a int NOT NULL PRIMARY KEY)
-go
-CREATE PROCEDURE tobbe_sp @t tobbe READONLY AS
- SELECT a FROM @t
-go
-USE otherdb
-go
-CREATE TYPE tobbe AS TABLE (a int NOT NULL PRIMARY KEY)
-go
-DECLARE @t tobbe
-EXEC tempdb..tobbe_sp @t
-
The error message is:
-
Msg 206, Level 16, State 2, Procedure tobbe_sp, Line 0
-Operand type clash: tobbe is incompatible with tobbe
-
And if you try
-
CREATE PROCEDURE tobbe_sp @t otherdb.dbo.tobbe READONLY AS
- SELECT a FROM @t
-
You get the message:
-
Msg 117, Level 15, State 2, Procedure tobbe_sp, Line 1
-The type name 'otherdb.dbo.tobbe' contains more than the maximum number of prefixes. The maximum is 1.
-
This some awkward message informs us that the data type for a parameter cannot be a three-part name with a database component.
-
You cannot create stored procedures or
- user-defined functions in the CLR that
- take a table-valued parameter. But the
- other way works: you can call a T‑SQL procedure with a TVP from a CLR procedure, using the same mechanisms you use from a client and which is what we will
-look at next.
Passing values to TVPs from ADO .NET is very straightforward, and requires very little extra code compared to passing
- data to regular parameters. You need .NET Framework 3.5 SP1 or higher to have support for TVPs. You can only use TVPs with SqlClient; you cannot use TVPs with the classes in the System.Data.OleDb or System.Data.Odbc namespaces.
-
The specifics can be summarised as:
-
-
For the data type you specify SqlDbType.Structured.
-
You specify the name of the table type in the TypeName property of the parameter.
-
You set the Value property of the parameter to something suitable.
-
-
Exactly what is suitable then? There is an MSDN topic that suggest that the three choices are List<SqlDataRecord>, a DataTable or a DbDataReader. It turns out that this is not the full story. I have not been able – and nor have I really tried – to find the exact requirements, but it seems that you can pass anything that implements IEnumerable and IDataRecord, and then DataTable is a special case that goes beyond that. Exactly what you can use and not use is not particularly interesting. I would suggest that in practice you will use one of these four:
-
-
List<SqlDataRecord>.
-
Custom-written classes that implement IEnumerable<SqlDataRecord> and IEnumerator<SqlDataRecord>.
-
DataTable.
-
A DbDataReader of some sort.
-
-
Of these, you would use the first two for general-purpose programming. The only reason to pass a DataTable is that you already have the data in such an object. If you have the data somewhere else – in a file, on a wire etc – there is no reason to fill a DataTable when you can use a List which is more lightweight. On the same token, the only reason you would use a DbDataReader, is because you have a DbDataReader anyway. That is, if the data for your TVP comes from an Oracle database, you can pass an OracleDataReader directly – no need to populate a List or a DataTable.
-
For this reason, in this article I focus on the first two alternatives, and all examples use either a custom-written class or a List<SqlDataRecord>.
-
One caveat about DataTable and DbDataReader: if your TVP has an IDENTITY column or a computed column, you may not be able to get these columns to work with your objects. In this case, you can always use a List or a custom-written iterator, since this gives you access to some more options to define the metadata for the TVP, and I will briefly cover how to do this later.
-
About the Sample Code
-
Before we move on, I like to give a quick introduction to the demo files that accompany this article. They are compiled in two zip files, one with the demos in C# and one with the same demos in Visual Basic .NET. Use the language that is the most convenient to you. In the text itself, I sometimes show the code in C# and sometimes in VB .NET. If you are more comfortable with the language I'm not using for the moment, please refer to the corresponding file in the other language. For instance, if I refer to TVPDemo.DemoHelper.cs, you can rely on that there is also a TVPDemo.DemoHelper.vb file in the zip file with the VB code.
-
Beside the source code in C# and VB .NET, the zip files also include an SQL script and a file with sample data for one of the demos. There is also a file compile.bat you can use to compile the files. There are however no project/solution files for Visual Studio, as that goes a little above my head.
-
I will cover the code in the zip files as we arrive to the examples where they belong. There is however one class I like to highlight here and now, and that is the TVPDemo.DemoHelper class. This class includes some utility routines that are of little interest for the article as such. There is one thing I like to highlight, though, to wit the connection string:
You may have to change it to fit your environment. Particularly, if you only have Express Edition installed, you should probably use .\SQLEXPRESS for Data Source instead of the single dot.
-
In the article, the code mainly appears without comments, since I explain the code in the text. However, in the source files, the code is thoroughly commented.
-
Disclaimer: My expertise is in SQL Server, and I only write .NET code left-handedly. While I have done my best to adhere what I think is best practice, you may see things which makes you think "I would never do something like that". It is not unlikely that you will be right. Please let me know in such case!
-
Sending a Comma-Separated List to SQL Server
-
The Arrays and Lists articles take their base in the problem of using a comma-separated list in SQL Server. Programmers often encounter them, because there are form controls that produce such lists. (Or so the .NET programmers I know keep telling me.) The other articles in this series present solutions to transform these lists into a table in SQL Server. Here I'm showing you a much better solution: transform the list in the client and pass it to a table-valued parameter. SQL Server should spend its resources on reading and writing tabular data, not string processing. Not only are the resources better spent this way, the solution is also much simpler and cleaner with help of the class CSV_splitter that I will introduce.
-
Using the CSV_splitter Class
-
Using the CSV_splitter class is extremely simple. All your application code sees is a call to the constructor and that's it. Here is an example where we call a stored procedure with a TVP. We use the table type and the stored procedure I used in the T‑SQL section above.:
-
CREATE TYPE integer_list_tbltype AS TABLE (n int NOT NULL PRIMARY KEY)
-go
-CREATE PROCEDURE get_product_names @prodids integer_list_tbltype READONLY AS
- SELECT p.ProductID, p.ProductName
- FROM Northwind.dbo.Products p
- WHERE p.ProductID IN (SELECT n FROM @prodids)
-
In the set of demo files you find CSVDemo.vb which includes the
-procedure CSV_to_SP that calls get_product_names, and it is no more complicated
-than this.
-
Private Sub CSV_to_SP()
-
- Using cn As SqlConnection = TVPDemo.DemoHelper.SetupConnection(), _
- cmd As SqlCommand = cn.CreateCommand()
-
- cmd.CommandType = CommandType.StoredProcedure
- cmd.CommandText = "dbo.get_product_names"
-
- cmd.Parameters.Add("@prodids", SqlDbType.Structured)
- cmd.Parameters("@prodids").Direction = ParameterDirection.Input
- cmd.Parameters("@prodids").TypeName = "integer_list_tbltype"
- cmd.Parameters("@prodids").Value = _
- new TVPDemo.CSV_splitter("9,12,27,37")
-
- Using da As new SqlDataAdapter(cmd), _
- ds As new DataSet()
- da.Fill(ds)
- TVPDemo.DemoHelper.PrintDataSet(ds)
- End Using
- End Using
-End Sub
-
To a large extent, very typical code to call a stored procedure. We first set up a connection and create a command object. We move on to state which stored procedure to call, and we define the single parameter that get_product_names accepts. Finally, we invoke the procedure, and in this example I have chosen to use DataAdapter.Fill together with a method in my DemoHelper class that prints the result set. In a real-world scenario you may prefer to use ExecuteReader or whatever fits you.
-
(I assume that most readers are acquainted with Using, but in case you are not: this statement permits you to declare a variable
- that is accessible in the enclosed block, and when the block exits, any Dispose method of the class will be invoked. This is
- highly recommendable for SqlConnection and SqlCommand objects. If you just leave it to garbage collection to take care of
-them, you may spew SQL Server with a lot of extra connections. Using is available in C# as well, but spelt using.)
-
The interesting part is the four statements that set up the parameter. The first adds the parameter and defines the type:
Specifying the direction of the parameter is somewhat superfluous; since TVPs are read-only, Input is the only choice. Nevertheless, I have included it for clarity. Next we introduce the name of the table type in SQL Server, by setting the special parameter property TypeName:
Strictly speaking, this is not necessary when calling a stored procedure, since SQL Server knows the type anyway.
- However, it is definitely best practice to always specify the type. For
- one thing, this will give you a clearer error message when there is a mismatch between the structure you pass from the client and the table type in SQL Server.
-
And now – drum roll! – it's time pass an actual value to the TVP:
-
cmd.Parameters("@prodids").Value = new TVPDemo.CSV_splitter("9,12,27,37")
-
You create a new CSV_splitter object which you pass as the parameter value. And as the parameter to the constructor you pass your list of comma-separated integers. Since this is a sample, the list is a constant; in practical code you would of course have a variable here.
-
All you need to do to get this to work is to put the CSV_splitter class in place. Which is very simple, since the code is included in the download files. You only need to change the namespace to fit your local conventions. The joy is that this class is perfectly reusable, and while I will cover the internals of the class in a second, all you really need to know if you are in a hurry is this:
-
-
The class assumes a list of integers – more precisely Int64. If you want a list of strings, you will need to clone the class.
-
The constructor takes an optional parameter which permits you to specify a different delimiter. (But it has to be a single-character delimiter.)
-
Empty elements in the string are ignored.
-
-
You might ask: what if I don't use stored procedures? Can I still use TVPs and the CSV_splitter class? Sure enough. The file CSVDemo.vb also includes this routine:
-
Private Sub CSV_to_SQL()
-
- Using cn As SqlConnection = TVPDemo.DemoHelper.SetupConnection(), _
- cmd As SqlCommand = cn.CreateCommand()
-
- cmd.CommandType = CommandType.Text
- cmd.CommandText = " SELECT p.ProductID, p.ProductName " & _
- " FROM Northwind.dbo.Products p " & _
- " WHERE p.ProductID IN (SELECT n FROM @prodids)"
-
- cmd.Parameters.Add("@prodids", SqlDbType.Structured)
- cmd.Parameters("@prodids").Direction = ParameterDirection.Input
- cmd.Parameters("@prodids").TypeName = "integer_list_tbltype"
- cmd.Parameters("@prodids").Value = _
- New TVPDemo.CSV_splitter("1, 11, 76, 34")
-
- Using da As new SqlDataAdapter(cmd), _
- ds As new DataSet()
- da.Fill(ds)
- TVPDemo.DemoHelper.PrintDataSet(ds)
- End Using
- End Using
-End Sub
-
It is very similar to CSV_to_SP. The one thing to observe is this line:
When you use CommandType.Text, it is compulsory to specify the name of the table type. For stored procedures you can leave it out, but as I noted above, best practice is to always include the type name.
-
Inside the CSV_splitter Class
-
As I discussed above, the object you pass as the value for a TVP must implement IEnumerable<SqlDataRecord> and IEnumerator<SqlDataRecord>. I guess most .NET programmers understand what this means. In case you don't: an interface consists of a number of members with well-defined signatures, but without any code. To implement an interface you write a class that includes the members of the interface with exactly those signatures – now with code added. To this you can add other members as you like. You don't have to worry too much about inadvertently leaving something out – the compiler will inform you of any small detail you forget. Some interfaces feature over 20 members, but these two interfaces are quite slender with in total four methods and one property.
-
While the main purpose is to feed a table-valued parameter, it is worth noting that since CSV_splitter implements IEnumerable, you can use the class in this way.
-
foreach (SqlDataRecord rec in new TVPDemo.CSV_splitter("1,2,3,4")) {
- Console.WriteLine (rec.GetInt64(0).ToString());
-}
-
Not that this is particularly useful, but it gives an understanding what this is all about.
-
I will now walk you through the inside of the CSV_splitter class, which you find in TVPDemo.CSV_splitter.cs. For reference, here is the using section:
-
using System;
-using System.Collections.Generic;
-using Microsoft.SqlServer.Server;
-
Nothing startling here. (Most people would probably add a few more namespaces, but I refer to some classes in full for clarity.) The class declaration looks like this:
-
public class CSV_splitter : IEnumerable<SqlDataRecord>,
- IEnumerator<SqlDataRecord>
-
-
That is, this class implements both IEnumerable and IEnumerator. This is possibly disputable; some people may prefer to have one class per interface, but I could not really see the point in this. (I did say that I'm normally not a .NET programmer, didn't I?)
-
The class has a few private member variables:
-
string input; // The input string.
-char delim; // The delimiter.
-int start_ix; // Start position for current list element.
-int end_ix; // Position for the next list delimiter.
-SqlDataRecord outrec; // The record we use to return data.
-
input is the comma-separated list itself and delim is the delimiter. start_ix and end_ix keep track of where in the string we are. The most interesting member is outrec. As the snippet above shows, each iteration produces an instance of SqlDataRecord and as we shall see, it comes from this outrec variable.
-
To permit for an alternate delimiter, the class has two constructors which in the C# version fork off to a common private method.
First the constructor saves the input parameters into the private members. Next comes the key part: the constructor creates an instance of SqlDataRecord that matches the table type for the table-valued parameter. The constructor for SqlDataRecord accepts an array of SqlMetaData objects. (Both these classes are in the Microsoft.SqlServer.Server namespace.) These classes are closely related: the raison d'être for SqlMetaData is exactly to describe a single column in an SqlDataRecord and ultimately a column in SQL Server.
-
SqlMetaData has a whole slew of constructors to accommodate the various data types in SQL Server and I cover some of the variations as we encounter them. For the CSV splitter we use the simplest constructor of them all and pass only the column name and the data type. You may note that the column we define in SqlMetaData differs from the column in integer_list_tbltype on two accounts:
-
-
The column names are not the same. I have made them different on purpose to show that what names you put in the column definition with SqlMetaData has no importance in the context of passing data to TVPs.
-
The data type is BigInt, while in the table type the column is int. I chose to use BigInt to make the class as general as possible. That is, you can use the class with any integer data type. (Of course, I could have used bigint in the table type as well, but since product IDs in Northwind are int, I used that type.) As we shall see later, this generalism comes with a price.
-
-
The last line in the constructor is a call to Reset which is one of the methods required by the IEnumerator interface. Its task is to initiate start_ix and end_ix, and we set them to values that indicate that we have not starting scanning the string yet:
Next comes the part of the class that implements IEnumerable. This interface requires the implementation of a single method: GetEnumerator, which should return an object that implements IEnumerator. Since the class implements both interfaces, it returns itself:
What is a little tricky is that the interface IEnumerable<T> requires that you also implement the non-generic version (and for some reason, the latter cannot be public).
-
The interface IEnumerator requires you to implement three methods MoveNext, Reset and Dispose and one read-only property, Current. We have already looked at Reset, and Dispose is only there to permit you to explicitly close files or SQL connections without waiting for garbage collection. That leaves MoveNext and Current as the two interesting members.
-
The purpose of MoveNext is to permit the caller to move to the next value in the iteration which the caller can retrieve with Current. MoveNext is a boolean function and should return true as long as there is a new item to retrieve with Current. If the caller moves past the last item, the method should return false.
The first action is to set start_ix to be one step ahead of end_ix. This is followed by a while loop of which the purpose is to skip adjacent delimiters. (Imagine that you have a string like "1,2,,4".) If we at this point find that start_ix is equal to the length of the string, we are past the last character in the string, and we return false to the caller to indicate that the iteration is over.
-
Else start_ix is now at the first character in the next value, and we set end_ix to be at the delimiter following this value. If there is no delimiter after the last value, we pretend that there is one any way. Since there is at least one more value in this case, we return true.
-
That is, all we do here is to position start_ix and end_ix. In the Current property we make use of these values. This property should return the same type as IEnumerable<T> was instantiated with, that is, SqlDataRecord. Here is how our Current property looks like:
-
public SqlDataRecord Current {
- get {
- string str = this.input.Substring(this.start_ix,
- this.end_ix - this.start_ix);
- this.outrec.SetInt64(0, Convert.ToInt64(str));
- return this.outrec;
- }
-}
-
We first extract the
- substring
-between start_ix and end_ix - 1, and then we convert that value to Int64 to set the only column in the outrec which we then return. From a logical point of view, the code could just as well have read:
-
public SqlDataRecord Current {
- get {
- string str = this.input.Substring(this.start_ix,
- this.end_ix - this.start_ix);
- SqlDataRecord outrec = new SqlDataRecord(
- new SqlMetaData("nnnn", System.Data.SqlDbType.BigInt));
- outrec.SetInt64(0, Convert.ToInt64(str));
- return outrec;
- }
-}
-
And there would have been no need to have outrec as a variable on class level, but it seemed to me slightly more efficient to create the record once and reuse it.
-
When you implement IEnumerable<T> you must also implement a non-generic version, and we just let it invoke the generic version.
-What you have seen in MoveNext and Current is fairly normal string-parsing code. There is certainly room for all sorts of improvements: multi-character delimiters, alternate delimiters, trim blanks. (A string like "1,2, ,3" will cause a run-time error in Convert.ToInt64.) If you want to handle comma-separated lists of strings, you can easily clone the class – or make the type a parameter or make the class generic. I leave all these ideas as exercises to the reader.
-
To conclude, you can see that implementing a custom-iterator to feed a TVP is by no means any advanced matter, and we will leverage on this later in this article.
Before we move on to the next demo, we will learn some more theory, mainly from the perspective of performance. The other Arrays and Lists articles discuss performance, so why not this one? In the first two subsections we will look at how TVPs performs compared to methods where we send a comma-separated list or similar to SQL Server. In the last subsection, we will discuss whether the TVP should have a primary key, and how we can improve performance when we know have data that is sorted. In passing, we will also learn how to work with IDENTITY columns and computed columns in the table type.
As you have understood from the fact that I devoted an article solely to table-valued parameters, this is the
- preferred method for passing a list of values to SQL Server. One important reason is simplicity: writing a stored procedure that
- accepts a table-valued parameter is straightforward. Not that using a list-to-table function is a big deal, but relational databases are centred around tables. And as you have seen, passing a value to
- a TVP from ADO .NET is
- a very simple affair. TVPs also have the advantage that you can add constraints to the table type to enforce uniqueness or some other type of contract. Nor do you have to worry in your database code about format errors in a comma-separated list.
-
Does this also mean that this method gives you the best performance? In general, yes. In each and
- every case? No. When running the tests for the performance appendix, I did find situations where other methods
- outperformed TVPs. However, I believe that in the long run TVPs will you give you better performance than any other
- method. There are two reasons for this:
-
Data is already in table format. With all other methods, cycles need to be spent on parsing a character string
- to get the data into table format. In my tests, the fixed-length method performed better in some tests with integer data. Indeed, this method just chops up a fixed-length string reading from a
- table of numbers, so it is very similar to reading from a table variable. However, TVPs have one more ace up the sleeve:
-
The optimizer gets a clue. For all other methods, the optimizer has no understanding of what is going on.
- In many situations you get a useful plan nevertheless, but with methods based on inline T‑SQL functions the optimizer often lose grip
- entirely and produce a plan that is nothing but a disaster. And even if the plan is useful, it may not be the most optimal because the optimizer
- has no idea how many rows your list of values will produce, which means that if you use the list in a query with other
- tables, row estimates are likely to be way off.
-
This is different for table-valued parameters. Just like table variables, table-valued parameters do not have
- distribution statistics, but there is nevertheless one piece of information: cardinality. That is, the first time you call a procedure that
- takes a TVP, the optimizer sniffs the TVP – as sniffs all other parameters – and the optimizer sees that
- the TVP has so and so many rows. This gives the optimizer better odds for good estimates for the number of rows in
- the rest of the query.
-
Not that it is perfect: There is the general problem that the sniffed value may be atypical. (For a closer discussion on parameter sniffing, see my article Slow in the Application, Fast in SSMS?.) And it
- is not always correct information leads to the best plan; in the performance appendix for SQL 2008 you can read about a case where SQL Server chooses an incorrect plan, when it has more accurate cardinality information. But as I discuss in the appendix this concerns only a window of the input size. Furthermore, cardinality is far from sufficient in all cases. Consider the query:
-
SELECT * FROM Orders WHERE CustomerID IN (SELECT custid FROM @custids)
-
Say that there are four values in @custids. If they are just four plain customers,
- seeking the non-clustered index on CustomerID is good. But if they are the top four customers accounting for 40 % of the volume, you want a table scan. But
- since a TVP does not have distribution statistics, the optimizer
- cannot distinguish the cases. The workaround is
- simple: bounce the data over a temp table and take benefit of that temp tables have distribution statistics. Since that workaround
- is the same as for all list-to-table functions, you may argue that when you need to do this, there is no special
- performance advantage of TVPs.
A reasonable question is: does TVP incur more calling overhead than regular parameters? The answer is yes. In my
- tests I found that passing 50 000 integer values to an unindexed TVP from ADO .NET took
- 40-50 ms compared to
- 20-35 ms for a comma-separated list. (Note that these numbers apply to the specific hardware that I used for the tests.) For a TVP with a primary key, the overhead was around 150 ms.
-
While this overhead may seem considerable, you need to put it in perspective
- and look at the total execution time, and in most cases, the server-side
- execution time exceeds the numbers in the previous paragraph with a wide
- margin. As just one
- data point: in my test, the server-side execution time for my join test over
- 50 000 list elements was 213 ms for a non-indexed TVP, and the best non-TVP method (fixed-length
- binary input) needed 420 ms. The performance appendix for SQL 2008 has more details.
-
As for the extra overhead when there is a primary key, we will discuss this more closely in the next section.
-
Primary Keys and Sorted Data – Looking Closer at the SqlMetaData constructors
-
The SqlMetaData class has no less than 15 constructors. They control in total 17 read-only properties – i.e., once set you can't change them. To a great extent which constructor to use depends on the data type. For a string or a binary column you use a constructor that includes the maxLength parameter, for a decimal column you need one that exposes scale and precision etc. I am not covering all constructors and properties here, but I refer you to the .NET documentation.
-
Here I will discuss four parameters to control special properties for table-valued parameters. They appear in several constructors, and a constructor either has all four or none of these parameters. Here is the C# declaration for the simplest of these constructors:
-
public SqlMetaData(
- string name,
- SqlDbType dbType,
- bool useServerDefault,
- bool isUniqueKey,
- SortOrder columnSortOrder,
- int sortOrdinal)
-
The first of these parameters, useServerDefault, serves a different purpose than the other three. You may guess from the name what it is all about, but your guess may not be exactly right. When you specify this parameter as true, SQL Server will ignore any value you set for the column but always set the column to its default value. Sounds corny? Here is the scoop: the SqlDataRecord must have exactly as many columns as your table type has. But what if your table type includes an IDENTITY column or a computed column which you cannot assign values to? It is for that sort of columns you specify useServerDefault as true. It's also useful for columns with a default of newid() or NEXT VALUE FOR. (The latter is for sequences, a feature added in SQL 2012.)
-
The other three parameters, isUniqueKey, columnSortOrder and sortOrdinal are related and they exist in order to permit a performance enhancement. But before we can discuss what purpose they serve and how they work, we need to take one step back and look at the declaration for the table type we used with get_product_names.
-
CREATE TYPE integer_list_tbltype AS TABLE (n int NOT NULL PRIMARY KEY)
-
The table type has a primary key, and thus it assumes that the values in the TVP are unique. Is this a good thing? To start with, when you design your tables, you should always look for a natural primary key, and this includes table variables and temp tables. One reason is that if you write your code under the assumption that a certain column or a set of columns is unique, you should also state this in the table declaration as an assertion. If your assumption is incorrect, your code will die early and not produce incorrect results.
-
But there is also a performance aspect. Let's look at the code for get_product_names again:
-
CREATE PROCEDURE get_product_names @prodids integer_list_tbltype READONLY AS
- SELECT p.ProductID, p.ProductName
- FROM Northwind.dbo.Products p
- WHERE p.ProductID IN (SELECT n FROM @prodids)
-
For SQL Server, the query is equivalent to:
-
SELECT p.ProductID, p.ProductName
-FROM Northwind.dbo.Products p
-JOIN @prodids ps ON ps.n = p.ProductID
-
If the table type would not have a primary key, this would not be true. Instead the equivalent query would be:
-
SELECT DISTINCT p.ProductID, p.ProductName
-FROM Northwind.dbo.Products p JOIN @prodids ps ON ps.n = p.ProductID
-
That is, SQL Server would have to add an operator somewhere to remove duplicate values. This comes with an extra cost. Of course, for four values in the TVP this is entirely negligible, but assume that there are has 50 000 values. Now the difference is starting to be measurable, and you can see this in the performance appendix.
-
However, as I noted above, I found in my performance tests that there is considerable difference in overhead when passing data to a TVP with a primary key and one without. And indeed, from what I have said this far, this is a zero-sum game. If the TVP has a primary key, there is no need for a Sort or Hash operator in the query above to remove duplicates. But when the data arrives, SQL Server must sort it so that it can be stored according to the index. Only if the TVP is used in more than one query, there is a performance gain with the primary key.
-
If we don't know anything about the data we are passing to SQL Server, we can't do any better. But what if we know that the data already is sorted according to the index? This is where the three parameters isUniqueKey, columnSortOrder and sortOrdinal come into play. They permit you to specify that the data is sorted and how. isUniqueKey should be true in this case. columnSortOrder can take any of the values SortOrder.Unspecified, SortOrder.Ascending and SortOrder.Descending. (The SortOrder enum is in the System.Data.SqlClient namespace.) For sorted data you would use any of the latter two; Unspecified is the value you use when you use a constructor with these parameters to be able to specify true for useServerDefault. Finally, SortOrdinal specifies where in the unique key the column appears. Use 0 for the first column in the key, 1 for the second etc. Use ‑1 for SortOrder.Unspecified. (If you want to see an example on this, stay tuned. They will be coming.)
-
You need to use these parameters with care. It goes without saying that you need to ensure that the data you have really is sorted. If you sort the data or create the sort keys yourself, you have control, but it may be precarious to rely on data coming from an outside source to be sorted. If you are mistaken, SQL Server will not let you get away with it, but produce an error message like this one.
-
Msg 4819, Severity 16, State: 1, Procedure , Line no: 0
-Cannot bulk load. The bulk data stream was incorrectly specified as sorted or the
-data violates a uniqueness constraint imposed by the target table. Sort order
-incorrect for the following two rows: primary key of first row: (gamma), primary
-key of second row: (delta).
-Msg 3621, Severity 0, State: 0, Procedure , Line no: 1
-The statement has been terminated.
-
There is another thing to watch out for, and in this case SQL Server will stay silent. Inspired by what we have read, we may get the idea to change the constructor for the CSV_splitter class, so that outrec is created in this way:
-
this.outrec = new SqlDataRecord(
- new SqlMetaData("nnnn", SqlDbType.BigInt,
- false, true, SortOrder.Ascending, 0));
-
If you make this change and then run the CSVdemo program, you will find that it runs just fine. But wait! In the procedure CSV_to_SQL there is this line:
-
cmd.Parameters("@prodids").Value = New TVPDemo.CSV_splitter("1, 11, 76, 34")
-
Data is out of order, so an error message is to be expected. Still we did not get any. Why? Recall that CSV_splitter uses BigInt to be as reusable as possible, while the table type has an integer column. Because of the data-type mismatch, SQL Server decides to ignore the information that the data is sorted and sorts it anyway. If you change the type to SqlDbType.Int and try again, you will get the error message above.
-
Thus, to be sure that SQL Server does not decide to sort behind your back, you should make sure that you create the SqlDataRecord object so that it matches your table type exactly. To be precise, you can have a mismatch as long as SQL Server feels that it can trust the conversion to not affect the sort order. If you want to be sure, the simplest way to test is to send data out of order. If you get error message 4819, the plot worked, else it did not. You can also use Profiler, and include the event Performance:Show Statistics XML Profile and run the application. If you also add SP:StmtCompleted you will see the insertion into the TVP as encrypted text. This helps you to locate the query plan, and it should not include a Sort or Hash operator.
-
Character data is particularly difficult in this context. The first thing to note is that the length must match. That is, if you define the column in .NET as
-
new SqlMetaData("charcol", SqlDbType.NVarChar, 120,
- false, true, SortOrder.Ascending, 0);
-
but the target column is nvarchar(20), SQL Server will ignore your sorting parameters and sort the data. Another complication is that character data can be sorted in many ways, that is, according to different collations. If you look through the constructors for SqlMetaData you will find two parameters localeID and compareOptions which seem like they could be used to specify the collation. I tested this, but I found that they had no effect. From what I can tell, SQL Server assumes that character data is always sorted according to the database collation. If the data you send with the TVP is sorted according to a different collation, you will get an error once there is a deviation. You can of course specify an explicit collation for the column in the table type, and it may save you from error messages about data being non-unique. However, my testing indicates that if a key column has a different collation from the database collation, SQL Server will ignore the sorting parameters and always sort the incoming data stream.
-
Loading Data through Table-Valued Parameters
-
We will look at one more example. This time we will see how we can use table-valued parameters to easily load lots of data to SQL Server. There are several other options for this task: BCP, BULK INSERT, SQL Server Integration Services and the SqlBulkCopy class. But none these options permit you to send data directly to a stored procedure. We will learn two ways to do this. The plain way where we read the file into memory and a more efficient way where we stream the file to the TVP. I've taken the opportunity to cover some ground beyond the topic of TVPs, so you may learn some other tricks in this chapter as well.
-
The Setup
-
For this example we will look at loading data into these two tables:
-
CREATE TABLE Albums (AlbumID int IDENTITY,
- Artist nvarchar(200) NOT NULL,
- Title nvarchar(200) NOT NULL,
- ReleaseDate date NULL,
- Length time(0) NULL,
- CONSTRAINT pk_Albums PRIMARY KEY (AlbumID)
-)
-
-CREATE TABLE Tracks (AlbumID int NOT NULL,
- TrackNo tinyint NOT NULL,
- Title nvarchar(200) NOT NULL,
- Length time(0) NULL,
- CONSTRAINT pk_Tracks PRIMARY KEY (AlbumID, TrackNo),
- CONSTRAINT fk_Tracks_Albums FOREIGN KEY(AlbumID)
- REFERENCES Albums(AlbumID)
-)
-
We have a music collection, and Albums includes information about an album, and Tracks details the tracks for the albums. All and all, a fairly typical master-detail scenario. These table definitions, as well as other SQL code in this chapter, are inclued in the file fileloaddemo.sql which you find among the demo files.
-
Our task is to load new albums with their tracks into the database, from the file Albums.csv which is also included in the demo files. Here are some sample lines from this file:
-
A,Adrian Belew,Desire Caught By the Tail,,33:25
-T,1,Tango Zebra,458553,
-T,2,Laughing Man,332460,
-T,3,The Gypsy Zurna,187141,
-T,4,Portrait of Margaret,240718,
-T,5,Beach Creatures Dancing Like Cranes,197564,
-T,6,At the Seaside Cafe,113319,
-T,7,Guernica,127216,
-T,8,"""Z""",338416,
-A,"Al di Meola, John McLaughlin, Paco de Lucia",Friday Night in San Francisco,8/10/1981,42:09
-T,1,A. Mediterranean Sundance-B. Rio Ancho,708780,
-T,2,Short Tales of the Black Forest,535484,
-T,3,Frevo Rasgado,486608,
-T,4,Fantasia Suite,541492,
-T,5,Guardian Angel (McLaughin),247066,
-A,David Bowie,"""Heroes""",14/10/1977,40:56
-T,1,Beauty and the Beast,217182,
-
The first field defines whether the line contains an album (A) or a track (T). On an Album line, the fields are Artist. Album title, Release date and Length in minutes and seconds. On a Track line, the fields are Track number, Track title and Length in milliseconds. That is, the fields are the same as in the tables, except for one thing: there is no AlbumID. It is part of our loading task to assign this id.
-
As for the format, you can note that some fields are quoted in double quotes, but this happens only when the field includes a comma or a double quote. Some fields include a plethora of double quotes; this happens when the double quotes are part of the value. (You may recall that the name of David Bowie's classic album from 1977 really is "Heroes" with quotes and all.)
-
An aside: you cannot load this file with BCP or BULK INSERT in a simple way. To start with, they cannot really cope with master-detail formats at all, but you would have to load the data into a staging table to be able to separate albums and tracks. And this is only possible it there is an equal number of fields on each line. As it happens, Excel – which I used to create this file – was kind to add an extra comma at the end of the Tracks lines, so this is not an issue here. Instead, the real killer is the inconsistent quoting. As long as a field is consistently quoted through a file, you can load quoted fields with BCP or BULK INSERT, if you use a format file that specifies delimiters that include the quotes. But in this file where only some values are in quotes and where these values include the field delimiter, BCP and BULK INSERT are completely lost. These tools are designed to read a binary stream, and do they not do string parsing.
-
We need two table types and a stored procedure. The table types mirror the file with one addition:
-
CREATE TYPE Albums_tbltype AS TABLE
- (TempID int NOT NULL,
- Artist nvarchar(200) NOT NULL,
- Title nvarchar(200) NOT NULL,
- ReleaseDate date NULL,
- Length time(0) NULL,
- PRIMARY KEY (TempID)
-)
-
-CREATE TYPE Tracks_tbltype AS TABLE
- (TempID int NOT NULL,
- TrackNo tinyint NOT NULL,
- Title nvarchar(200) NOT NULL,
- Length time(0) NULL,
- PRIMARY KEY (TempID, TrackNo)
-)
-go
-
Since there is no album ID in the file, the loading process must assign new ids. As long as we have the file, we know which tracks that go with which albums, since the file is ordered. But when we load the data into different tables that order is lost, since tables are unordered objects by definition. For this reason, both table types include a column TempID, which is a temporary ID that uniquely identifies an album during the loading process.
-
The stored procedure is worth dwelling on for an extra second:
-
CREATE PROCEDURE LoadAlbums @Albums Albums_tbltype READONLY,
- @Tracks Tracks_tbltype READONLY AS
-
-DECLARE @idmap TABLE (TempID int NOT NULL PRIMARY KEY,
- AlbumID int NOT NULL UNIQUE)
-
-SET XACT_ABORT ON
-BEGIN TRANSACTION
-
-MERGE Albums A
-USING @Albums T ON 1 = 0
-WHEN NOT MATCHED BY TARGET THEN
- INSERT(Artist, Title, ReleaseDate, Length)
- VALUES(T.Artist, T.Title, T.ReleaseDate, T.Length)
-OUTPUT T.TempID, inserted.AlbumID INTO @idmap(TempID, AlbumID)
-;
-
-INSERT Tracks(AlbumID, TrackNo, Title, Length)
- SELECT i.AlbumID, T.TrackNo, T.Title, T.Length
- FROM @Tracks T
- JOIN @idmap i ON i.TempID = T.TempID
-
-COMMIT TRANSACTION
-go
-
To start with, the procedure sets up a user-defined transaction so that we don't end up loading only the albums. While I am a strong advocate of error handling, I don't use TRY-CATCH here. In the interest of brevity, I let it suffice with SET XACT_ABORT ON to make sure that any error aborts and rolls back the transaction. (If you want directions for error handling, please see my article Error Handling in SQL Server 2005 and Later.)
-
What may surprise the reader is the MERGE statement. This is a pure insert operation (for the sake of the example, I am completely ignoring that the album may already be in the database), so why use MERGE? And with that weird condition 1 = 0? By using this condition we make sure that no rows in the source match the target. That is, all rows in @Albums will match the condition WHEN NOT MATCHED BY TARGET, and thus all rows in @Albums will be inserted into Albums. Or in another words, this is a complicated way of saying:
Why all this? The answer lies in the OUTPUT clause. We need to map the TempID in @Albums to the IDENTITY values generated for AlbumID in Albums, so that we can insert the correct AlbumID values into Tracks, and this is the purpose of the table variable @idmap. If you try to make the mapping with INSERT, you will find that this does not work, because in the OUTPUT clause for INSERT you only have access to the columns in the target table. This is different with MERGE; with MERGE you have access to both target and source columns in the OUTPUT clause.
-
When inserting into Tracks there is no need for extra fireworks, and we can use plain INSERT where we pick up the album IDs from the@idmap table.
-
Take One: Reading the File Into a List
-
There are two example programs to load the file, and we will first look at fileloaddemo1.cs which reads the file into two List<SqlDataRecord>, one for albums and one for tracks. This program starts of with a number using clauses, of which one may be surprising:
System is needed as always of course, and System.Data includes SqlDBType and more. SqlClient is what this text is all about. We need System.Collections.Generic for the class List<T>, and as noted previously we get SqlDataRecord and SqlMetaData from Microsoft.SqlServer.Server. But staunch fans of C# may be appalled by the appearance of Visual Basic here. As I pointed out above, the format of this file is somewhat complex. While I could have written the code to parse the lines on my own, I said to myself "this file has been generated by Excel; there must be code out there that performs this task". So I did a search on Google, and I was quickly pointed to the class TextFieldParser that exists in the namespace Microsoft.VisualBasic.FileIO.
-
If you want to use this class from C#, you need to add a reference to Microsoft.VisualBasic.dll. VB programmers get this DLL automatically.
-
Fileloaddemo1 includes two routines of interest, read_file and load_albums. The latter first calls read_file and then calls the stored procedure LoadAlbums. We will look at read_file first. Here is the declaration:
-
private static void read_file (string filename,
- out List<SqlDataRecord> albums,
- out List<SqlDataRecord> tracks) {
-
It accepts a file name and return album and track data in the two List parameters. The first few lines in read_file are pretty dull:
The two items from System.Globalization are some jazz needed when we parse the date and time fields, I'll return to them later. The variable album_no is more interesting: this variable will feed the TempID columns in the table parameters.
-
The next two statements are significantly hotter, because this is where we set up the SqlMetaData definitions that map to our table types:
-
SqlMetaData[] albums_tbltype =
- { new SqlMetaData("id", SqlDbType.Int, false,
- true, SortOrder.Ascending, 0),
- new SqlMetaData("artist", SqlDbType.NVarChar, 200),
- new SqlMetaData("album", SqlDbType.NVarChar, 200),
- new SqlMetaData("released", SqlDbType.Date),
- new SqlMetaData("length", SqlDbType.Time, 0, 0)};
-
-SqlMetaData[] tracks_tbltype =
- { new SqlMetaData("id", SqlDbType.Int, false,
- true, SortOrder.Ascending, 0),
- new SqlMetaData("trackno", SqlDbType.TinyInt, false,
- true, SortOrder.Ascending, 1),
- new SqlMetaData("title", SqlDbType.NVarChar, 200),
- new SqlMetaData("length", SqlDbType.Time, 0, 0)};
-
In difference to the CSV_splitter class, we don't create any SqlDataRecord at this point; since we are adding to a List, we will need a new SqlDataRecord object each time. Whence, we only create the SqlMetaData arrays in advance.
-
Here we see some more examples of using the special parameters for the SqlMetaData constructor to specify that the data is sorted. For albums_tbltype there is a single column in the sort key, while for tracks_tbltype there is a composite key and as you see we specify that both columns are unique. We set the parameter sortOrdinal to 0 and 1 respectively. Admittedly, to some extent this contradicts what I said previously about ensuring that the data is sorted. The id columns are no problem; we are generating the id values in our code and we have full control over them. But the track numbers comes from the file and in a real-world scenario, we may not be able to rely on that the track numbers come in numeric order.
-
Here are also examples of SqlMetaData constructors where we specify the length for the string columns. For the time columns we need to use a constructor that exposes scale and precision, even if time only has one of them.
-
In the C# version we create the lists at this point:
-
albums = new List<SqlDataRecord>();
-tracks = new List<SqlDataRecord>();
-
(In the VB code this happens in load_albums since VB did not seem to like it when I passed uninitialised variables.)
-
Next we open the file by creating a TextFieldParser object:
-
TextFieldParser fp = new TextFieldParser(filename,
- System.Text.Encoding.Default);
-
In total, this class offers eight different constructors. For this demo, we use one where we pass the name of the file (there are also constructors accept a Stream object instead) and the encoding. The default for the TextFieldParser is UTF-8, but CSV files from Excel appears to always be ANSI files. (And since one of the tracks from "Heroes" is called Neuköln it matters for the sample file.)
The TextFieldParser can handle both delimited files and fixed-length formats. Here we set up the file to be comma-delimited. We also specify that there are fields enclosed in quotes. Yet an option, that we don't make use of, is to specify comment tokens.
-
Once this is done, we have completed the preparations and can read the file.
-
while (! fp.EndOfData) {
- String[] fields = fp.ReadFields();
-
The ReadFields method consumes the next set of fields and returns them in a string array. (If the file does not comply with the expected format, the method will throw an exception, but I have not included any error handling to keep the example down in length.) Depending on fields[0] we take different paths:
-
if (fields[0] == "A") {
- SqlDataRecord album_rec = new SqlDataRecord(albums_tbltype);
If we have an A in the first field, we create an SqlDataRecord that aligns with the table type for albums, and then we go on and populate the fields, using various Set methods of the SqlDataRecord class. Above, we save the temporary id (which we first increment), the artist name and the album title. As you see, we refer to the columns by number, starting on 0. If you prefer to access the columns by name, you need to use the GetOrdinal method:
Note here that you need to use the name you specified in the SqlMetaData constructor; you cannot use the names in the table type.
-
The ReleaseDate column is a little more complex for two reasons: it is permitted to be NULL, and date formats are always problematic. Here is the code:
We use TryParseExact to see if there is a legit date in the field. It just so happens that the dates in the file are on the format DD/MM/YYYY, because I generated the CSV file with my regional settings set to English (Australia). (Had I used my regular Swedish settings, the CSV file would have had semicolon as delimiter, which would have been less interesting with regards to the double quotes.) When reading dates from text input – be that a file or text box – you should never assume that all dates are well-formed. There may be a mix of different date formats, and there may be completely bogus dates like 1992-02-30. If the parsing succeeds, we set the date column in album_rec, else we set it to NULL.
-
When I composed this demo program, the release date proved to be the most difficult to get right. It turned out that it is not sufficient to specify an exact date format. When I tested the program, I had switched back to Swedish settings where the date format is YYYY-MM-DD. Eventually I found that I could not leave the third parameter null, but I had to use an explicit value to state that I wanted to ignore regional settings, whence this no_culture. no_datetime_style is the value for an enum parameter which is mandatory with TryParseExact.
-
The last album field is the length, which is handled similarly:
It first calls read_file to fill albums and tracks, and then it calls the stored procedure LoadAlbums. The only difference to the code we saw for comma-separated list is this line:
-
cmd.Parameters["@Albums"].Value = albums;
-
That is, we pass a List object and not an custom-written iterator.
-
While this code may seem trivial, it is worth emphasising the flexibility. Here we pass a List object, but if we would change our mind and want to pass something else, we can do that very easily. In fact, this is exactly what we will do in a second.
-
Take Two: Streaming the File
-
The sample file that comes with this article is short; there are only five albums. But imagine that you have a very large file, tens of megabytes in size. With the solution above, you would have to read the entire file into memory before you start sending the data to SQL Server. Is that really necessary? No, and you might already have guessed how we can approach this. If we can write a custom-iterator for a comma-separated list, we should be able to write an iterator that reads the file, so that SqlClient can send a row to SQL Server as soon as we have read it.
-
Now, the fact that this is a mater-detail file makes this a little more complicated. If we have two TVPs, we would need two iterator classes, one for albums and one for tracks. And these classes would both have to read the file, which thus would be read twice. To avoid this, I decided to use a single table type that can accommodate both row types. Depending on how different headers and details are from each other, this can be quite messy. Thankfully, our albums-and-tracks example is quite forgiving in this sense. (At this point I can sense objection from some readers who think that it is possible to have two table types and still only read the file once. Permit me to come back to this idea after I have gone through the streaming example.)
-
Here is the table type (which you also find in fileloaddemo.sql):
-
CREATE TYPE AlbumTracks_tbltype AS TABLE
- (TempID int NOT NULL,
- TrackNo tinyint NOT NULL,
- Artist nvarchar(200) NULL,
- Title nvarchar(200) NOT NULL,
- ReleaseDate date NULL,
- Length time(0) NULL,
- PRIMARY KEY (TempID, TrackNo),
- CHECK (TrackNo = 0 AND Artist IS NOT NULL
- OR TrackNo > 0 AND Artist IS NULL
- AND ReleaseDate IS NULL)
-)
-
I did not add the A/T field to the table type; instead I use TrackNo as the distinguishing column; TrackNo = 0 indicates that this is a header row. I've also added constraints to state rules that are unique for album rows (Artist must be present) and track rows (must not have Artist and ReleaseDate). Such CHECK constraints help to detect errors in the client program.
-
To use this table type, there is a second stored procedure, similar to the one we looked at previously:
-
CREATE PROCEDURE LoadAlbums_2 @AlbumTracks AlbumTracks_tbltype READONLY AS
-
-DECLARE @idmap TABLE (TempID int NOT NULL PRIMARY KEY,
- AlbumID int NOT NULL UNIQUE)
-
-SET XACT_ABORT ON
-BEGIN TRANSACTION
-
-MERGE Albums A
-USING (SELECT TempID, Artist, Title, ReleaseDate, Length
- FROM @AlbumTracks
- WHERE TrackNo = 0) AT ON 1 = 0
-WHEN NOT MATCHED BY TARGET THEN
- INSERT(Artist, Title, ReleaseDate, Length)
- VALUES(AT.Artist, AT.Title, AT.ReleaseDate, AT.Length)
-OUTPUT AT.TempID, inserted.AlbumID INTO @idmap(TempID, AlbumID)
-;
-
-INSERT Tracks(AlbumID, TrackNo, Title, Length)
- SELECT i.AlbumID, AT.TrackNo, AT.Title, AT.Length
- FROM @AlbumTracks AT
- JOIN @idmap i ON i.TempID = AT.TempID
- WHERE AT.TrackNo > 0
-
-COMMIT TRANSACTION
-
In demo files, there is a sample program fileloaddemo2.vb that calls this procedure. Here is the code that calls LoadAlbums_2:
-
Private Sub LoadAlbums
-
- Using cn As SqlConnection = TVPDemo.DemoHelper.SetupConnection(), _
- cmd As SqlCommand = cn.CreateCommand()
-
- cmd.CommandType = CommandType.StoredProcedure
- cmd.CommandText = "dbo.LoadAlbums_2"
-
- cmd.Parameters.Add("@AlbumTracks", SqlDbType.Structured)
- cmd.Parameters("@AlbumTracks").Direction = ParameterDirection.Input
- cmd.Parameters("@AlbumTracks").TypeName = "AlbumTracks_tbltype"
-
- cmd.Parameters("@AlbumTracks").Value = _
- new TVPDemo.AlbumReader("Albums.csv")
-
- cmd.ExecuteNonQuery()
- End Using
-End Sub
-
You have seen this pattern a couple of times now. What is different from fileloaddemo1 is that there is no call to read_file, but instead there is an instantiation of the class TVPDemo.AlbumReader. This is analogous to when we worked with comma-separated strings of integers, and when we look inside TVPDemo.AlbumReader.vb there is a mix of what we saw in CSV_splitter.cs and fileloaddemo1.cs. The most startling difference may be that this time I show the code is in Visual Basic... So I will rash through the code fairly quickly. The important takeaway is that writing a class that streams a file to a TVP is by no means complicated.
-
Here is the Imports section:
-
Imports System
-Imports System.Data
-Imports System.Collections.Generic
-Imports Microsoft.SqlServer.Server
-Imports Microsoft.VisualBasic.FileIO
-
Again Microsoft.VisualBasic.FileIO is featured, but I like to remind you that the choice of using the TextFieldParser class is due to the specific file format. While it is likely to be useful for CSV files in general, you may have a file format for which it is less suitable. Particularly, it is not that you need to use this class only because you are streaming to a TVP.
-
The class declaration:
-
Public Class AlbumReader
- Implements IEnumerable(Of SqlDataRecord), _
- IEnumerator(Of SqlDataRecord)
-
is no different from the CSV_splitter. I implement both interfaces in the same class. There are some global members:
-
Dim AlbumNo As Integer ' Current album.
-Dim fp As TextFieldParser ' Our file-reading class.
-Dim Outrec As SqlDataRecord ' The record we use to return data.
-
-Dim NoCulture As New System.Globalization.DateTimeFormatInfo
-Dim NoDateTimeStyle As System.Globalization.DateTimeStyles = _
- System.Globalization.DateTimeStyles.None
-
AlbumNo is the TempID for the current album and fp is the object for the file we are reading. Outrec is a single output record that I reuse just like in the CSV_splitter class. Then follows the System.Globalization jazz.
-
The constructor:
-
Public Sub New (FileName As String)
- Me.AlbumNo = 0
-
- Me.Outrec = new SqlDataRecord( _
- New SqlMetaData("id", SqlDbType.Int, false, _
- true, System.Data.SqlClient.SortOrder.Ascending, 0), _
- New SqlMetaData("trackno", SqlDbType.TinyInt, false, _
- true, System.Data.SqlClient.SortOrder.Ascending, 1), _
- New SqlMetaData("artist", SqlDbType.NVarChar, 200), _
- New SqlMetaData("title", SqlDbType.NVarChar, 200), _
- New SqlMetaData("released", SqlDbType.Date), _
- New SqlMetaData("length", SqlDbType.Time, 0, 0))
-
- Me.fp = New TextFieldParser(FileName, System.Text.Encoding.Default)
- fp.TextFieldType = FieldType.Delimited
- fp.Delimiters = New String() {","}
- fp.HasFieldsEnclosedInQuotes = True
-End Sub
-
Again, we take the occasion to state that our TVP is sorted to save SQL Server from sorting when the data arrives. The last few lines set up the TextFieldParser class for reading a CSV file.
-
Next comes GetEnumerator and in Visual Basic, the two functions must have different names:
-
Function GetEnumerator_nongeneric As System.Collections.IEnumerator _
- Implements System.Collections.IEnumerable.GetEnumerator
- Return Me
-End Function
-
Public Function GetEnumerator_generic As IEnumerator (Of SqlDataRecord) _
- Implements IEnumerable (Of SqlDataRecord).GetEnumerator
- Return Me
-End Function
-
Observe here that this is identical to CSV_splitter.vb, and trust me: the implementation in AlbumReader.cs looks exactly to what I showed you for the CSV_splitter class. That is, as long as you follow the pattern with implementing IEnumerable and IEnumerator in the same class, GetEnumerator will always look the same.
-
The Reset method is somewhat brutal:
-
Public Sub Reset Implements IEnumerator(Of SqlDataRecord).Reset
- Throw New NotImplementedException("AlbumReader.Reset")
-End Sub
-
I could not think of anything to put here. Well, I guess a proper Reset method could restart the file, but I'm not sure I want that to happen. I chanced to see a blog post that used this pattern, which I decided to copy. Since there is no reason why SqlClient would have to call Reset when you pass a TVP, you could always implement Reset this way. (But try to remember to change the class name in the argument to the exception constructor.)
-
Next we look at the Current property, which is very straightforward here, even if there is some level of noise due to the requirement to have both a generic and a non-generic implementation:
-
ReadOnly Public Property Current_generic As SqlDataRecord _
- Implements IEnumerator (Of SqlDataRecord).Current
- Get
- Return Me.Outrec
- End Get
-End Property
-
-ReadOnly Property Current_nongeneric As Object _
- Implements System.Collections.IEnumerator.Current
- Get
- Return Me.Outrec
- End Get
-End Property
-
In the CSV_splitter class, I put the final extraction in Current, but in this class I have put all work to fill Outrec in MoveNext, and that is probably you will do most of the time.
-
Now, if you think of what we have seen so far, there are really only two things you have craft from scratch when you implement a new custom-iterator for a TVP: the constructor and MoveNext. As for GetEnumerator, Reset and Current, you simply clone from your previous effort. Oh, I forgot: you need to implement Dispose as well:
-
Public Sub Dispose Implements IDisposable.Dispose
- Me.fp.Close()
- Me.fp.Dispose()
-End Sub
-
This time, there is something real to dispose of.
-
Left to show is the implementation of MoveNext, which is very much a rehash of the loop in read_file above, why I only include an outline to highlight the one thing that is different: since this is MoveNext we should return False if we are at end of file, else True.
-
Public Function MoveNext As Boolean _
- Implements IEnumerator (Of SqlDataRecord).MoveNext
-
- If Me.fp.EndOfData Then _
- Return False
-
- Dim Fields() As String = fp.ReadFields()
-
- If Fields(0) = "A" Then
- ' ...
- Else If Fields(0) = "T" Then
- ' ...
- Else
- Throw New Exception("Illegal record type '" & fields(0) & "'.")
- End If
-
- Return True
-End Function
-
We have now looked at two classes that both feed a TVP. While they have lot of common when we look at the code, there is nevertheless one important distinction. The CSV_splitter class is intended to be a general class that you can reuse in many places. AlbumReader, on the other hand, is specific to a certain problem. You would have to write a new class for every new file or data source you read. And as you have seen, this is no big deal at all. Just remember that if there is a DbDataReader class for your data source, you should pass a data-reader object to your TVP directly; no need to write your own class in this case.
-
Performance Considerations
-
Before you start to stream files all over town, I like to add some words of caution. While the pattern I have shown here is very practical and neat, it is not the most optimal. It will serve you well for large files – but not for very large files. I wanted to prove that a streamed file is not buffered in the client, why I wrote a very stupid file reader which just chopped up the file into chunks of 1024 bytes and passed it to a TVP with a binary(1024) column. I was able to load an 80 MB file this way, although it took some time. (But the memory consumption in the client stayed flat, proving that data was indeed streamed.) When I tried a 500 MB file, my reward was a timeout message and a TDS error. I never investigated very closely what the underlying reason was, but I assume that I hit a resource limit. Maybe I triggered an auto-grow of the log file which took too long.
-
An advantage with TVPs is that they make it simple to implement a polished well-packaged solution using stored procedures. But keep in mind that the table parameter is an intermediate storage. This intermediate storage may be in memory or on disk, depending on how SQL Server decides to handle it, but it is intermediate storage. For this reason, it will always be more efficient if you can load the data directly into the target table through BCP, BULK INSERT or the SqlBulkCopy class. As I noted previously, BCP and BULK INSERT are not able to handle files with formats that require stateful parsing. Since SqlBulkCopy is an API, you have more control and you could use a class like the TextFieldParser to feed an SqlBulkCopy session to load data into the target table directly.
-
(In case you are thinking that XML or delimited strings could be an alternative here, permit me to point out that they, too, represent intermediate storage. If you pass a 50 MB XML document, it is very likely that SQL Server will spill it to disk.)
-
When you insert or update large amounts of data, there is always reason to consider chopping up the operation in batches. This applies no matter you are loading data from an outside source like a file, or if you copy data from one table to another. If for no other reason, it helps to keep the transaction-log size in check. In the context of loading a file through a TVP, this means that you need to call your procedure for every batch. There are two challenges here:
-
-
Implement the batching as such.
-
Make the process restartable in case of a crash half-way through the file.
-
-
I will not go into details here, but let if suffice with a brief discussion. The first point is not too difficult. You could pass the custom-iterator a Stream object and a batch size, and the custom-iterator would read that many of number of lines from the file. Or you could keep it simple: use a moderate batch size and fill a List with one batch at a time, and don't stream at all.
-
Making the process restartable may be more difficult. For a simple MERGE scenario (that is, if-not-exists-insert-else-update) you may accept to run part of the file twice. But there are scenarios where re-running part of a file would alter the outcome, for instance when columns are updated incrementally. Or INSERT-only scenarios like the one we have looked at in this article, where a re-run would result in primary-key violations or even worse: load of duplicate data. You can add WHERE NOT EXISTS in the stored procedure as a simple way out, but it may prove to have an undesirable performance impact for all loads, not only restarted ones. The best solution is likely to depend on the exact situation.
-
Finally, let's discuss the specific problem with master-detail files a little more closely. I said previously that with two table types and two iterators, both iterators would have to read the file from start to end. You may object to this statement and suggest that there could be a single class that reads the file and which puts the rows into two queues, one for albums and one for tracks. The custom-iterators would read from these queues. But, no, this will not fly. Well, it would fly in the sense that you would be able to load the file. However, you not would achieve the aim of preserving memory in the client process. Why?
-
Keep in mind that SqlClient sends the data to SQL Server over single a communication line where it has to respect the TDS protocol. And if you look in the TDS specification, you will find that the data for one TVP has to be sent in a single sequence. That is, SqlClient cannot interleave data for the two TVPs, but it will have to read all data for one TVP first. Which means that the data for the other TVP will be buffered into in this queue and take up memory which was exactly what we wanted to avoid. There is simply a law of nature working against us here: the data in the file comes in a different order than we want to process it, and there is no way around it. The best you can do is to stream the detail rows and buffer the header rows (of which there are likely to be fewer). But this appears to be messy to implement – it may be simpler use a batchwise implementation with a List<SqlDataRecord>.
-
It is worth noticing that neither my solution with a single table type overcomes problem with having to reorder the data. As long as the procedure has not started executing, no reordering has occurred, but all data has been buffered in SQL Server – in memory or in tempdb. However, when the procedure runs, it scans the table variable twice. Depending on the situation and hardware configuration this may be a better – or worse – solution than having the client to read the file twice. It goes without saying that if you are facing this scenario, and performance is critical for you, you should benchmark several solutions.
This article has focused on using table-valued parameters with ADO .NET and SqlClient for two reasons. 1) It's a very common environment. 2) It's very simple to use TVPs from SqlClient. Before I conclude this article, I will give a brief exposé over other APIs and whether they support table-valued
- parameters. I also discuss what options you have if your API does not support
-TVPs.
You can use table-valued parameters with ODBC. You need to specify SQL Server Native
-Client 10.0 or later as your ODBC driver. SQL Server Native Client is a DLL that implements both an ODBC driver and an OLE DB provider for SQL Server. It comes with SQL Server and is freely redistributable.
-
As I have not worked with ODBC myself, I cannot assess how smooth or difficult it is to use TVPs
- with ODBC. I believe that as with ADO .NET there are two ways to pass a
-TVP through ODBC: streaming and non-streaming. Just like ADO .NET, ODBC exposes properties to specify that your data is sorted, to avoid sorting in SQL Server when the TVP has a primary key.
-
Books Online have two examples on using table-valued parameter in the section Table-Valued Parameters (ODBC) . There is also a sample on Codeplex.
You can use table-valued parameters with OLE DB, if you use the SQLNCLI10 provider or later, that is the OLE DB half of SQL
-Server Native Client. OLE DB offers two models for passing TVPs. One is the push model, where you create a rowset
-with the metadata, fill the rowset with your data, and in the regular parameter area, you pass the rowset pointer. This is the same basic idea as passing a List with ADO .NET, but you need to write more code. (As always with
-OLE DB, I'm tempted to say.)
-
The alternative is the pull model, which essentially is a role reversal where the consumer needs to implement
-IRowset
-on its own whereupon the provider will read from the rowset as a consumer. This model is intended for streaming scenarios, where you get data from an external source, and you don't want
-any intermediate storage in the client.
-
I can't find anything in SQL Server Books Online that discusses how to specify that your data source is already sorted, so I don't know if this is possible. I have a suspicion, though, that they rely on general OLE DB functionality. To define a table parameter, you need to use the interface ITableDefinitionWithConstraints, and this interface has a method AddConstraint that permits you to specify a primary key. It is a little embarrassing that I don't know, since I have actually implemented TVPs with OLE DB (see below under Perl).
-
Whether you can use TVPs if you use the OLE DB Consumer Templates, I don't know. I've only worked with "naked" OLE DB
-myself, never the consumer templates.
-
You can find a sample for the pull model on CodePlex. I have not found any sample for
-the push model, but if you are desperate you can download the source code for my Perl module (see below), but you will find it difficult to find the forest among the all the trees there.
No, you cannot use table-valued parameters with old ADO. Yes, ADO sits on top of OLE DB, and you can use SQLNCLI10 as the
-OLE DB provider with ADO. But ADO itself has not been updated for the new data types added in SQL 2005 and later cannot
-work with them.
None of them have support for table-valued parameters. Ironic isn't it? Microsoft touts them as the hottest and
-best way to access SQL Server, and then you find you don't have access to all features. The obvious workaround, besides
-using one of the older list-to-table methods, is to make a direct call from ADO .NET and bypass that language-integrated
-thing. Arguable, this causes your code to have a mix of paradigms. But it could be a first step from moving away from
-LINQ/EF entirely. (Wait, did I just say that? OK, let it be said: I am not a fan of neither of these technologies, as I
-feel that they serve to increase the object/relational impedance between client-side developers and
-SQL Server people.)
-
See also the section Further Reading for some useful links in this area.
The version of the Microsoft SQL Server JDBC Driver
-that is current of this writing (4.0) does not seem to support table-valued parameters. But please check Microsoft's site for
-updates. I don't know whether JDBC drivers for SQL Server from other vendors support
-TVPs, but it
-could definitely be worth investigating.
Microsoft has a PHP driver for SQL Server. The current version of this writing is 3.0. What I can understand, it does not support table-valued parameters. The driver is available with source code on Codeplex.
If you use the standard DBI/DBD modules, I doubt that you will find any support for table-valued parameters. However,
-the best option for connecting to SQL Server – as long you do not need to support other data sources
-– is
-Win32::SqlServer, of which I am the author myself. And, yes, it supports table-valued
-parameters. However, I found in my performance tests that the performance for passing TVPs is very poor. It took two seconds to pass a TVP with 50 000 values. Compare this with 50-150 ms for ADO .NET. I cannot say whether this is due to OLE DB or my own miserable programming.
As you have realised when you've read this small summary is that if you are using VB6, VBA, Access, Java, PHP – and
-probably a few more environments which I did not list here – you cannot use TVPs directly in your API. If you need to
-pass a list of values, you should use any of the methods that I discuss in my article
-Arrays
-and Lists for SQL 2005 and Beyond.
-
If you need to call a stored procedure that takes a table-valued parameter, you can always do this by writing a
-wrapper procedure that takes a comma-separated list (or an XML document for multi-column TVPs) as a parameter
-and inserts the data
-to a table variable and then calls the inner procedure. Say for instance that you need to call get_product_names from VB6:
-
CREATE PROCEDURE get_product_names_wrapper @prodids nvarchar(MAX)
-DECLARE @prodid_table integer_list_tbltype
-INSERT @prodid_table(n)
- SELECT number FROM iter_intlist_to_tbl(@prodids)
-EXEC get_product_names @prodid_table
-
If you think creating a procedure is too much, you can submit a parameterised command batch:
-
DECLARE @prodid_table integer_list_tbltype
-INSERT @prodid_table(n)
- SELECT number FROM iter_intlist_to_tbl(?)
-EXEC get_product_names @prodid_table
-
If you've never seen a parameterised command before, see the section on
-SQL Injection in my article on dynamic SQL for a
-brief introduction.
I like to thank my MVP colleagues who helped me by reviewing my demo program and
- with other research: Bob Beauchemin,
-Alejandro Mesa, Greg Low, Daniel Joskovski, Lenni Lobel and Adam Machanic.
-
If you have opinions, additions or just have spotted a language/grammar error, please mail me at
-esquel@sommarskog.se. If you have questions about using TVPs or arrays and
-lists in SQL Server in general, I advice you to post your questions to the appropriate public forum. Which forum you should use depends on the exact nature of your question. If you have questions related to C# and VB .NET, you should use a .NET forum. For questions on ADO .NET the SQL Server Data Access forum may be the best place, while T‑SQL questions goes into the T‑SQL forum.
2012-07-01 – More or less a total rewrite of the sections that cover .NET because of two reasons: I realised how simple it is to write a reusable class for parsing a comma-separated list and pass it to a table-valued parameter. The original version of the article incorrectly said you could not stream data to a TVP through ADO .NET, but that SqlClient would always buffer. This unfortunate error was due to a misunderstanding between me and a Program Manager at Microsoft. To the latter end, I have added examples how to load data from a file through a table-valued parameter, both streaming and non-streaming. For the other sections there mainly some language polishing, but I've added a caveat that you cannot use TVPs between stored procedures in different databases.
\ No newline at end of file
diff --git a/Articles/Backup/How to Build a SQL Server Disaster Recovery Plan with Google Compute Engine.pdf b/Articles/Backup/How to Build a SQL Server Disaster Recovery Plan with Google Compute Engine.pdf
new file mode 100644
index 00000000..d637b7db
Binary files /dev/null and b/Articles/Backup/How to Build a SQL Server Disaster Recovery Plan with Google Compute Engine.pdf differ
diff --git a/Articles/Backup/Optimizing Your Query Plans with the SQL Server 2014 Cardinality Estimator.docx b/Articles/Backup/Optimizing Your Query Plans with the SQL Server 2014 Cardinality Estimator.docx
new file mode 100644
index 00000000..38a4cbaf
Binary files /dev/null and b/Articles/Backup/Optimizing Your Query Plans with the SQL Server 2014 Cardinality Estimator.docx differ
diff --git a/Articles/Backup/Permissions_Poster_SQL_Server_2008_R2.pdf b/Articles/Backup/Permissions_Poster_SQL_Server_2008_R2.pdf
new file mode 100644
index 00000000..9a459d05
Binary files /dev/null and b/Articles/Backup/Permissions_Poster_SQL_Server_2008_R2.pdf differ
diff --git a/Articles/Backup/Permissions_Poster_SQL_Server_2012.pdf b/Articles/Backup/Permissions_Poster_SQL_Server_2012.pdf
new file mode 100644
index 00000000..ad9257c6
Binary files /dev/null and b/Articles/Backup/Permissions_Poster_SQL_Server_2012.pdf differ
diff --git a/Articles/Backup/Permissions_Poster_SQL_Server_2014.pdf b/Articles/Backup/Permissions_Poster_SQL_Server_2014.pdf
new file mode 100644
index 00000000..c1a4713e
Binary files /dev/null and b/Articles/Backup/Permissions_Poster_SQL_Server_2014.pdf differ
diff --git a/Articles/Backup/Permissions_Poster_SQL_Server_2016_and_SQLDB.pdf b/Articles/Backup/Permissions_Poster_SQL_Server_2016_and_SQLDB.pdf
new file mode 100644
index 00000000..a68dfd7c
Binary files /dev/null and b/Articles/Backup/Permissions_Poster_SQL_Server_2016_and_SQLDB.pdf differ
diff --git a/Articles/Backup/Permissions_Poster_SQL_Server_vNext_and_SQLDB.pdf b/Articles/Backup/Permissions_Poster_SQL_Server_vNext_and_SQLDB.pdf
new file mode 100644
index 00000000..e6d03495
Binary files /dev/null and b/Articles/Backup/Permissions_Poster_SQL_Server_vNext_and_SQLDB.pdf differ
diff --git a/Articles/Backup/SQL Server Performance Tuning in Google Compute Engine.pdf b/Articles/Backup/SQL Server Performance Tuning in Google Compute Engine.pdf
new file mode 100644
index 00000000..034560ac
Binary files /dev/null and b/Articles/Backup/SQL Server Performance Tuning in Google Compute Engine.pdf differ
diff --git a/Articles/The Curse and Blessings of Dynamic SQL.htm b/Articles/Backup/The Curse and Blessings of Dynamic SQL.htm
similarity index 98%
rename from Articles/The Curse and Blessings of Dynamic SQL.htm
rename to Articles/Backup/The Curse and Blessings of Dynamic SQL.htm
index 401b8796..82981937 100644
--- a/Articles/The Curse and Blessings of Dynamic SQL.htm
+++ b/Articles/Backup/The Curse and Blessings of Dynamic SQL.htm
@@ -1,2111 +1,2111 @@
-
-
-
-The Curse and Blessings of Dynamic SQL
-
-
-
-
-
-
-
An earlier version of this article is
- also available in
- German. Translations
- provided by SQL Server MVP Frank Kalis.
-
Introduction
-
If you follow the various newsgroups on Microsoft SQL Server,
-you often see people asking why they can't do:
-
SELECT * FROM @tablename
-SELECT @colname FROM tbl
-SELECT * FROM tbl WHERE x IN (@list)
-
For all three examples you can expect someone to answer Use dynamic SQL
- and give a quick example on how to do it. Unfortunately, for all three examples
- above, dynamic SQL is a poor solution.
- On the other hand, there are situations where dynamic SQL
- is the best or only way to go.
-
In this article I will discuss the use of dynamic SQL
- in stored procedures and to a minor extent from client languages. To set the
- scene, I start with a very quick overview on application
- architecture for data access. I then proceed to describe the feature dynamic
- SQL as such,
- with a quick introduction followed by the gory syntax details. Next, I continue with a discussion on SQL injection, a
- security issue that it is essential to have good understanding of when
- you work with dynamic SQL. This is followed by a section where I discuss why
- we use stored procedures, and how that is affected by the use of dynamic SQL.
- I carry on with a section on good practices and tips for writing
- dynamic SQL. I conclude by reviewing a number of
- situations where you could use dynamic SQL and
- whether it is a good or bad idea to do it.
-
The article covers all versions of SQL Server from SQL6.5 to
- SQL2008, with emphasis on SQL2000 and later
-versions.
Note: many of
- the code samples in this text works against the pubs and Northwind databases
- that ship with SQL2000 and SQL7, but not with SQL2005
-and later. You can download
- these databases from
-
- Microsoft's web site.
-
-
Before I describe dynamic SQL, I like to briefly discuss the various ways you can
- access data from an application to give an overview of what I'll be
- talking about in this article.
-
(Note: all through this text I will
- refer to client as anything that accesses SQL Server from the outside.
- In the overall application architecture that may in fact be a middle tier or
- a business layer, but as that is of little interest to this article, I use
- client in the sake of brevity.)
-
There are two main roads to go, and then there are forks and sub-forks.
-
-
Send SQL statements from the client to SQL
- Server.
-
-
Rely on SQL generated by the client API, using options like
- CommandType.TableDirect and methods like .Update. LINQ falls into this group as well.
-
Compose the SQL strings in the client code.
-
-
Build the entire SQL string with parameter values expanded.
-
Use parameterised queries.
-
-
-
Perform access through stored procedures.
-
-
Stored procedures in T-SQL
-
-
Use static SQL only.
-
Use dynamic SQL together with static SQL.
-
-
Stored procedures in a CLR language such as C# or VB .Net. (SQL2005
- and later.)
-
-
-
Fork 1-a may be good for simple tasks, but you are likely to
- find that you outgrow it as the complexity of your application increases.
- In any case, this approach falls entirely outside the scope of this article.
-
Many applications are built along the principles of fork 1-b,
- and as long as you take the sub-fork 1-b-ii, it does not have to
- be bad. (Why 1-b-i is bad, is
- something I will come back to. Here I will just drop two keywords:
- SQL
- Injection and Query-Plan Reuse.) Nonetheless, in many shops the mandate is
- that you should use stored procedures. When you use stored procedures with
- only static SQL, users do
- not need direct permissions to access the tables, only permissions to execute the stored
- procedures, and thus you can use the stored procedure to control what users
- may and may not do.
-
The main focus for this text is sub-fork 2-a-ii. When used
- appropriately, dynamic SQL in stored
- procedures can be a powerful addition to static SQL. But some of the questions on the newsgroups leads to
- dynamic SQL in stored procedures that are so meaningless, that these people
- would be better off with fork 1-b instead.
-
Finally, fork 2-b, stored procedures in the CLR, is in many
- regards very similar to fork 1-b, since all data access from CLR
- procedures is through generated SQL strings, parameterised or unparameterised. If you have settled on SQL
- procedures for your application, there is little point in rewriting them into
- the CLR. However, CLR code can be a valuable supplement for tasks that are
- difficult to perform in T-SQL, but you yet want to perform server-side.
In this chapter I will first look at some quick examples of dynamic SQL and
- point out some very important implications of using dynamic SQL. I will then
- describe sp_executesql and EXEC() in detail, the two commands you can use to
- invoke dynamic SQL from T-SQL.
Understanding dynamic SQL itself is not difficult. Au contraire, it's rather
- too easy to use. Understanding the fine details, though, takes a little
- longer time. If you start out using dynamic SQL casually, you are bound to face
- accidents when things do not work as you have anticipated.
-
One of the problems
- listed in the introduction was how to write a stored procedure that takes a
- table name as its input. Here are two examples, based on the two ways to do dynamic SQL in
- Transact-SQL:
CREATE PROCEDURE general_select2 @tblname nvarchar(127),
- @key varchar(10) AS
-EXEC('SELECT col1, col2, col3
- FROM ' + @tblname + '
- WHERE keycol = ''' + @key + '''')
-
Before I say anything else, permit me to point out that these are examples of
- bad usage of dynamic SQL.
- Passing a table name as a parameter
- is not how you should write stored procedures, and one aim of this article is
- to explain this in detail. Also, the two examples are not equivalent. While
- both examples are bad, the second
- example has several problems that the first does not have. What these
- problems are will be apparent as you read this text.
-
Whereas the above looks very simple and easy, there are some very important things
- to observe. The first thing is permissions. You may know that when you
- use stored procedures, users do not need permissions to access the tables accessed by the stored procedure. This does not apply when
- you use dynamic SQL! For the procedures above to execute
- successfully, the users must have SELECT permission on the table in @tblname. In SQL2000 and earlier this is an absolute rule with no
- way around it. Starting with SQL2005, there are alternatives, something I will
- come
- back to in the section The Permission System.
-
Next thing to observe is that the dynamic SQL is not part of
- the stored procedure, but constitutes its own scope. Invoking a block
- of dynamic SQL is akin to call a nameless stored procedure created ad-hoc. This
- has a number of consequences:
-
-
Within the block of dynamic SQL, you cannot access local variables
- (including table variables) or parameters of the calling stored procedure.
- But you can pass parameters in and out to a block of dynamic SQL if you
- use sp_executesql.
-
Any USE statement in the dynamic SQL will not affect the calling stored procedure.
-
Temp tables created in the dynamic SQL will not be accessible from the
- calling procedure since they are dropped when the dynamic SQL exits.
- (Compare to how temp tables created in a stored procedure go away when you
- exit the procedure.) The block of
- dynamic SQL can however access temp tables created
- by the calling procedure.
-
If you issue a SET command in the dynamic SQL, the effect of the SET
- command lasts for the duration of the block of dynamic SQL
- only and does not affect the caller.
-
The query plan for the stored procedure does not include the dynamic SQL.
- The block of dynamic SQL has a query plan of its own.
-
-
As you've seen there are two ways to invoke dynamic SQL, sp_executesql and
- EXEC(). sp_executesql was added in SQL7, whereas EXEC() has been around
- since SQL6.0. In application code, sp_executesql should be your choice 95%
- of the time for reasons that will prevail. For now I will only give two
- keywords: SQL Injection and
- Query-Plan Reuse. EXEC() is mainly useful for quick throw-away things and DBA tasks, but also
- comes to the rescue in SQL2000 and SQL7
- when the SQL string exceeds 4000 characters. And, obviously, in SQL6.5, EXEC() is the sole choice. In the next
- two sections we will look at these two commands in detail.
sp_executesql is a built-in stored procedure that takes two
- pre-defined parameters and any number of user-defined parameters.
-
The first parameter @stmt is mandatory, and contains a batch of one or
- more SQL statements. The data type of @stmt is ntext in SQL7 and SQL2000,
- and nvarchar(MAX) in SQL2005 and later. Beware that you must pass an nvarchar/ntext
- value (that is, a Unicode value). A varchar value won't do.
-
The second parameter @params is optional, but you will use it 90% of the
- time. @params declares the parameters that you refer to in @stmt. The syntax
- of @params is exactly the same as for the parameter list of a stored procedure. The
- parameters can
- have default values and they can have the OUTPUT marker. Not all parameters you declare must actually
- appear in the SQL string. (Whereas all variables that appear in the SQL
- string must be declared, either with a DECLARE inside @stmt, or in
- @params.) Just like @stmt, the data
- type of @params is ntext SQL2000 and earlier and nvarchar(MAX)
-since SQL2005.
-
The rest of the parameters are simply the parameters that you declared in
- @params, and you pass them as you pass parameters to a stored procedure, either
- positional or named. To get a value back from your output parameter, you must
- specify OUTPUT with the parameter, just like when you call a stored
- procedure. Note that the first two parameters, @stmt and @params, must be specified positionally. You
- can provide the parameter names for them, but these names are blissfully ignored.
-
Let's look at an example. Say that in your database, many tables
- have a column LastUpdated, which holds the time a row last was
- updated. You want to be able to find out how many rows in each table that were modified at
- least once during a period. This is not something you run as part of the application, but
- something you run as a DBA from time to time, so you just keep it as a script
- that you have a around. Here is what it could look like:
-
DECLARE @tbl sysname,
- @sql nvarchar(4000),
- @params nvarchar(4000),
- @count int
-
-DECLARE tblcur CURSOR STATIC LOCAL FOR
- SELECT object_name(id) FROM syscolumns WHERE name = 'LastUpdated'
- ORDER BY 1
-OPEN tblcur
-
-WHILE 1 = 1
-BEGIN
- FETCH tblcur INTO @tbl
- IF @@fetch_status <> 0
- BREAK
-
- SELECT @sql =
- N' SELECT @cnt = COUNT(*) FROM dbo.' + quotename(@tbl) +
- N' WHERE LastUpdated BETWEEN @fromdate AND ' +
- N' coalesce(@todate, ''99991231'')'
- SELECT @params = N'@fromdate datetime, ' +
- N'@todate datetime = NULL, ' +
- N'@cnt int OUTPUT'
- EXEC sp_executesql @sql, @params, '20060101', @cnt = @count OUTPUT
-
- PRINT @tbl + ': ' + convert(varchar(10), @count) + ' modified rows.'
-END
-
-DEALLOCATE tblcur
-
I've put the lines that pertain directly to the dynamic SQL in bold face. You
- can see that I have declared the @sql and @params variables to be of the maximum
- length for nvarchar variables in SQL2000. In SQL2005
-and later, you may want to make it a routine to
- declare @sql as nvarchar(MAX), more about this just below.
-
When I assign the @sql variable, I am careful to format the statement so that
- it is easy to read, and I leave in spaces to avoid that two concatenated
- parts are glued together without space in between, which could cause a syntax
- error. I put the table name in
- quotename() in case a table name has any special
- characters in it. I also prefix the table name with "dbo.", which is a good habit, as we will see when we look at dynamic SQL and
- query plans. Overall, I will cover this sort of
- good practices more in detail later in the text. Note also the appearance of
- '' around the date literal the rule in T-SQL is that to include the string
- delimiter in a string, you must double it.
-
In this example, the dynamic SQL has three parameters: one mandatory input
- parameter, one optional input parameter, and one
- output parameter. I've assumed that this time the DBA wanted to see
- all changes made after 2006-01-01, which is why I've left out @todate in the call
- to sp_executesql. Since I left out one variable, I must specify the last,
- @cnt by name the same rules as when you call a stored procedure. Note also
- that the variable is called @cnt in the dynamic SQL, but @count in the
- surrounding script. Normally, you might want to use the same name, but I
- wanted to stress that the @cnt in the dynamic SQL is only visible within the
- dynamic SQL, whereas @count is not visible there.
-
You may note that I've prefix the string literals with N to denote that
- they are Unicode strings. As @sql and @params are declared as nvarchar,
- technically this is not necessary (as long as you stick to your 8-bit character
- set). However, when you provide any of the strings directly in the call to
- sp_executesql, you must specify the N, as in this fairly silly example:
If you remove any of the Ns, you will get an error message. Since sp_executesql is a built-in stored procedure, there is no implicit
- conversion from varchar.
-
You may wonder why I do not pass @tbl as a parameter as well. The answer is
- that you can't. Dynamic SQL is just like any other SQL. You can't specify a
- table name through a variable in T-SQL, that's the whole story. Thus, when you
- need to specify things like table names, column names etc dynamically,
- you must interpolate them into the string.
-
If you are on SQL2000 or SQL7, there is a limitation with sp_executesql
- when it comes to the length of the SQL string. While the parameter is ntext,
- you cannot use this data type for local variables. Thus, you will have to
- stick to nvarchar(4000). In many cases this will do fine, but it is not
- uncommon to exceed that limit. In this case, you will need to use EXEC(),
- described just below.
-
Since SQL2005, this is not an issue. Here you can use the new data type
- nvarchar(MAX) which can hold as much data as ntext,
- but without the many restrictions of ntext.
EXEC() takes one parameter which is an SQL statement to
- execute. The parameter can be a concatenation of
- string variables and string literals, but cannot include calls to functions
- or other operators. For very simple
- cases, EXEC() is less hassle than sp_executesql. For instance, say that you
- want to run UPDATE STATISTICS WITH FULLSCAN on some selected tables. It could
- look like this:
-
FETCH tblcur INTO @tbl
-IF @@fetch_status <> 0 BREAK
-EXEC('UPDATE STATISTICS [' + @tbl + '] WITH FULLSCAN')
-
In the example with sp_executesql, I used quotename(), but here I've let it
- suffice with adding brackets, in case there is a table named Order
- Details (which there is in the Northwind database). Since EXEC only permits
- string literals and string variables to be concatenated and not arbitrary
- expressions, this is not legal:
-
EXEC('UPDATE STATISTICS ' + quotename(@tbl) + ' WITH FULLSCAN')
-
Best practice is to always use a variable to hold the SQL statement, so the
- example would better read:
The fact that you can concatenate strings within EXEC() permits you to
- make very quick things, which can be convenient at times, but it can lead to
- poor habits in application code. However, there are situations where this is an
- enormous blessing. As I mentioned, in SQL7 and SQL2000, you can in practice
- only use 4000 characters in your SQL string with sp_executesql. EXEC does
- not have this limitation, since you can say:
-
EXEC(@sql1 + @sql2 + @sql3)
-
Where all of @sql1, @sql2 and @sql3 can be 4000 characters long or even
- 8000 characters as EXEC() permits you to use varchar.
-
Since you cannot use parameters, you cannot as easily get values out from
- EXEC() as you can with sp_executesql. You can, however, use INSERT-EXEC
- to insert the result set from EXEC() into a table. I will show you an example
- later on, when I also show you how you can
- use EXEC() to pass longer strings than 4000 characters to sp_executesql.
-
In SQL2005 and later, EXEC() permits impersonation so that you can say:
-
EXEC(@sql) AS USER = 'mitchell'
-EXEC(@sql) AS LOGIN = 'CORDOBA\Miguel'
-
This is mainly a syntactical shortcut that saves you from embedding the
- invocation of dynamic SQL in EXECUTE AS and REVERT. (I discuss these
- statements more in detail in my article
- Granting Permissions Through Stored
- Procedures.)
-
SQL2005 adds a valuable extension to EXEC(): you can use
- it to execute
- strings on linked servers. I will cover this form
- of EXEC() in a separate section
- later in this text.
Before you start to use dynamic SQL all over town, you need to learn about
- SQL injection and how you protect your application against it. SQL
- injection is a technique whereby an intruder enters data that causes your application
- to execute SQL statements you did not intend it to. SQL injection is possible as soon there is dynamic SQL which is
- handled carelessly, be that SQL statements sent from the client, dynamic SQL
- generated in T-SQL stored procedures, or SQL batches executed from CLR stored
- procedures. This is not a line of attack that is unique to
- MS SQL Server, but all RDBMS are open to it.
-
Here is an example. The purpose of the procedure below is to permit users to
- search for orders by various conditions. A real-life example of such a
- procedure would have many more parameters, but I've cut it down to two to be
- brief. (This is, by the way, a problem for which dynamic SQL is a very good
- solution.) As the procedure is written, it is open for SQL injection:
-
CREATE PROCEDURE search_orders @custid nchar(5) = NULL,
- @shipname nvarchar(40) = NULL AS
-DECLARE @sql nvarchar(4000)
-SELECT @sql = ' SELECT OrderID, OrderDate, CustomerID, ShipName ' +
- ' FROM dbo.Orders WHERE 1 = 1 '
-IF @custid IS NOT NULL
- SELECT @sql = @sql + ' AND CustomerID LIKE ''' + @custid + ''''
-IF @shipname IS NOT NULL
- SELECT @sql = @sql + ' AND ShipName LIKE ''' + @shipname + ''''
-EXEC(@sql)
-
Before we look at a real attack, let's just discuss this from the point of view
- of user-friendliness. Assume that the input for the parameters @custid and @shipname comes directly
- from the user and a nave and innocent user wants to look for orders where ShipName is Let's Stop N Shop, so he enters Let's. Do you see
- what will happen? Because @shipname includes a single quote, he will get a
- syntax error. So even if you think that SQL injection is no issue to you,
- because you trust your users, you still need to read this section, so that they
- can search for Brian O'Brien and Samuel Eto'o.
-
So this is the starting point. A delimiter, usually a single quote, affects your dynamic SQL, and
- a malicious user
- can take benefit of this. For
- instance, consider this input for @shipname:
-
' DROP TABLE Orders --
-
The resulting SQL becomes:
-
SELECT * FROM dbo.Orders WHERE 1 = 1 AND ShipName LIKE '' DROP TABLE orders --'
-
This is a perfectly legal batch of T-SQL, including the text in red. Since there is something called permissions in SQL Server, this
- attack may or may not succeed. A plain
- user who runs a Windows application and who logs into SQL Server with his
- own login, is not likely to have
- permissions to drop a table. But it is not uncommon for web applications to
- have a general login that runs SQL queries on behalf of the users. And if this web app logs into SQL Server with sysadmin or db_owner
- privileges, the attack succeeds. Mind you, with sysadmin rights, the
- attacker can add users and logins as he pleases. And if the service account
- for SQL Server has admin privileges in Windows, the attacker has access into
- your network far beyond SQL Server through xp_cmdshell. (Which is
- disabled by default on SQL2005 and later, but if the attacker has achieved
- sysadmin rights on the server, he can change that.)
-
Typically, an attacker first tests what happens
- if he enters a single quote (') in an input field or a URL. If this
- yields a syntax error, the attacker knows that there is a vulnerability. He
- then finds out if he needs any extra tokens to terminate the query, and then
- he can add his own SQL statement. Finally he adds a comment character to kill
- the rest of the SQL string to avoid syntax errors. Single quote is the most
- common character to reveal openings for SQL injection, but if you have
- dynamic table and column names, there are more options an attacker could
- succeed with.
- Take this dreadful version of general_select:
-
CREATE PROCEDURE general_select2 @tblname nvarchar(127),
- @key varchar(10) AS
-EXEC('SELECT col1, col2, col3
- FROM ' + @tblname + '
- WHERE keycol = ''' + @key + '''')
-
and assume that @tblname comes from a URL. There are quite some options that
- an attacker could use to take benefit of this hole.
-
And don't overlook numeric values: they can very well be used for SQL
- injection. Of course, in a T-SQL procedure where the value is passed as an
- int parameter there is no risk, but if a supposedly numeric value is directly
- interpolated into an SQL string in client code, there is a huge potential for
- SQL injection.
-
Keep in mind that user input comes from more places than just input fields on
- a form. The most commonly used area for injection attacks on the Internet is
- probably parameters in URLs and cookies. Thus, be very careful how you handle
- anything that comes into your application from the outside.
-
You may think that it takes not only skill, but also luck for someone to find
- and exploit a hole for SQL injection. But remember that there are too many hackers out there
- with too much time on their hands. SQL injection is a serious security issue, and you
- must take precautions to protect your applications against it.
-
One approach I seen mentioned from time to time, is to validate input data in some way, but in my opinion that is not
-the right way to go. Here are are the three steadfast
- principles you need to follow:
-
-
Never run with more privileges than necessary. Users that log into an
- application with their own login should normally only have EXEC
- permissions on stored procedures. If you use dynamic SQL, it should be
- confined to reading operations so that users only need SELECT permissions.
- A web site that logs into a database should not have any elevated
- privileges, preferably only EXEC and
- (maybe) SELECT permissions. Never let the web site log in as sa!
-
For web applications: never expose error messages from SQL Server to the
- end user.
-
Always used
- parameterised statements. That is, in a T-SQL procedure use sp_executesql,
- not EXEC().
-
-
The first point is mainly a safeguard, so that if there is a injection hole,
- the intruder will not be able to do that much harm. The second point makes
- the task for the attacker more difficult as he cannot get feedback from his
- attempts.
-
But it is the third point that is the
- actual protection, and that we will look a little closer at. The procedure search_orders above should be coded as:
-
CREATE PROCEDURE search_orders @custid nchar(5) = NULL,
- @shipname nvarchar(40) = NULL AS
-DECLARE @sql nvarchar(4000)
-SELECT @sql = ' SELECT OrderID, OrderDate, CustomerID, ShipName ' +
- ' FROM dbo.Orders WHERE 1 = 1 '
-IF @custid IS NOT NULL
- SELECT @sql = @sql + ' AND CustomerID LIKE @custid '
-IF @shipname IS NOT NULL
- SELECT @sql = @sql + ' AND ShipName LIKE @shipname '
-EXEC sp_executesql @sql, N'@custid nchar(5), @shipname nvarchar(40)',
- @custid, @shipname
-
Since the SQL string does not include any user input, there is
- no opening for SQL
- injection. It's as simple as that. By the way, note that since we can include
- parameters in the parameter list, even if they don't actually appear in the
- SQL string, we don't need any complicated logic to build the parameter list,
- but can keep it static. In the same vein, we can always pass all input
- parameters to the SQL string.
-
As you may recall, you cannot pass everything as parameters to dynamic SQL,
- for instance table and column names. In this case you must enclose all such
- object names in quotename(), that I will return to in the section
- Good Coding Practices and Tips for Dynamic SQL.
-
The example above was for dynamic SQL in a T-SQL stored procedure. The same advice
- applies to SQL generated in client code or in a CLR stored procedure. Since
- this is so important, here is an example of coding the above in VB6 and ADO:
-
Set cmd = CreateObject("ADODB.Command")
-Set cmd.ActiveConnection = cnn
-
-cmd.CommandType = adCmdText
-cmd.CommandText = " SELECT OrderID, OrderDate, CustomerID, ShipName " & _
- " FROM dbo.Orders WHERE 1 = 1 "
-If custid <> "" Then
- cmd.CommandText = cmd.CommandText & " AND CustomerID LIKE ? "
- cmd.Parameters.Append
- cmd.CreateParameter("@custid", adWChar, adParamInput, 5, custid)
-End If
-
-If shipname <> "" Then
- cmd.CommandText = cmd.CommandText & " AND ShipName LIKE ? "
- cmd.Parameters.Append cmd.CreateParameter("@shipname", _
- adVarWChar, adParamInput, 40, shipname)
-End If
-
-Set rs = cmd.Execute
-
Since the main focus of this text is dynamic SQL in T-SQL procedures, I will
- explain this example only briefly. In ADO you use ? as a parameter
- marker, and you can only pass parameters that
- actually appear in the SQL string. (If you
- specify too many parameters, you will get a completely incomprehensible error
- message.) If you use the SQL Profiler to see what ADO
- sends to SQL Server, you will find that it invokes sp_executesql.
-
Protection against SQL injection is not the only advantage of using
- parameterised queries. In the section Caching Query
- Plans, we will look more in detail on parameterised queries and at a
- second very important reason to use them. This section also includes an example of composing and sending a parameterised SQL statement for SqlClient
- in VB .Net.
-
You may think that an even better protection against SQL injection is to use
- stored procedures with static SQL only. Yes, this is true,
- but! It
- depends on how you call your stored procedures from the client. If you
- compose an EXEC command into which you interpolate the input values, you are
- back on square one and you are as open to SQL injection as ever.
- In ADO, you need to call
- your procedure with the command type adCmdStoredProc and use .CreateParameter to specify the parameters. By specifying adCmdStoredProc, you call the stored procedure through RPC,
- Remote Procedure Call, which not only protects you against SQL
- injection, but it is also more efficient. Similar measures apply to other client APIs;
- all APIs I know of supply a way to call a stored procedure through RPC.
In the introduction, I presented various strategies for
- data-access for an application, and I said that in many shops all data access
- is through stored procedures. In this section, I will look a little closer at
- the advantages with using stored procedures over sending SQL statements from
- the client. I will also look at what happens when you use dynamic SQL in a
- stored procedure, and show that you lose some of the advantages with stored
- procedures, whereas other are unaffected.
Historically, using stored procedures has been the way to give users
- access to data. In a locked-down database, users do not have permissions to
- access tables directly. Instead, the application performs all
- access through stored procedures that retrieve and update data in a
- controlled way, so that users only get to see data they have access to, and
- they cannot perform updates that violate business rules. This works as long as the
- procedure and the tables have the same owner, typically dbo (the
- database owner), through a mechanism known as ownership chaining.
-
As I have already mentioned, ownership chaining does not work when you
- use dynamic SQL. The reason for this is very simple: the block of
- dynamic SQL is not a procedure and does not have any owner.
- Thus the chain
- is broken.
-
SQL 2005 and later
-
In SQL2005 and later versions of SQL Server, this can be addressed by signing a procedure that uses dynamic
- SQL with a certificate. You associate the certificate with a user, and grant
- that user (which is a user that cannot log in) the rights needed for the
- dynamic SQL to execute successfully. A second method is to use
- the EXECUTE AS clause to impersonate a user that has been granted the
- necessary permissions. This method is easier to use, but has side effects
- that can have unacceptable consequences for auditing, row-level security
- schemes and system monitoring. For this reason, my strong recommendation is
- to use certificates.
-
Describing these methods more closely, would take up too much space here.
- Instead I've written a separate article about them, Giving Permissions through Stored
- Procedures, where I discusses both certificates and impersonation in
- detail, and I also take a closer look on ownership chaining.
-
If you write CLR procedures that perform data access, the same is true
- for them.
- Ownership chaining never applies since all data access in a CLR procedure is
- through dynamic SQL. But you can use certificates or
- impersonation to avoid having to give users direct permissions on the
- tables.
-
SQL 2000 and earlier
-
On SQL2000 there is no way
- to combine dynamic SQL with the encapsulation of permissions that you can get
- through stored procedures. Any use of dynamic
- SQL requires that the users have direct permissions on the accessed tables. If your security
- scheme precludes giving users permissions to access tables directly, you cannot
- use dynamic SQL. It is that plain and simple. Depending on the
- sensitivity of the data in the application, it may be acceptable to give the
- users SELECT permissions on the tables (or on some tables) to permit the use
- of dynamic SQL. I strongly recommend against granting users INSERT, UPDATE
- and DELETE rights on tables only to permit dynamic SQL
- in some occasional procedure.
-
There are however, some ways to arrange so that users only have access to the data through the application. All and
-all, there are three alternatives, application roles, "application
- proxies" and Terminal Server. All require you to change the application architecture or infrastructure, so it
- is nothing you introduce at whim.
-
Application roles were introduced in SQL7. Users log into SQL Server but have no permissions on their own beyond
- the database access. Instead, the application activates the application role by
- sending a password somehow embedded into it, and this application
- role has the permissions needed. With "application proxies", the application authenticates the users outside SQL Server and logs into SQL
- Server on their behalf with a proxy login. This proxy login impersonates the users in SQL Server, and
- thus their permissions apply. However, since the users do not have any login on their own, they cannot
- log into SQL Server outside the application. In Giving Permissions...,
- I discuss these two methods a little further.
-
The final possibility is to put the application on Terminal Server. Users log into the terminal server which is set
-up so that all they can do is to run this application. Furthermore, the network is configured so that they cannot access SQL Server from their regular
-computers. Thus, the application is their only way to the data.
-
For all these methods, keep in mind about SQL injection, and do not grant more
-permissions than needed.
Every query you run in SQL Server requires a query plan. When you run a query
- the first time, SQL Server builds a query plan for it or as the terminology
- goes it compiles the query. SQL Server saves the plan in cache, and next time you run
- the query, the plan is reused. The query plan stays in cache
- until it's aged out because it has not been used for a while, or it is
- invalidated for some reason. (Why this happens falls outside the scope of
- this article.)
-
The reuse of cached query plans is very important for the performance
- of queries where the compilation time is in par with the execution time or
- exceeds it. If
- a query needs to run for four minutes, it does not matter much if the query
- is recompiled for an extra second each time. On the other hand, if the execution time of the
- query is 40ms but it takes one second to compile the query, there is a
- huge gain with the cached plan, particularly if the query is executed over and
- over again.
-
Up to SQL6.5 the only plans there were put
- into the cache were plans for stored
- procedures. Loose batches of SQL were compiled each time. And since the
- query plan for dynamic SQL is not part of the stored procedure, that included
- dynamic SQL as well. Thus in SQL6.5, the use of dynamic SQL nullified the
- benefit with stored procedures in this regard.
-
Starting with SQL7, SQL Server also caches the plans for bare statements
- sent from a client or generated through dynamic SQL. Say that you send this
- query from the client, or execute it with EXEC():
-
SELECT O.OrderID, SUM(OD.UnitPrice * OD.Quantity)
-FROM Orders O
-JOIN [Order Details] OD ON O.OrderID = OD.OrderID
-WHERE O.OrderDate BETWEEN '19980201' AND '19980228'
- AND EXISTS (SELECT *
- FROM [Order Details] OD2
- WHERE O.OrderID = OD2.OrderID
- AND OD2.ProductID = 76)
-GROUP BY O.OrderID
-
The query returns the total order amount for the orders in February 1998 that
- contained the product Lakkalikri. SQL Server will put
- the plan into the cache,
- and next time you run this query, the plan will be reused. But only if it is exactly the same query.
- Since the cache lookup is by a hash value computed from the query text, the cache is space- and case-sensitive.
- Thus, if you add a
- single space somewhere, the plan is not reused. More importantly, it is not
- unlikely that next time you want to run the query for a different product, or a
- different period.
-
All this changes, if you instead use sp_executesql to run your query
- with parameters:
-
DECLARE @sql nvarchar(2000)
-SELECT @sql = 'SELECT O.OrderID, SUM(OD.UnitPrice * OD.Quantity)
- FROM dbo.Orders O
- JOIN dbo.[Order Details] OD ON O.OrderID = OD.OrderID
- WHERE O.OrderDate BETWEEN @from AND @to
- AND EXISTS (SELECT *
- FROM dbo.[Order Details] OD2
- WHERE O.OrderID = OD2.OrderID
- AND OD2.ProductID = @prodid)
- GROUP BY O.OrderID'
-EXEC sp_executesql @sql, N'@from datetime, @to datetime, @prodid int',
- '19980201', '19980228', 76
-
The principle for cache lookup is the same as for a non-parameterised query:
- SQL Server hashes the query text and looks up the hash value in the cache,
- still in a case- and space-sensitive fashion. But since the parameter values
- are
- not part of the query text, the same plan can be reused even when the input
- changes.
-
To make this really efficient there is one more thing you need to observe.
- Do you see that I've prefixed all tables in the query with dbo? There
- is a very important reason for this. Users can have different default schema, and up to SQL2000, all users had a
-default schema equal to their username. Thus, if default schema for user1 is user1, and this users runs a query that goes "SELECT ... FROM
- Orders", SQL Server must first check if there is a table user1.Orders,
- before it looks for dbo.Orders. Since user1.Orders could appear
- on the scene at any time, user1 cannot share cache entry with a user different default schema. Yes, in SQL2005, it is perfectly possible that all users have dbo as their default schema, but it seems to be a bad idea to
-rely on it.
-
If you instead use stored procedures, it is not equally important to prefix
- tables with dbo. Microsoft still recommends that you do, but even if
- you don't, users with different default schema can share the same query
- plan.
-
From what I have said here, it follows that if you use dynamic SQL with
- EXEC() you lose an important benefit of stored procedures
- whereas with sp_executesql you don't. At least in
- theory. It's easy to forget that dbo, and if you leave it out in just a
- single place in the query, you will get as
- many entries in the cache for the query as there are users running it. Recall
- also that the cache is space-
- and case-sensitive, so if you generate the same query in several places, you
- may inadvertently have different spacing or inconsistent use of case.
- And this is not restricted to the SQL statement, the parameter list is as much part of the cache entry. Furthermore, since the cache lookup is by a hash value computed from the query text, I
- would assume that this is somewhat more expensive than looking up a stored
- procedure. In fact, under extreme circumstances, heavy use of dynamic SQL, can lead to serious
- performance degradation. Some of my MVP colleagues have observed systems with
- lots of memory (>20GB) when the plan cache has been so filled with plans
- for SQL statements, that there have been hash collisions galore, and the
- cache lookup alone could take several seconds. Presumably, the applications in
- question either did not use parameterised queries at all, or they failed to
- prefix tables with dbo.
-
So far, I've only talked about dynamic SQL in stored procedures. But in this
- regard there is very little difference to SQL statements sent from
- the client, or SQL statements generated in CLR procedures. The same rules
- apply: unparameterised statements are cached but with little probability for
- reuse, whereas parameterised queries can be as efficient as stored
- procedures if you remember to always prefix the tables with dbo. (And still
- with the caveat that the cache lookup is space- and case-sensitive.) Most client APIs implement
- parameterised queries by calling sp_executesql under the covers.
-
In the section on SQL Injection, I included an example on how to do
- parameterised queries with ADO and VB6.
- Here is an example with VB .Net and SqlClient:
-
cmd.CommandType = System.Data.CommandType.Text
-cmd.CommandText = _
- " SELECT O.OrderID, SUM(OD.UnitPrice * OD.Quantity)" & _
- " FROM dbo.Orders O " & _
- " JOIN dbo.[Order Details] OD ON O.OrderID = OD.OrderID" & _
- " WHERE O.OrderDate BETWEEN @from AND @to" & _
- " AND EXISTS (SELECT *" & _
- " FROM dbo.[Order Details] OD2" & _
- " WHERE O.OrderID = OD2.OrderID" & _
- " AND OD2.ProductID = @prodid)" & _
- " GROUP BY O.OrderID"
-
-cmd.Parameters.Add("@from", SqlDbType.Datetime)
-cmd.Parameters("@from").Value = "1998-02-01"
-
-cmd.Parameters.Add("@to", SqlDbType.Datetime)
-cmd.Parameters("@to").Value = "1998-02-28"
-
-cmd.Parameters.Add("@prodid", SqlDbType.Int)
-cmd.Parameters("@prodid").Value = 76
-
In contrast to ADO, SqlClient uses names with @ for parameters. The syntax
- for defining parameters is similar to ADO, but not identical. This article is
- long enough, so I will not go into details on how the Parameters
- collection works. Instead, I refer you to MSDN where both SqlClient and ADO
- are documented in detail. Whatever client API you are using,
- please
- learn how to use parameterised commands with it. Yes, there is a tone of
- desperation in my voice. I don't know how many posts I've seen on the
- newsgroups over the years where people build their SQL strings by
- interpolating the values from input fields into the SQL string, and thereby
- degrading the performance of their application, and worst of all opening
- their database to SQL injection.
-
... and just when you thought you were safe, I need to turn this upside down. Recall what I said in the beginning of
-this section, that if the query is going to run for four minutes, one second extra for compilation is not a big deal.
-And if that recompilation slashes the execution time from forty minutes to four, there is a huge gain. Most queries
-benefit from cached parameterised plans, but not all do. Say that you have a query where the user can ask for data for
-some time span. If the user asks for a summary for a single day, there is a good non-clustered index that can be used
-for a sub-second response time. But if the request is for the entire year, the same index would be a disaster, and a
-table scan is better. Starting with SQL2005 you can force a
- query to be recompiled each
- time it is executed by adding OPTION (RECOMPILE)
- to the end of the query, and thus you can still use sp_executesql to get the
- best protection against SQL injection. On SQL2000
- and earlier, it may in fact be better to interpolate critical parameters into the
- query string when you need to force recompilation each time.
-
For the sake of completeness, I should mention that SQL
- Server is able to auto-parameterise queries. If you submit:
-
SELECT OrderID, OrderDate FROM dbo.Orders WHERE CustomerID = N'ALFKI'
-
SQL Server may recast this as
-
SELECT OrderID, OrderDate FROM dbo.Orders WHERE CustomerID = @P1
-
so if next time you submit BERGS instead of ALFKI, the query plan will be reused.
- Auto-parameterisation comes in two flavours: simple and forced. Simple is the
- default and is the only option on SQL2000 and
- earlier. With simple parameterisation, auto-parameterisation happens only with very simple
- queries, and, it seems, with some inconsistency. With forced
- parameterisation, SQL Server parameterises all queries that comes its way
- (with some exceptions documented in Books Online). Forced parameterisation
- is, in my opinion, mainly a setting to cover up for poorly designed
- third-party application that uses unparameterised dynamic
- SQL. For your own development you should not
- rely on any form of auto-parameterisation. (But in the situation you really a want a new query
- plan each time, you may have to verify that it doesn't happen when you don't
- want to.)
-
They say seeing is believing. Here is a demo that you can try on yourself, if
- you have SQL2005. First create this database:
-
CREATE DATABASE many_sps
-go
-USE many_sps
-go
-DECLARE @sql nvarchar(4000),
- @x int
-SELECT @x = 200
-WHILE @x > 0
-BEGIN
- SELECT @sql = 'CREATE PROCEDURE abc_' + ltrim(str(@x)) +
- '_sp @orderid int AS
- SELECT O.OrderID, O.OrderDate, O.CustomerID, C.CompanyName,
- Prodcnt = OD.cnt, Totalsum = OD.total
- FROM Northwind..Orders O
- JOIN Northwind..Customers C ON O.CustomerID = C.CustomerID
- JOIN (SELECT OrderID, cnt = COUNT(*), total = SUM(Quantity * UnitPrice)
- FROM Northwind..[Order Details]
- GROUP BY OrderID) AS OD ON OD.OrderID = O.OrderID
- WHERE O.OrderID = @orderid'
- EXEC(@sql)
- SELECT @x = @x - 1
-END
-
Then in SQL Server Management Studio 2005, press F7
- navigate down to the list of stored procedures. Select all procedures. Then
- from the context menu select to script them as CREATE
- TO to a new query window. How long time this takes depends on your
- hardware, but on my machine it took 90 seconds and at the same time SQL
- Server grabbed over 250MB of memory. If you
- use the Profiler to see what Mgmt Studio is up to, you will see that for each
- procedure, Mgmt Studio emits a couple of queries with the procedure name
- embedded. That is, no parameterised statements. Once scripting is complete,
- issue this command:
-
ALTER DATABASE many_sps SET PARAMETERIZATION FORCED
-
and redo the operation. On my machine scripting now completed in five
- seconds!. This demonstrates that the difference between parameterised and
- unparameterised can be dramatic. (And that Microsoft can not use their own
- products properly.) If you run SQL Server on
- your local machine, you can see this from one more angle, you can stop and restart
- SQL Server before the two scripting operations, and then use Task Manager to
- see how much physical memory SQL Server uses
- in the two cases. That difference lies entirely in the plan cache.
-
This particular issue have been addressed in SQL Server Management Studio 2008. SSMS 2008 has its own scripting
-issues, but they have nothing to do with the topic of this article.
Another advantage with stored procedures over SQL sent from the client is that less bytes travel the network. Rather than sending a
- 50-line query over the network, you only need to pass the name of a stored procedure
- and a few parameters. This gets more significant if the computation requires
- several queries, possibly with logic in between. If all logic is outside the
- database, this could mean that data has to travel up to the client, only to travel back in the next moment. With stored procedures you can
- use temp tables to hold intermediate results. (You can use temp tables
- from outer layers as well, although it may require some careful use of your
- client API.)
-
In this case, the dividing line goes between sending SQL from the client or
- running stored procedures. If the stored procedures use static SQL only, or
- invoke dynamic SQL does not matter, nor does it matter if it is a CLR procedure.
- You still get the gains of reduced network traffic.
This is not a question of security or performance, but one of
- good programming practice and modularising your code. By using stored procedures, you don't have to bog down
-your client code with the construction of SQL statements. Then again, it depends
- a little on what you put into those stored procedure. Myself, I am of the
- school that the business logic should be where the data is, and in this case
- there is no dispute that you should use stored procedures to encapsulate your
- logic.
-
But there are also people
- who like to see the database as a unintelligent container of data, and who
- prefer to have the business logic
- elsewhere. In this case, the arguments for using stored procedures
- for encapsulation may not be equally compelling. You could just as well employ careful programming practices in
- your client language and send SQL strings.
-
Nothing of this changes if you use dynamic SQL in your stored procedures. The
- stored procedure is still a container for some piece of logic, and how it
- looks on the inside does not matter. I'm here assuming that most of your
- procedures use static SQL only. If all your stored procedures
- generate dynamic SQL, then you are probably better off in this regard to do it all in client code. Then again, sometimes there is no other application
- than Query Analyzer or SQL Server Management Studio. (Typically this would be
- tasks that are run by an admin.) In this case, the only container of logic
- available is stored procedures, and it's immaterial whether they use dynamic
- SQL or not.
In a complex system with hundreds of tables, you may need to know where a
- certain table or column is referenced, because you are considering changing
- or dropping it. If all access to tables is from static SQL in stored
- procedures, you may be able find all references by using the system
- stored procedure sp_depends or query a system table directly. (sysdepends
- in SQL2000, sys.sql_dependencies in SQL2005
-and later. In SQL2008 there is also sys.sql_expression_dependencies.) I say may, because it is very difficult to maintain complete dependency
- information in SQL Server. If you drop and recreate a table, all dependency
- information for the table is lost. What I do myself is to regularly build an empty database
- from our version-control system, and since our build tool
- loads all tables before any stored procedure or trigger, I know that I can
- trust the dependency information in that database.
-
If you throw dynamic SQL into the mix be that SQL sent from client,
- dynamic SQL in T-SQL procedures, or SQL generated by CLR stored procedures
- - you lose this opportunity. The alternative is to employ brute-force search,
- and if the construction of dynamic SQL is confined to some well-defined set
- of modules, this may work. If not, you may end up with a database where no
- one ever dares to drop or change a column or a table, and which eventually
- becomes unbearable complex and inefficient because of all the legacy baggage
- it's carrying around.
-
While the main dividing line here is between static SQL and any form of
- dynamic SQL, dynamic SQL in T-SQL
-stored procedures is probably the least harmful, as there is less code to search. You can even search
- the column sys.sql_modules.definition using SQL. Available since SQL2005. In SQL2000 you
- can search syscomments, but as the procedure text there is chopped into 4000-char slices, this is less
-reliable.
-
In any case, an occasional stored procedure that uses dynamic SQL is not
- likely cause the Armageddon I pictured above. But it is
- a good argument for being restrictive with dynamic SQL in any form.
One distinct advantage of writing stored T-SQL procedures is that you get a
- syntax check directly. With dynamic SQL, a trivial syntax error may not show up
- until run time. Even if you test your code carefully, there may be some query, or
- some variation of a query, that is only run in odd cases and not covered in
- your test suite.
-
It has to be admitted that the strength of this argument is somewhat reduced by the fact
- that T-SQL is not too industrious on reporting semantic errors.
- Because of deferred name resolution, SQL Server will not examine queries in
- stored procedures, where one or more tables are missing, be that misspellings
- or temp tables created within the procedure. Nevertheless, SQL Server
- does report sufficiently many errors, for this to be a very important reason
- to use stored procedures.
-
Another side of this coin is that when you write dynamic SQL, you embed the
- SQL code into strings, which makes programming far more complex. Your SQL
- code is a string delimited by single quotes('), and this string
- may include strings itself, and to include a single quote into the string you
- need to double it. You can easily get lost in a maze of quotes if you don't
- watch out. (In the section Good Coding Practices
- and Tips for Dynamic SQL, we will look a little closer
- on how to deal
- with this problem.) The most commonly used client languages with T-SQL -
- Visual Basic, C#, C++, VBScript all use the double quote (")
- as their string delimiter, so dynamic SQL in client code or CLR stored
- procedures is less prone to that particular problem. Then again, in VB you
- don't have multi-line strings, so at the end of each line you have to have a double
- quote, an ampersand and an underscore for continuation. It sure does not
- serve to make coding easier. You are relieved from all this hassle, if you
- use stored procedures with static SQL only.
Somewhat surprisingly, one of the strongest arguments for stored procedures today may
- be
- that they permit you to quickly address bugs and performance problems in the
- application.
-
Say that you generate SQL statements in your application, and that there is
- an error in it. Or that it simply performs unbearably slow. To fix it, you need to
- build a new executable or DLL, which is likely to contain other code that also
- has changed since the module was shipped. This
- means that before the fix can be put into production, the module will have to go
- through QA and testing.
-
On the other hand, if the problem is in a stored procedure, and the fix is
- trivial, you may be able to deploy a fix into production within an hour after
- the problem was reported.
-
This difference is even more emphasised, if you are an ISV and you ship a
- product that the customer is supposed administer himself. If your application
- uses stored procedures, a DBA may be able to address problems directly
- without opening a support case. For instance, if a procedure runs unacceptably
- slow, he may be able to fix that by adding an index hint. In contrast,
- with an application that generates SQL in the
- client, his hands will be tied. Of course, as an ISV you may not want your
- customers to poke around in your code, even less to change it. You may also prefer
- to ship your procedures WITH ENCRYPTION to protect
- your intellectual property, but this is best controlled
- through license agreements. (If you encrypt your procedures, the DBA can still
- change them, as long as he is able to find a way to decrypt them. Which any
- DBA that knows how to use Google can do.)
-
In this case, it does not matter whether the stored procedure uses static SQL
- only, or if it also uses dynamic SQL. For CLR procedures it depends on many objects
- you have in your assemblies. If you have one assembly per object, installing a new version of a CLR procedure
- is as simple as replacing a T-SQL procedure.
-
(I should add that SQL2005 offers a new feature that permits the DBA to
- change the plan for a query without altering the code, by adding a plan guide.
- This feature has been further enhanced in SQL2008. This is quite an advanced feature, and I refer to Books Online for details.)
Writing
- dynamic SQL is a task that requires discipline to
-avoid losing control
- over your code. If you
- just go ahead, your code can become very messy, and be difficult to read, troubleshoot
- and maintain. In this section, we will look at how to avoid this. I will also
- discuss some special cases: how you can use sp_executesql for input longer
- than 4000 chars in SQL2000, and how to use dynamic SQL with cursors, and the
- combination of dynamic SQL and user-defined functions.
When you write a stored procedure that generates dynamic SQL, you should
- always include a @debug parameter:
-
CREATE PROCEDURE dynsql_sp @par1 int,
- ...
- @debug bit = 0 AS
-...
-IF @debug = 1 PRINT @sql
-
When you get a syntax error from the dynamic SQL, it can be very confusing, and
- you may not even discern where it comes from. And even when you do, it can be
- very difficult to spot the error only by looking at the code that constructs the SQL.
- Once the SQL code is slapped in your face, the error is much more likely to be apparent to you.
- So always include a @debug parameter and a PRINT!
As I've already mentioned, one problem with dynamic SQL is that you often need to deal with nested
- string delimiters. For instance, in the beginning of this article, I showed
- you the procedure general_select2. Here it is again:
-
CREATE PROCEDURE general_select2 @tblname nvarchar(127),
- @key varchar(10) AS
-EXEC('SELECT col1, col2, col3
- FROM ' + @tblname + '
- WHERE keycol = ''' + @key + '''')
-
(Again, I like to emphasise that this sort of procedure is poor use of
- dynamic SQL.)
-
-SQL is one of those language where the method to include a string
-delimiter itself in a string literal is to double it. So those four consecutive
-single quotes ('''') is a string literal with the value of a one
-single quote (').
-This is a fairly simple example; it can get a lot worse. If you work with
-dynamic SQL, you must learn to master nested strings. Obviously, in this case you
-can easily escape the mess by using sp_executesql instead yet another reason
-to use parameterised statements. However, there are situations when you need to
-deal with nested quotes even with sp_executesql. For instance, earlier in this
-article, I had this code:
-
N' WHERE LastUpdated BETWEEN @fromdate AND '
-N' coalesce(@todate, ''99991231'')'
-
We will look at some tips of dealing with nested strings later in this
- section.
-See that there is a space missing after FROM? When you compile the stored procedure
-you will get no error, but when you run it, you will be told that the columns
-keycol, col1, col2, col3 are missing. And since you know that the
-table you passed to the procedure has these columns you will be mighty confused. But this is
-the actual code generated, assuming the parameters foo and abc:
-This is not a syntax error, because FROMfoo is a column alias to col3.
-And, yes, it's legal to use a WHERE clause, even if there is no FROM clause. But
-since the columns cannot exist out of the blue, you get an error for that.
- This is also a good example why you should use debug prints. If the code
- looks like this:
It would be much easier to find the error by running the procedure with
- @debug = 1. (Obviously, had we included the dbo prefix, this error
- could not occur at all.)
-
Overall, good formatting is essential when working with dynamic SQL. Try to
- write the query as you would have written it in static SQL, and then add the
- string delimiters outside of that. T-SQL permits you to embed newlines in
- string literals (as testified by the example above), so in contrast to VB,
- you don't need a string delimiter on each line. An advantage of this is that
- your debug PRINT is easier to read, and in the case of a syntax error the line
- number in the error message may guide you.
-
You may prefer, though, to
- have a string terminator on each line. A tip in such case is to do something
- like this:
Passing table and column names as parameters to a procedure with dynamic SQL
- is rarely a good idea for application code. (It can make perfectly sense for
- admin tasks). As I've said, you cannot pass a table or a column name as a
- parameter to sp_executesql, but you must interpolate it into the SQL string.
- Still you should protect it against SQL
- injection, as a matter of routine. It could be that bad it comes from user
- input.
-
To this end, you should use the built-in function quotename() (added in
- SQL7). quotename() takes two parameters: the first is a string, and the second
- is a pair of delimiters to wrap the string in. The default for the second
- parameter is []. Thus, quotename('Orders') returns
- [Orders]. quotename() takes care of nested delimiters, so if you have
- a really crazy table name like Left]Bracket, quotename() will
- return [Left]]Bracket].
-
Note that when you work with names with several components, each component
- should be quoted separately. quotename('dbo.Orders') returns
- [dbo.Orders], but that is a table in an unknown
- schema of which the first four characters are d, b, o and
- a dot. As long as you only work with the dbo schema, best practice is to
- add dbo in the dynamic SQL and only pass the table name. If you work
- with different schemas, pass the schema as a separate parameter. (Although
- you could use the built-in function parsename() to split up a
- @tblname
- parameter in parts.)
-
While general_select still is a poor idea as a stored procedure, here
- is nevertheless a version that summarises some good coding
- virtues for dynamic SQL:
-The main purpose of quotename() is to quote object names, which is why the
-default for the second parameter is brackets. But you can specify other
-delimiters as well, including single quotes, which means that any single quote
-in the input is doubled. Thus, if you for some reason prefer to use
- EXEC(), you can use quotename() to protect yourself against SQL
- injection by help of this function. Here is an example.
-
IF @custname IS NOT NULL
- SELECT @sql = @sql + ' AND custname = ' + quotename(@custname, '''')
-
Say that @custname has the value D'Artagnan. This part of the dynamic SQL
- becomes:
-
AND custname = 'D''Artagnan'
-
There is a limitation with quotename(): its input parameter
- is nvarchar(128), so it does not handle long strings. A remedy is this user-defined function:
This version is for SQL2000. On SQL2005 and
-later, replace 1998 and 4000 with MAX,
- to make it work for any string length. Here is an example of using this function:
-
IF @custname IS NOT NULL
- SELECT @sql = @sql + ' AND custname = ' + dbo.quotestring(@custname)
-
-The result is the same as above.
-
-On SQL7, you would have to implement quotestring as a stored procedure.
-SQL6.5 does not have replace(), so you are a bit out of luck there.
-
-So with quotename() and quotestring(),
-do we have as good protection against SQL
-injection as we have with parameterised commands? Maybe. I don't know of any way to
-inject SQL that slips through quotename() or quotestring(). Nevertheless, you
-are interpolating user input into the SQL string, whereas with parameterised
-commands, you don't.
-
-(I
-should add that I got the suggestion to use quotename() or a user-defined
-function from SQL Server MVP Steve Kass.)
Another alternative to
- escape the mess of nested quotes, is make use
- of the fact that T-SQL actually has two string delimiters. To wit, if the
- setting QUOTED_IDENTIFIER is OFF, you can also use double quotes(")
- as a string delimiter. The default
- for this setting depends on context, but the preferred setting is
- ON, and it
- must be ON in order to use XQuery, indexed views and indexes on computed columns.
- Thus, this is not a first-rate alternative, but if you are aware of the caveats,
- you can do this:
Since there are two different quote characters, the code is much easier to
- read. The single quotes are for the SQL string and the double quotes
- are for
- the embedded string literals.
-
All and all, this is an inferior method to both sp_executesql and quotestring(), since you are not protected against SQL injection
- (what if @key includes a double quote?). But it
- would be OK to do for some sysadmin task (where SQL injection is not likely
- to be an issue), and it may be the best way to go on SQL6.5.
There is a limitation with sp_executesql on SQL2000
- and SQL7, since you cannot use longer SQL
- strings than 4000 characters. (On SQL2005 and later,
- you should use nvarchar(MAX) to avoid this
- problem.) If you
- want to use sp_executesql when your query string exceeds this limit to make use of parameterised query plans, there is actually a
- workaround. To wit, you can wrap sp_executesql in EXEC():
This very simple: you cannot use dynamic SQL from used-defined functions
- written in T-SQL. This is because you are not permitted do anything in a UDF
- that could change the database state (as the UDF may be invoked as part of a
- query). Since you can do anything from dynamic SQL, including updates, it is
- obvious why dynamic SQL is not permitted.
-
I've seen more than one post on the newsgroups where people have
- been banging their head against this. But if you want to use dynamic SQL in a
- UDF, back out
- and redo your design. You have hit a roadblock, and in SQL2000 there is no
- way out.
-
In SQL2005 and later, you could implement your function as a CLR function. Recall that
- all data access from the CLR is dynamic SQL. (You are safe-guarded, so that if
- you perform an update operation from your function, you will get caught.) A
- word of warning though: data access from scalar UDFs can often give performance
- problems. If you say
-
SELECT ... FROM tbl WHERE dbo.MyUdf(somecol) = @value
-
and MyUdf performs data access, you have more or less created a hidden
- cursor.
Not that cursors are something you should use very frequently, but people often
-ask about using dynamic SQL with cursors, so I give an example for the sake
- of completeness. You cannot say DECLARE CURSOR EXEC(); you have to put the
-entire DECLARE CURSOR statement in dynamic SQL:
You may be used to using the LOCAL keyword with your cursors. However, it is
- important to understand that you must use a global cursor, as a local cursor
- will disappear when the dynamic SQL exits. (Because, as you know by now, the
- dynamic SQL is its own scope.) Once you have declared the
- cursor in this way, you can use the cursor in a normal fashion. You must be
- extra careful with error-handling though, so that you don't exit the
- procedure without deallocating the cursor.
-
There is however a way to use locally-scoped cursors with dynamic SQL.
- Anthony Faull pointed out to me that you can achieve this with cursor variables, as in this example:
-
DECLARE @my_cur CURSOR
-EXEC sp_executesql
- N'SET @my_cur = CURSOR STATIC FOR
- SELECT name FROM dbo.sysobjects;
- OPEN @my_cur',
- N'@my_cur cursor OUTPUT', @my_cur OUTPUT
-FETCH NEXT FROM @my_cur
-
-You refer to a cursor variable, just like named cursors, but there is an @ in front,
-and, as you see from the example, you can pass them as a parameters. (I have to confess
-I have never seen any use for cursor variables until Anthony Faull was kind to send
-me this example.)
A special feature added in SQL2005 is that you can use EXEC() to run
- pass-through queries on a linked server. This could be another instance of
- SQL Server, but it could also be an Oracle server, an Access database, Active
- directory or whatever. The SQL could be a single query or a sequence of
- statements, and could it be composed dynamically or be entirely static. The syntax
- is simple, as seen by this example:
-
EXEC('SELECT COUNT(*) FROM ' + @db + '.dbo.sysobjects') AT SQL2K
-
SQL2K is here a linked server that has been defined with
- sp_addlinkedserver.
-
There is one thing that you can do with EXEC() at a linked server, that you
- cannot do with EXEC() on a local server: you can use parameters, both for
- input and output. The confuse matters, you don't use parameters with names
- starting with @, instead you use question marks (?) as parameter
- holders. Say that you are on an SQL2005 box, and you are dying to know how
- many orders VINET had in the Northwind database. Unfortunately, SQL2005 does
- not ship with Northwind, but you have a linked server set up to an instance
- of SQL2000 with Northwind. You can run this:
-
DECLARE @cnt int
-EXEC('SELECT ? = COUNT(*) FROM Northwind.dbo.Orders WHERE CustomerID = ?',
- @cnt OUTPUT, N'VINET') AT SQL2K
-SELECT @cnt
-
Note here that the parameter values must appear in the order the parameter
- markers appear in the query. When passing a parameter, you can either specify a
- constant value or a variable.
-
You may ask why the inconsistency with a different parameter marker from
- sp_executesql? Recall that linked servers in SQL Server are always accessed
- through an OLE DB provider, and OLE DB uses ? as
- the parameter marker, a convention inherited from ODBC. OLE DB translates
- that parameter marker as is appropriate for the data source on the other end.
- (Not all RDBMS use @ for variables.)
-
As with regular EXEC(), you can specify AS USER/LOGIN to use impersonation:
-
EXEC('SELECT COUNT(*) FROM ' + @db + '.dbo.sysobjects')
- AS USER = 'davidson' AT SQL2K
-
This begs the question: is davidson here a local user or a remote
- user at SQL2K? Books Online is not very clear
- about this, but I did some
- quick experimenting, and found that what you are impersonating is a local user or login,
- not a login on the remote server. (The login to use on the remote server can be
- defined with sp_addlinkedsrvlogin.)
When you read the various newsgroups on SQL Server, there is almost every day
- someone who asks a question that is answered with use dynamic SQL with a quick example
- to illustrate, but ever so often the person answering forgets to tell
-about the implications on permissions or SQL injection. On top of that, far too many
-examples use EXEC() without any thought of query plans. And while many of these
- questions taken by the letter have no other answer than dynamic SQL, there is
- often a real business problem which has a completely different solution
- without dynamic SQL and
- a much better one.
-
So, in this section I will explore some situations where you could use dynamic
-SQL. You will see that sometimes dynamic SQL is a
- good choice, but also that in many cases that it is an outright bad idea.
A common question is why the following does not work:
-
CREATE PROCEDURE my_proc @tablename sysname AS
- SELECT * FROM @tablename
-
-
As we have seen, we can make this procedure work with help of dynamic SQL, but
- it should also be clear that we gain none of the advantages with generating
- that dynamic SQL in a stored procedure. You could just as well send the
- dynamic SQL from the client. So, OK: 1) if the
- SQL statement is very complex, you save some network traffic and you do encapsulation.
-2) As we have seen, starting with SQL2005 there are methods to deal with
- permissions. Nevertheless, this is a bad idea.
-
There seems to be several reasons why people want to parameterise the table
- name. One camp
- appears to be people who are new to SQL programming, but have experience
- from other
-languages such as C++, VB etc where parameterisation is a good thing. Parameterising
-the table name to achieve generic code and to increase
-maintainability seems like good programmer virtue.
-
But it is just that when it comes to database objects, the old truth does not
-hold. In a proper database design, each table is unique, as it describes a
- unique entity. (Or at least it should!) Of course, it is not uncommon to end
- up with a dozen or more look-up tables that all have an id, a name
- column and some auditing columns. But they do describe different entities,
- and their semblance should be regarded as mere chance, and future
- requirements may make the tables more dissimilar.
-
Furthermore, when it comes to building a query plan, each table has its set
- of statistics and
- presumptions that are by no means interchangeable, as far as SQL Server is
- concerned. Finally, in
- a complex data model, it is important to get a grip of what's being used. When you start to pass table and column names as parameters, you definitely
- lose control.
-
So if you want to do the above (save the fact that SELECT * should not be
- used in production code), to save some typing, you are on the wrong path. It is
-much better to write ten or twenty stored procedures, even if they are similar
-to each other.
-
(If your SQL statements are complex, so that there actually is a considerable
- gain in maintainability to only have them in one place, despite different
- tables being used, you could consider using a
- pre-processor like the one in C/C++. You would still have one set of
- procedures per table, but the code would be in one single include file.)
This is a variation of the previous case, where there is a suite of tables
- that actually do describe the same entity. All tables have the same columns, and the name includes some partitioning
- component, typically year and sometimes also month. New tables are created as
- a new year/month begins.
-
In this case, writing one stored procedure per table is not really feasible.
- Not the least, because the user may want to specify a date range for a search, so even
- with one procedure per table you would still need a dynamic dispatcher.
-
Now, let's make this very clear: this is a flawed
- table design. You should not have one sales table per month, you should
- have one single sales table, and the month that appear in the table
- name, should be the first column of the primary key in the united sales table. But you may be stuck with a legacy
-application where you cannot easily change the table design. And, admittedly, there are situations where partitioning
-makes sense. The table may be huge (say over 10 GB
- in size), or you want to be able age to out old data quickly. But in such case you should do partitioning properly.
-
In the following, I will look at three approaches to deal with partitioning without using dynamic SQL.
-
Partitioned Tables
-
Partitioned tables were added in SQL2005. You can divide a table in up to 999 partition according to a partition
-function. These partitions can be split up over different filegroups to spread out the load. Another important benefit
-of partitioned tables is that deleting a partition is a pure meta-data operation, which means that if you want to throw
-away all orders that are more than, say, 12 months old, you can do this with the wink of an eye.
-
Table partitioning is only available in Enterprise and Developer Edition, not in Standard. For this reason, I'm not
-going into further details, but refer you to Books Online.
-
Views and Partitioned Views
-
If you have an old application, where you cannot easily merge the umpteen sales tables into one, because it would break
-other parts of the application, a simple approach is
- to define a view like this:
-
CREATE VIEW sales AS
- SELECT year = '2006', col1, col2, ... FROM dbo.sales2006
- UNION ALL
- SELECT year = '2005', col1, col2, ... FROM dbo.sales2005
- UNION ALL
- ...
-
Instead of composing
- the table name dynamically, you can now say:
-
SELECT ... FROM sales WHERE year = '2006' AND ...
-
Also, it's easy to add new tables to the view or remove old tables as the data is aged out. Unfortunately, this view is not terribly efficient, as the query will access
- all tables in the view. Furthermore, the view is not updateable. But with a few more steps, you could make it into what SQL Server
-knows as a partitioned view,
-a feature added in SQL2000 (and available in all editions of SQL Server). A true partitioned view can be very efficient, because for
- queries that include the partitioning column in the WHERE clause, SQL Server
- will only access the relevant table(s). And such a view is updatable, so you
- can insert data into it, and the data will end up in the right table.
-
Here is a
- quick example/demo on how to properly set up a partitioned view. Assume that
- as legacy of a poor design we have these three tables:
-
SELECT OrderID + 0 AS OrderID, OrderDate, CustomerID, EmployeeID
-INTO Orders96 FROM Northwind..Orders WHERE year(OrderDate) = 1996
-ALTER TABLE Orders96 ALTER COLUMN OrderID int NOT NULL
-
-SELECT OrderID + 0 AS OrderID, OrderDate, CustomerID, EmployeeID
-INTO Orders97 FROM Northwind..Orders WHERE year(OrderDate) = 1997
-ALTER TABLE Orders97 ALTER COLUMN OrderID int NOT NULL
-
-SELECT OrderID + 0 AS OrderID, OrderDate, CustomerID, EmployeeID
-INTO Orders98 FROM Northwind..Orders WHERE year(OrderDate) = 1998
-ALTER TABLE Orders98 ALTER COLUMN OrderID int NOT NULL
-go
-ALTER TABLE Orders97 ADD CONSTRAINT pk97 PRIMARY KEY (OrderID)
-ALTER TABLE Orders96 ADD CONSTRAINT pk96 PRIMARY KEY (OrderID)
-ALTER TABLE Orders98 ADD CONSTRAINT pk98 PRIMARY KEY (OrderID)
-
First step is to a add Year column to each table. These columns need a
- default (so that processes that insert directly into these tables are
- unaffected) and a CHECK constraint. Here is how it looks for Orders96:
-
ALTER TABLE Orders96 ADD Year char(4) NOT NULL
- CONSTRAINT def96 DEFAULT '1996'
- CONSTRAINT check96 CHECK (Year = '1996')
-
This column must be the first column in the primary key, so we need to drop
- the current primary key and recreate it:
-
ALTER TABLE Orders96 DROP CONSTRAINT pk96
-ALTER TABLE Orders96 ADD CONSTRAINT pk96 PRIMARY KEY (Year, OrderID)
-
Again, this must be performed for all three tables. Finally, you can create
- the view:
-
CREATE VIEW Orders AS
- SELECT * FROM dbo.Orders96
- UNION ALL
- SELECT * FROM dbo.Orders97
- UNION ALL
- SELECT * FROM dbo.Orders98
-
Note: I have here use SELECT * to save some space in the article, but when you
-define your real view, you should list the colunms explicitly. There is a risk that columns could come in different
-order in the tables.
-
You now have a proper partitioned view that you can perform inserts and updates through. For instance you can run:
SELECT OrderID, OrderDate, EmployeeID
-FROM Orders
-WHERE Year = @year
- AND CustomerID = N'BERGS'
-
SQL Server will at run-time only access the OrdersNN table that maps to
- @year. If you look at the query plan casually, it may seem that all three
- tables are
- accessed, but if you check the Filter operators you will find something
- called STARTUP EXPR. This means that SQL Server determines at
- run-time
- whether to access the table or not. (In fact, when I tested this, I only got this result on SQL2005 and SQL2008. On
-SQL2000, the start-up expression was not included for some reason I have not been able to understand.)
-
For your real-world case you may find it prohibitive to change the primary
- key. In this case you could add a UNIQUE constraint with the partitioning
- column + the real primary key. This will not be a proper partitioned view,
- and the view will not be updatable,
- but with some luck SQL Server may still apply start-up expressions, and access only one of the base tables.
- At least I got it to work, when I ran a quick test. You
- should verify that it works for your situation.
-
When a new table is added with a new year, the view needs to be redefined. If
- this happens frequently, for instance by each month, you should probably set
- up a job for this. I leave out example code, but it requires running
- a cursor over sysobjects to compose a CREATE VIEW statement that you then
- execute with sp_executesql or EXEC(). That would be an example of good use of
- dynamic SQL.
-
This was a concentrated introduction to partitioned views. You can find the full rules for
- partitioned views under the topic for CREATE VIEW in Books Online. Good
- reading is also Stefan
- Delmarco's detailed article
- SQL
- Server 2000 Partitioned Views.
-
Compatibility Views
-
If you have very many tables, there is a risk that you will hit a roadblock with a partitioned view: SQL Server only
-permits 256 tables in a query. Henrik Staun Poulsen suggested an alternate solution that evades this restriction. You first create that new table, with
-all the data in it. Then you drop the old tables, but replace them with views:
-
CREATE VIEW sales200612 AS
- SELECT col1, col2, col3
- FROM sales
- WHERE yearmonth = '200612'
-
Old functions that uses dynamic SQL or whatever they do, can continue to do so. If they perform INSERT, UPDATE or
-DELETE operations, you need to implement INSTEAD OF triggers to support this.
-
Obviously, this solution requires you to produce a lot of code, but you don't have to write it by hand; you can
-easily write a program in the language of your choice to generate the views and triggers.
In this case people want to update a column which they select at run time.
-The above is actually legal in T-SQL, but what happens is simply that the
- variable @colname
-is assigned the value in @value for each affected row in the table.
-
In this case dynamic SQL would call for the user to have UPDATE permissions
-on the table, something not to take lightly. So there is all reason to
-avoid it. Here is a fairly simple workaround:
-
UPDATE tbl
-SET col1 = CASE @colname WHEN 'col1' THEN @value ELSE col1 END,
- col2 = CASE @colname WHEN 'col2' THEN @value ELSE col2 END,
- ...
-
-If you don't know about the CASE expression, please look it up in Books Online.
-It's a very powerful SQL feature.
-
Then again, one would wonder why people want to do this. Maybe it's because their
-tables look like this:
The request here is to determine the name for a column in a result set at
-run-time. My gut reaction, is that this should be handled
-client-side. But if your client is a query window is Management Studio or
-similar, this is kind of difficult. In any case, this is simple to do without any
-dynamic SQL on SQL2005 and later:
-
DECLARE @mycolalias sysname
-SELECT @mycolalias = 'This week''s alias'
-
-CREATE TABLE #temp (a int NOT NULL,
- b int NOT NULL)
-
-INSERT #temp(a, b) SELECT 12, 17
-
-EXEC tempdb..sp_rename '#temp.b', @mycolalias, 'COLUMN'
-
-SELECT * FROM #temp
-
That is, you first get the data into a temp table, and then you use
-sp_rename to rename the column along your needs. (You need to qualify sp_rename with tempdb to have
-it to operate in that database.) You will get
-an informational message Caution: Changing any part of an object name could
-break scripts and stored procedures, but you may be able to live with that.
-
-
This trick works on SQL2000 too, although not entirely without dynamic
-SQL:
-you need put the SELECT from the temp table in
-EXEC():
-
EXEC('SELECT * FROM #temp')
-
This is because on SQL2000, sp_rename apparently does not trigger a recompile,
-so if the the SELECT is in the same batch, the statement fails with Invalid
-column name 'b'. There is yet one thing to be aware of on SQL2000: you
-cannot use sp_rename in a stored procedure that is to be run by plain users, as sp_rename thinks
-you need to be a member of the db_owner or db_ddladmin database roles,
-even if this is only a temp table. This issue has been addressed in
-SQL2005.
In this case the table is in another database which is somehow determined
-dynamically. There seems to be several reasons why people want to do this, and
- depending on your underlying reason, the solution is different.
If you for some reason have your
- application spread over two databases, what you absolutely not should do is
- to have code that says:
-
SELECT ... FROM otherdb.dbo.tbl JOIN ...
-
This is bad, because if someone asks for a second environment on the same
- server, you have a lot of code to change.
-
The best solution for this particular problem is to use synonyms, added in SQL2005:
-
CREATE SYNONYM otherdbtbl FOR otherdb.dbo.tbl
-
You can then refer to otherdb.dbo.tbl as just otherdbtbl. If
- there is a need for a second set of databases, you only have to update the
- synonyms, and there is no need to use dynamic SQL.
-
Yet a way to avoid dynamic SQL is to use stored procedures for all
- inter-database communication. That is, if you are in db1 and need to get data from
- db2, you call a stored procedure in db2. This can be dynamic,
- because EXEC permits you to specify a variable that holds the name of the
- procedure to execute.
As above, I make use of that you can specify the procedure name dynamically
- with EXEC. The trick here is that when you specify a system stored procedure
- in three-part notation with the database name, the procedure executes in the
- context of that database. Thus, the dynamic SQL in this example runs in
- @dbname, not the current database.
This sounds to me like some sysadmin
- venture, and for sysadmin tasks dynamic SQL is
- usually a fair game, because neither caching nor permissions are issues.
- Nevertheless there is an kind of alternative: sp_MSforeachdb, demonstrated by this example:
-
sp_MSforeachdb 'SELECT ''?'', COUNT(*) FROM sysobjects'
-
As you might guess, sp_MSforeachdb uses dynamic SQL internally, so
- what you win is that you don't have to write the control loop yourself. I should
- hasten to add that sp_MSforeachdb is not documented in Books Online,
- which also means that use of it is not supported by Microsoft and it could be
- changed or withdrawn from SQL Server without notice.
The scenario here is that you have a suite of databases with identical
- schema. The typical reason they are different databases and not one, is that every
- database serves a different customer, and each customer can access his
- database (but of course no one else's). Some people
- see a problem with the same stored procedures in fifty databases,
- and believe that they face a maintenance nightmare. So they get the idea
- that they should put the procedures in a "master" database. Yes, you can do that. It
- will give you a much bigger maintenance problem, because your code will
- entirely littered with dynamic SQL.
- In fact, if you feel that this is the only alternative, you are better off
- skipping stored procedures altogether and do all access from client code
- instead. In such case there is only one place you need to specify the
- database: the connection string.
-
What else can you do? Some people might suggest that you should collapse the
- databases into one, and employ a strict
- row-level security scheme. Personally, I would never accept such a solution
- as a potential customer. In a complex application, bugs can easily lead to
- that information is exposed to people who should not see it. Besides,
- row-level security cannot be implemented entirely waterproof in SQL Server.
- Whereas queries only would return the data they should, query plans and error
- messages may indirectly disclose information to users who are not authorised
- to see it.
-
Another wild approach is to use SQL Server's own master database and install the application procedures
- as system procedures. I have not played with this for a long time, but I am told that it still works in SQL2008. In any case, this is entirely
- unsupported. So while I mention the possibility, I don't give you the details
- on how to do it and I strongly recommend that you don't go there.
-
What then is the real solution? Install the stored procedures in each database and develop
- rollout routines for your SQL objects. You need this anyway, the day you want
- to update the table definitions. This also permits you to have some
- flexibility. Some customers may prefer to skip an upgrade. Other customers
- may be prepared to pay for extra functions that only they have access to. Even more importantly, it permits you to easily scale out and move some
- databases to a second server. I mentioned that as a customer, I would not
- accept to share database with other customers. In fact, a security-aware
- customer would not even accept to share the same instance of SQL Server, but
- require his own instance.
-
(You may ask whether not synonyms could be used to implement the "master"
- database. I have not been able to think of anything useful, but if you find
- out something, please drop me a line.)
This question sometimes comes up. Most often people have problems with the
- USE command. The correct solution is to avoid USE altogether in this case. In
- fact, we have already seen how to do this:
It is fascinating how may people who put '1,2,3,4' in @list, and then are
- puzzled why the query above does not return any rows. Well, if there is a row
- where col has the value '1,2,3,4', you will get a match. These two
- conditions are the same:
-
col IN (@list)
-col = @list
-
IN does not mean "parse whatever data there is at runtime as a
- comma-separated list". It's a compile-time shortcut for
- col =
- @a OR col = @b OR ...
-
This is a very common question on the newsgroups, and Use dynamic SQL is a far too common answer.
- Yes, you can do this with dynamic SQL, but it is an extremely poor solution.
- You cannot pass the list as a parameter to sp_executesql, so you would have
- to use EXEC() and be open to SQL injection. On
- top of that, for long lists, IN has extremely poor performance in some
- tests I did, it took SQL Server 15 seconds to build the query plan for a list
- with 10000 elements.
-
The correct method is to unpack the list into a table with a user-defined
- function or a stored procedure. In my article, Arrays and Lists in
- SQL Server, I describe a whole range of ways to do this. I also present performance data for the various methods. (Dynamic SQL is at
- the bottom of that list!) This is a long article, but there are jump-start
- links in the beginning of the article, depending on which version of SQL
- Server you are using.
CREATE PROCEDURE search_sp @condition varchar(8000) AS
- SELECT * FROM tbl WHERE @condition
-
Just forget it. If you are doing this, you have not completed the transition
- to use stored procedure and you are still assembling your SQL code in the client.
-But this example lapses into
A not too uncommon case is that the users should be able to select data from a broad set of
-parameters. The procedure search_orders in the section on
- SQL injection
- is a very simple example of this.
-
Any programmer that tackles this realises that writing a static solution
- with a tailor-made query for each combination of input parameters is
- impossible. It most cases, it's simple to write a single static query with conditions like:
-
AND (CustomerID = @custid OR @custid IS NULL)
-
But in SQL2005 and earlier if is not possible to get good performance from such a query, but the only option for good
- performance is to use dynamic SQL. This changed in SQL2008, provided that you use the RECOMPILE hint. However that is a bit complicated, because the original implementation had a serious bug, so Microsoft reverted on that change for a while. Rather than going into details here, I refer you to my article, Dynamic Search Conditions, where I
- discuss this type of searches in more detail and where I present several methods, both with dynamic SQL and
- static SQL. This article exists in two versions, one for
- SQL2008 and later, and one for earlier versions.
Another common request is to make a dynamic crosstab query, where you transform rows into columns. For instance, say
-that you want to display the number of orders handled by each employee in Northwind with one column per year. This query
-works well:
-
SELECT E.LastName,
- [1996] = SUM(CASE Year(OrderDate) WHEN '1996' THEN 1 ELSE 0 END),
- [1997] = SUM(CASE Year(OrderDate) WHEN '1997' THEN 1 ELSE 0 END),
- [1998] = SUM(CASE Year(OrderDate) WHEN '1998' THEN 1 ELSE 0 END)
-FROM Orders O
-JOIN Employees E ON O.EmployeeID = E.EmployeeID
-GROUP BY E.LastName
-
But in many situations you don't exactly which columns you will have in the data, or even how many there will be. For
-instance, in this example, we may not know beforehand for which years there are orders.
-
One approach is to set an upper limit of how many output columns you support and use dummy names for the columns.
-Once you have run the query, you use the technique I described in the section SELECT col AS @myname.
-
-
However, in the very most cases, you will want to employ dynamic SQL for this. And there is not really any
-alternative. A SELECT statement returns a table, and a table has a known number of columns with known names, so there is
-no way you can write a static SELECT statement to achieve this.
-
The general technique is a two-step operation: 1) Get the unique values to pivot on. 2) with those values, generate a query like the one above. While it's a short description, it
-takes some time to get everything in place. You can make a shortcut with the stored procedure
-pivot_sp, something I have adapted from a procedure
-originally written by SQL
-Server MVP Itzik Ben-Gan. The procedure takes a number of parameters permitting you to specify the query, the rows to group
-by and to pivot by, and which aggregation operation you want.
-
As this article is already long enough, I don't go into details to try to explain how it works, but leave it to you
-to explore it on your own. I like to stress one thing though: The way pivot_sp is written, it is wide-open to
-SQL injection, and it is very difficult, not to say impossible to make the procedure
-fool-proof since it accepts query text as parameter. This is no problem as long as you use it as your own utility
-procedure and have full control over the input, but you should not make a procedure like this one accessible to anyone.
-Rather I recommend that you do
-
DENY EXECUTE ON pivot_sp TO public
-
To make sure that plain users cannot run it. If you make a call to pivot_sp in a stored procedure, this call
-will succeed as ownership chaining applies. The file for
-pivot_sp includes an example to demonstrate this.
-
Another option for dynamic crosstab is RAC, which is a third-party tool. I have never used it
-myself, but I have heard several good comments about it.
This can easily be handled without dynamic SQL in this way:
-
SELECT col1, col2, col3
-FROM dbo.tbl
-ORDER BY CASE @col1
- WHEN 'col1' THEN col1
- WHEN 'col2' THEN col2
- WHEN 'col3' THEN col3
- END
-
Again, review the CASE expression in Books Online, if you are not acquainted
-with it.
-
Note that if the columns have different data types you cannot lump them into
- the same CASE expression, as the data type of a CASE
- expression is always one and the same. Instead, you can do this:
-
SELECT col1, col2, col3
-FROM dbo.tbl
-ORDER BY CASE @col1 WHEN 'col1' THEN col1 ELSE NULL END,
- CASE @col1 WHEN 'col2' THEN col2 ELSE NULL END,
- CASE @col1 WHEN 'col3' THEN col3 ELSE NULL END
-
-If you also want to make it dynamic whether the order should be ascending or
-descending, add one more CASE:
-
SELECT col1, col2, col3
-FROM dbo.tbl
-ORDER BY CASE @sortorder
- WHEN 'ASC' THEN CASE @col1
- WHEN 'col1' THEN col1
- WHEN 'col2' THEN col2
- WHEN 'col3' THEN col3
- END
- ELSE NULL
- END ASC,
- CASE @sortorder
- WHEN 'DESC' THEN CASE @col1
- WHEN 'col1' THEN col1
- WHEN 'col2' THEN col2
- WHEN 'col3' THEN col3
- END
- ELSE NULL
- END
-
Or use the form in the second example to deal with different data types.
-
SQL Server MVP Itzik Ben-Gan had a good article on this topic in the March
-2001 issue of SQL Server Magazine,
-where he offers other suggestions.
-
It should be added that these solutions has the disadvantage that they will always cause a sort which for a large
-data set could be expensive. If you add an ORDER BY clause in dynamic SQL, the optimizer may avoid the sort if there is
-a suitable index.
This is no longer an issue, since SQL2005 added new syntax that permits a variable:
-
SELECT TOP(@n) col1, col2 FROM tbl
-
On SQL2000, TOP does not accept variables, so you need to use dynamic SQL to use
-TOP. But there is an alternative:
-
CREATE PROCEDURE get_first_n @n int AS
-SET ROWCOUNT @n
-SELECT au_id, au_lname, au_fname
-FROM authors
-ORDER BY au_id
-SET ROWCOUNT 0
-
It can be disputed whether SET ROWCOUNT @n is really a better solution than
- running a dynamic SQL statement with TOP. A dynamic TOP is probably a
- better choice, as long as you can accept the security implications. (But it's
- not worth to change the permissions only for this.)
-
I guess a common reason for wanting to do this is to implement paging in web
- applications. SQL Server MVP Aaron Bertrand has an article which is the
- standard reference on
- this topic.
The desire here is to create a table of which the name is determined at
- run-time.
-
If we just look at the arguments against using dynamic SQL in stored
- procedures, few of them are really applicable here. If a stored procedure has a
- static CREATE TABLE in it, the user who runs the procedure must have
- permissions to create tables, so dynamic SQL
- will not change anything. Plan caching obviously has nothing to do with
- it. Etc.
-
Nevertheless: Why? Why would you want to do this? If you are creating tables on the fly in your
- application, you have missed some fundamentals about database design. In a
- relational database, the set of tables and columns are supposed to be
- constant. They may change with the installation of new versions, but not during
- run-time.
-
Sometimes when people are doing this, it appears that they want to construct
-unique names for temporary tables. This is completely unnecessary, as this is a
-built-in feature in SQL Server. If you say:
-
CREATE TABLE #nisse (a int NOT NULL)
-
then the actual name behind the scenes will be something much longer, and no
-other connections will be able to see this instance of #nisse.
-
If you want to create a permanent table which is unique to a user, but you
- don't want to stay connected and therefore cannot use temp tables, it may be
-better to create one table that all clients can share, but where the first
-column is a key which is private to the client. I discuss this method a little
- more closely in my article How to
- Share Data between Stored Procedures.
Sometimes I see persons on the newsgroups that are unhappy, because they
- create a temp table from dynamic SQL, and then they can't access it, because it
- disappeared when the dynamic SQL exited. When told that they have to create the
- table outside the dynamic SQL, they respond that they can't, because they don't
- know the structure of the table until run-time.
-
One solution is to create a global temp table, one with two # in the name,
- for instance ##temp. Such a table is visible to all processes (so you may have
- to take precautions to make the name unique), and unless you explicitly drop it, it exists
- until your process exits.
-
But the real question is: what are these guys up to? If you are
- working with a relational database, and you don't know the structure of your
- data until run-time, then there is something fundamentally wrong. As I have
- never been able to fully understand what the underlying business requirements
- are, I can't really provide any alternatives. But I would suggest that if you
- need to go this road, you should seriously consider to run your SQL from a client
- program. Because, all access
- to that table would have to be through dynamic SQL, and composing
- dynamic SQL strings is easier in languages with better string capabilities,
- be that C#, VB or Perl.
This is similar to parameterising the database name,
- but in this case we want to access a linked server of which the name is
- determined at run-time.
-
Two of the solutions for dynamic database names apply here as well:
-
-
On SQL2005 and later, the best solution is probably to use synonyms:
-
CREATE SYNONYM myremotetbl FOR Server.db.dbo.remotetbl
-
If you can confine the access to the linked server to a stored procedure
- call, you can build the SP name dynamically:
-
-If you want to join a local table with a remote table on some remote server,
-determined in the flux of the moment, dynamic SQL is probably the best way if
-you are on SQL2000.
-There exists however an alternative, although it's only usable in some
-situations. You can use sp_addlinkedserver to define the linked server at
-run-time,
-as demonstrated by this snippet:
-
EXEC sp_addlinkedserver MYSRV, @srvproduct='Any',
- @provider='SQLOLEDB', @datasrc=@@SERVERNAME
-go
-CREATE PROCEDURE linksrv_demo_inner WITH RECOMPILE AS
- SELECT * FROM MYSRV.master.dbo.sysdatabases
-go
-EXEC sp_dropserver MYSRV
-go
-CREATE PROCEDURE linksrv_demo @server sysname AS
- IF EXISTS (SELECT * FROM master..sysservers WHERE srvname = 'MYSRV')
- EXEC sp_dropserver MYSRV
- EXEC sp_addlinkedserver MYSRV, @srvproduct='Any',
- @provider='SQLOLEDB', @datasrc=@server
- EXEC linksrv_demo_inner
- EXEC sp_dropserver MYSRV
-go
-EXEC linksrv_demo 'Server1'
-EXEC linksrv_demo 'Server2'
-
-There are two procedures. linksrv_demo_inner is the procedure where we
-actually access the linked server. As the linked server must exist when the
-procedure is created, I first create a dummy entry for MYSRV, which I subsequently
-drop once the procedure has been created. (Not only must the linked server exist, it must also have the database and
-tables that you access.) linksrv_demo is the outside interface which takes a
-server name as a parameter, and then at run-time defines MYSRV to point to
-@server.
-
-The above is only possible under certain conditions:
-
-
The procedure must be run by someone who has privileges to set up
- linked servers, normally only the roles sysadmin and setupadmin
- have these permissions. Thus, plain users do not apply.
-
Since you change a
- server-wide definition, you cannot have several instances of the procedure
- running. (It goes without saying, that you should use the alias in this
- procedure only.)
-
-
-As you can see in the example, I've added WITH RECOMPILE to linksrv_demo_inner.
-This is a safety precaution, to prevent that a cached plan does not access a
-different server. I don't think this is really necessary, as SQL Server should sense the
-changed definition. In fact, you may not even have to split the code over two
-procedures, but as they say, better safe than sorry.
The rowset functions OPENQUERY and OPENROWSET often calls for dynamic SQL. Their second argument
- is an SQL string, and they do no accept variables.
- (This is because the optimizer builds a plan for the distributed query when
- the procedure is compiled.) So any single parameter you want to pass to the
- SQL statement for that remote server requires you to use dynamic SQL. Since the
- remote SQL string can include string literals, you
- may have to deal with up to three
- levels of nested quotes. If you don't watch out, you can spend a full day
- looking at things like:
to try to find out if you might you have one ' too many or too
- few.
-
Strict discipline is absolutely necessary when working with dynamic SQL for
- OPENQUERY. The function quotestring()
- that I showed you earlier can be of great help:
-
The built-in function quotename() is usually not useful here, as the SQL statement easily
- can exceed the limit of 129 characters for the input parameter to
- quotename().
-
-
On SQL2005 and later, you can use EXEC() to run an SQL statement on a
- linked
- server. Since EXEC() at linked servers can take parameters, this can make
- things considerably easier. Then again, you can join OPENQUERY with local
- tables, so that only rows of interest are brought across the wire. This you
- cannot do with EXEC().
Say that you write a stored
- procedure that is to present some data, and the GUI it is to be run from is
- Query Analyzer or SQL Server Management Studio (presumably because it is a sysadmin procedure). To make the
- output easy to digest, you want the column width to be so wide that no data
- is truncated, but neither do you want any extraneous spaces. This is
- something you can achieve with dynamic SQL. Typically you would use a temp table
- to hold the data, in which case there are no permission issues.
-
Rather than giving an example, I refer you to the source code for the popular (but undocumented)
- system procedure sp_who2. You can find the code by entering exec
- master..sp_helptext sp_who2.
I've written this text with a main focus on application code, because it is
- mainly in application tasks, bad usage of dynamic SQL can cause serious harm
- by opening for SQL injection, poor
- query-plan reuse, and result in code that is
- difficult to read and maintain.
-
Here, I like to briefly discuss code is for maintenance jobs, code that
- runs once a
- night or once a week or even less frequently. Generally, for this sort of
- code, dynamic SQL is almost always a fair game. Query
- plans are rarely an issue. And if the code is to be run by users with
- sysadmin privileges, there are no permissions issues. The same applies to
- code that does not require permissions outside the database, and is to be run
- by users with db_owner privileges.
-
There are however, two points about SQL injection I like to make.
-
-
If you are a DBA that writes some stored procedure to be run by junior
- operators that do not have sysadmin privilege themselves, you must of
- course take precaution against SQL injection, so that they don't outsmart
- you.
-
If you write a job that performs operations on tables in
- every database, be careful to use quotename() when you build the SQL strings.
- This is particularly important if there are non-sysadmin users that own
- databases. A user could create a table with a name that injects an SQL command
- into
- your maintenance script when you run it. If you are the DBA at a hosting
- company, this is a risk that you definitely should not neglect.
I like to thank the following persons who have provided valuable suggestions
- and input for this article: SQL Server MVPs Tibor Karaszi, Keith Kratochvil,
- Steve Kass, Umachandar Jaychandran, Hal Berenson and Aaron Bertrand, as well as Pankul Verma,
- Anthony Faull, Henrik Staun Poulsen, Karl Jones, Jim Higgins, Marcus
- Hansfeldt, Gennadi Gretchkosiy, Jeremy Lubich and Simon Hayes. I also like to thank Frank Kalis for providing the
-German
- translation.
-
Not the least I like to thank all you people who have pointed out typos
-and spelling errors. Just keep those letters and cards coming!
2015-04-14 A very small change, in fact the addition of a single dot that was missing in SET @sp in the section linked servers. Thanks to Jim Higgins for pointing out this error.
-
2011-06-23 Updated the text in the section on Dynamic Search Conditions to mention the RECOMPILE hint, since the bug mentioned in the entry from 2009-02-14 has been fixed.
-
2009-09-12 Gennadi Gretchkosiy pointed out using that SELECT * in a
- partitioned view is not OK. If the columns come in different order in the underlying tables, you will get a mess.
-
2009-02-14 - Removed text in the section on Dynamic Search Conditions that referred
-to the new behaviour of OPTION (RECOMPILE) in SQL 2008, that Microsoft is now reverting
-on because of a serious
-bug.
-
2008-12-06 Modified the section on dynamic crosstab to stress that pivot_sp is
-open to SQL injection.
-
2008-12-02 Updated the article for SQL2008. Rewrote the section on Sales + @yymm
-tables and added one more approach. Added a section on dynamic crosstab. Various other minor
-changes.
-
2008-06-06 Added an example on how to deal with dynamic sort
-order in the section on ORDER BY.
2006-12-27 In the section Caching
- Query Plans, added a note
- on forced parameterisation and a demo of the performance penalty for failing
- to use parameterised queries.
-
2006-07-25 Corrected syntax in example with
- cursor variable after comment from Anthony Faull.
-
2006-04-23 Thoroughly reworked the article to cover SQL2005 in
- full, resulting in lots of new text, lots of old text dropped, and many
- sections rearranged. I'm now
- more strongly favouring sp_executesql over EXEC(), and
- I put more stress on SQL
- injection. I also stress the importance of using parameterised statements for
- query-plan reuse, and I note that prefixing with dbo is essential for
- query-plan reuse. The examples of cases where (not) to use dynamic SQL have
- had an overhaul as well, if not equally drastic. I'm now giving a very quick
- example of partitioned views for the sales + @yymm case. The article now also
- includes snippets for
- parameterised commands from VB6 and VB .Net.
-
2005-04-17 Added example of EXEC +
- sp_executesql with OUTPUT parameter. Added use of nvarchar(max) on
- SQL2005 for quotestring and elsewhere.
-
2004-02-08
- German translation now available. Minor language corrections.
-
2003-12-02 Added example of using
- cursor variable with dynamic SQL. Modified description
- of first parameter to sp_executesql.
An earlier version of this article is
+ also available in
+ German. Translations
+ provided by SQL Server MVP Frank Kalis.
+
Introduction
+
If you follow the various newsgroups on Microsoft SQL Server,
+you often see people asking why they can't do:
+
SELECT * FROM @tablename
+SELECT @colname FROM tbl
+SELECT * FROM tbl WHERE x IN (@list)
+
For all three examples you can expect someone to answer Use dynamic SQL
+ and give a quick example on how to do it. Unfortunately, for all three examples
+ above, dynamic SQL is a poor solution.
+ On the other hand, there are situations where dynamic SQL
+ is the best or only way to go.
+
In this article I will discuss the use of dynamic SQL
+ in stored procedures and to a minor extent from client languages. To set the
+ scene, I start with a very quick overview on application
+ architecture for data access. I then proceed to describe the feature dynamic
+ SQL as such,
+ with a quick introduction followed by the gory syntax details. Next, I continue with a discussion on SQL injection, a
+ security issue that it is essential to have good understanding of when
+ you work with dynamic SQL. This is followed by a section where I discuss why
+ we use stored procedures, and how that is affected by the use of dynamic SQL.
+ I carry on with a section on good practices and tips for writing
+ dynamic SQL. I conclude by reviewing a number of
+ situations where you could use dynamic SQL and
+ whether it is a good or bad idea to do it.
+
The article covers all versions of SQL Server from SQL6.5 to
+ SQL2008, with emphasis on SQL2000 and later
+versions.
Note: many of
+ the code samples in this text works against the pubs and Northwind databases
+ that ship with SQL2000 and SQL7, but not with SQL2005
+and later. You can download
+ these databases from
+
+ Microsoft's web site.
+
+
Before I describe dynamic SQL, I like to briefly discuss the various ways you can
+ access data from an application to give an overview of what I'll be
+ talking about in this article.
+
(Note: all through this text I will
+ refer to client as anything that accesses SQL Server from the outside.
+ In the overall application architecture that may in fact be a middle tier or
+ a business layer, but as that is of little interest to this article, I use
+ client in the sake of brevity.)
+
There are two main roads to go, and then there are forks and sub-forks.
+
+
Send SQL statements from the client to SQL
+ Server.
+
+
Rely on SQL generated by the client API, using options like
+ CommandType.TableDirect and methods like .Update. LINQ falls into this group as well.
+
Compose the SQL strings in the client code.
+
+
Build the entire SQL string with parameter values expanded.
+
Use parameterised queries.
+
+
+
Perform access through stored procedures.
+
+
Stored procedures in T-SQL
+
+
Use static SQL only.
+
Use dynamic SQL together with static SQL.
+
+
Stored procedures in a CLR language such as C# or VB .Net. (SQL2005
+ and later.)
+
+
+
Fork 1-a may be good for simple tasks, but you are likely to
+ find that you outgrow it as the complexity of your application increases.
+ In any case, this approach falls entirely outside the scope of this article.
+
Many applications are built along the principles of fork 1-b,
+ and as long as you take the sub-fork 1-b-ii, it does not have to
+ be bad. (Why 1-b-i is bad, is
+ something I will come back to. Here I will just drop two keywords:
+ SQL
+ Injection and Query-Plan Reuse.) Nonetheless, in many shops the mandate is
+ that you should use stored procedures. When you use stored procedures with
+ only static SQL, users do
+ not need direct permissions to access the tables, only permissions to execute the stored
+ procedures, and thus you can use the stored procedure to control what users
+ may and may not do.
+
The main focus for this text is sub-fork 2-a-ii. When used
+ appropriately, dynamic SQL in stored
+ procedures can be a powerful addition to static SQL. But some of the questions on the newsgroups leads to
+ dynamic SQL in stored procedures that are so meaningless, that these people
+ would be better off with fork 1-b instead.
+
Finally, fork 2-b, stored procedures in the CLR, is in many
+ regards very similar to fork 1-b, since all data access from CLR
+ procedures is through generated SQL strings, parameterised or unparameterised. If you have settled on SQL
+ procedures for your application, there is little point in rewriting them into
+ the CLR. However, CLR code can be a valuable supplement for tasks that are
+ difficult to perform in T-SQL, but you yet want to perform server-side.
In this chapter I will first look at some quick examples of dynamic SQL and
+ point out some very important implications of using dynamic SQL. I will then
+ describe sp_executesql and EXEC() in detail, the two commands you can use to
+ invoke dynamic SQL from T-SQL.
Understanding dynamic SQL itself is not difficult. Au contraire, it's rather
+ too easy to use. Understanding the fine details, though, takes a little
+ longer time. If you start out using dynamic SQL casually, you are bound to face
+ accidents when things do not work as you have anticipated.
+
One of the problems
+ listed in the introduction was how to write a stored procedure that takes a
+ table name as its input. Here are two examples, based on the two ways to do dynamic SQL in
+ Transact-SQL:
CREATE PROCEDURE general_select2 @tblname nvarchar(127),
+ @key varchar(10) AS
+EXEC('SELECT col1, col2, col3
+ FROM ' + @tblname + '
+ WHERE keycol = ''' + @key + '''')
+
Before I say anything else, permit me to point out that these are examples of
+ bad usage of dynamic SQL.
+ Passing a table name as a parameter
+ is not how you should write stored procedures, and one aim of this article is
+ to explain this in detail. Also, the two examples are not equivalent. While
+ both examples are bad, the second
+ example has several problems that the first does not have. What these
+ problems are will be apparent as you read this text.
+
Whereas the above looks very simple and easy, there are some very important things
+ to observe. The first thing is permissions. You may know that when you
+ use stored procedures, users do not need permissions to access the tables accessed by the stored procedure. This does not apply when
+ you use dynamic SQL! For the procedures above to execute
+ successfully, the users must have SELECT permission on the table in @tblname. In SQL2000 and earlier this is an absolute rule with no
+ way around it. Starting with SQL2005, there are alternatives, something I will
+ come
+ back to in the section The Permission System.
+
Next thing to observe is that the dynamic SQL is not part of
+ the stored procedure, but constitutes its own scope. Invoking a block
+ of dynamic SQL is akin to call a nameless stored procedure created ad-hoc. This
+ has a number of consequences:
+
+
Within the block of dynamic SQL, you cannot access local variables
+ (including table variables) or parameters of the calling stored procedure.
+ But you can pass parameters in and out to a block of dynamic SQL if you
+ use sp_executesql.
+
Any USE statement in the dynamic SQL will not affect the calling stored procedure.
+
Temp tables created in the dynamic SQL will not be accessible from the
+ calling procedure since they are dropped when the dynamic SQL exits.
+ (Compare to how temp tables created in a stored procedure go away when you
+ exit the procedure.) The block of
+ dynamic SQL can however access temp tables created
+ by the calling procedure.
+
If you issue a SET command in the dynamic SQL, the effect of the SET
+ command lasts for the duration of the block of dynamic SQL
+ only and does not affect the caller.
+
The query plan for the stored procedure does not include the dynamic SQL.
+ The block of dynamic SQL has a query plan of its own.
+
+
As you've seen there are two ways to invoke dynamic SQL, sp_executesql and
+ EXEC(). sp_executesql was added in SQL7, whereas EXEC() has been around
+ since SQL6.0. In application code, sp_executesql should be your choice 95%
+ of the time for reasons that will prevail. For now I will only give two
+ keywords: SQL Injection and
+ Query-Plan Reuse. EXEC() is mainly useful for quick throw-away things and DBA tasks, but also
+ comes to the rescue in SQL2000 and SQL7
+ when the SQL string exceeds 4000 characters. And, obviously, in SQL6.5, EXEC() is the sole choice. In the next
+ two sections we will look at these two commands in detail.
sp_executesql is a built-in stored procedure that takes two
+ pre-defined parameters and any number of user-defined parameters.
+
The first parameter @stmt is mandatory, and contains a batch of one or
+ more SQL statements. The data type of @stmt is ntext in SQL7 and SQL2000,
+ and nvarchar(MAX) in SQL2005 and later. Beware that you must pass an nvarchar/ntext
+ value (that is, a Unicode value). A varchar value won't do.
+
The second parameter @params is optional, but you will use it 90% of the
+ time. @params declares the parameters that you refer to in @stmt. The syntax
+ of @params is exactly the same as for the parameter list of a stored procedure. The
+ parameters can
+ have default values and they can have the OUTPUT marker. Not all parameters you declare must actually
+ appear in the SQL string. (Whereas all variables that appear in the SQL
+ string must be declared, either with a DECLARE inside @stmt, or in
+ @params.) Just like @stmt, the data
+ type of @params is ntext SQL2000 and earlier and nvarchar(MAX)
+since SQL2005.
+
The rest of the parameters are simply the parameters that you declared in
+ @params, and you pass them as you pass parameters to a stored procedure, either
+ positional or named. To get a value back from your output parameter, you must
+ specify OUTPUT with the parameter, just like when you call a stored
+ procedure. Note that the first two parameters, @stmt and @params, must be specified positionally. You
+ can provide the parameter names for them, but these names are blissfully ignored.
+
Let's look at an example. Say that in your database, many tables
+ have a column LastUpdated, which holds the time a row last was
+ updated. You want to be able to find out how many rows in each table that were modified at
+ least once during a period. This is not something you run as part of the application, but
+ something you run as a DBA from time to time, so you just keep it as a script
+ that you have a around. Here is what it could look like:
+
DECLARE @tbl sysname,
+ @sql nvarchar(4000),
+ @params nvarchar(4000),
+ @count int
+
+DECLARE tblcur CURSOR STATIC LOCAL FOR
+ SELECT object_name(id) FROM syscolumns WHERE name = 'LastUpdated'
+ ORDER BY 1
+OPEN tblcur
+
+WHILE 1 = 1
+BEGIN
+ FETCH tblcur INTO @tbl
+ IF @@fetch_status <> 0
+ BREAK
+
+ SELECT @sql =
+ N' SELECT @cnt = COUNT(*) FROM dbo.' + quotename(@tbl) +
+ N' WHERE LastUpdated BETWEEN @fromdate AND ' +
+ N' coalesce(@todate, ''99991231'')'
+ SELECT @params = N'@fromdate datetime, ' +
+ N'@todate datetime = NULL, ' +
+ N'@cnt int OUTPUT'
+ EXEC sp_executesql @sql, @params, '20060101', @cnt = @count OUTPUT
+
+ PRINT @tbl + ': ' + convert(varchar(10), @count) + ' modified rows.'
+END
+
+DEALLOCATE tblcur
+
I've put the lines that pertain directly to the dynamic SQL in bold face. You
+ can see that I have declared the @sql and @params variables to be of the maximum
+ length for nvarchar variables in SQL2000. In SQL2005
+and later, you may want to make it a routine to
+ declare @sql as nvarchar(MAX), more about this just below.
+
When I assign the @sql variable, I am careful to format the statement so that
+ it is easy to read, and I leave in spaces to avoid that two concatenated
+ parts are glued together without space in between, which could cause a syntax
+ error. I put the table name in
+ quotename() in case a table name has any special
+ characters in it. I also prefix the table name with "dbo.", which is a good habit, as we will see when we look at dynamic SQL and
+ query plans. Overall, I will cover this sort of
+ good practices more in detail later in the text. Note also the appearance of
+ '' around the date literal the rule in T-SQL is that to include the string
+ delimiter in a string, you must double it.
+
In this example, the dynamic SQL has three parameters: one mandatory input
+ parameter, one optional input parameter, and one
+ output parameter. I've assumed that this time the DBA wanted to see
+ all changes made after 2006-01-01, which is why I've left out @todate in the call
+ to sp_executesql. Since I left out one variable, I must specify the last,
+ @cnt by name the same rules as when you call a stored procedure. Note also
+ that the variable is called @cnt in the dynamic SQL, but @count in the
+ surrounding script. Normally, you might want to use the same name, but I
+ wanted to stress that the @cnt in the dynamic SQL is only visible within the
+ dynamic SQL, whereas @count is not visible there.
+
You may note that I've prefix the string literals with N to denote that
+ they are Unicode strings. As @sql and @params are declared as nvarchar,
+ technically this is not necessary (as long as you stick to your 8-bit character
+ set). However, when you provide any of the strings directly in the call to
+ sp_executesql, you must specify the N, as in this fairly silly example:
If you remove any of the Ns, you will get an error message. Since sp_executesql is a built-in stored procedure, there is no implicit
+ conversion from varchar.
+
You may wonder why I do not pass @tbl as a parameter as well. The answer is
+ that you can't. Dynamic SQL is just like any other SQL. You can't specify a
+ table name through a variable in T-SQL, that's the whole story. Thus, when you
+ need to specify things like table names, column names etc dynamically,
+ you must interpolate them into the string.
+
If you are on SQL2000 or SQL7, there is a limitation with sp_executesql
+ when it comes to the length of the SQL string. While the parameter is ntext,
+ you cannot use this data type for local variables. Thus, you will have to
+ stick to nvarchar(4000). In many cases this will do fine, but it is not
+ uncommon to exceed that limit. In this case, you will need to use EXEC(),
+ described just below.
+
Since SQL2005, this is not an issue. Here you can use the new data type
+ nvarchar(MAX) which can hold as much data as ntext,
+ but without the many restrictions of ntext.
EXEC() takes one parameter which is an SQL statement to
+ execute. The parameter can be a concatenation of
+ string variables and string literals, but cannot include calls to functions
+ or other operators. For very simple
+ cases, EXEC() is less hassle than sp_executesql. For instance, say that you
+ want to run UPDATE STATISTICS WITH FULLSCAN on some selected tables. It could
+ look like this:
+
FETCH tblcur INTO @tbl
+IF @@fetch_status <> 0 BREAK
+EXEC('UPDATE STATISTICS [' + @tbl + '] WITH FULLSCAN')
+
In the example with sp_executesql, I used quotename(), but here I've let it
+ suffice with adding brackets, in case there is a table named Order
+ Details (which there is in the Northwind database). Since EXEC only permits
+ string literals and string variables to be concatenated and not arbitrary
+ expressions, this is not legal:
+
EXEC('UPDATE STATISTICS ' + quotename(@tbl) + ' WITH FULLSCAN')
+
Best practice is to always use a variable to hold the SQL statement, so the
+ example would better read:
The fact that you can concatenate strings within EXEC() permits you to
+ make very quick things, which can be convenient at times, but it can lead to
+ poor habits in application code. However, there are situations where this is an
+ enormous blessing. As I mentioned, in SQL7 and SQL2000, you can in practice
+ only use 4000 characters in your SQL string with sp_executesql. EXEC does
+ not have this limitation, since you can say:
+
EXEC(@sql1 + @sql2 + @sql3)
+
Where all of @sql1, @sql2 and @sql3 can be 4000 characters long or even
+ 8000 characters as EXEC() permits you to use varchar.
+
Since you cannot use parameters, you cannot as easily get values out from
+ EXEC() as you can with sp_executesql. You can, however, use INSERT-EXEC
+ to insert the result set from EXEC() into a table. I will show you an example
+ later on, when I also show you how you can
+ use EXEC() to pass longer strings than 4000 characters to sp_executesql.
+
In SQL2005 and later, EXEC() permits impersonation so that you can say:
+
EXEC(@sql) AS USER = 'mitchell'
+EXEC(@sql) AS LOGIN = 'CORDOBA\Miguel'
+
This is mainly a syntactical shortcut that saves you from embedding the
+ invocation of dynamic SQL in EXECUTE AS and REVERT. (I discuss these
+ statements more in detail in my article
+ Granting Permissions Through Stored
+ Procedures.)
+
SQL2005 adds a valuable extension to EXEC(): you can use
+ it to execute
+ strings on linked servers. I will cover this form
+ of EXEC() in a separate section
+ later in this text.
Before you start to use dynamic SQL all over town, you need to learn about
+ SQL injection and how you protect your application against it. SQL
+ injection is a technique whereby an intruder enters data that causes your application
+ to execute SQL statements you did not intend it to. SQL injection is possible as soon there is dynamic SQL which is
+ handled carelessly, be that SQL statements sent from the client, dynamic SQL
+ generated in T-SQL stored procedures, or SQL batches executed from CLR stored
+ procedures. This is not a line of attack that is unique to
+ MS SQL Server, but all RDBMS are open to it.
+
Here is an example. The purpose of the procedure below is to permit users to
+ search for orders by various conditions. A real-life example of such a
+ procedure would have many more parameters, but I've cut it down to two to be
+ brief. (This is, by the way, a problem for which dynamic SQL is a very good
+ solution.) As the procedure is written, it is open for SQL injection:
+
CREATE PROCEDURE search_orders @custid nchar(5) = NULL,
+ @shipname nvarchar(40) = NULL AS
+DECLARE @sql nvarchar(4000)
+SELECT @sql = ' SELECT OrderID, OrderDate, CustomerID, ShipName ' +
+ ' FROM dbo.Orders WHERE 1 = 1 '
+IF @custid IS NOT NULL
+ SELECT @sql = @sql + ' AND CustomerID LIKE ''' + @custid + ''''
+IF @shipname IS NOT NULL
+ SELECT @sql = @sql + ' AND ShipName LIKE ''' + @shipname + ''''
+EXEC(@sql)
+
Before we look at a real attack, let's just discuss this from the point of view
+ of user-friendliness. Assume that the input for the parameters @custid and @shipname comes directly
+ from the user and a nave and innocent user wants to look for orders where ShipName is Let's Stop N Shop, so he enters Let's. Do you see
+ what will happen? Because @shipname includes a single quote, he will get a
+ syntax error. So even if you think that SQL injection is no issue to you,
+ because you trust your users, you still need to read this section, so that they
+ can search for Brian O'Brien and Samuel Eto'o.
+
So this is the starting point. A delimiter, usually a single quote, affects your dynamic SQL, and
+ a malicious user
+ can take benefit of this. For
+ instance, consider this input for @shipname:
+
' DROP TABLE Orders --
+
The resulting SQL becomes:
+
SELECT * FROM dbo.Orders WHERE 1 = 1 AND ShipName LIKE '' DROP TABLE orders --'
+
This is a perfectly legal batch of T-SQL, including the text in red. Since there is something called permissions in SQL Server, this
+ attack may or may not succeed. A plain
+ user who runs a Windows application and who logs into SQL Server with his
+ own login, is not likely to have
+ permissions to drop a table. But it is not uncommon for web applications to
+ have a general login that runs SQL queries on behalf of the users. And if this web app logs into SQL Server with sysadmin or db_owner
+ privileges, the attack succeeds. Mind you, with sysadmin rights, the
+ attacker can add users and logins as he pleases. And if the service account
+ for SQL Server has admin privileges in Windows, the attacker has access into
+ your network far beyond SQL Server through xp_cmdshell. (Which is
+ disabled by default on SQL2005 and later, but if the attacker has achieved
+ sysadmin rights on the server, he can change that.)
+
Typically, an attacker first tests what happens
+ if he enters a single quote (') in an input field or a URL. If this
+ yields a syntax error, the attacker knows that there is a vulnerability. He
+ then finds out if he needs any extra tokens to terminate the query, and then
+ he can add his own SQL statement. Finally he adds a comment character to kill
+ the rest of the SQL string to avoid syntax errors. Single quote is the most
+ common character to reveal openings for SQL injection, but if you have
+ dynamic table and column names, there are more options an attacker could
+ succeed with.
+ Take this dreadful version of general_select:
+
CREATE PROCEDURE general_select2 @tblname nvarchar(127),
+ @key varchar(10) AS
+EXEC('SELECT col1, col2, col3
+ FROM ' + @tblname + '
+ WHERE keycol = ''' + @key + '''')
+
and assume that @tblname comes from a URL. There are quite some options that
+ an attacker could use to take benefit of this hole.
+
And don't overlook numeric values: they can very well be used for SQL
+ injection. Of course, in a T-SQL procedure where the value is passed as an
+ int parameter there is no risk, but if a supposedly numeric value is directly
+ interpolated into an SQL string in client code, there is a huge potential for
+ SQL injection.
+
Keep in mind that user input comes from more places than just input fields on
+ a form. The most commonly used area for injection attacks on the Internet is
+ probably parameters in URLs and cookies. Thus, be very careful how you handle
+ anything that comes into your application from the outside.
+
You may think that it takes not only skill, but also luck for someone to find
+ and exploit a hole for SQL injection. But remember that there are too many hackers out there
+ with too much time on their hands. SQL injection is a serious security issue, and you
+ must take precautions to protect your applications against it.
+
One approach I seen mentioned from time to time, is to validate input data in some way, but in my opinion that is not
+the right way to go. Here are are the three steadfast
+ principles you need to follow:
+
+
Never run with more privileges than necessary. Users that log into an
+ application with their own login should normally only have EXEC
+ permissions on stored procedures. If you use dynamic SQL, it should be
+ confined to reading operations so that users only need SELECT permissions.
+ A web site that logs into a database should not have any elevated
+ privileges, preferably only EXEC and
+ (maybe) SELECT permissions. Never let the web site log in as sa!
+
For web applications: never expose error messages from SQL Server to the
+ end user.
+
Always used
+ parameterised statements. That is, in a T-SQL procedure use sp_executesql,
+ not EXEC().
+
+
The first point is mainly a safeguard, so that if there is a injection hole,
+ the intruder will not be able to do that much harm. The second point makes
+ the task for the attacker more difficult as he cannot get feedback from his
+ attempts.
+
But it is the third point that is the
+ actual protection, and that we will look a little closer at. The procedure search_orders above should be coded as:
+
CREATE PROCEDURE search_orders @custid nchar(5) = NULL,
+ @shipname nvarchar(40) = NULL AS
+DECLARE @sql nvarchar(4000)
+SELECT @sql = ' SELECT OrderID, OrderDate, CustomerID, ShipName ' +
+ ' FROM dbo.Orders WHERE 1 = 1 '
+IF @custid IS NOT NULL
+ SELECT @sql = @sql + ' AND CustomerID LIKE @custid '
+IF @shipname IS NOT NULL
+ SELECT @sql = @sql + ' AND ShipName LIKE @shipname '
+EXEC sp_executesql @sql, N'@custid nchar(5), @shipname nvarchar(40)',
+ @custid, @shipname
+
Since the SQL string does not include any user input, there is
+ no opening for SQL
+ injection. It's as simple as that. By the way, note that since we can include
+ parameters in the parameter list, even if they don't actually appear in the
+ SQL string, we don't need any complicated logic to build the parameter list,
+ but can keep it static. In the same vein, we can always pass all input
+ parameters to the SQL string.
+
As you may recall, you cannot pass everything as parameters to dynamic SQL,
+ for instance table and column names. In this case you must enclose all such
+ object names in quotename(), that I will return to in the section
+ Good Coding Practices and Tips for Dynamic SQL.
+
The example above was for dynamic SQL in a T-SQL stored procedure. The same advice
+ applies to SQL generated in client code or in a CLR stored procedure. Since
+ this is so important, here is an example of coding the above in VB6 and ADO:
+
Set cmd = CreateObject("ADODB.Command")
+Set cmd.ActiveConnection = cnn
+
+cmd.CommandType = adCmdText
+cmd.CommandText = " SELECT OrderID, OrderDate, CustomerID, ShipName " & _
+ " FROM dbo.Orders WHERE 1 = 1 "
+If custid <> "" Then
+ cmd.CommandText = cmd.CommandText & " AND CustomerID LIKE ? "
+ cmd.Parameters.Append
+ cmd.CreateParameter("@custid", adWChar, adParamInput, 5, custid)
+End If
+
+If shipname <> "" Then
+ cmd.CommandText = cmd.CommandText & " AND ShipName LIKE ? "
+ cmd.Parameters.Append cmd.CreateParameter("@shipname", _
+ adVarWChar, adParamInput, 40, shipname)
+End If
+
+Set rs = cmd.Execute
+
Since the main focus of this text is dynamic SQL in T-SQL procedures, I will
+ explain this example only briefly. In ADO you use ? as a parameter
+ marker, and you can only pass parameters that
+ actually appear in the SQL string. (If you
+ specify too many parameters, you will get a completely incomprehensible error
+ message.) If you use the SQL Profiler to see what ADO
+ sends to SQL Server, you will find that it invokes sp_executesql.
+
Protection against SQL injection is not the only advantage of using
+ parameterised queries. In the section Caching Query
+ Plans, we will look more in detail on parameterised queries and at a
+ second very important reason to use them. This section also includes an example of composing and sending a parameterised SQL statement for SqlClient
+ in VB .Net.
+
You may think that an even better protection against SQL injection is to use
+ stored procedures with static SQL only. Yes, this is true,
+ but! It
+ depends on how you call your stored procedures from the client. If you
+ compose an EXEC command into which you interpolate the input values, you are
+ back on square one and you are as open to SQL injection as ever.
+ In ADO, you need to call
+ your procedure with the command type adCmdStoredProc and use .CreateParameter to specify the parameters. By specifying adCmdStoredProc, you call the stored procedure through RPC,
+ Remote Procedure Call, which not only protects you against SQL
+ injection, but it is also more efficient. Similar measures apply to other client APIs;
+ all APIs I know of supply a way to call a stored procedure through RPC.
In the introduction, I presented various strategies for
+ data-access for an application, and I said that in many shops all data access
+ is through stored procedures. In this section, I will look a little closer at
+ the advantages with using stored procedures over sending SQL statements from
+ the client. I will also look at what happens when you use dynamic SQL in a
+ stored procedure, and show that you lose some of the advantages with stored
+ procedures, whereas other are unaffected.
Historically, using stored procedures has been the way to give users
+ access to data. In a locked-down database, users do not have permissions to
+ access tables directly. Instead, the application performs all
+ access through stored procedures that retrieve and update data in a
+ controlled way, so that users only get to see data they have access to, and
+ they cannot perform updates that violate business rules. This works as long as the
+ procedure and the tables have the same owner, typically dbo (the
+ database owner), through a mechanism known as ownership chaining.
+
As I have already mentioned, ownership chaining does not work when you
+ use dynamic SQL. The reason for this is very simple: the block of
+ dynamic SQL is not a procedure and does not have any owner.
+ Thus the chain
+ is broken.
+
SQL 2005 and later
+
In SQL2005 and later versions of SQL Server, this can be addressed by signing a procedure that uses dynamic
+ SQL with a certificate. You associate the certificate with a user, and grant
+ that user (which is a user that cannot log in) the rights needed for the
+ dynamic SQL to execute successfully. A second method is to use
+ the EXECUTE AS clause to impersonate a user that has been granted the
+ necessary permissions. This method is easier to use, but has side effects
+ that can have unacceptable consequences for auditing, row-level security
+ schemes and system monitoring. For this reason, my strong recommendation is
+ to use certificates.
+
Describing these methods more closely, would take up too much space here.
+ Instead I've written a separate article about them, Giving Permissions through Stored
+ Procedures, where I discusses both certificates and impersonation in
+ detail, and I also take a closer look on ownership chaining.
+
If you write CLR procedures that perform data access, the same is true
+ for them.
+ Ownership chaining never applies since all data access in a CLR procedure is
+ through dynamic SQL. But you can use certificates or
+ impersonation to avoid having to give users direct permissions on the
+ tables.
+
SQL 2000 and earlier
+
On SQL2000 there is no way
+ to combine dynamic SQL with the encapsulation of permissions that you can get
+ through stored procedures. Any use of dynamic
+ SQL requires that the users have direct permissions on the accessed tables. If your security
+ scheme precludes giving users permissions to access tables directly, you cannot
+ use dynamic SQL. It is that plain and simple. Depending on the
+ sensitivity of the data in the application, it may be acceptable to give the
+ users SELECT permissions on the tables (or on some tables) to permit the use
+ of dynamic SQL. I strongly recommend against granting users INSERT, UPDATE
+ and DELETE rights on tables only to permit dynamic SQL
+ in some occasional procedure.
+
There are however, some ways to arrange so that users only have access to the data through the application. All and
+all, there are three alternatives, application roles, "application
+ proxies" and Terminal Server. All require you to change the application architecture or infrastructure, so it
+ is nothing you introduce at whim.
+
Application roles were introduced in SQL7. Users log into SQL Server but have no permissions on their own beyond
+ the database access. Instead, the application activates the application role by
+ sending a password somehow embedded into it, and this application
+ role has the permissions needed. With "application proxies", the application authenticates the users outside SQL Server and logs into SQL
+ Server on their behalf with a proxy login. This proxy login impersonates the users in SQL Server, and
+ thus their permissions apply. However, since the users do not have any login on their own, they cannot
+ log into SQL Server outside the application. In Giving Permissions...,
+ I discuss these two methods a little further.
+
The final possibility is to put the application on Terminal Server. Users log into the terminal server which is set
+up so that all they can do is to run this application. Furthermore, the network is configured so that they cannot access SQL Server from their regular
+computers. Thus, the application is their only way to the data.
+
For all these methods, keep in mind about SQL injection, and do not grant more
+permissions than needed.
Every query you run in SQL Server requires a query plan. When you run a query
+ the first time, SQL Server builds a query plan for it or as the terminology
+ goes it compiles the query. SQL Server saves the plan in cache, and next time you run
+ the query, the plan is reused. The query plan stays in cache
+ until it's aged out because it has not been used for a while, or it is
+ invalidated for some reason. (Why this happens falls outside the scope of
+ this article.)
+
The reuse of cached query plans is very important for the performance
+ of queries where the compilation time is in par with the execution time or
+ exceeds it. If
+ a query needs to run for four minutes, it does not matter much if the query
+ is recompiled for an extra second each time. On the other hand, if the execution time of the
+ query is 40ms but it takes one second to compile the query, there is a
+ huge gain with the cached plan, particularly if the query is executed over and
+ over again.
+
Up to SQL6.5 the only plans there were put
+ into the cache were plans for stored
+ procedures. Loose batches of SQL were compiled each time. And since the
+ query plan for dynamic SQL is not part of the stored procedure, that included
+ dynamic SQL as well. Thus in SQL6.5, the use of dynamic SQL nullified the
+ benefit with stored procedures in this regard.
+
Starting with SQL7, SQL Server also caches the plans for bare statements
+ sent from a client or generated through dynamic SQL. Say that you send this
+ query from the client, or execute it with EXEC():
+
SELECT O.OrderID, SUM(OD.UnitPrice * OD.Quantity)
+FROM Orders O
+JOIN [Order Details] OD ON O.OrderID = OD.OrderID
+WHERE O.OrderDate BETWEEN '19980201' AND '19980228'
+ AND EXISTS (SELECT *
+ FROM [Order Details] OD2
+ WHERE O.OrderID = OD2.OrderID
+ AND OD2.ProductID = 76)
+GROUP BY O.OrderID
+
The query returns the total order amount for the orders in February 1998 that
+ contained the product Lakkalikri. SQL Server will put
+ the plan into the cache,
+ and next time you run this query, the plan will be reused. But only if it is exactly the same query.
+ Since the cache lookup is by a hash value computed from the query text, the cache is space- and case-sensitive.
+ Thus, if you add a
+ single space somewhere, the plan is not reused. More importantly, it is not
+ unlikely that next time you want to run the query for a different product, or a
+ different period.
+
All this changes, if you instead use sp_executesql to run your query
+ with parameters:
+
DECLARE @sql nvarchar(2000)
+SELECT @sql = 'SELECT O.OrderID, SUM(OD.UnitPrice * OD.Quantity)
+ FROM dbo.Orders O
+ JOIN dbo.[Order Details] OD ON O.OrderID = OD.OrderID
+ WHERE O.OrderDate BETWEEN @from AND @to
+ AND EXISTS (SELECT *
+ FROM dbo.[Order Details] OD2
+ WHERE O.OrderID = OD2.OrderID
+ AND OD2.ProductID = @prodid)
+ GROUP BY O.OrderID'
+EXEC sp_executesql @sql, N'@from datetime, @to datetime, @prodid int',
+ '19980201', '19980228', 76
+
The principle for cache lookup is the same as for a non-parameterised query:
+ SQL Server hashes the query text and looks up the hash value in the cache,
+ still in a case- and space-sensitive fashion. But since the parameter values
+ are
+ not part of the query text, the same plan can be reused even when the input
+ changes.
+
To make this really efficient there is one more thing you need to observe.
+ Do you see that I've prefixed all tables in the query with dbo? There
+ is a very important reason for this. Users can have different default schema, and up to SQL2000, all users had a
+default schema equal to their username. Thus, if default schema for user1 is user1, and this users runs a query that goes "SELECT ... FROM
+ Orders", SQL Server must first check if there is a table user1.Orders,
+ before it looks for dbo.Orders. Since user1.Orders could appear
+ on the scene at any time, user1 cannot share cache entry with a user different default schema. Yes, in SQL2005, it is perfectly possible that all users have dbo as their default schema, but it seems to be a bad idea to
+rely on it.
+
If you instead use stored procedures, it is not equally important to prefix
+ tables with dbo. Microsoft still recommends that you do, but even if
+ you don't, users with different default schema can share the same query
+ plan.
+
From what I have said here, it follows that if you use dynamic SQL with
+ EXEC() you lose an important benefit of stored procedures
+ whereas with sp_executesql you don't. At least in
+ theory. It's easy to forget that dbo, and if you leave it out in just a
+ single place in the query, you will get as
+ many entries in the cache for the query as there are users running it. Recall
+ also that the cache is space-
+ and case-sensitive, so if you generate the same query in several places, you
+ may inadvertently have different spacing or inconsistent use of case.
+ And this is not restricted to the SQL statement, the parameter list is as much part of the cache entry. Furthermore, since the cache lookup is by a hash value computed from the query text, I
+ would assume that this is somewhat more expensive than looking up a stored
+ procedure. In fact, under extreme circumstances, heavy use of dynamic SQL, can lead to serious
+ performance degradation. Some of my MVP colleagues have observed systems with
+ lots of memory (>20GB) when the plan cache has been so filled with plans
+ for SQL statements, that there have been hash collisions galore, and the
+ cache lookup alone could take several seconds. Presumably, the applications in
+ question either did not use parameterised queries at all, or they failed to
+ prefix tables with dbo.
+
So far, I've only talked about dynamic SQL in stored procedures. But in this
+ regard there is very little difference to SQL statements sent from
+ the client, or SQL statements generated in CLR procedures. The same rules
+ apply: unparameterised statements are cached but with little probability for
+ reuse, whereas parameterised queries can be as efficient as stored
+ procedures if you remember to always prefix the tables with dbo. (And still
+ with the caveat that the cache lookup is space- and case-sensitive.) Most client APIs implement
+ parameterised queries by calling sp_executesql under the covers.
+
In the section on SQL Injection, I included an example on how to do
+ parameterised queries with ADO and VB6.
+ Here is an example with VB .Net and SqlClient:
+
cmd.CommandType = System.Data.CommandType.Text
+cmd.CommandText = _
+ " SELECT O.OrderID, SUM(OD.UnitPrice * OD.Quantity)" & _
+ " FROM dbo.Orders O " & _
+ " JOIN dbo.[Order Details] OD ON O.OrderID = OD.OrderID" & _
+ " WHERE O.OrderDate BETWEEN @from AND @to" & _
+ " AND EXISTS (SELECT *" & _
+ " FROM dbo.[Order Details] OD2" & _
+ " WHERE O.OrderID = OD2.OrderID" & _
+ " AND OD2.ProductID = @prodid)" & _
+ " GROUP BY O.OrderID"
+
+cmd.Parameters.Add("@from", SqlDbType.Datetime)
+cmd.Parameters("@from").Value = "1998-02-01"
+
+cmd.Parameters.Add("@to", SqlDbType.Datetime)
+cmd.Parameters("@to").Value = "1998-02-28"
+
+cmd.Parameters.Add("@prodid", SqlDbType.Int)
+cmd.Parameters("@prodid").Value = 76
+
In contrast to ADO, SqlClient uses names with @ for parameters. The syntax
+ for defining parameters is similar to ADO, but not identical. This article is
+ long enough, so I will not go into details on how the Parameters
+ collection works. Instead, I refer you to MSDN where both SqlClient and ADO
+ are documented in detail. Whatever client API you are using,
+ please
+ learn how to use parameterised commands with it. Yes, there is a tone of
+ desperation in my voice. I don't know how many posts I've seen on the
+ newsgroups over the years where people build their SQL strings by
+ interpolating the values from input fields into the SQL string, and thereby
+ degrading the performance of their application, and worst of all opening
+ their database to SQL injection.
+
... and just when you thought you were safe, I need to turn this upside down. Recall what I said in the beginning of
+this section, that if the query is going to run for four minutes, one second extra for compilation is not a big deal.
+And if that recompilation slashes the execution time from forty minutes to four, there is a huge gain. Most queries
+benefit from cached parameterised plans, but not all do. Say that you have a query where the user can ask for data for
+some time span. If the user asks for a summary for a single day, there is a good non-clustered index that can be used
+for a sub-second response time. But if the request is for the entire year, the same index would be a disaster, and a
+table scan is better. Starting with SQL2005 you can force a
+ query to be recompiled each
+ time it is executed by adding OPTION (RECOMPILE)
+ to the end of the query, and thus you can still use sp_executesql to get the
+ best protection against SQL injection. On SQL2000
+ and earlier, it may in fact be better to interpolate critical parameters into the
+ query string when you need to force recompilation each time.
+
For the sake of completeness, I should mention that SQL
+ Server is able to auto-parameterise queries. If you submit:
+
SELECT OrderID, OrderDate FROM dbo.Orders WHERE CustomerID = N'ALFKI'
+
SQL Server may recast this as
+
SELECT OrderID, OrderDate FROM dbo.Orders WHERE CustomerID = @P1
+
so if next time you submit BERGS instead of ALFKI, the query plan will be reused.
+ Auto-parameterisation comes in two flavours: simple and forced. Simple is the
+ default and is the only option on SQL2000 and
+ earlier. With simple parameterisation, auto-parameterisation happens only with very simple
+ queries, and, it seems, with some inconsistency. With forced
+ parameterisation, SQL Server parameterises all queries that comes its way
+ (with some exceptions documented in Books Online). Forced parameterisation
+ is, in my opinion, mainly a setting to cover up for poorly designed
+ third-party application that uses unparameterised dynamic
+ SQL. For your own development you should not
+ rely on any form of auto-parameterisation. (But in the situation you really a want a new query
+ plan each time, you may have to verify that it doesn't happen when you don't
+ want to.)
+
They say seeing is believing. Here is a demo that you can try on yourself, if
+ you have SQL2005. First create this database:
+
CREATE DATABASE many_sps
+go
+USE many_sps
+go
+DECLARE @sql nvarchar(4000),
+ @x int
+SELECT @x = 200
+WHILE @x > 0
+BEGIN
+ SELECT @sql = 'CREATE PROCEDURE abc_' + ltrim(str(@x)) +
+ '_sp @orderid int AS
+ SELECT O.OrderID, O.OrderDate, O.CustomerID, C.CompanyName,
+ Prodcnt = OD.cnt, Totalsum = OD.total
+ FROM Northwind..Orders O
+ JOIN Northwind..Customers C ON O.CustomerID = C.CustomerID
+ JOIN (SELECT OrderID, cnt = COUNT(*), total = SUM(Quantity * UnitPrice)
+ FROM Northwind..[Order Details]
+ GROUP BY OrderID) AS OD ON OD.OrderID = O.OrderID
+ WHERE O.OrderID = @orderid'
+ EXEC(@sql)
+ SELECT @x = @x - 1
+END
+
Then in SQL Server Management Studio 2005, press F7
+ navigate down to the list of stored procedures. Select all procedures. Then
+ from the context menu select to script them as CREATE
+ TO to a new query window. How long time this takes depends on your
+ hardware, but on my machine it took 90 seconds and at the same time SQL
+ Server grabbed over 250MB of memory. If you
+ use the Profiler to see what Mgmt Studio is up to, you will see that for each
+ procedure, Mgmt Studio emits a couple of queries with the procedure name
+ embedded. That is, no parameterised statements. Once scripting is complete,
+ issue this command:
+
ALTER DATABASE many_sps SET PARAMETERIZATION FORCED
+
and redo the operation. On my machine scripting now completed in five
+ seconds!. This demonstrates that the difference between parameterised and
+ unparameterised can be dramatic. (And that Microsoft can not use their own
+ products properly.) If you run SQL Server on
+ your local machine, you can see this from one more angle, you can stop and restart
+ SQL Server before the two scripting operations, and then use Task Manager to
+ see how much physical memory SQL Server uses
+ in the two cases. That difference lies entirely in the plan cache.
+
This particular issue have been addressed in SQL Server Management Studio 2008. SSMS 2008 has its own scripting
+issues, but they have nothing to do with the topic of this article.
Another advantage with stored procedures over SQL sent from the client is that less bytes travel the network. Rather than sending a
+ 50-line query over the network, you only need to pass the name of a stored procedure
+ and a few parameters. This gets more significant if the computation requires
+ several queries, possibly with logic in between. If all logic is outside the
+ database, this could mean that data has to travel up to the client, only to travel back in the next moment. With stored procedures you can
+ use temp tables to hold intermediate results. (You can use temp tables
+ from outer layers as well, although it may require some careful use of your
+ client API.)
+
In this case, the dividing line goes between sending SQL from the client or
+ running stored procedures. If the stored procedures use static SQL only, or
+ invoke dynamic SQL does not matter, nor does it matter if it is a CLR procedure.
+ You still get the gains of reduced network traffic.
This is not a question of security or performance, but one of
+ good programming practice and modularising your code. By using stored procedures, you don't have to bog down
+your client code with the construction of SQL statements. Then again, it depends
+ a little on what you put into those stored procedure. Myself, I am of the
+ school that the business logic should be where the data is, and in this case
+ there is no dispute that you should use stored procedures to encapsulate your
+ logic.
+
But there are also people
+ who like to see the database as a unintelligent container of data, and who
+ prefer to have the business logic
+ elsewhere. In this case, the arguments for using stored procedures
+ for encapsulation may not be equally compelling. You could just as well employ careful programming practices in
+ your client language and send SQL strings.
+
Nothing of this changes if you use dynamic SQL in your stored procedures. The
+ stored procedure is still a container for some piece of logic, and how it
+ looks on the inside does not matter. I'm here assuming that most of your
+ procedures use static SQL only. If all your stored procedures
+ generate dynamic SQL, then you are probably better off in this regard to do it all in client code. Then again, sometimes there is no other application
+ than Query Analyzer or SQL Server Management Studio. (Typically this would be
+ tasks that are run by an admin.) In this case, the only container of logic
+ available is stored procedures, and it's immaterial whether they use dynamic
+ SQL or not.
In a complex system with hundreds of tables, you may need to know where a
+ certain table or column is referenced, because you are considering changing
+ or dropping it. If all access to tables is from static SQL in stored
+ procedures, you may be able find all references by using the system
+ stored procedure sp_depends or query a system table directly. (sysdepends
+ in SQL2000, sys.sql_dependencies in SQL2005
+and later. In SQL2008 there is also sys.sql_expression_dependencies.) I say may, because it is very difficult to maintain complete dependency
+ information in SQL Server. If you drop and recreate a table, all dependency
+ information for the table is lost. What I do myself is to regularly build an empty database
+ from our version-control system, and since our build tool
+ loads all tables before any stored procedure or trigger, I know that I can
+ trust the dependency information in that database.
+
If you throw dynamic SQL into the mix be that SQL sent from client,
+ dynamic SQL in T-SQL procedures, or SQL generated by CLR stored procedures
+ - you lose this opportunity. The alternative is to employ brute-force search,
+ and if the construction of dynamic SQL is confined to some well-defined set
+ of modules, this may work. If not, you may end up with a database where no
+ one ever dares to drop or change a column or a table, and which eventually
+ becomes unbearable complex and inefficient because of all the legacy baggage
+ it's carrying around.
+
While the main dividing line here is between static SQL and any form of
+ dynamic SQL, dynamic SQL in T-SQL
+stored procedures is probably the least harmful, as there is less code to search. You can even search
+ the column sys.sql_modules.definition using SQL. Available since SQL2005. In SQL2000 you
+ can search syscomments, but as the procedure text there is chopped into 4000-char slices, this is less
+reliable.
+
In any case, an occasional stored procedure that uses dynamic SQL is not
+ likely cause the Armageddon I pictured above. But it is
+ a good argument for being restrictive with dynamic SQL in any form.
One distinct advantage of writing stored T-SQL procedures is that you get a
+ syntax check directly. With dynamic SQL, a trivial syntax error may not show up
+ until run time. Even if you test your code carefully, there may be some query, or
+ some variation of a query, that is only run in odd cases and not covered in
+ your test suite.
+
It has to be admitted that the strength of this argument is somewhat reduced by the fact
+ that T-SQL is not too industrious on reporting semantic errors.
+ Because of deferred name resolution, SQL Server will not examine queries in
+ stored procedures, where one or more tables are missing, be that misspellings
+ or temp tables created within the procedure. Nevertheless, SQL Server
+ does report sufficiently many errors, for this to be a very important reason
+ to use stored procedures.
+
Another side of this coin is that when you write dynamic SQL, you embed the
+ SQL code into strings, which makes programming far more complex. Your SQL
+ code is a string delimited by single quotes('), and this string
+ may include strings itself, and to include a single quote into the string you
+ need to double it. You can easily get lost in a maze of quotes if you don't
+ watch out. (In the section Good Coding Practices
+ and Tips for Dynamic SQL, we will look a little closer
+ on how to deal
+ with this problem.) The most commonly used client languages with T-SQL -
+ Visual Basic, C#, C++, VBScript all use the double quote (")
+ as their string delimiter, so dynamic SQL in client code or CLR stored
+ procedures is less prone to that particular problem. Then again, in VB you
+ don't have multi-line strings, so at the end of each line you have to have a double
+ quote, an ampersand and an underscore for continuation. It sure does not
+ serve to make coding easier. You are relieved from all this hassle, if you
+ use stored procedures with static SQL only.
Somewhat surprisingly, one of the strongest arguments for stored procedures today may
+ be
+ that they permit you to quickly address bugs and performance problems in the
+ application.
+
Say that you generate SQL statements in your application, and that there is
+ an error in it. Or that it simply performs unbearably slow. To fix it, you need to
+ build a new executable or DLL, which is likely to contain other code that also
+ has changed since the module was shipped. This
+ means that before the fix can be put into production, the module will have to go
+ through QA and testing.
+
On the other hand, if the problem is in a stored procedure, and the fix is
+ trivial, you may be able to deploy a fix into production within an hour after
+ the problem was reported.
+
This difference is even more emphasised, if you are an ISV and you ship a
+ product that the customer is supposed administer himself. If your application
+ uses stored procedures, a DBA may be able to address problems directly
+ without opening a support case. For instance, if a procedure runs unacceptably
+ slow, he may be able to fix that by adding an index hint. In contrast,
+ with an application that generates SQL in the
+ client, his hands will be tied. Of course, as an ISV you may not want your
+ customers to poke around in your code, even less to change it. You may also prefer
+ to ship your procedures WITH ENCRYPTION to protect
+ your intellectual property, but this is best controlled
+ through license agreements. (If you encrypt your procedures, the DBA can still
+ change them, as long as he is able to find a way to decrypt them. Which any
+ DBA that knows how to use Google can do.)
+
In this case, it does not matter whether the stored procedure uses static SQL
+ only, or if it also uses dynamic SQL. For CLR procedures it depends on many objects
+ you have in your assemblies. If you have one assembly per object, installing a new version of a CLR procedure
+ is as simple as replacing a T-SQL procedure.
+
(I should add that SQL2005 offers a new feature that permits the DBA to
+ change the plan for a query without altering the code, by adding a plan guide.
+ This feature has been further enhanced in SQL2008. This is quite an advanced feature, and I refer to Books Online for details.)
Writing
+ dynamic SQL is a task that requires discipline to
+avoid losing control
+ over your code. If you
+ just go ahead, your code can become very messy, and be difficult to read, troubleshoot
+ and maintain. In this section, we will look at how to avoid this. I will also
+ discuss some special cases: how you can use sp_executesql for input longer
+ than 4000 chars in SQL2000, and how to use dynamic SQL with cursors, and the
+ combination of dynamic SQL and user-defined functions.
When you write a stored procedure that generates dynamic SQL, you should
+ always include a @debug parameter:
+
CREATE PROCEDURE dynsql_sp @par1 int,
+ ...
+ @debug bit = 0 AS
+...
+IF @debug = 1 PRINT @sql
+
When you get a syntax error from the dynamic SQL, it can be very confusing, and
+ you may not even discern where it comes from. And even when you do, it can be
+ very difficult to spot the error only by looking at the code that constructs the SQL.
+ Once the SQL code is slapped in your face, the error is much more likely to be apparent to you.
+ So always include a @debug parameter and a PRINT!
As I've already mentioned, one problem with dynamic SQL is that you often need to deal with nested
+ string delimiters. For instance, in the beginning of this article, I showed
+ you the procedure general_select2. Here it is again:
+
CREATE PROCEDURE general_select2 @tblname nvarchar(127),
+ @key varchar(10) AS
+EXEC('SELECT col1, col2, col3
+ FROM ' + @tblname + '
+ WHERE keycol = ''' + @key + '''')
+
(Again, I like to emphasise that this sort of procedure is poor use of
+ dynamic SQL.)
+
+SQL is one of those language where the method to include a string
+delimiter itself in a string literal is to double it. So those four consecutive
+single quotes ('''') is a string literal with the value of a one
+single quote (').
+This is a fairly simple example; it can get a lot worse. If you work with
+dynamic SQL, you must learn to master nested strings. Obviously, in this case you
+can easily escape the mess by using sp_executesql instead yet another reason
+to use parameterised statements. However, there are situations when you need to
+deal with nested quotes even with sp_executesql. For instance, earlier in this
+article, I had this code:
+
N' WHERE LastUpdated BETWEEN @fromdate AND '
+N' coalesce(@todate, ''99991231'')'
+
We will look at some tips of dealing with nested strings later in this
+ section.
+See that there is a space missing after FROM? When you compile the stored procedure
+you will get no error, but when you run it, you will be told that the columns
+keycol, col1, col2, col3 are missing. And since you know that the
+table you passed to the procedure has these columns you will be mighty confused. But this is
+the actual code generated, assuming the parameters foo and abc:
+This is not a syntax error, because FROMfoo is a column alias to col3.
+And, yes, it's legal to use a WHERE clause, even if there is no FROM clause. But
+since the columns cannot exist out of the blue, you get an error for that.
+ This is also a good example why you should use debug prints. If the code
+ looks like this:
It would be much easier to find the error by running the procedure with
+ @debug = 1. (Obviously, had we included the dbo prefix, this error
+ could not occur at all.)
+
Overall, good formatting is essential when working with dynamic SQL. Try to
+ write the query as you would have written it in static SQL, and then add the
+ string delimiters outside of that. T-SQL permits you to embed newlines in
+ string literals (as testified by the example above), so in contrast to VB,
+ you don't need a string delimiter on each line. An advantage of this is that
+ your debug PRINT is easier to read, and in the case of a syntax error the line
+ number in the error message may guide you.
+
You may prefer, though, to
+ have a string terminator on each line. A tip in such case is to do something
+ like this:
Passing table and column names as parameters to a procedure with dynamic SQL
+ is rarely a good idea for application code. (It can make perfectly sense for
+ admin tasks). As I've said, you cannot pass a table or a column name as a
+ parameter to sp_executesql, but you must interpolate it into the SQL string.
+ Still you should protect it against SQL
+ injection, as a matter of routine. It could be that bad it comes from user
+ input.
+
To this end, you should use the built-in function quotename() (added in
+ SQL7). quotename() takes two parameters: the first is a string, and the second
+ is a pair of delimiters to wrap the string in. The default for the second
+ parameter is []. Thus, quotename('Orders') returns
+ [Orders]. quotename() takes care of nested delimiters, so if you have
+ a really crazy table name like Left]Bracket, quotename() will
+ return [Left]]Bracket].
+
Note that when you work with names with several components, each component
+ should be quoted separately. quotename('dbo.Orders') returns
+ [dbo.Orders], but that is a table in an unknown
+ schema of which the first four characters are d, b, o and
+ a dot. As long as you only work with the dbo schema, best practice is to
+ add dbo in the dynamic SQL and only pass the table name. If you work
+ with different schemas, pass the schema as a separate parameter. (Although
+ you could use the built-in function parsename() to split up a
+ @tblname
+ parameter in parts.)
+
While general_select still is a poor idea as a stored procedure, here
+ is nevertheless a version that summarises some good coding
+ virtues for dynamic SQL:
+The main purpose of quotename() is to quote object names, which is why the
+default for the second parameter is brackets. But you can specify other
+delimiters as well, including single quotes, which means that any single quote
+in the input is doubled. Thus, if you for some reason prefer to use
+ EXEC(), you can use quotename() to protect yourself against SQL
+ injection by help of this function. Here is an example.
+
IF @custname IS NOT NULL
+ SELECT @sql = @sql + ' AND custname = ' + quotename(@custname, '''')
+
Say that @custname has the value D'Artagnan. This part of the dynamic SQL
+ becomes:
+
AND custname = 'D''Artagnan'
+
There is a limitation with quotename(): its input parameter
+ is nvarchar(128), so it does not handle long strings. A remedy is this user-defined function:
This version is for SQL2000. On SQL2005 and
+later, replace 1998 and 4000 with MAX,
+ to make it work for any string length. Here is an example of using this function:
+
IF @custname IS NOT NULL
+ SELECT @sql = @sql + ' AND custname = ' + dbo.quotestring(@custname)
+
+The result is the same as above.
+
+On SQL7, you would have to implement quotestring as a stored procedure.
+SQL6.5 does not have replace(), so you are a bit out of luck there.
+
+So with quotename() and quotestring(),
+do we have as good protection against SQL
+injection as we have with parameterised commands? Maybe. I don't know of any way to
+inject SQL that slips through quotename() or quotestring(). Nevertheless, you
+are interpolating user input into the SQL string, whereas with parameterised
+commands, you don't.
+
+(I
+should add that I got the suggestion to use quotename() or a user-defined
+function from SQL Server MVP Steve Kass.)
Another alternative to
+ escape the mess of nested quotes, is make use
+ of the fact that T-SQL actually has two string delimiters. To wit, if the
+ setting QUOTED_IDENTIFIER is OFF, you can also use double quotes(")
+ as a string delimiter. The default
+ for this setting depends on context, but the preferred setting is
+ ON, and it
+ must be ON in order to use XQuery, indexed views and indexes on computed columns.
+ Thus, this is not a first-rate alternative, but if you are aware of the caveats,
+ you can do this:
Since there are two different quote characters, the code is much easier to
+ read. The single quotes are for the SQL string and the double quotes
+ are for
+ the embedded string literals.
+
All and all, this is an inferior method to both sp_executesql and quotestring(), since you are not protected against SQL injection
+ (what if @key includes a double quote?). But it
+ would be OK to do for some sysadmin task (where SQL injection is not likely
+ to be an issue), and it may be the best way to go on SQL6.5.
There is a limitation with sp_executesql on SQL2000
+ and SQL7, since you cannot use longer SQL
+ strings than 4000 characters. (On SQL2005 and later,
+ you should use nvarchar(MAX) to avoid this
+ problem.) If you
+ want to use sp_executesql when your query string exceeds this limit to make use of parameterised query plans, there is actually a
+ workaround. To wit, you can wrap sp_executesql in EXEC():
This very simple: you cannot use dynamic SQL from used-defined functions
+ written in T-SQL. This is because you are not permitted do anything in a UDF
+ that could change the database state (as the UDF may be invoked as part of a
+ query). Since you can do anything from dynamic SQL, including updates, it is
+ obvious why dynamic SQL is not permitted.
+
I've seen more than one post on the newsgroups where people have
+ been banging their head against this. But if you want to use dynamic SQL in a
+ UDF, back out
+ and redo your design. You have hit a roadblock, and in SQL2000 there is no
+ way out.
+
In SQL2005 and later, you could implement your function as a CLR function. Recall that
+ all data access from the CLR is dynamic SQL. (You are safe-guarded, so that if
+ you perform an update operation from your function, you will get caught.) A
+ word of warning though: data access from scalar UDFs can often give performance
+ problems. If you say
+
SELECT ... FROM tbl WHERE dbo.MyUdf(somecol) = @value
+
and MyUdf performs data access, you have more or less created a hidden
+ cursor.
Not that cursors are something you should use very frequently, but people often
+ask about using dynamic SQL with cursors, so I give an example for the sake
+ of completeness. You cannot say DECLARE CURSOR EXEC(); you have to put the
+entire DECLARE CURSOR statement in dynamic SQL:
You may be used to using the LOCAL keyword with your cursors. However, it is
+ important to understand that you must use a global cursor, as a local cursor
+ will disappear when the dynamic SQL exits. (Because, as you know by now, the
+ dynamic SQL is its own scope.) Once you have declared the
+ cursor in this way, you can use the cursor in a normal fashion. You must be
+ extra careful with error-handling though, so that you don't exit the
+ procedure without deallocating the cursor.
+
There is however a way to use locally-scoped cursors with dynamic SQL.
+ Anthony Faull pointed out to me that you can achieve this with cursor variables, as in this example:
+
DECLARE @my_cur CURSOR
+EXEC sp_executesql
+ N'SET @my_cur = CURSOR STATIC FOR
+ SELECT name FROM dbo.sysobjects;
+ OPEN @my_cur',
+ N'@my_cur cursor OUTPUT', @my_cur OUTPUT
+FETCH NEXT FROM @my_cur
+
+You refer to a cursor variable, just like named cursors, but there is an @ in front,
+and, as you see from the example, you can pass them as a parameters. (I have to confess
+I have never seen any use for cursor variables until Anthony Faull was kind to send
+me this example.)
A special feature added in SQL2005 is that you can use EXEC() to run
+ pass-through queries on a linked server. This could be another instance of
+ SQL Server, but it could also be an Oracle server, an Access database, Active
+ directory or whatever. The SQL could be a single query or a sequence of
+ statements, and could it be composed dynamically or be entirely static. The syntax
+ is simple, as seen by this example:
+
EXEC('SELECT COUNT(*) FROM ' + @db + '.dbo.sysobjects') AT SQL2K
+
SQL2K is here a linked server that has been defined with
+ sp_addlinkedserver.
+
There is one thing that you can do with EXEC() at a linked server, that you
+ cannot do with EXEC() on a local server: you can use parameters, both for
+ input and output. The confuse matters, you don't use parameters with names
+ starting with @, instead you use question marks (?) as parameter
+ holders. Say that you are on an SQL2005 box, and you are dying to know how
+ many orders VINET had in the Northwind database. Unfortunately, SQL2005 does
+ not ship with Northwind, but you have a linked server set up to an instance
+ of SQL2000 with Northwind. You can run this:
+
DECLARE @cnt int
+EXEC('SELECT ? = COUNT(*) FROM Northwind.dbo.Orders WHERE CustomerID = ?',
+ @cnt OUTPUT, N'VINET') AT SQL2K
+SELECT @cnt
+
Note here that the parameter values must appear in the order the parameter
+ markers appear in the query. When passing a parameter, you can either specify a
+ constant value or a variable.
+
You may ask why the inconsistency with a different parameter marker from
+ sp_executesql? Recall that linked servers in SQL Server are always accessed
+ through an OLE DB provider, and OLE DB uses ? as
+ the parameter marker, a convention inherited from ODBC. OLE DB translates
+ that parameter marker as is appropriate for the data source on the other end.
+ (Not all RDBMS use @ for variables.)
+
As with regular EXEC(), you can specify AS USER/LOGIN to use impersonation:
+
EXEC('SELECT COUNT(*) FROM ' + @db + '.dbo.sysobjects')
+ AS USER = 'davidson' AT SQL2K
+
This begs the question: is davidson here a local user or a remote
+ user at SQL2K? Books Online is not very clear
+ about this, but I did some
+ quick experimenting, and found that what you are impersonating is a local user or login,
+ not a login on the remote server. (The login to use on the remote server can be
+ defined with sp_addlinkedsrvlogin.)
When you read the various newsgroups on SQL Server, there is almost every day
+ someone who asks a question that is answered with use dynamic SQL with a quick example
+ to illustrate, but ever so often the person answering forgets to tell
+about the implications on permissions or SQL injection. On top of that, far too many
+examples use EXEC() without any thought of query plans. And while many of these
+ questions taken by the letter have no other answer than dynamic SQL, there is
+ often a real business problem which has a completely different solution
+ without dynamic SQL and
+ a much better one.
+
So, in this section I will explore some situations where you could use dynamic
+SQL. You will see that sometimes dynamic SQL is a
+ good choice, but also that in many cases that it is an outright bad idea.
A common question is why the following does not work:
+
CREATE PROCEDURE my_proc @tablename sysname AS
+ SELECT * FROM @tablename
+
+
As we have seen, we can make this procedure work with help of dynamic SQL, but
+ it should also be clear that we gain none of the advantages with generating
+ that dynamic SQL in a stored procedure. You could just as well send the
+ dynamic SQL from the client. So, OK: 1) if the
+ SQL statement is very complex, you save some network traffic and you do encapsulation.
+2) As we have seen, starting with SQL2005 there are methods to deal with
+ permissions. Nevertheless, this is a bad idea.
+
There seems to be several reasons why people want to parameterise the table
+ name. One camp
+ appears to be people who are new to SQL programming, but have experience
+ from other
+languages such as C++, VB etc where parameterisation is a good thing. Parameterising
+the table name to achieve generic code and to increase
+maintainability seems like good programmer virtue.
+
But it is just that when it comes to database objects, the old truth does not
+hold. In a proper database design, each table is unique, as it describes a
+ unique entity. (Or at least it should!) Of course, it is not uncommon to end
+ up with a dozen or more look-up tables that all have an id, a name
+ column and some auditing columns. But they do describe different entities,
+ and their semblance should be regarded as mere chance, and future
+ requirements may make the tables more dissimilar.
+
Furthermore, when it comes to building a query plan, each table has its set
+ of statistics and
+ presumptions that are by no means interchangeable, as far as SQL Server is
+ concerned. Finally, in
+ a complex data model, it is important to get a grip of what's being used. When you start to pass table and column names as parameters, you definitely
+ lose control.
+
So if you want to do the above (save the fact that SELECT * should not be
+ used in production code), to save some typing, you are on the wrong path. It is
+much better to write ten or twenty stored procedures, even if they are similar
+to each other.
+
(If your SQL statements are complex, so that there actually is a considerable
+ gain in maintainability to only have them in one place, despite different
+ tables being used, you could consider using a
+ pre-processor like the one in C/C++. You would still have one set of
+ procedures per table, but the code would be in one single include file.)
This is a variation of the previous case, where there is a suite of tables
+ that actually do describe the same entity. All tables have the same columns, and the name includes some partitioning
+ component, typically year and sometimes also month. New tables are created as
+ a new year/month begins.
+
In this case, writing one stored procedure per table is not really feasible.
+ Not the least, because the user may want to specify a date range for a search, so even
+ with one procedure per table you would still need a dynamic dispatcher.
+
Now, let's make this very clear: this is a flawed
+ table design. You should not have one sales table per month, you should
+ have one single sales table, and the month that appear in the table
+ name, should be the first column of the primary key in the united sales table. But you may be stuck with a legacy
+application where you cannot easily change the table design. And, admittedly, there are situations where partitioning
+makes sense. The table may be huge (say over 10 GB
+ in size), or you want to be able age to out old data quickly. But in such case you should do partitioning properly.
+
In the following, I will look at three approaches to deal with partitioning without using dynamic SQL.
+
Partitioned Tables
+
Partitioned tables were added in SQL2005. You can divide a table in up to 999 partition according to a partition
+function. These partitions can be split up over different filegroups to spread out the load. Another important benefit
+of partitioned tables is that deleting a partition is a pure meta-data operation, which means that if you want to throw
+away all orders that are more than, say, 12 months old, you can do this with the wink of an eye.
+
Table partitioning is only available in Enterprise and Developer Edition, not in Standard. For this reason, I'm not
+going into further details, but refer you to Books Online.
+
Views and Partitioned Views
+
If you have an old application, where you cannot easily merge the umpteen sales tables into one, because it would break
+other parts of the application, a simple approach is
+ to define a view like this:
+
CREATE VIEW sales AS
+ SELECT year = '2006', col1, col2, ... FROM dbo.sales2006
+ UNION ALL
+ SELECT year = '2005', col1, col2, ... FROM dbo.sales2005
+ UNION ALL
+ ...
+
Instead of composing
+ the table name dynamically, you can now say:
+
SELECT ... FROM sales WHERE year = '2006' AND ...
+
Also, it's easy to add new tables to the view or remove old tables as the data is aged out. Unfortunately, this view is not terribly efficient, as the query will access
+ all tables in the view. Furthermore, the view is not updateable. But with a few more steps, you could make it into what SQL Server
+knows as a partitioned view,
+a feature added in SQL2000 (and available in all editions of SQL Server). A true partitioned view can be very efficient, because for
+ queries that include the partitioning column in the WHERE clause, SQL Server
+ will only access the relevant table(s). And such a view is updatable, so you
+ can insert data into it, and the data will end up in the right table.
+
Here is a
+ quick example/demo on how to properly set up a partitioned view. Assume that
+ as legacy of a poor design we have these three tables:
+
SELECT OrderID + 0 AS OrderID, OrderDate, CustomerID, EmployeeID
+INTO Orders96 FROM Northwind..Orders WHERE year(OrderDate) = 1996
+ALTER TABLE Orders96 ALTER COLUMN OrderID int NOT NULL
+
+SELECT OrderID + 0 AS OrderID, OrderDate, CustomerID, EmployeeID
+INTO Orders97 FROM Northwind..Orders WHERE year(OrderDate) = 1997
+ALTER TABLE Orders97 ALTER COLUMN OrderID int NOT NULL
+
+SELECT OrderID + 0 AS OrderID, OrderDate, CustomerID, EmployeeID
+INTO Orders98 FROM Northwind..Orders WHERE year(OrderDate) = 1998
+ALTER TABLE Orders98 ALTER COLUMN OrderID int NOT NULL
+go
+ALTER TABLE Orders97 ADD CONSTRAINT pk97 PRIMARY KEY (OrderID)
+ALTER TABLE Orders96 ADD CONSTRAINT pk96 PRIMARY KEY (OrderID)
+ALTER TABLE Orders98 ADD CONSTRAINT pk98 PRIMARY KEY (OrderID)
+
First step is to a add Year column to each table. These columns need a
+ default (so that processes that insert directly into these tables are
+ unaffected) and a CHECK constraint. Here is how it looks for Orders96:
+
ALTER TABLE Orders96 ADD Year char(4) NOT NULL
+ CONSTRAINT def96 DEFAULT '1996'
+ CONSTRAINT check96 CHECK (Year = '1996')
+
This column must be the first column in the primary key, so we need to drop
+ the current primary key and recreate it:
+
ALTER TABLE Orders96 DROP CONSTRAINT pk96
+ALTER TABLE Orders96 ADD CONSTRAINT pk96 PRIMARY KEY (Year, OrderID)
+
Again, this must be performed for all three tables. Finally, you can create
+ the view:
+
CREATE VIEW Orders AS
+ SELECT * FROM dbo.Orders96
+ UNION ALL
+ SELECT * FROM dbo.Orders97
+ UNION ALL
+ SELECT * FROM dbo.Orders98
+
Note: I have here use SELECT * to save some space in the article, but when you
+define your real view, you should list the colunms explicitly. There is a risk that columns could come in different
+order in the tables.
+
You now have a proper partitioned view that you can perform inserts and updates through. For instance you can run:
SELECT OrderID, OrderDate, EmployeeID
+FROM Orders
+WHERE Year = @year
+ AND CustomerID = N'BERGS'
+
SQL Server will at run-time only access the OrdersNN table that maps to
+ @year. If you look at the query plan casually, it may seem that all three
+ tables are
+ accessed, but if you check the Filter operators you will find something
+ called STARTUP EXPR. This means that SQL Server determines at
+ run-time
+ whether to access the table or not. (In fact, when I tested this, I only got this result on SQL2005 and SQL2008. On
+SQL2000, the start-up expression was not included for some reason I have not been able to understand.)
+
For your real-world case you may find it prohibitive to change the primary
+ key. In this case you could add a UNIQUE constraint with the partitioning
+ column + the real primary key. This will not be a proper partitioned view,
+ and the view will not be updatable,
+ but with some luck SQL Server may still apply start-up expressions, and access only one of the base tables.
+ At least I got it to work, when I ran a quick test. You
+ should verify that it works for your situation.
+
When a new table is added with a new year, the view needs to be redefined. If
+ this happens frequently, for instance by each month, you should probably set
+ up a job for this. I leave out example code, but it requires running
+ a cursor over sysobjects to compose a CREATE VIEW statement that you then
+ execute with sp_executesql or EXEC(). That would be an example of good use of
+ dynamic SQL.
+
This was a concentrated introduction to partitioned views. You can find the full rules for
+ partitioned views under the topic for CREATE VIEW in Books Online. Good
+ reading is also Stefan
+ Delmarco's detailed article
+ SQL
+ Server 2000 Partitioned Views.
+
Compatibility Views
+
If you have very many tables, there is a risk that you will hit a roadblock with a partitioned view: SQL Server only
+permits 256 tables in a query. Henrik Staun Poulsen suggested an alternate solution that evades this restriction. You first create that new table, with
+all the data in it. Then you drop the old tables, but replace them with views:
+
CREATE VIEW sales200612 AS
+ SELECT col1, col2, col3
+ FROM sales
+ WHERE yearmonth = '200612'
+
Old functions that uses dynamic SQL or whatever they do, can continue to do so. If they perform INSERT, UPDATE or
+DELETE operations, you need to implement INSTEAD OF triggers to support this.
+
Obviously, this solution requires you to produce a lot of code, but you don't have to write it by hand; you can
+easily write a program in the language of your choice to generate the views and triggers.
In this case people want to update a column which they select at run time.
+The above is actually legal in T-SQL, but what happens is simply that the
+ variable @colname
+is assigned the value in @value for each affected row in the table.
+
In this case dynamic SQL would call for the user to have UPDATE permissions
+on the table, something not to take lightly. So there is all reason to
+avoid it. Here is a fairly simple workaround:
+
UPDATE tbl
+SET col1 = CASE @colname WHEN 'col1' THEN @value ELSE col1 END,
+ col2 = CASE @colname WHEN 'col2' THEN @value ELSE col2 END,
+ ...
+
+If you don't know about the CASE expression, please look it up in Books Online.
+It's a very powerful SQL feature.
+
Then again, one would wonder why people want to do this. Maybe it's because their
+tables look like this:
The request here is to determine the name for a column in a result set at
+run-time. My gut reaction, is that this should be handled
+client-side. But if your client is a query window is Management Studio or
+similar, this is kind of difficult. In any case, this is simple to do without any
+dynamic SQL on SQL2005 and later:
+
DECLARE @mycolalias sysname
+SELECT @mycolalias = 'This week''s alias'
+
+CREATE TABLE #temp (a int NOT NULL,
+ b int NOT NULL)
+
+INSERT #temp(a, b) SELECT 12, 17
+
+EXEC tempdb..sp_rename '#temp.b', @mycolalias, 'COLUMN'
+
+SELECT * FROM #temp
+
That is, you first get the data into a temp table, and then you use
+sp_rename to rename the column along your needs. (You need to qualify sp_rename with tempdb to have
+it to operate in that database.) You will get
+an informational message Caution: Changing any part of an object name could
+break scripts and stored procedures, but you may be able to live with that.
+
+
This trick works on SQL2000 too, although not entirely without dynamic
+SQL:
+you need put the SELECT from the temp table in
+EXEC():
+
EXEC('SELECT * FROM #temp')
+
This is because on SQL2000, sp_rename apparently does not trigger a recompile,
+so if the the SELECT is in the same batch, the statement fails with Invalid
+column name 'b'. There is yet one thing to be aware of on SQL2000: you
+cannot use sp_rename in a stored procedure that is to be run by plain users, as sp_rename thinks
+you need to be a member of the db_owner or db_ddladmin database roles,
+even if this is only a temp table. This issue has been addressed in
+SQL2005.
In this case the table is in another database which is somehow determined
+dynamically. There seems to be several reasons why people want to do this, and
+ depending on your underlying reason, the solution is different.
If you for some reason have your
+ application spread over two databases, what you absolutely not should do is
+ to have code that says:
+
SELECT ... FROM otherdb.dbo.tbl JOIN ...
+
This is bad, because if someone asks for a second environment on the same
+ server, you have a lot of code to change.
+
The best solution for this particular problem is to use synonyms, added in SQL2005:
+
CREATE SYNONYM otherdbtbl FOR otherdb.dbo.tbl
+
You can then refer to otherdb.dbo.tbl as just otherdbtbl. If
+ there is a need for a second set of databases, you only have to update the
+ synonyms, and there is no need to use dynamic SQL.
+
Yet a way to avoid dynamic SQL is to use stored procedures for all
+ inter-database communication. That is, if you are in db1 and need to get data from
+ db2, you call a stored procedure in db2. This can be dynamic,
+ because EXEC permits you to specify a variable that holds the name of the
+ procedure to execute.
As above, I make use of that you can specify the procedure name dynamically
+ with EXEC. The trick here is that when you specify a system stored procedure
+ in three-part notation with the database name, the procedure executes in the
+ context of that database. Thus, the dynamic SQL in this example runs in
+ @dbname, not the current database.
This sounds to me like some sysadmin
+ venture, and for sysadmin tasks dynamic SQL is
+ usually a fair game, because neither caching nor permissions are issues.
+ Nevertheless there is an kind of alternative: sp_MSforeachdb, demonstrated by this example:
+
sp_MSforeachdb 'SELECT ''?'', COUNT(*) FROM sysobjects'
+
As you might guess, sp_MSforeachdb uses dynamic SQL internally, so
+ what you win is that you don't have to write the control loop yourself. I should
+ hasten to add that sp_MSforeachdb is not documented in Books Online,
+ which also means that use of it is not supported by Microsoft and it could be
+ changed or withdrawn from SQL Server without notice.
The scenario here is that you have a suite of databases with identical
+ schema. The typical reason they are different databases and not one, is that every
+ database serves a different customer, and each customer can access his
+ database (but of course no one else's). Some people
+ see a problem with the same stored procedures in fifty databases,
+ and believe that they face a maintenance nightmare. So they get the idea
+ that they should put the procedures in a "master" database. Yes, you can do that. It
+ will give you a much bigger maintenance problem, because your code will
+ entirely littered with dynamic SQL.
+ In fact, if you feel that this is the only alternative, you are better off
+ skipping stored procedures altogether and do all access from client code
+ instead. In such case there is only one place you need to specify the
+ database: the connection string.
+
What else can you do? Some people might suggest that you should collapse the
+ databases into one, and employ a strict
+ row-level security scheme. Personally, I would never accept such a solution
+ as a potential customer. In a complex application, bugs can easily lead to
+ that information is exposed to people who should not see it. Besides,
+ row-level security cannot be implemented entirely waterproof in SQL Server.
+ Whereas queries only would return the data they should, query plans and error
+ messages may indirectly disclose information to users who are not authorised
+ to see it.
+
Another wild approach is to use SQL Server's own master database and install the application procedures
+ as system procedures. I have not played with this for a long time, but I am told that it still works in SQL2008. In any case, this is entirely
+ unsupported. So while I mention the possibility, I don't give you the details
+ on how to do it and I strongly recommend that you don't go there.
+
What then is the real solution? Install the stored procedures in each database and develop
+ rollout routines for your SQL objects. You need this anyway, the day you want
+ to update the table definitions. This also permits you to have some
+ flexibility. Some customers may prefer to skip an upgrade. Other customers
+ may be prepared to pay for extra functions that only they have access to. Even more importantly, it permits you to easily scale out and move some
+ databases to a second server. I mentioned that as a customer, I would not
+ accept to share database with other customers. In fact, a security-aware
+ customer would not even accept to share the same instance of SQL Server, but
+ require his own instance.
+
(You may ask whether not synonyms could be used to implement the "master"
+ database. I have not been able to think of anything useful, but if you find
+ out something, please drop me a line.)
This question sometimes comes up. Most often people have problems with the
+ USE command. The correct solution is to avoid USE altogether in this case. In
+ fact, we have already seen how to do this:
It is fascinating how may people who put '1,2,3,4' in @list, and then are
+ puzzled why the query above does not return any rows. Well, if there is a row
+ where col has the value '1,2,3,4', you will get a match. These two
+ conditions are the same:
+
col IN (@list)
+col = @list
+
IN does not mean "parse whatever data there is at runtime as a
+ comma-separated list". It's a compile-time shortcut for
+ col =
+ @a OR col = @b OR ...
+
This is a very common question on the newsgroups, and Use dynamic SQL is a far too common answer.
+ Yes, you can do this with dynamic SQL, but it is an extremely poor solution.
+ You cannot pass the list as a parameter to sp_executesql, so you would have
+ to use EXEC() and be open to SQL injection. On
+ top of that, for long lists, IN has extremely poor performance in some
+ tests I did, it took SQL Server 15 seconds to build the query plan for a list
+ with 10000 elements.
+
The correct method is to unpack the list into a table with a user-defined
+ function or a stored procedure. In my article, Arrays and Lists in
+ SQL Server, I describe a whole range of ways to do this. I also present performance data for the various methods. (Dynamic SQL is at
+ the bottom of that list!) This is a long article, but there are jump-start
+ links in the beginning of the article, depending on which version of SQL
+ Server you are using.
CREATE PROCEDURE search_sp @condition varchar(8000) AS
+ SELECT * FROM tbl WHERE @condition
+
Just forget it. If you are doing this, you have not completed the transition
+ to use stored procedure and you are still assembling your SQL code in the client.
+But this example lapses into
A not too uncommon case is that the users should be able to select data from a broad set of
+parameters. The procedure search_orders in the section on
+ SQL injection
+ is a very simple example of this.
+
Any programmer that tackles this realises that writing a static solution
+ with a tailor-made query for each combination of input parameters is
+ impossible. It most cases, it's simple to write a single static query with conditions like:
+
AND (CustomerID = @custid OR @custid IS NULL)
+
But in SQL2005 and earlier if is not possible to get good performance from such a query, but the only option for good
+ performance is to use dynamic SQL. This changed in SQL2008, provided that you use the RECOMPILE hint. However that is a bit complicated, because the original implementation had a serious bug, so Microsoft reverted on that change for a while. Rather than going into details here, I refer you to my article, Dynamic Search Conditions, where I
+ discuss this type of searches in more detail and where I present several methods, both with dynamic SQL and
+ static SQL. This article exists in two versions, one for
+ SQL2008 and later, and one for earlier versions.
Another common request is to make a dynamic crosstab query, where you transform rows into columns. For instance, say
+that you want to display the number of orders handled by each employee in Northwind with one column per year. This query
+works well:
+
SELECT E.LastName,
+ [1996] = SUM(CASE Year(OrderDate) WHEN '1996' THEN 1 ELSE 0 END),
+ [1997] = SUM(CASE Year(OrderDate) WHEN '1997' THEN 1 ELSE 0 END),
+ [1998] = SUM(CASE Year(OrderDate) WHEN '1998' THEN 1 ELSE 0 END)
+FROM Orders O
+JOIN Employees E ON O.EmployeeID = E.EmployeeID
+GROUP BY E.LastName
+
But in many situations you don't exactly which columns you will have in the data, or even how many there will be. For
+instance, in this example, we may not know beforehand for which years there are orders.
+
One approach is to set an upper limit of how many output columns you support and use dummy names for the columns.
+Once you have run the query, you use the technique I described in the section SELECT col AS @myname.
+
+
However, in the very most cases, you will want to employ dynamic SQL for this. And there is not really any
+alternative. A SELECT statement returns a table, and a table has a known number of columns with known names, so there is
+no way you can write a static SELECT statement to achieve this.
+
The general technique is a two-step operation: 1) Get the unique values to pivot on. 2) with those values, generate a query like the one above. While it's a short description, it
+takes some time to get everything in place. You can make a shortcut with the stored procedure
+pivot_sp, something I have adapted from a procedure
+originally written by SQL
+Server MVP Itzik Ben-Gan. The procedure takes a number of parameters permitting you to specify the query, the rows to group
+by and to pivot by, and which aggregation operation you want.
+
As this article is already long enough, I don't go into details to try to explain how it works, but leave it to you
+to explore it on your own. I like to stress one thing though: The way pivot_sp is written, it is wide-open to
+SQL injection, and it is very difficult, not to say impossible to make the procedure
+fool-proof since it accepts query text as parameter. This is no problem as long as you use it as your own utility
+procedure and have full control over the input, but you should not make a procedure like this one accessible to anyone.
+Rather I recommend that you do
+
DENY EXECUTE ON pivot_sp TO public
+
To make sure that plain users cannot run it. If you make a call to pivot_sp in a stored procedure, this call
+will succeed as ownership chaining applies. The file for
+pivot_sp includes an example to demonstrate this.
+
Another option for dynamic crosstab is RAC, which is a third-party tool. I have never used it
+myself, but I have heard several good comments about it.
This can easily be handled without dynamic SQL in this way:
+
SELECT col1, col2, col3
+FROM dbo.tbl
+ORDER BY CASE @col1
+ WHEN 'col1' THEN col1
+ WHEN 'col2' THEN col2
+ WHEN 'col3' THEN col3
+ END
+
Again, review the CASE expression in Books Online, if you are not acquainted
+with it.
+
Note that if the columns have different data types you cannot lump them into
+ the same CASE expression, as the data type of a CASE
+ expression is always one and the same. Instead, you can do this:
+
SELECT col1, col2, col3
+FROM dbo.tbl
+ORDER BY CASE @col1 WHEN 'col1' THEN col1 ELSE NULL END,
+ CASE @col1 WHEN 'col2' THEN col2 ELSE NULL END,
+ CASE @col1 WHEN 'col3' THEN col3 ELSE NULL END
+
+If you also want to make it dynamic whether the order should be ascending or
+descending, add one more CASE:
+
SELECT col1, col2, col3
+FROM dbo.tbl
+ORDER BY CASE @sortorder
+ WHEN 'ASC' THEN CASE @col1
+ WHEN 'col1' THEN col1
+ WHEN 'col2' THEN col2
+ WHEN 'col3' THEN col3
+ END
+ ELSE NULL
+ END ASC,
+ CASE @sortorder
+ WHEN 'DESC' THEN CASE @col1
+ WHEN 'col1' THEN col1
+ WHEN 'col2' THEN col2
+ WHEN 'col3' THEN col3
+ END
+ ELSE NULL
+ END
+
Or use the form in the second example to deal with different data types.
+
SQL Server MVP Itzik Ben-Gan had a good article on this topic in the March
+2001 issue of SQL Server Magazine,
+where he offers other suggestions.
+
It should be added that these solutions has the disadvantage that they will always cause a sort which for a large
+data set could be expensive. If you add an ORDER BY clause in dynamic SQL, the optimizer may avoid the sort if there is
+a suitable index.
This is no longer an issue, since SQL2005 added new syntax that permits a variable:
+
SELECT TOP(@n) col1, col2 FROM tbl
+
On SQL2000, TOP does not accept variables, so you need to use dynamic SQL to use
+TOP. But there is an alternative:
+
CREATE PROCEDURE get_first_n @n int AS
+SET ROWCOUNT @n
+SELECT au_id, au_lname, au_fname
+FROM authors
+ORDER BY au_id
+SET ROWCOUNT 0
+
It can be disputed whether SET ROWCOUNT @n is really a better solution than
+ running a dynamic SQL statement with TOP. A dynamic TOP is probably a
+ better choice, as long as you can accept the security implications. (But it's
+ not worth to change the permissions only for this.)
+
I guess a common reason for wanting to do this is to implement paging in web
+ applications. SQL Server MVP Aaron Bertrand has an article which is the
+ standard reference on
+ this topic.
The desire here is to create a table of which the name is determined at
+ run-time.
+
If we just look at the arguments against using dynamic SQL in stored
+ procedures, few of them are really applicable here. If a stored procedure has a
+ static CREATE TABLE in it, the user who runs the procedure must have
+ permissions to create tables, so dynamic SQL
+ will not change anything. Plan caching obviously has nothing to do with
+ it. Etc.
+
Nevertheless: Why? Why would you want to do this? If you are creating tables on the fly in your
+ application, you have missed some fundamentals about database design. In a
+ relational database, the set of tables and columns are supposed to be
+ constant. They may change with the installation of new versions, but not during
+ run-time.
+
Sometimes when people are doing this, it appears that they want to construct
+unique names for temporary tables. This is completely unnecessary, as this is a
+built-in feature in SQL Server. If you say:
+
CREATE TABLE #nisse (a int NOT NULL)
+
then the actual name behind the scenes will be something much longer, and no
+other connections will be able to see this instance of #nisse.
+
If you want to create a permanent table which is unique to a user, but you
+ don't want to stay connected and therefore cannot use temp tables, it may be
+better to create one table that all clients can share, but where the first
+column is a key which is private to the client. I discuss this method a little
+ more closely in my article How to
+ Share Data between Stored Procedures.
Sometimes I see persons on the newsgroups that are unhappy, because they
+ create a temp table from dynamic SQL, and then they can't access it, because it
+ disappeared when the dynamic SQL exited. When told that they have to create the
+ table outside the dynamic SQL, they respond that they can't, because they don't
+ know the structure of the table until run-time.
+
One solution is to create a global temp table, one with two # in the name,
+ for instance ##temp. Such a table is visible to all processes (so you may have
+ to take precautions to make the name unique), and unless you explicitly drop it, it exists
+ until your process exits.
+
But the real question is: what are these guys up to? If you are
+ working with a relational database, and you don't know the structure of your
+ data until run-time, then there is something fundamentally wrong. As I have
+ never been able to fully understand what the underlying business requirements
+ are, I can't really provide any alternatives. But I would suggest that if you
+ need to go this road, you should seriously consider to run your SQL from a client
+ program. Because, all access
+ to that table would have to be through dynamic SQL, and composing
+ dynamic SQL strings is easier in languages with better string capabilities,
+ be that C#, VB or Perl.
This is similar to parameterising the database name,
+ but in this case we want to access a linked server of which the name is
+ determined at run-time.
+
Two of the solutions for dynamic database names apply here as well:
+
+
On SQL2005 and later, the best solution is probably to use synonyms:
+
CREATE SYNONYM myremotetbl FOR Server.db.dbo.remotetbl
+
If you can confine the access to the linked server to a stored procedure
+ call, you can build the SP name dynamically:
+
+If you want to join a local table with a remote table on some remote server,
+determined in the flux of the moment, dynamic SQL is probably the best way if
+you are on SQL2000.
+There exists however an alternative, although it's only usable in some
+situations. You can use sp_addlinkedserver to define the linked server at
+run-time,
+as demonstrated by this snippet:
+
EXEC sp_addlinkedserver MYSRV, @srvproduct='Any',
+ @provider='SQLOLEDB', @datasrc=@@SERVERNAME
+go
+CREATE PROCEDURE linksrv_demo_inner WITH RECOMPILE AS
+ SELECT * FROM MYSRV.master.dbo.sysdatabases
+go
+EXEC sp_dropserver MYSRV
+go
+CREATE PROCEDURE linksrv_demo @server sysname AS
+ IF EXISTS (SELECT * FROM master..sysservers WHERE srvname = 'MYSRV')
+ EXEC sp_dropserver MYSRV
+ EXEC sp_addlinkedserver MYSRV, @srvproduct='Any',
+ @provider='SQLOLEDB', @datasrc=@server
+ EXEC linksrv_demo_inner
+ EXEC sp_dropserver MYSRV
+go
+EXEC linksrv_demo 'Server1'
+EXEC linksrv_demo 'Server2'
+
+There are two procedures. linksrv_demo_inner is the procedure where we
+actually access the linked server. As the linked server must exist when the
+procedure is created, I first create a dummy entry for MYSRV, which I subsequently
+drop once the procedure has been created. (Not only must the linked server exist, it must also have the database and
+tables that you access.) linksrv_demo is the outside interface which takes a
+server name as a parameter, and then at run-time defines MYSRV to point to
+@server.
+
+The above is only possible under certain conditions:
+
+
The procedure must be run by someone who has privileges to set up
+ linked servers, normally only the roles sysadmin and setupadmin
+ have these permissions. Thus, plain users do not apply.
+
Since you change a
+ server-wide definition, you cannot have several instances of the procedure
+ running. (It goes without saying, that you should use the alias in this
+ procedure only.)
+
+
+As you can see in the example, I've added WITH RECOMPILE to linksrv_demo_inner.
+This is a safety precaution, to prevent that a cached plan does not access a
+different server. I don't think this is really necessary, as SQL Server should sense the
+changed definition. In fact, you may not even have to split the code over two
+procedures, but as they say, better safe than sorry.
The rowset functions OPENQUERY and OPENROWSET often calls for dynamic SQL. Their second argument
+ is an SQL string, and they do no accept variables.
+ (This is because the optimizer builds a plan for the distributed query when
+ the procedure is compiled.) So any single parameter you want to pass to the
+ SQL statement for that remote server requires you to use dynamic SQL. Since the
+ remote SQL string can include string literals, you
+ may have to deal with up to three
+ levels of nested quotes. If you don't watch out, you can spend a full day
+ looking at things like:
to try to find out if you might you have one ' too many or too
+ few.
+
Strict discipline is absolutely necessary when working with dynamic SQL for
+ OPENQUERY. The function quotestring()
+ that I showed you earlier can be of great help:
+
The built-in function quotename() is usually not useful here, as the SQL statement easily
+ can exceed the limit of 129 characters for the input parameter to
+ quotename().
+
+
On SQL2005 and later, you can use EXEC() to run an SQL statement on a
+ linked
+ server. Since EXEC() at linked servers can take parameters, this can make
+ things considerably easier. Then again, you can join OPENQUERY with local
+ tables, so that only rows of interest are brought across the wire. This you
+ cannot do with EXEC().
Say that you write a stored
+ procedure that is to present some data, and the GUI it is to be run from is
+ Query Analyzer or SQL Server Management Studio (presumably because it is a sysadmin procedure). To make the
+ output easy to digest, you want the column width to be so wide that no data
+ is truncated, but neither do you want any extraneous spaces. This is
+ something you can achieve with dynamic SQL. Typically you would use a temp table
+ to hold the data, in which case there are no permission issues.
+
Rather than giving an example, I refer you to the source code for the popular (but undocumented)
+ system procedure sp_who2. You can find the code by entering exec
+ master..sp_helptext sp_who2.
I've written this text with a main focus on application code, because it is
+ mainly in application tasks, bad usage of dynamic SQL can cause serious harm
+ by opening for SQL injection, poor
+ query-plan reuse, and result in code that is
+ difficult to read and maintain.
+
Here, I like to briefly discuss code is for maintenance jobs, code that
+ runs once a
+ night or once a week or even less frequently. Generally, for this sort of
+ code, dynamic SQL is almost always a fair game. Query
+ plans are rarely an issue. And if the code is to be run by users with
+ sysadmin privileges, there are no permissions issues. The same applies to
+ code that does not require permissions outside the database, and is to be run
+ by users with db_owner privileges.
+
There are however, two points about SQL injection I like to make.
+
+
If you are a DBA that writes some stored procedure to be run by junior
+ operators that do not have sysadmin privilege themselves, you must of
+ course take precaution against SQL injection, so that they don't outsmart
+ you.
+
If you write a job that performs operations on tables in
+ every database, be careful to use quotename() when you build the SQL strings.
+ This is particularly important if there are non-sysadmin users that own
+ databases. A user could create a table with a name that injects an SQL command
+ into
+ your maintenance script when you run it. If you are the DBA at a hosting
+ company, this is a risk that you definitely should not neglect.
I like to thank the following persons who have provided valuable suggestions
+ and input for this article: SQL Server MVPs Tibor Karaszi, Keith Kratochvil,
+ Steve Kass, Umachandar Jaychandran, Hal Berenson and Aaron Bertrand, as well as Pankul Verma,
+ Anthony Faull, Henrik Staun Poulsen, Karl Jones, Jim Higgins, Marcus
+ Hansfeldt, Gennadi Gretchkosiy, Jeremy Lubich and Simon Hayes. I also like to thank Frank Kalis for providing the
+German
+ translation.
+
Not the least I like to thank all you people who have pointed out typos
+and spelling errors. Just keep those letters and cards coming!
2015-04-14 A very small change, in fact the addition of a single dot that was missing in SET @sp in the section linked servers. Thanks to Jim Higgins for pointing out this error.
+
2011-06-23 Updated the text in the section on Dynamic Search Conditions to mention the RECOMPILE hint, since the bug mentioned in the entry from 2009-02-14 has been fixed.
+
2009-09-12 Gennadi Gretchkosiy pointed out using that SELECT * in a
+ partitioned view is not OK. If the columns come in different order in the underlying tables, you will get a mess.
+
2009-02-14 - Removed text in the section on Dynamic Search Conditions that referred
+to the new behaviour of OPTION (RECOMPILE) in SQL 2008, that Microsoft is now reverting
+on because of a serious
+bug.
+
2008-12-06 Modified the section on dynamic crosstab to stress that pivot_sp is
+open to SQL injection.
+
2008-12-02 Updated the article for SQL2008. Rewrote the section on Sales + @yymm
+tables and added one more approach. Added a section on dynamic crosstab. Various other minor
+changes.
+
2008-06-06 Added an example on how to deal with dynamic sort
+order in the section on ORDER BY.
2006-12-27 In the section Caching
+ Query Plans, added a note
+ on forced parameterisation and a demo of the performance penalty for failing
+ to use parameterised queries.
+
2006-07-25 Corrected syntax in example with
+ cursor variable after comment from Anthony Faull.
+
2006-04-23 Thoroughly reworked the article to cover SQL2005 in
+ full, resulting in lots of new text, lots of old text dropped, and many
+ sections rearranged. I'm now
+ more strongly favouring sp_executesql over EXEC(), and
+ I put more stress on SQL
+ injection. I also stress the importance of using parameterised statements for
+ query-plan reuse, and I note that prefixing with dbo is essential for
+ query-plan reuse. The examples of cases where (not) to use dynamic SQL have
+ had an overhaul as well, if not equally drastic. I'm now giving a very quick
+ example of partitioned views for the sales + @yymm case. The article now also
+ includes snippets for
+ parameterised commands from VB6 and VB .Net.
+
2005-04-17 Added example of EXEC +
+ sp_executesql with OUTPUT parameter. Added use of nvarchar(max) on
+ SQL2005 for quotestring and elsewhere.
+
2004-02-08
+ German translation now available. Minor language corrections.
+
2003-12-02 Added example of using
+ cursor variable with dynamic SQL. Modified description
+ of first parameter to sp_executesql.
\ No newline at end of file
diff --git a/Articles/Backup/To BLOB or Not To BLOB Large Object Storage in a Database or a Filesystem.pdf b/Articles/Backup/To BLOB or Not To BLOB Large Object Storage in a Database or a Filesystem.pdf
new file mode 100644
index 00000000..9ff7aec8
Binary files /dev/null and b/Articles/Backup/To BLOB or Not To BLOB Large Object Storage in a Database or a Filesystem.pdf differ
diff --git a/Articles/Backup/sql server on vmware best practices guide.pdf b/Articles/Backup/sql server on vmware best practices guide.pdf
new file mode 100644
index 00000000..fa1604fb
Binary files /dev/null and b/Articles/Backup/sql server on vmware best practices guide.pdf differ
diff --git a/Articles/Dynamic Search Conditions in T-SQL.htm b/Articles/Dynamic Search Conditions in T-SQL.htm
deleted file mode 100644
index 0d80cb20..00000000
--- a/Articles/Dynamic Search Conditions in T-SQL.htm
+++ /dev/null
@@ -1,1194 +0,0 @@
-
-
-
-
-
-Dynamic Search Conditions in T-SQL
-
-
-
It is very common in information systems to have functions where the users are able to search the data by selecting
- freely among many possible criterias. When you implement such a function with SQL Server there are two challenges: to produce the correct result and have good performance.
-
When it comes to the latter, there is a key theme: there is no single execution plan that is good for all possible search criterias. Rather, you want the query plan to be different depending on user input. There are two ways to achieve this. You can write a static SQL query and add the hint OPTION (RECOMPILE) which forces SQL Server to compile the query every time. Or you can use dynamic SQL to build a query string which includes only the search criterias the user specified. We will look at both these approaches in this article. They are both viable, and a good SQL programmer should have both in his toolbox since both have their strengths and weaknesses.
-
This article assumes that you are on SQL 2008 or later. A key feature of this article is OPTION (RECOMPILE), a query hint that was introduced already in SQL 2005, but which was implemented properly first in SQL 2008. And to be precise, you should be on at least Service Pack 2 of SQL 2008, or Service Pack 1 for SQL 2008 R2 to take benefit of this feature. For a full discussion of how this feature has changed forth and back, see the section The History of Forced Recompilation, which also discusses a bug with OPTION (RECOMPILE) fixed in the autumn of 2014.
-
If you are still on SQL 2005 or SQL 2000, there is an older version of this article where I cover additional techniques that are not equally interesting on SQL 2008 and later, thanks to OPTION (RECOMPILE).
-
I begin the article looking at some methods which are good for very simple cases where you only need to handle a very small set of choices and where the more general methods shoot over the target. The next chapter introduces the task in focus for the rest of the article: the requirement to implement the routine search_orders in the Northgale database which I introduce this chapter. The two main chapters of this article look at implementing this procedure with static and dynamic SQL.
Problems with dynamic search conditions come in several flavours. In the general case, there is a search form where the user can select between many search conditions, and this is also the main focus of this article. But
-sometimes you encounter problems with a small number of conditions that are more or less mutually exclusive. A typical example would be a form where a user can look up a customer by entering one of: 1) The name of the customer. 2) The customer number. 3) The customer's national registration number. (That is, what is called SSN,
-personnummer etc. depending on where you are.) There are indexes on all three columns.
-
None of the solutions in the main body in the article are not really suitable here. Forcing a recompile every time with OPTION (RECOMPILE) can add too much load to the system, particularly if these lookups are frequent. And dynamic SQL is just too much hassle for a simple problem like this one.
-
So let us look at more lightweight solutions that fit this problem. A very simple-minded way is to use IF:
-
IF @custno IS NOT NULL
- SELECT ... FROM customers WHERE custno = @custno
-ELSE IF @natregno IS NOT NULL
- SELECT ... FROM customers WHERE natregno = @natregno
-ELSE IF @custname IS NOT NULL
- SELECT TOP 200 ...
- FROM customers
- WHERE custname LIKE @custname + '%'
- ORDER BY custname
-ELSE
- RAISERROR('No search condition given!', 16, 1)
-
(The TOP 200 for the search on customer name limits the output in case the user would enter a very short search string, so that we don't return tens of thousands of customers.)
-
If you need to return data from other tables as well, and you don't want to repeat the join, you could enter all matching customer numbers into a table variable or a temp table, and then do your final join:
-
IF @custno IS NOT NULL
- INSERT @cust (custno) VALUES (@custno)
-ELSE IF @natregno IS NOT NULL
- INSERT @cust (custno) SELECT custno FROM customers WHERE natregno = @natregno
-ELSE IF @custname IS NOT NULL
- INSERT @cust (custno)
- SELECT TOP (200) custno
- FROM customers
- WHERE custname LIKE @custname + '%'
- ORDER BY custname
-ELSE
- RAISERROR('No search condition given!', 16, 1)
-
-SELECT ...
-FROM @cust c
-JOIN customers cst ON cst.custno = c.custno
-JOIN ...
-
There is however a potential performance problem here. No matter which choice the user makes, we want the optimizer to use the index on the chosen search column. But the way SQL Server builds query plans, this may not always happen. When the procedure is invoked and there is no plan in the cache, SQL Server builds the plan for the entire stored procedure and "sniffs" the current input values for the parameters. Say that the first user to make the search enters a customer number. This means that the branches for national registration number and customer name are optimised for NULL and under unfortunate circumstances this could lead to a plan with a table scan, which is not what you want. (For an in-depth discussion on parameter sniffing, see my article Slow in the Application – Fast in SSMS.)
-
To prevent this from happening, there are a couple of precautions you can take. One is to push the three SELECT statements down into three subprocedures, but admittedly this is a bit bulky. Another approach is to add explicit index hints, but you should always be restrictive with index hints. For instance, what if someone renames the index? That would cause the query to fail.
-
Rather, the best option is probably to use the OPTIMIZE FOR hint:
-
SELECT TOP 200 custno
-FROM customers
-WHERE custname LIKE @custname + '%'
-ORDER BY custname
-OPTION (OPTIMIZE FOR (@custname = N'ZZZZZZZ'))
-
This hint causes SQL Server to build the query plan for the value you specify. Obviously you should pick a value which is selective enough.
-
Whatever strategy you choose, you should test on production-size data that you get the plans you expect. Due to the sniffing issue, your test should look something like this:
That is, you should test with all three parameters as the parameter "sniffed" when the plan is built.
-
In this particular example, there is one more issue with the @custname parameter that I have ignored so far: the user could add a leading %, in which case a scan would be a better choice. If you need to support searches with a leading %, the best is to split this into two branches:
-
IF left(@custname, 1) <> '%'
- -- query as above
-ELSE
- -- same query, but with different value in OPTIMIZE FOR.
-
Using OR
-
If you don't like the multiple IF statements, you may be delighted to know that it is in fact perfectly possible do it all in one query as long as you can ignore leading % in @custname:
-
SELECT TOP 200 ...
-FROM customers
-WHERE (custno = @custno AND @custno IS NOT NULL) OR
- (natregno = @natregno AND @natregno IS NOT NULL) OR
- (custname LIKE @custname + '%' AND @custname IS NOT NULL)
-ORDER BY custname
-
The WHERE clause here essentially reads:
-
custno = @custno OR natregno = @natregno OR custname LIKE @custname + '%'
-
But the added conditions with IS NOT NULL serve a purpose. With them, the chances are good that the optimizer will pick a plan that seeks all three indexes using index concatenation. However, thanks to the IS NOT NULL conditions, SQL Server will add Filter operators with a startup expression so that at run-time, only one index is accessed. (I return to startup expressions in the section Optional Tables later in this article.)
-
This strategy usually works well as long as the search terms are all in the same table and all are indexed, but rarely (if ever) if the search terms are in different tables. In any case, you should never use this strategy blindly, but always verify that you get the plan – and the performance – you intended.
-
The Case Study: Searching Orders
-
-
We will now turn to a more general case with many search terms. We will work with implementing a stored procedure that
- retrieves information about orders in the Northgale database, which is an inflated version of Microsoft's classic Northwind database. See later in this chapter how to install it.
-
This is the interface that we expose to
- the user (well rather to a GUI or middle-layer programmer):
You see in the SELECT list what information the user gets. Here is a
- specification of the parameters:
-
-
-
Parameter
Function
-
@orderid
Retrieve this order only.
-
@fromdate
Retrieve orders made on @fromdate
- or later.
-
@todate
Retrieve orders made on @todate
- or earlier.
-
@minprice
Retrieve only order details that
- cost at least @minprice.
-
@maxprice
Retrieve only order details that
- cost at most @maxprice.
-
@custid
Retrieve only orders from this
- customer.
-
@custname
Retrieve only orders from customers whose name starts with @custname.
-
@city
Retrieve only orders from customers in this city.
-
@region
Retrieve only orders from customers in this region.
-
@country
Retrieve only orders from customers in this country.
-
@prodid
Retrieve only order details with
- this product.
-
@prodname
Retrieve only order details with a
- product starting with @prodname.
-
-
@employeestr
- @employeetbl
-
These two parameters serve the same purpose: return only orders for the specified employees. @employeestr is a comma-separated string with employee IDs, while @employeetbl is a table-valued parameter. See further the discussion below.
-
-
If the user leaves out a search condition, that search condition should not
- apply to the search. Thus, a plain EXEC search_orders should
- return all orders in the database. In this text I will discuss some different implementations of search_orders,
- unimaginatively named search_orders_1 etc. Some
- of them are included in whole in this text, others only in parts. All
- are available in the dynsearch-2008 directory on my web site. (The numbering of the procedures is
-quite out of order with the text due to the historic evolution of this article.)
-
The last two parameters in the parameter list serve the same purpose functionally. I have included both to illustrate two ways how to handle multi-valued parameters. When I see these questions on the forums, people almost always have a comma-separate list. This list must be cracked into a table to be usable in SQL Server, which easily can be done with a table-valued function. In my article Arrays and Lists in SQL Server 2005 you can find a whole slew of such functions.
-
My own preference is to use a table-valued parameter and I discuss this in detail in my article Arrays and Lists in SQL Server 2008. I have not included these two parameters in all search_orders procedures; they are only present when I want to illustrate a technique to handle them. Some procedures have only one of them. (In case you wonder why @employeetbl does not have a default value: Table-valued parameters can never have an explicit default value, but instead they always have the implicit default value of an empty table.)
-
The search_orders example is not overly complicated; each condition can be implemented with a
- single condition using =,<=, >= or LIKE. In a real-life application you may encounter more complex requirements:
-
-
User should be able to select how the output should be sorted.
-
Depending on input parameters you may need to access different tables or columns.
-
Users should be able to choose the comparison operator, for instance @country = 'Germany' or @country != 'Germany'.
-
Users should be able to add or remove columns from the output and for an aggregation query what to aggregate on.
-
Anything else you can imagine – or you were not able to imagine, but the users wanted it anyway.
-
-
In interest of keeping this article down in size, I have not included such parameters in search_orders. Nevertheless, I cover some of these points in the text that follows.
-
The Northgale Database
-
I wrote the first version of this article when SQL Server 2000 ruled the world. I worked from the Northwind database, which shipped with SQL 2000. However, since that database was so small, it was not possible for me to draw any conclusions at all about performance. For this reason, I composed the Northgale database, an inflated version of Northwind. Tables and indexes are the same, but I have exploded the data so
-that instead of 830 orders, there are 344035 of them.
-
To install Northgale, you first need to create the Northwind database on your server. Download the script to install it from Microsoft's web site. (If you are on SQL 2012 or later, beware that the script will fail if you have a surrogate-aware collation. Change the CREATE DATABASE statement to force a different collation, if this occurs to you.) Once you have Northwind in place, run Northgale.sql.
- To install Northgale, you need 4.6 GB of
-disk space. When the install has completed you can reclaim 4 GB by removing the log file Northgale_log2. (The script attempts to do this, but it always seems to fail. Rerunning the last statement in the script a little later seems to work.) By default, the
- database is installed in the same directory as the master database,
-but you can edit the script to change that. (There is no issue with surrogate collations for the Northgale script.)
-
The script for Northgale works by cross-joining the tables in Northwind and for important entities like IDs and names I have created new ones by combining the existing ids and the same goes for some of the names. I have reused the existing cities, countries and regions together with some extras that I needed for this article, so these columns do not have very good selectivity.
-
Northgale includes the table type intlist_tbltype used for the @employeetbl parameter as well as the table-valued function intlist_to_tbl to crack @employeestr into a table.
-
Keep in mind that Northgale still is a small database. It easily fits entirely into memory on a laptop with 4 GB of RAM. A
- poorly written query that requires a scan of, say, the Orders table,
- still returns within a few seconds. It's hopefully big enough to give a sense
- for how good or bad different solutions are, but I would advise you to not
- draw any far-reaching conclusions. It is also worth pointing out that the way
-the database was composed, the distribution of data is a bit skewed.
-
Static SQL with OPTION (RECOMPILE)
-
Why Static SQL?
-
Solutions for dynamic search conditions in static SQL almost always include the query hint OPTION (RECOMPILE), although there are a few simple cases where the hint is not needed, and we saw an example of this in the introducing chapter Alternate Key Lookup.
-
The advantages with these solutions are:
-
-
As long as the search conditions are moderately complex, the code you get is compact and relatively easy to maintain.
-
Since the query is recompiled every time, you get a query plan that is optimised for the exact search conditions at hand.
-
You don't have to worry about permissions; it works like it always does for stored procedures. That is, the user only needs to have permission to run the stored procedure; no direct permissions on the tables are needed.
-
-
But there are also disadvantages:
-
-
When requirements grow in complexity, the complexity of the query tends to grow non-linearly, so that what once was a relatively simple query evolves to a beast that hardly anyone understands, even less wants to touch.
-
If the search routine is called with high frequency, the recurring compilation may cause an overload on the server.
-
-
In the following I will elaborate these points in more detail.
-
Note that this section assumes that OPTION (RECOMPILE) works like it does in SQL 2008 SP2, SQL 2008 R2 SP1 and later versions. See the section The History of Forced Recompilation for more details how the hint worked in older versions.
-
The Basic Technique
-
The basic technique for static SQL with OPTION (RECOMPILE) is illustrated by
-search_orders_3, which I initially show in a simplified form without the parameters @employeestr and @employeetbl.
-
CREATE PROCEDURE search_orders_3
- @orderid int = NULL,
- @fromdate datetime = NULL,
- @todate datetime = NULL,
- @minprice money = NULL,
- @maxprice money = NULL,
- @custid nchar(5) = NULL,
- @custname nvarchar(40) = NULL,
- @city nvarchar(15) = NULL,
- @region nvarchar(15) = NULL,
- @country nvarchar(15) = NULL,
- @prodid int = NULL,
- @prodname nvarchar(40) = NULL AS
-
-SELECT o.OrderID, o.OrderDate, od.UnitPrice, od.Quantity,
- c.CustomerID, c.CompanyName, c.Address, c.City, c.Region,
- c.PostalCode, c.Country, c.Phone, p.ProductID,
- p.ProductName, p.UnitsInStock, p.UnitsOnOrder
-FROM Orders o
-JOIN [Order Details] od ON o.OrderID = od.OrderID
-JOIN Customers c ON o.CustomerID = c.CustomerID
-JOIN Products p ON p.ProductID = od.ProductID
-WHERE (o.OrderID = @orderid OR @orderid IS NULL)
- AND (o.OrderDate >= @fromdate OR @fromdate IS NULL)
- AND (o.OrderDate <= @todate OR @todate IS NULL)
- AND (od.UnitPrice >= @minprice OR @minprice IS NULL)
- AND (od.UnitPrice <= @maxprice OR @maxprice IS NULL)
- AND (o.CustomerID = @custid OR @custid IS NULL)
- AND (c.CompanyName LIKE @custname + '%' OR @custname IS NULL)
- AND (c.City = @city OR @city IS NULL)
- AND (c.Region = @region OR @region IS NULL)
- AND (c.Country = @country OR @country IS NULL)
- AND (od.ProductID = @prodid OR @prodid IS NULL)
- AND (p.ProductName LIKE @prodname + '%' OR @prodname IS NULL)
-ORDER BY o.OrderID
-OPTION (RECOMPILE)
-
-
The effect of all the @x IS NULL clauses is that if an input
- parameter is NULL, then the corresponding AND-condition is always true. Thus, the only
- conditions that are in effect are those where the search parameter has a
- non-NULL value. Sounds simple enough, but there is a very big difference in performance with or without that last line present:
-
OPTION (RECOMPILE)
-
The hint instructs SQL Server to recompile the query every time. Without this hint, SQL Server produces a plan that will be cached and reused. This has a very important implication: the plan must work with all possible input values of the parameters. Due to parameter sniffing, the plan may be optimised for the parameter combination for the first search. That plan is likely to perform poorly with entirely different parameters, while it still would not be perfect for the initial parameter combination. For optimal response times when the user provides a single order ID, we want the optimizer to use the indexes on OrderID in Orders and Order Details and ignore everything else. But if the user performs a search on a product ID or a product name, we want to use the index on ProductID in Order Details and so on for other search criterias.
-
And this is exactly what we achieve with the hint OPTION (RECOMPILE). Since SQL Server is instructed to recompile the query every time, there is no need to cache the plan, why SQL Server can handle all the variables as constants. Thus, if the procedure is called like this:
-
EXEC search_orders_3 @orderid = 11000
-
SQL Server will in essence optimise this WHERE clause:
-
WHERE (o.OrderID = 11000 OR 11000 IS NULL)
- AND (o.OrderDate >= NULL OR NULL IS NULL)
- AND (o.OrderDate <= NULL OR NULL IS NULL)
- AND (od.UnitPrice >= NULL OR NULL IS NULL)
- AND (od.UnitPrice <= NULL OR NULL IS NULL)
- AND (o.CustomerID = NULL OR NULL IS NULL)
- ...
-
SQL Server is smart enough to remove all these NULL IS NULL from the query, so in essence it works with this WHERE clause:
-
WHERE o.OrderID = 11000
-
The choice of using the indexes on OrderID to drive the query becomes a no-brainer. And if you take this call:
-
EXEC search_orders_3 @custid = 'ALFKI'
-
The effective WHERE clause becomes:
-
WHERE (o.OrderID = NULL OR NULL IS NULL)
- AND (o.OrderDate >= NULL OR NULL IS NULL)
- AND (o.OrderDate <= NULL OR NULL IS NULL)
- AND (od.UnitPrice >= NULL OR NULL IS NULL)
- AND (od.UnitPrice <= NULL OR NULL IS NULL)
- AND (o.CustomerID = N'ALFKI' OR N'ALFKI' IS NULL)
- ...
-
The optimizer decides that the index on CustomerID is good.
-
Some more test cases that you can try and look at the query plan:
The two calls have the same set of parameters, but yet they produce different query plans. The first call searches for a single day for a customer with many orders. The second call searches a full year for a customer with a single order.
-
To better understand the benefit of OPTION (RECOMPILE), you can play with search_orders_3b, which is identical to search_orders_3, except that it does not have the query hint. Run the examples above with search_orders_3b and compare with the query plans for search_orders_3. Here is an exercise that is particularly illuminating: First run
-
EXEC sp_recompile search_orders_3b
-
to make sure that there is no plan in the cache for the procedure. Now run search_orders_3b first with @orderid = 11000 and then with @prodid = 76. You will notice that the latter is search is a tad slow. Flush the query plan with sp_recompile again and run these two searches in reverse order. That is, first run with @prodid = 76, and then with @orderid = 11000. You may find that it takes 20 seconds to retrieve that single order. This happens because the plan was optimised for a search on product ID and that plan did not work well with a search on order ID – but it did produce the correct result eventually.
-
The Coalesce Trap
-
Rather than using OR like above,
- some people write one of:
coalesce() is a function that takes a list of values as argument, and returns the
- first non-NULL value in the list, or NULL if there is no non-NULL value in the
- list. Thus, if @orderid is NULL, you get o.OrderID = o.OrderID,
- a complete no-op – or so it may seem.
- You can see a full example of this in search_orders_3a.
-
This yields code that is even more compact than using OR, but I strongly recommend that you stay away from this method, because there is a trap. Run this:
The first call return nine rows, but the last returns no rows at all!
- Why? The reason is that for the customer on this order, the column Region is NULL. When @region is NULL, the
- condition
-
c.Region = coalesce(@region, c.Region)
-
becomes in essence NULL = NULL. But in SQL, NULL is not equal to NULL. NULL stands for "unknown value", and any comparison with NULL yields neither true nor false in the three-valued logic of SQL, but unknown. Whence, no rows are returned.
-
To avoid this trap, some people write things like:
This is not only more kludgy, but since the column is entangled into an expression, this may preclude the use of any index on the column.
-
Another "workaround" is to write this particular condition as (c.Region = @region OR @region IS NULL) like in the original search_orders_3. But that begs the question why you should use the construct with coalesce or isnull at all, when it only works under some conditions. Thus, the simple advice is: stay away from this trap entirely.
-
Handling Multi-valued Parameters
-
Let's now look at how the parameters @employeestr and @employeetbl are handled in search_orders_3. Here are the last two conditions in the WHERE clause:
-
AND (o.EmployeeID IN (SELECT number FROM intlist_to_tbl(@employeestr)) OR
- @employeestr IS NULL)
-AND (o.EmployeeID IN (SELECT val FROM @employeetbl) OR @hasemptbl = 0)
-
intlist_to_tbl is a function that cracks a comma-separated list into table. This function is included in the Northgale database. @hasemptbl is a local variable which is defined first in the procedure:
-
DECLARE @hasemptbl bit = CASE WHEN EXISTS (SELECT * FROM @employeetbl)
- THEN 1
- ELSE 0
- END
-
This help variable is needed for the optimizer to understand that it can ignore @employeetbl when there are no rows in it. This does not work if the EXISTS test is in the main query itself.
While this works, there is a difference with regards to simple scalar parameters. For the latter, the optimizer knows the exact parameter values and builds the plan accordingly. As we saw in the example with @custid and a date interval, different parameter values can yield different plans. But this cannot happen with the multi-valued parameters in search_orders_3. All the optimizer knows about @employeetbl is the number of rows in the table variable. For @employeestr, it does not even know that. As long as the distribution of the values in the search column is fairly even, this may not be much of an issue. But if there are skews, it certainly matters.
-
One way to deal with this is to insert the values in a temp table. A temp table has distribution statistics which gives the optimizer more information. But if there are just a small number of values, you may have to force statistics update yourself, as auto-stats for a temp table happens first when six rows have been inserted/modified.
-
A more elaborate method is illustrated in the procedure search_orders_3c. The idea is that most of the time the users only want to search for two or three values at a time. Therefore, if there are up to four elements in the list, the procedure uses an IN expression, else it uses use a table variable. The procedure has this initial code:
-
DECLARE @rowc int,
- @emp1 int,
- @emp2 int,
- @emp3 int,
- @emp4 int,
- @hasemptbl bit = 0
-
-IF @employeestr IS NOT NULL
-BEGIN
- INSERT @employeetbl (rowno, employeeid)
- SELECT row_number() OVER(ORDER BY (SELECT 1)), number
- FROM intlist_to_tbl(@employeestr)
- SELECT @rowc = @@rowcount
-
- IF @rowc BETWEEN 1 AND 4
- BEGIN
- SELECT @emp1 = employeeid FROM @employeetbl WHERE rowno = 1
- SELECT @emp2 = employeeid FROM @employeetbl WHERE rowno = 2
- SELECT @emp3 = employeeid FROM @employeetbl WHERE rowno = 3
- SELECT @emp4 = employeeid FROM @employeetbl WHERE rowno = 4
- END
- ELSE IF @rowc > 4
- SELECT @hasemptbl = 1
-END
-
(For simplicity, search_orders_3c only has the parameter @employeestr, and @employeetbl resurfaces as a local work table.) If @employeestr has a value, we unpack the list into a table variable and we number the rows. If there are four values or less, we populate the variables @emp1 to @emp4. The last two conditions in the WHERE clause look like this:
-
AND (o.EmployeeID IN (@emp1, @emp2, @emp3, @emp4) OR @emp1 IS NULL)
-AND (o.EmployeeID IN (SELECT employeeid FROM @employeetbl) OR @hasemptbl = 0)
-
That is, the first condition applies if @emp1 has a value, which it has if the list had one to four values. The second condition only applies if @hasemptbl is 1, which happens if there are five or more values in the list.
-
You can compare the query plans for these three cases:
When I tested this on SQL 2012 with only EmployeeID 805 (the employee with the smallest number of orders), the first two calls resulted in a parallel plan which did not use the index on EmployeeID, whereas the last call produced a serial plan that used this index. Interesting enough on SQL 2014, where the new Cardinality Estimator comes into play, the first call produced a serial plan fairly similar to the plan for the third call. When I added 304 (the employee with the most number of orders) to the selection, the first call retained the same plan, whereas the call to search_orders_3c got a parallel plan. That is, with the strategy in search_orders_3c, you can get a plan which is tailored to the selected values.
-
I like to point out there is nothing magic with the number 4 here. You could set the limit to from any number from one to ten. Or even higher if you feel like, but I doubt that you will see any actual benefit with that long IN list over using a temp table or a table variable.
-
Choice of Sort Order
-
If users need to be able to choose the sort order, this can also easily be handled with static SQL. The basic pattern is:
-
ORDER BY CASE @sortcol WHEN 'OrderID' THEN o.OrderID
- WHEN 'EmployeeID' THEN o.EmployeeID
- WHEN 'ProductID' THEN od.ProductID
- END,
- CASE @sortcol WHEN 'CustomerName' THEN c.CompanyName
- WHEN 'ProductName' THEN p.ProductName
- END,
- CASE @sortcol WHEN 'OrderDate' THEN o.OrderDate
- END
-
That is, you have a parameter that holds the column to sort by (or some other identifier that maps to the column name) and then you use CASE to select that parameter. One very important thing to observe is that all branches in a CASE expression must have a similar data type. Recall that a CASE expression has a static data type, which is determined according to the rules of data-type precedence in SQL Server. That is, THEN-expressions that are of types with lower precedence will be converted to the type with the highest precedence in the CASE expression. If you mix string and numeric columns in the same CASE expression, attempts to sort on a string column, will die with a conversion error. Thus, you need to have one CASE expression for numeric columns, one for string columns, one for dates etc.
-
While this looks a little daunting, the optimizer is able to reduce this to an ORDER BY with a single column and build the plan best suited for that sorting – as long as you use OPTION (RECOMPILE) of course.
-
If you want to support both ascending and descending sorts, you will need to double everything:
-
ORDER BY CASE WHEN @isdesc = 1 THEN
- CASE @sortcol WHEN 'OrderID' THEN o.OrderID
- WHEN 'EmployeeID' THEN o.EmployeeID
- WHEN 'ProductID' THEN od.ProductID
- END DESC,
- CASE WHEN @isdesc = 0 THEN
- CASE @sortcol WHEN 'OrderID' THEN o.OrderID
- WHEN 'EmployeeID' THEN o.EmployeeID
- WHEN 'ProductID' THEN od.ProductID
- END ASC
-
For brevity, I included only the numeric columns here, but as you see, it's starting to get a little ugly. Now, imagine that users should be able to select multiple sort columns with different data types and also ascending/descending for each column. If you would try the above strategy above, it would grow to something completely unmanageable. So while you can do user-selected sorting with static SQL, it is only practical if you only need to support a single column or if all your sort columns have the same data type. If you encounter anything beyond that, it is time to consider a solution with dynamic SQL instead. Or – this is not an option that should be overlooked – sort the data client-side.
-
Optional Tables
-
Sometimes you may have a situation that requires you to access a table only if a certain condition is given. Let's add one more parameter to our procedure:
- @suppl_country. If this parameter is provided, the procedure should only
- return information about products with a supplier from the given
- country. You could implement this by joining to the Suppliers table,
- but a suggestion that I originally got from Phillipp Sumi is that you should use an EXISTS clause
- in this way:
-
@suppl_country IS NULL OR EXISTS (SELECT *
- FROM Suppliers s
- WHERE s.SupplierID = p.SupplierID
- AND s.Country = @suppl_country)
-
To illustrate this, I wrote search_orders_9, which is the same as search_orders_3 and with the line above added (and without the parameters for search on employees). If you run
-this:
and then look at the query plans, you will see that the first plan does not include Suppliers. This should not really come as a surprise, given what you have learnt about OPTION (RECOMPILE).
-
However, there is one more revelation to make, and to this end you need to comment out OPTION (RECOMPILE) from search_orders_9 and recreate it. Run the above again preceded by the command SET STATISTICS IO ON. If you look at the query plan for the first execution, you will see that Suppliers now appears in the plan. However, when you look at the output from SET STATISTICS IO ON, you will see something like this:
That is, even without the RECOMPILE hint, SQL Server is able to avoid the access to Suppliers. If you look in the execution plan, you find a Filter operator above the Clustered Index Seek on Suppliers. If you hover over this Filter operator, you find that it has a Startup Expression Predicate. That is, SQL Server decides at run-time whether to access the table. This is nothing new; we saw the same thing, in the section Using OR for alternate key lookup.
-
This is something which is good to keep in mind if you encounter a situation where your only dynamic search condition is that depending on a parameter you should filter the data depending on rows (not) existing in a certain table. It may be overkill to use OPTION (RECOMPILE) if a filter with a startup expression works. I like to remind you that you should always inspect the query plan and test that performance is acceptable.
-
Note: some people with a background in languages like C++ may find this trite and think that this is just a matter of operator shortcutting. However, there is no operator shortcutting in SQL, but in SQL operands can be computed in any order, and the behaviour would be the same if the condition was written as EXISTS () OR @suppl_country IS NULL.
-
Alternate Tables
-
A scenario you may encounter is that depending on a parameter, you should read from different tables. For instance, say that there is a parameter @ishistoric. If this parameter is 1, you should read from the tables HistoricOrders and HistoricOrderDetails instead. There are no such tables in Northgale so I cannot show a full-fledged procedure. But here is how the FROM clause in search_orders_3 would be written to accomodate the situation. You replace the join between Orders and Order Details with a derived table which is a UNION ALL query of two join queries that both have a WHERE clause which includes or excludes the query depending on the variable:
-
FROM (SELECT o.OrderID, o.OrderDate, od.UnitPrice, od.Quantity,
- o.CustomerID, od.ProductID, o.EmployeeID
- FROM Orders o
- JOIN [Order Details] od ON o.OrderID = od.OrderID
- WHERE @ishistoric = 0
- UNION ALL
- SELECT o.OrderID, o.OrderDate, od.UnitPrice, od.Quantity,
- o.CustomerID, od.ProductID, o.EmployeeID
- FROM HistoricOrders o
- JOIN HistoricOrderDetails od ON o.OrderID = od.OrderID
- WHERE @ishistoric = 1) AS u
-JOIN Customers c ON o.CustomerID = u.CustomerID
-JOIN Products p ON p.ProductID = u.ProductID
-
With OPTION(RECOMPILE) only one set of order tables will be accessed at run-time. (Even without the hint, you could expect a plan with a startup expression.)
-
It is worth observing, that the query has a certain amount of repetition – the SELECT list and the join conditions. The more alternate tables there are, the case for dynamic SQL grows stronger, as with dynamic SQL you can avoid much of that repetition.
-
When OPTION (RECOMPILE) Hurts You
-
We have now seen many of the advantages with using OPTION (RECOMPILE), but before you start to use it all over town, you need to understand that too frivolous use of OPTION (RECOMPILE) can cause severe pain to your system. There is after all a reason why SQL Server in the normal case caches query plans. Without plan caching there would be many systems crumbling under the load of query compilation.
-
You need to understand how often your query will be executed. Say that there are users running search_orders once a
-minute in peak activity. In this case, the extra time we spend on compilation is clearly ignorable, not the least if 50 ms of compilation can reduce execution time from five minutes to 100 ms. But assume instead that there are over 100 calls to the procedure every second. And assume furthermore, that @orderID is the only input parameter in the vast majority of these calls. Recompiling the query every time to produce the same plan all over again is a perfect waste of CPU resources.
-
One way to alleviate this situation is to introduce an IF statement so that you have:
-
IF @orderid IS NOT NULL
-BEGIN
- SELECT ...
- WHERE O.OrderID = @orderid
- AND -- Conditions on Order Details here.
- -- No OPTION (RECOMPILE) here!
-END
-ELSE
-BEGIN
- SELECT ...
- WHERE -- same conditions as before
- OPTION (RECOMPILE)
-END
-
By adding a separate branch for @orderid that does not have OPTION(RECOMPILE), the common requests for a single order can be served from a cached plan, whereas other conditions still result in compilation every time. Assume now that once you have this in production, you find that the load from compilation is still a tad high, and you identify that there many are requests with @custid and @fromdate, with @fromdate typically being at most a week ago.
-
This calls for one more branch without OPTION (RECOMPILE), and you can see a complete solution in
- search_orders_4. However, this procedure is not likely to work out well. You may recall the discussion on parameter sniffing earlier and this strikes here. Say that the first call to search_orders_4 happens to be a search on @prodid. Now the two branches for order ID and recent orders for a customer will be optimised for a search on product ID, which will result in catastrophic performance. This can be addressed with index hints, or you can shove the SELECT without OPTION (RECOMPILE) into subprocedures, and this is what I have done in search_orders_4a.
-
But this is about as far this path can take you. If you find more common input combinations that cause too much compilation, this gets out of hand, and that's where you need to look into dynamic SQL as with dynamic SQL, you can get one cached plan for each combination of input parameters. More about that later.
-
The History of Forced Recompilation
-
The RECOMPILE option is somewhat confusing, because through the course of SQL Server, it has existed in several flavours and with different behaviour. Here is a short history.
-
For as long as I have used SQL Server, there has been an option on procedure level to force recompilation:
-
CREATE PROCEDURE search_orders ... WITH RECOMPILE AS
-
There is also a similar option on the EXEC statement:
-
EXEC some_other_proc @p1, @p2, ... WITH RECOMPILE
-
The problem with these options is that SQL Server optimises a stored procedure query by query and performs no flow analysis. Thus, even if the procedure is a single query, SQL Server cannot assume that the input parameters will have the same values when the query is executed as they have at compile time. Therefore it builds a plan which produces the correct results no matter the parameter values. Even if such a one-size-fits-all plan is optimised for the parameter values sniffed, it is not a very efficient plan. Thus, as long as we only had this option, static SQL was not a good solution for dynamic search conditions.
-
In SQL 2005, Microsoft introduced statement-level recompilation, and that included the hint OPTION (RECOMPILE). However, Microsoft had not drawn the inference that the variables in the query could be handled as constants, but the plan still was compiled to be correct with all possible values of the variables. So also in SQL 2005, static SQL was still not a good solution.
-
Microsoft addressed this flaw with the release of SQL 2008. Now variables were handled as constants when you used OPTION (RECOMPILE) and static SQL became a serious contender as a solution for dynamic search conditions. However, SQL 2008 had only been out for a few months when a serious bug was revealed: if two users were both running a query with OPTION (RECOMPILE) with different parameters in parallel, they could get each other's results. This was not exactly a simple bug to fix, so Microsoft saw no choice but to revert to the old behaviour, which happened in SQL 2008 RTM CU4.
-
But there was a customer in Bulgaria who had invested heavily in the new behaviour, and they were able to convince Microsoft that they had to fix the bug for real and restore the good behaviour of OPTION (RECOMPILE). This happened in SQL 2008 SP1 CU5.
-
When it comes to SQL 2008 R2, it was released a little too soon after SQL 2008 SP1 CU5 to include the fix. As a consequence, SQL 2008 R2 RTM shipped with the old behaviour of OPTION (RECOMPILE) and the bug fix got into SQL 2008 R2 RTM CU1.
-
Thus, there are some versions of SQL 2008 for which OPTION (RECOMPILE) does not work as touted in this article. To determine whether your server has a correct implementation of OPTION
-(RECOMPILE), issue this command:
-
SELECT serverproperty('ProductVersion')
-
It should return 10.0.2746.0 (SQL 2008) or 10.50.1702.0 (SQL 2008 R2) or
- higher. Note that these versions are very old by now, and preferably you should be running the latest and last service pack, which is Service Pack 4 for SQL 2008 and Service Pack 3 for SQL 2008 R2. (As SQL 2008 and SQL 2008 R2 have gone out of mainstream support, there will be no more service packs.)
-
If you are on SQL 2012 or later, OPTION (RECOMPILE) always works in the same way, so you don't have to worry. Well, almost. In the autumn of 2014, a new bug with OPTION (RECOMPILE) was uncovered. The issue is the same as with the first bug: users running the same query with different parameters can get each other's results. But whereas the first bug was very simple to repro, this bug requires quite specific circumstances to exhibit as described in KB2965069. I am not going to repeat the KB article here, but I certainly recommend that you read it and decide whether the scenario could apply to your system. If you think it does, you should certainly apply the applicable cumulative update. (Or any CU released later.) The KB article does not list SQL 2008 and SQL 2008 R2, but I would assume that this is due to that they have gone out of mainstream support. I have no information on the matter, but my assumption is that the bug is present in these two versions as well. That is, this is a bug has been there since the new behaviour was restored in SQL 2008 SP1 CU5, and it took four years before it was observed.
-
Dynamic SQL
-
Why Dynamic SQL?
-
It might as well be said directly: solutions with dynamic SQL require more from you as a programmer. Not only in skill, but foremost in discipline and understanding of what you are doing. Dynamic SQL is a wonderful tool when used correctly, but in the hands of the unexperienced it far too often leads to solutions that are flawed and hopeless to maintain.
-
That said, the main advantages with dynamic SQL are:
-
-
Dynamic SQL gives you a lot more flexibility; as the complexity of the requirements grows, the complexity of the code tends to grow linearly or less than so.
-
Query plans are cached by the query string, meaning that commonly recurring search criterias will not cause unnecessary recompilations.
-
-
The disadvantages with dynamic SQL are:
-
-
As I said above, poor coding discipline can lead to code that is difficult to maintain.
-
Dynamic SQL introduces a level of difficulty from the start, so for problems of low to moderate complexity, it's a bit of too heavy artillery.
-
Because queries are built dynamically, testing is more difficult, and some odd combination of parameters can prove to yield a syntax error when a poor user tries it.
-
You need to consider permissions on the tables accessed by the dynamic SQL since users do not get permission just because the code in a stored procedure; it does not work that way.
-
Caching is not always what you want; sometimes you want different plans for different values of the same set of input parameters.
-
-
It may seem from this list that there are more disadvantages with dynamic SQL than advantages, but if you look more closely, you see that the list is more or less complementary with the corresponding list for static SQL. Static SQL with OPTION (RECOMPILE) is good for many everyday situations, but when the requirements of what the users should be able to do become to complex, or some the searches are too frequent for recurring recompilations to be permissible, this is when you turn to dynamic SQL, fully aware of that it comes with a price.
-
The Ways to Do Dynamic SQL
-
Whereas for static SQL, there is a single basic pattern to work from, there is more than way to implement solutions for dynamic SQL. There are three different choices where to construct the SQL code:
-
-
In a T‑SQL stored procedure.
-
In a CLR stored procedure.
-
Client-side.
-
-
And there are two choices for how to handle the input values from the users:
-
-
Inline them into the query string, that is, do something like ' AND col = ' + convert(varchar, @value)'.
-
Use parameterised queries with sp_executesql, so that the above fragment reads ' AND col = @value'.
-
-
Let's start with the latter, because this is not a matter of a choice in the normal manner. You don't pick one or the other as a matter of taste, phase of the moon, roll of a dice or the whim of the day. It cannot be enough emphasised: your norm and what you should use in 99.9 % of the time is parameterised queries. But there may be an occasional parameter where inlining is required for performance reasons. Once we have looked at the basic examples, we will look at such cases, as well as a discussion of why inlining is unacceptable in the general case.
-
On the other hand, the choice of where to construct the SQL code is to a large extent a matter of preference. None of them is intrinsically better than the other. Many people use T‑SQL procedures, and I will show you two implementations of search_orders using dynamic SQL in T‑SQL, one with a parameterised query, and one with inlined parameter values. It may seem natural to use T‑SQL to build a T‑SQL query, but the process of building a query is a matter of scalar logic and string manipulation for which traditional programming languages are better tools, and I will show implementations of search_orders as a CLR stored procedure, one in C# and one in VB .NET.
-
However, once you have made the realisation that it's better to use a traditional language to build the query string, you might ask yourself why it should be a stored procedure at all, why not do it client-side altogether? You would not be wrong in asking that question. Implementing your dynamic search entirely in client code is a perfectly legit choice as long as it fits in with the general development pattern for your application. That is, if the rule for the application is that all data access should be in stored procedures, you should stick to that pattern.
-
That said, you may encounter very complex requirements for your dynamic search. Not only should users be able to select search and sort criterias, but they should also be able to select the exact set of columns to return, they should be able to aggregate the data and freely choose aggregate function (e.g. AVG, SUM) and what columns to group by. For something as ultra-dynamic like this, there is really only one reasonable choice: build the dynamic query client-side and use the full powers of object-oriented programming. If you were to do this in a stored procedure, you would need umpteen parameters to describe the conditions, and only defining the interface would take a week – and it would still be a kludge. Because that is the straight-jacket of a stored procedure, be that T‑SQL or a CLR procedure, the parameter list.
-
You may think that you could do a hybrid, and build some parts of the query client-side and send for instance the WHERE clause as a parameter to a stored procedure. But this is the one thing you should never do. Either you build the query entirely client-side, or you build it in entirely in a stored procedure. If you mix, you create a strongly coupled dependency between client and stored procedure. In all software systems, you want components to be as loosely coupled as possible. Say that the DBA makes some changes to the data model: columns are renamed or moved to different tables. If you have a stored procedure accepts values for various search conditions, you only have to change the procedure; the client can remain affected and unaware of the change. But if you start to pass WHERE clauses, column lists and whatnots, you will have to change the client as well, and you have gained little with your stored procedure. In that case it's better to have it all in the client, fully aware of that the client code has be modified if the data model is changed.
-
I will not show any client-side examples of our order search in this article, since such an implementation should probably have an object-oriented interface with methods and properties quite different from the parameter interface of search_orders. Nevertheless, in the examples that follow, there are many points that are applicable also when you work client-side.
-
Permissions
-
With stored procedures using static SQL, you don't have to bother about permissions. As long as the procedure and the tables have the same owner, it is sufficient for the users to have rights to run the stored procedure because of a feature known as ownership chaining. But ownership chaining never applies to dynamic SQL. Even if you build the query string inside a stored procedure, the string is never part of the procedure itself, but constitutes its own owner-less scope.
-
If you build the query string client-side or in a CLR stored procedure, you will have no choice but to grant the users SELECT permissions on the tables and the views that appear in the query. This also includes as any list-to-table functions you may use.
-
Depending on your application, and how it is set up, granting SELECT permissions may be entirely uncontroversial or absolutely impermissible. Thankfully, in the case you build the query string in a T‑SQL procedure, there are two alternatives to arrange for the permissions:
-
-
Create a certificate and sign the procedure with this certificate. Create a user from the certificate, and grant this user the required SELECT permissions.
-
Add the clause EXECUTE AS 'someuser' to the procedure. This should be a user created WITHOUT LOGIN and which has been granted the required SELECT permissions.
-
-
I will not go into further details on these techniques here. Rather I refer you to my article Granting Permissions through Stored Procedures, where I discuss these techniques in detail.
-
Before you get any funny ideas, permit me to beat the dead horse of the hybrid solution a little more. You may think this sounds excellent, you could build the WHERE clause client-side and send it to a stored procedure which handles permissions problem for you. But this is again an awfully bad idea. You expose a stored procedure that accepts a WHERE clause. How do you in the stored procedure verify that this WHERE clause does not violate any security rules about what the user should see or not?
-
Implementing search_orders with a Parameterised Query
-
-
After these proceedings, it's time to look at search_orders_1 which is a T‑SQL procedure that builds a parameterised SQL statement. Because of its length, I have numbered the rows in the right margin:
On line 18, I declare the variable @sql which will hold my query string. The type should always be nvarchar(MAX). It should be MAX, so that you can fit any query in the variable. As for why it needs to be nvarchar, I will return to that. I'm ignoring the variable @paramlist for now. On line 20, I define the variable @nl which I set to the standard line-ending in Windows, CR-LF. While technically a variable, @nl is a constant in this procedure.
-
On lines 22-32, I compose the nucleus of the dynamic SQL query. That is, the query we will get when all input parameters are left out. Observe that I use two-part notation for the tables. You should always do this when you work with dynamic SQL for performance reasons. Exactly why, I will return to when I discuss caching and performance.
-
The condition WHERE 1 = 1 on line 32 is there so that all other conditions can be added as "AND something". I add @nl to the string, for reasons that will prevail.
-
-
On lines 34-72, I check all the single-valued search parameters. If a parameter is non-NULL, I add a condition for the corresponding column to the
-SQL string. I use the += operator which is a shortcut for @sql = @sql +. Note that if I want to include a quote in the query string, I need to double it, see for instance line 71. Again, I concatenate @nl after all conditions.
-
On lines 73-75, I handle the @employeestr parameter in the same manner as I did in search_orders_3. That is, I use the function intlist_to_tbl to crack the list into table format. You may have other ideas, but this is the way should do it as a first choice. As for alternatives, I will return to that later. Observe that just like the tables, I need to refer to the function with two-part notation.
-
On lines 77-79, I handle the parameter @employeetbl, and this is perfectly straightforward. The only deviation is that I use EXISTS to see whether this parameter was specified rather than checking for NULL.
-
Finally, on line 80 I add the ORDER BY clause.
-
You may note that for parameters that match columns that appear in multiple tables (@orderid, @custid, @prodid), I add conditions against both tables. This something I learnt very early in my SQL Server career that you should do to help the optimizer. It mattered more in those days when SQL Server did not have foreign-key constraints. Today, with proper foreign-key constraints (and which have not been applied with NOCHECK), the optimizer can move around the condition even if you apply it on the "wrong" table. But I added it nevertheless, and it's not a bad habit, as you may have some denormalised database design with redundant columns without a foreign-key relation between them. Nevertheless, I did not do this in the procedures with static SQL. I felt that in those procedures, the extra conditions add extra noise, but this is a less of an issue in code that builds a query string.
-
The Debug PRINT
-
On line 82-83, I do something very important: if the parameter @debug is 1, I print the SQL string. This is one more of these things that cannot be enough emphasised: always include a parameter that permits you to print the SQL string. One of the distinct disadvantages with dynamic SQL is that you can happen to concatenate the strings incorrectly leading to syntax errors, maybe only with some combination of input parameters. Finding this error by looking at the code that generates the dynamic SQL is hard, but once you see the SQL string, the error may be immediately apparent. For instance, a typical
-error is a missing space, leading to code that reads:
-
-
WHERE 1 = 1 AND o.OrderDate <= @todateAND p.ProductName LIKE @xprodname
-
If you look closely in the procedure code, I have already take precautions to avoid such goofs by having a leading space in most string literals, and also by adding the @nl parameter to each condition. However, that is not the main purpose of @nl. The reason I add @nl is to avoid that the query string becomes one single long line which is very difficult to read when I have to look at it. Thus, not only should you keep the code that generates the SQL string tidy, you should also produce an SQL string that is reasonably tidy.
-
If the query string is very long, it may be appear to be truncated in SQL Server Management Studio because it only prints the first 4000 characters. A workaround is to do:
-
IF @debug = 1
- SELECT @sql FOR XML PATH(''), TYPE
-
By the default, SSMS displays the first 2 MB of a returned XML document, which hopefully should be sufficient. You will have to accept that characters that are special to XML, like < are replaced by sequences such as <.
-
Running the Query
-
On lines 84 to 97, I set up the parameter list, and on lines 99 to 102 I execute the query using sp_executesql. It is extremely important to understand this system procedure. This is the vehicle to run parameterised queries.
-
sp_executesql is a system procedure that takes two fixed parameters. The first parameter is a batch of SQL statements and the second parameter is a parameter list. These parameters must be of the type nvarchar; you cannot pass varchar. (And thus I have declared the parameters @sql and @paramlist accordingly.) The remaining parameters are the actual parameters passed to the parameters in the parameter list. They must match the data types in the parameter list in the same way as when you call a regular stored procedure. That is, implicit conversion applies.
-
The system procedure executes the batch using the parameters values you pass it. If this sounds a little abstract, you can think of sp_executesql this way:
That is, you create a nameless stored procedure and execute it in one go.
-
In search_orders_1, the parameter names in the query string are the same as in the surrounding parameters in the stored procedure. But don't be lured. They are physically separate and I could have used completely different names and the procedure would still have worked. The key is that the dynamic SQL cannot see any variables in the calling procedure; the dynamic SQL is a procedure of its own.
-
You may note that the parameter list in @paramlist is static. That is, the set of parameters is always the same, despite that some of them may not appear in the actual query string. While it would be possible to extend the parameter list as new non-NULL search parameters are encountered, that would only be unnecessarily complicated. There is no law in T‑SQL against having unused parameters.
If you try these and inspect the query plans, you will see that
- the available indexes on the search columns are used with two exceptions: The index on Orders.EmployeeID is ignored, and on SQL 2008 and 2012, the index on Customers.City is not used. However, SQL 2014 uses this index. If you compare with the plans for search_orders_3, you will see that these are identical, except for the search on @custid alone.
-
I also encourage you to run the procedures with @debug = 1 to see the generated SQL.
-
Compilation and Caching
-
You have learnt that sp_executesql defines a nameless stored procedure and executes it directly. You may ask if this procedure is saved in the database. No, it is not. But, and this is the key, the query plan is saved in the cache. So the next time a user runs your search procedure with exactly the same set of search parameters, SQL Server will reuse the existing plan for that query.
-
That is, when you use static SQL, and there are these three calls.
And this will be a new compilation and a new cache entry. The existing plan for the search on OrderID alone is unaffected.
-
There is one qualification to make here, and it is one we have already touched: the table names must be specified in two-part notation, that is, with schema and table. If the query has FROM Orders without schema, SQL Server needs to consider the possibility that there may be an Orders table in the default schema of the user. And even if there isn't one right now, it might appear later. Therefore, SQL Server needs to have different cache entries for users with different default schemas. Now, normally users have dbo as their default schema, in which case this is a non-issue, but this is nothing you should rely on.
-
Special Search Conditions
-
For static SQL, we looked at how to implement some special search conditions. Let's review these for dynamic SQL as well.
-
Columns with Filtered Indexes
-
This was nothing I brought up with static SQL, because this is a non-issue with OPTION (RECOMPILE). But with cached plans, you need to be aware of this. Say that there is a Status column in the Orders table for which there are four possible values: N – New order, P – In process, E – Error, C – Processing completed. 99 % of the rows have the value C, and there is a filtered index on the Status column:
-
CREATE INDEX status_ix ON Orders(Status) WHERE Status <> 'C'
-
Say now that the search has a parameter @status where the user can search for orders with a specific status. If you simply mimic the code above, and do:
-
IF @status IS NOT NULL
- SELECT @sql += ' AND o.Status = @status'
-
SQL Server will not use the filtered index, no matter what value the user passes, because it has a produce a plan that works with all parameter values, including @status = 'C'. You need to add some logic to add an extra condition so that the the filtered index can be used:
-
IF @status IS NOT NULL
- SELECT @sql += ' AND o.Status = @status' +
- CASE WHEN @status <> 'C'
- THEN ' AND o.Status <> ''C'''
- ELSE ''
- END
-
Here I assumed for simplicity that @status is a single-valued parameter, but it seems likely that in a real-world application @status would be multi-valued; that is, the user is able to select a number of status values he is interested in. You would need to do the same checks and add extra conditions in the case the user's choice falls entirely within the filtered index (and you want it to be used).
-
Choice of Sort Order
-
It may seem that this could be done as simple as:
-
@sql += ' ORDER BY ' + @sortcol
-
This could easily handle multiple sort columns. That is, the client could pass a value like 'CustomerID, OrderID DESC'. This breaks the principle that the client should know nothing about the query. However, it is a little difficult to argue this point very strongly here. The syntax of the string is not very difficult. (And the assumption is that the application builds the string from users choices in a UI; the user does not write the call himself.) At first glance, some readers may think that the string above will result in an error with ambiguous column names. But since ORDER BY is evaluated after SELECT in an SQL query, you can use the column names defined in the SELECT list in the ORDER BY clause, and thus CustomerID and OrderID without prefix are legit here. Another argument against the client forming part of the query is that the data model may change. But these are columns in the result set which the client needs to have knowledge of anyway to be able bind them to columns in an output grid or similar. That is, if the DBA would decide that OrderID should now be order_id, you would have to change the query to read:
-
SELECT o.order_id AS OrderID, ...
-
to avoid breaking the client.
-
There is however the issue of SQL injection. Maybe it is a web application. Maybe the sort parameters are passed in a URL. Maybe the web application connects as sa. (Bad! Bad! Bad!). And then some user out on the evil Internet passes '1 SHUTDOWN WITH NOWAIT'. That is, this use of @sortcol opens for SQL injection. You can easily prevent this with quotename():
-
@sql += ' ORDER BY ' + quotename(@sortcol)
-
quotename adds brackets around the value, doubling any right brackets there may be in it, so that you still have a legal quoted identifier. But now you can no longer easily accept multi-column sort conditions or ASC/DESC in a single parameter. You would have to parse @sortcol to put in quotename where it's needed. Which is not trivial at all.
-
So, after all, I think it is much better to use CASE to map the input value to a sort column:
-
SELECT @sql += ' ORDER BY ' +
- CASE @sortcol WHEN 'OrderID' THEN 'o.OrderID'
- WHEN 'EmplyoeeID' THEN 'o.EmployeeID'
- WHEN 'ProductID' THEN 'od.ProductID'
- WHEN 'CustomerName' THEN 'c.CompanyName'
- WHEN 'ProductName' THEN 'p.ProductName'
- ELSE 'o.OrderID'
- END + CASE @isdesc WHEN 0 THEN ' ASC' ELSE ' DESC' END
-
This is reminiscent of how we did in search_orders_3, but it is still a lot simpler, since we don't need to have different CASE expressions for different data types, but we can use a single one. And it is also easy to handle a parameter to control ASC/DESC. If you want multiple sort columns, you will need to repeat the above, but it grows linearly and does not explode like it does for static SQL.
-
Observe that in the CASE for @sortcol I have an ELSE with a default sort order. Without the ELSE, the entire query string would become NULL if the application passes an unexpected value in @sortcol.
-
Optional Tables
-
The example with the @suppl_country parameter is of course trivial to handle with dynamic SQL:
-
IF @suppl_country IS NULL
- SELECT @sql += ' AND EXISTS (SELECT *
- FROM Suppliers s
- WHERE s.SupplierID = p.SupplierID
- AND s.Country = @suppl_country)'
-
It is just another condition to add.
-
Alternate Tables
-
This is also something which is quite simple to handle with dynamic SQL. Say that we have this parameter @ishistoric. In this case, lines 27-28 in search_orders_1 would read:
-
FROM dbo.' + CASE @ishistoric
- WHEN 0 THEN 'Orders'
- WHEN 1 THEN 'HistoricOrders'
- END + ' o
-JOIN dbo.' + CASE @ishistoric
- WHEN 0 THEN '[Order Details]'
- WHEN 1 THEN 'HistoricOrderDetails'
- END + ' od
-
You may get the idea that you should pass the table name from the application, but while it is almost acceptable for the sort column, it is entirely impermissible for the table names. The DBA should be free to rename a table without affecting an application that only uses stored procedures. And what if the application passes table name with schema and you wrap the full name in quotename()?
-
No, always map the application input to a table name through CASE.
-
Using the CLR
-
Let's now look at how implement search_orders in a CLR stored procedure. I've written two CLR procedures,
- search_orders_vb
- and search_orders_cs,
- that I will discuss in this section. As the code is fairly repetitive, I'm not including any of
-them in full here, but I only highlight some important points. (These points are also generally applicable for the data-access part of a client-side only implementation.)
-
Be aware that I will not go into any details on writing CLR stored procedures as such. If you have never
- worked with the CLR before, but are curious, I refer you to Books Online. At
- the end of this section there are instructions on how to create these two
-procedures in SQL Server.
-
The Parameter List
-
There is one deviation in the parameter list: the parameter @employeetbl is not there, since you cannot pass table-valued parameters to a CLR stored procedure. Thus, for CLR stored procedures, you will need to pass multi-valued parameters as a comma-separated string (or some other format like XML).
-
Setting up the Statement
-
This is how search_orders_cs starts off:
-
string Query;
-SqlCommand Command = new SqlCommand();
-
-Query = @"SELECT o.OrderID, o.OrderDate, od.UnitPrice, od.Quantity,
- c.CustomerID, c.CompanyName, c.Address, c.City,
- c.Region, c.PostalCode, c.Country, c.Phone,
- p.ProductID, p.ProductName, p.UnitsInStock,
- p.UnitsOnOrder
- FROM dbo.Orders o
- JOIN dbo.[Order Details] od ON o.OrderID = od.OrderID
- JOIN dbo.Customers c ON o.CustomerID = c.CustomerID
- JOIN dbo.Products p ON p.ProductID = od.ProductID
- WHERE 1 = 1 ";
-
As you can see this is very similar to search_orders_1, including the dbo prefix. The rule that you should use two-part notation to maximise
- query-plan reuse applies to CLR procedures as well.
-
Defining the Parameters
-
So this should be plain vanilla for anyone who has written the teeniest piece of data-access code with ADO .NET. Except that I have seen so many examples on forums where people inline the parameter values into the query string. And it is equally impermissible no matter you build the query in T‑SQL or some other language. Your queries should always be parameterised. (Except for the very few cases inlining may be needed for performance.)
-
This is however not the place to give a full coverage of the SqlParameter class in .NET. If you have never heard of this class before (and you call yourself a .NET programmer), you will have to look at the examples and then study the class further in MSDN Library.
-
Here is how the @custid
- parameter is added in search_orders_cs:
-
if (! Custid.IsNull) {
- Query += " AND o.CustomerID = @custid" +
- " AND c.CustomerID = @custid";
- Command.Parameters.Add("@custid", SqlDbType.NChar, 5);
- Command.Parameters["@custid"].Value = Custid;
-}
-
As in the T‑SQL example, the query string is extended
- with the conditions for the
- parameter in both Orders and Customers.
-
What is different from T‑SQL is how we define the parameter list and supply
- the value. In T‑SQL the parameter list is a string, which includes all
- possible parameters. When working with the CLR, we only define the parameters
- that actually are in use. The reason for this difference is entirely a matter of convenience. We define a parameter by adding it to the Parameters
- collection of the Command object. The Add method has a number of overloads, but I prefer to use the ones that takes the parameter name and a type indicator from the SqlDbType enumeration. For parameters of the variable-length data types – char, varchar,
- nchar, nvarchar, binary and varbinary – I use an overload where I can also specify the length of the parameter. There is no means to pass precision or scale – used with the data types decimal, numeric, time, datetime2 and datetimeoffset – in the Add method, but the SqlParameter class has Precision and Scale properties which permits you to set these values after you have created the parameter.
-
Once the parameter is defined, I assign the value separately, although you could do all on a single line if you feel like:
If Not Custid.IsNull Then
- Query &= " AND o.CustomerID = @custid" & _
- " AND c.CustomerID = @custid" & VbCrLf
- Command.Parameters.Add("@custid", SqlDbType.NChar, 5)
- Command.Parameters("@custid").Value = Custid
-End If
-
It's very similar to the C# example. Different operator for string
- concatenation, parentheses to address elements in the collection and no
- semicolons.
-
Don't Forget to Specify the Length!
-
There is one thing about the parameter definition, I like to highlight:
I explicitly specify the length of the string parameter. ADO .NET permits you leave out the length when you add the parameter. ADO .NET also supplies the method AddWithValue that permits you to define a parameter and
-provide the value in a single call whereupon ADO .NET guesses the data type. Do not fall into the trap of using these shortcuts! The reason these alternatives are bad is that when ADO .NET constructs the call to sp_executesql for you, it will use the length
-of the actual parameter value when it builds the parameter list. Thus, if one user enters Alfred, the parameter will be declared as:
-
@custname nvarchar(6)
-
But if another user enters Berglund, the parameter will be declared as
-
@custname nvarchar(8)
-
When SQL Server looks up a query in the cache, it hashes the query text and the parameter list and performs a lookup on that hash value. That is, differences in the parameter list will result in different cache
-entries and more compilations. Note here the difference to OPTION (RECOMPILE). With the latter you get compilation every time, but the plans don't take up space in the cache. This happens here leading to cache bloat, which under extreme circumstances can lead to degraded
-overall performance on the SQL Server instance.
-
If you feel that you don't want to hardcode the length of the column in case it could change in the future, rather than leaving out the length, use the maximum length for the type, that is 8000 for char, varchar, binary and varbinary and 4000 for nchar and nvarchar.
-
Handling the Multi-Valued Parameter
-
I will have to admit that I was lazy and used the list-to-table function:
-
if (! Employeestr.IsNull) {
- Query += " AND o.EmployeeID IN" +
- " (SELECT number FROM intlist_to_tbl(@employeestr))";
- Command.Parameters.Add("@employeestr", SqlDbType.NVarChar, -1);
- Command.Parameters["@employeestr"].Value = Employeestr;
- }
-
While this works, the optimizer has no information of how many elements the list will return and it will guess 1. It would be a little prettier to use the CSV_splitter class that I present in my article Arrays and Lists in SQL Server 2008 to pass the value to a table-valued parameter but I leave that as an exercise to the reader. That would permit SQL Server to have knowledge of the number of elements when it builds the plan. As long as the lists are typically short, this is not likely to be any major issue.
This is very much is the standard way to run a query from a CLR procedure. You connect on the context connection, that is, the same connection you are already running on. SqlContext.Pipe.ExecuteAndSend runs the command and returns the result set to the client. SqlContext.Pipe.Send is how you do PRINT from a CLR procedure.
-
Loading the Examples
-
If you have any flavour of Visual Studio 2005 or later (including the Express
- editions), you can deploy search_orders_cs and search_orders_vb
- from Visual Studio. (But please don't ask me how to do it, Visual Studio
- just leaves me in a maze.)
-
Since the .NET Framework comes with Windows and includes compilers
- for the most
- common .NET languages, you can also load them without Visual Studio. First
- make sure that C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 (or
- corresponding) is in your path. Then run from a command-line window:
To load the DLLs into SQL Server, you can use
- load_clr_sp.sql.
- You will have to change the path in the CREATE ASSEMBLY command to where you placed the
- DLL. Note that the paths are as seen from SQL Server, so if you don't have SQL
- Server on your local machine, you will have to copy the
- DLLs to the SQL
- Server box, or specify a UNC path to your machine.
The query plans should be identical to search_orders_1, as the queries are the same. Hint: if you want to look at the query plans, you need to use Profiler,
- and get the Showplan XML event. For some reason, you don't see query
- plans for queries submitted from CLR code in Management Studio.
-
An Example with Unparameterised SQL
-
-
We will now turn to an example that does the forbidden: it inlines all parameters and does not use parameterised SQL. One reason I show you this is example is pure deterrence: to make you see how much more difficult this is than parameterised SQL. But there are also situations when inlining an occasional parameter may be a good idea to resolve a performance problem. Thus, it may be good to know the technique if you need to do this, but I like to stress that this is not a step that you should take lightly.
-
The name of the procedure for this is example is search_orders_2. I don't include the procedure in full here, but only comment on certain parts.
-
General Notes
-
-When building a non-parameterised query with the values inlined, you need to
-be very disciplined when you write your code. It's very easy to get lost in a maze of
-nested quotes. I often see people in SQL forms posting code like:
-
EXEC('SELECT col1, col2, ...
- FROM ...
- WHERE ' + CASE @par1 IS NULL THEN ' + col = ''' + @par + ''' + ...)
-
-This is difficult to read and maintain, and if it goes wrong, you have no idea
-what SQL you are actually generating. search_orders_2 aggregates the SQL
-code into a variable, and there is a @debug parameter so I can see the
-generate SQL code if needed. And to make the debug output easier to read I use the variable @nl like I did in search_orders_1.
-
To run the code I use EXEC(), but it works equally well with sp_executesql without any parameter list. Again, keep in mind that the dynamic SQL is a separate scope and cannot refer to variables in the surrounding procedure.
-
Handling String Values
-
To understand the problem, we will start with looking at a parameter in search_orders_2 which is unique to this procedure: @city_bad, which is bad implementation of the @city parameter that reflects what the naïve and inexperienced user may try:
While there are orders from customers in both Łódź (a Polish city) and Luleå (in Sweden), at least one of the procedure calls will come back empty-handed, exactly which depends on your collation. String literals preceded by N are nvarchar, and those without are varchar and can only hold characters for the code page of the collation and other characters are replaced by fallback characters. You can see this by running this SELECT:
-
SELECT 'Łódź', 'Luleå'
-
Again, exactly what you see depends on your collation, but you may see Lódz, Lodz, Lulea, or even have question marks in some places.
-
That is, however, the small problem. Assume instead that we want to search for customers in the capital of Chad, N'Djamena:
-
EXEC search_orders_2 @city_bad = N'N''Djamena'
-
This ends with syntax errors:
-
-
Msg 102, Level 15, State 1, Line 11
-
Incorrect syntax near 'Djamena'.
-
Msg 105, Level 15, State 1, Line 11
-
Unclosed quotation mark after the character string ' ORDER BY o.OrderID'.
-
-
Not what you call a good user experience. And there is also, as I said a few times, the issue of SQL injection. Try this:
-
EXEC search_orders_2 @city_bad = '''SHUTDOWN --'
-
As it happens this will not shut down you server, but you will get the informational message
-The SHUTDOWN statement cannot be executed within a transaction or by a stored procedure. But the important point is: you were able to inject SQL code where there should have been a city name.
-
Let us now look at the proper way to inline a string parameter. We have already mentioned the function quotename(), but it is time to give it a closer look. This built-in function delimits a string with the delimiter(s) you specify, and, this is the important part: if the string includes the closing delimiter, this character is doubled. The default delimiter is [], and the main purpose of quotename is to quote identifiers when you generate queries from metadata, but you can use other delimiters as seen in these examples:
And using the second of these examples, we can now see how the @city parameter should be implemented:
-
IF @city IS NOT NULL
- SELECT @sql += ' AND c.City = N' + quotename(@city, '''') + @nl
-
Here I have added the N to mark a Unicode literal and there is also @nl to make the debug output prettier. And I use quotename with single quote(') as the delimiter. If you try these searches:
You will find that the first two return lots of rows. The last does not return any rows – but nor does it attempt to shut down your SQL Server instance. (Credit for the idea of using quotename() this way goes my MVP colleague Steve Kass.)
-
You should always use quotename when you inline string parameters in your dynamic searches. There is a caveat, though: quotename is designed for quoting object names, and the input parameter is nvarchar(128). If the input value is longer, you get NULL back. However, I find it extremely unlikely that you can find a good case where it makes sense to inline a string parameter that long. (For a dynamic search, I should hasten to add. There are other situations you may need it, and in such case you can use my function
-quotestring() from my Curse and Blessings article.)
-
No, we have not said all there is to say about inlining string parameters yet. Let's return to that N. You should include that N only when the type of the parameter is nvarchar or nchar. It should not be there if you are comparing the value with a varchar or char column. Because of the rules for data-type precedence in SQL Server, the (var)char column will be implicitly converted to n(var)char and this affects how any index on the column can be used. If the column has a Windows collation, the index can still be used but in a slower way. If the column has an SQL collation, the index is of no use at all, why that N can cause serious performance problems when applied incorrectly.
-
So as you see, inlining string parameters is anything but easy.
-
Datetime Parameters
-
Compared to string values, date/time values are easier to deal with, but only in a relative way. People often go wrong with these as well. In search_orders_2, I handle the @fromdate parameter this way:
-
SELECT @fromdatestr = convert(char(23), @fromdate, 126)
-...
-IF @fromdate IS NOT NULL
- SELECT @sql += ' AND o.OrderDate >= ' + quotename(@fromdatestr, '''') + @nl
-
-
The whole key is the format code 126. The results in a string like this one 2003-04-06T21:14:26.627. This is the format mandated by the standard ISO 8601, and it is commonly used in XML. More
-importantly, it is one of the three formats for datetime literals in SQL Server of
-which the interpretation does not depend on the settings for date format and
-language. If you don't understand what I'm talking about, try these statements:
-
SET DATEFORMAT mdy
-SELECT convert(datetime, '02/07/09')
-SET DATEFORMAT dmy
-SELECT convert(datetime, '02/07/09')
-go
-SELECT convert(datetime, '2002-12-19') -- Fails!
-go
-SET LANGUAGE Swedish
-SELECT convert(datetime, 'Oct 12 2003') -- Fails! (It's "Okt" in Swedish.)
-
If you always use code 126 to produce a datetime string for your dynamic SQL, you don't have to worry about this. (When it comes to the newer date/time data types, there are a few more safe formats, but there is still a lot of datetime out there, so stick with code 126.) As for using an extra variable, this is mainly a matter keeping the code that produces the dynamic SQL clean.
-
Numeric Parameters
-
Numeric values are the easiest to inline, as you simply can apply convert:
-
IF @orderid IS NOT NULL
- SELECT @sql += ' AND o.OrderID = ' + convert(varchar(10), @orderid) +
- ' AND od.OrderID = ' + convert(varchar(10), @orderid) + @nl
-
Although, you have to be careful to make the string long enough to fit all possible values.
-
For some numeric parameters in the procedure, I use an intermediate string variable:
-
SELECT @minpricestr = convert(varchar(25), @minprice)
-...
-IF @minprice IS NOT NULL
- SELECT @sql += ' AND od.UnitPrice >= ' + @minpricestr + @nl
-
-
This is purely a matter of aesthetics.
-
If you get the idea to inline float or real values, you will need to be more careful, since with a casual use of convert you can lose precision. But it's a little difficult to see a case where you would need to do this in the first place.
-
Multi-valued Parameters
-
Let's now look at how the parameters @employeestr and @employeetbl should be handled. @employeestr is supposed to be a comma-separated string, so it sounds dirt simple:
-
IF @employeestr IS NOT NULL
- SELECT @sql += ' AND o.EmployeeID IN (' + @employeestr + ')' + @nl
-
But this would be bad mistake, as this would open the code for SQL injection. And while it is kind of difficult to make a serious intrusion in the 15-character long @city_bad, the data type of @employeestr is varchar(MAX), so there is all the space in the world for an intruder. But I pass my comma-separated list from SSRS, how could there be SQL injection? Answer: when you write your stored procedure, you should assume the worst. That is, a web application that runs as sa and sends data from a URL right into your parameter. Don't laugh, it happens. When you write your stored procedure, you should make your procedure bullet-proof and make no assumptions.
-
So here is how I handle the @employeestr parameter:
-
IF @employeestr IS NOT NULL
-BEGIN
- SELECT @employeestr =
- (SELECT ltrim(str(number)) + ','
- FROM intlist_to_tbl(@employeestr)
- FOR XML PATH(''))
-END
-
-SELECT @employeestr = substring(@employeestr, 1, len(@employeestr) - 1)
-...
-IF @employeestr IS NOT NULL
- SELECT @sql += ' AND o.EmployeeID IN (' + @employeestr + ')' + @nl
-
That is, I unpack the string into table format with that list-to-table function. Then I produce a new comma-separated list using the FOR XML PATH syntax. The intended purpose of FOR XML PATH is to generate an XML document, but Microsoft designed it so that if you don't give any element name (that's what the empty string after PATH means), you get a concatenated list of the values from a single-column query. This results in a list with a trailing comma, and I delete this comma in the subsequent SELECT. And then I use my local variable that I can fully trust with IN as in the original example. If @employeestr does not contain the comma-separated list as expected, it is likely that this will result in a conversion error inside intlist_to_tbl. Not very pretty, but it keeps the illegitimate input out.
-
The same solution is used for the parameter @employeetbl (which is not directly accessible from the SQL string):
-
IF EXISTS (SELECT * FROM @employeetbl)
-BEGIN
- SELECT @employeestr =
- (SELECT ltrim(str(val)) + ','
- FROM @employeetbl
- FOR XML PATH(''))
-END
-
Effects on Caching
-
I said previously that an advantage of using dynamic SQL over static SQL with OPTION (RECOMPILE) is that it reduces the amount of compilation, since the plan is cached. But this applies to parameterised SQL only. These two calls:
Generates two query plans and two compilations. This is because when SQL Server caches the plan for a query string it hashes the string, exactly as it stands, so the smallest difference produces a different hash value, why the plan for o.OrderID = 11000 cannot be reused when the query instead reads o.OrderID = 21000. The only time a plan can be reused is when someone makes a search on exactly the same parameter values.
-
That is, if you inline all parameters, the behaviour is quite similar to static SQL with OPTION (RECOMPILE). Except that you also litter the cache with all those plans that are rarely reused. That's a serious waste of memory. Although, this is a statement that requires some qualification, because there are some settings that changes this behaviour.
-
-
If the server-level configuration parameter optimize for ad hoc workloads is 1, SQL Server does not cache the plan on the first execution, but it only caches a so-called shell query so that it knows that it has seen the query. Only if the exact string reappears, the plan is cached. This configuration parameter, that was introduced in SQL 2008, is 0 by default, but the general recommendation is to set it to 1.
-
If the query string is very simple, SQL Server may replace a constant with a parameter holder, and thereby create a parameterised query by itself. It is not very likely that you would encounter this with a dynamic search of any complexity.
-
There is a database setting, forced parameterization. With this setting in force, SQL Server replaces all constants in a query string with parameter holders. With this setting, search_orders_2 will use the cache exactly like search_orders_1. The reason this setting exists is exactly to save the performance of poorly written applications that inline all parameter values.
-
-
Conclusion
-
I have now shown you a bad example, search_orders_2, which inlines all parameters and I hope you have gathered why this is a really poor choice as a general solution. But as we shall see in the next section, there are situations where may need to do this for a specific parameter.
-
When Caching Is Not What You Want
-
An advantage with parameterised dynamic SQL is that you get less compilation because plans can be reused. But caching is not always to your advantage. Earlier on in the article, we had this pair:
The choice of parameters is the same, but the profile is very different. ERNTC is the most active customer in Northgale with 591 orders in total, but the date interval is only one day. BOLSR, on the other hand, has only placed a single order, but the interval is the full year. There are indexes on both CustomerID and OrderDate. For the first call, the index on OrderDate looks like the best bet, whereas the index on CustomerID sounds more appealing for the second call. And, indeed, if you look at the query plans, this is what we get. (Sort of; the call for ERNTC uses both indexes and joins these.)
-
But what happens if we use search_orders_1 instead?
The plan is the same for both. When I tested, there was a yellow triangle on a hash match operator in the execution for BOLSR, indicating that the hash table spilled to disk (which certainly is not good for performance).
-
In the following, I will discuss some tactics you can use when you work a search that uses dynamic SQL and where the choice of plans is sensitive to the actual values.
-
OPTION (RECOMPILE)
-
For this particular case, OPTION (RECOMPILE) could be a simple way out. If the search has both @custid, @fromdate, and @todate, add OPTION (RECOMPILE):
-
IF @custid IS NOT NULL AND (@fromdate IS NOT NULL OR @todate IS NOT NULL)
- SELECT @sql += ' OPTION(RECOMPILE)' + @nl
-
More generally, when you identify that you have search parameters that both relate to indexed columns, and where the selectivity is very dependent on the actual parameter values, add OPTION (RECOMPILE), so that you always get the best plan you can get from the statistics.
-
Obviously, this strategy will add quite a few unnecessary compilations.
-
Changing the Query Text
-
As I discussed previously, SQL Server looks up queries in the cache by
- hashing the query text. This means that two queries with different text are
- different entries in the cache, even if they are logically equivalent. There
- are many ways to alter the query text, for instance you could do something
- like:
-
IF @fromdate IS NOT NULL AND @todate IS NOT NULL
-BEGIN
- SELECT @sql += CASE WHEN @fromdate = @todate
- THEN ''
- WHEN datediff(DAY, @fromdate, @todate) <= 7
- THEN ' AND 2 = 2 '
- WHEN datediff(DAY, @fromdate, @todate) <= 30
- THEN ' AND 3 = 3 '
- ...
-
The advantage with changing the query text depending on the parameter values over OPTION (RECOMPILE) is that you will not get as many compilations. But it also means that in some cases you
- will not run with the best plan, since predicting the exact breakpoint between different plans is hard. With some luck the damage is limited. Even if the plan for a single day is not the best for
- the span of a week,
- it may still yield acceptable performance. But you will have to know your data, and
- possibly tune as time goes.
-
Could this technique also be used to deal with the fact that different
- customers have a very different number of orders? Probably not. Counting
- the number of orders for a customer before we construct the query is taking
- it too far in my opinion, and it could be more expensive than what you save in
- the other end. If you really wanted to do this, you would probably have to maintain a separate table with order counts per customer. You would not have to maintain this table in real-time, but it would be sufficient to update it nightly or weekly.
-
Inlining Some Values
-
Sometimes you can resolve this sort of problems by inlining a specific parameter into the query. Typically, this would be a parameter with a very skewed distribution. Say that the search includes a @status parameter, and
- there are only four possible values for Orders.Status, whereof
- Completed accounts for 95 % of the values. A typical search may be for new orders,
-less than 1 % of the rows. This is a situation where it could make sense to inline the @status parameter. The four different values are really different searches.
-
You may recognize the situation from when I discussed filtered indexes where I presented a somewhat different approach. I think both approaches are valid. The solution I presented for filtered indexes, assumes that you know that there is a filtered index and that you also have some understanding of the distribution of the values. But maybe you don't know what the distribution between the small of handful of values will be in production, or what indexes a DBA may add in the future. By inlining you keep the doors open, and as long it is only a matter of small number of values, you will not produce that many extra plans.
-
What about the case where we had competing indexes like in the example with customer ID and a date interval? In this case, OPTION (RECOMPILE) works out better, since you avoid cache littering. Overall, inlining customer IDs on a general basis is likely to be a bad idea. But if you have five big-whiz customers that overtrump everything else, it may make sense to inline these customer IDs and parameterise the rest. The same applies to product IDs, if you have a very small number of huge-selling products and umpteen low-volume products. It's all about knowing your data.
-
Note: above I mentioned forced parameterisation. If your database is in this mode, inlining parameters is useless, since SQL Server will replace the constants with parameters anyway.
-
Index Hints and Other Hints
-
Sometimes index hints or query hints other than OPTION (RECOMPILE) can be useful. Returning to our example with ERNTC and BOLSR, we can make the observation that the index on CustomerID is always OK. It does not always give the best plan, but it does not give a really bad plan. Whereas, as I noted, the index on OrderDate resulted in hash spills for a long interval. So one strategy could be do:
-
FROM dbo.Orders o ' + CASE WHEN @custid IS NOT NULL AND
- (@fromdate IS NOT NULL OR
- @todate IS NOT NULL)
- THEN 'WITH (INDEX = CustomerID) '
- ELSE ''
- END
-
I cannot say that this is my favourite strategy. Overall, index hints is something you should use sparingly. Casually used, they can cause performance problems because you force the optimizer to use the completely wrong index.
-
A hint that makes a little more sense is the hint OPTIMIZE FOR. If you want plans to always be compiled with the big customers in mind, you could add
-
IF @custid IS NOT NULL
- @sql += ' OPTION (OPTIMIZE FOR (@custid = ''ERNTC''))'
-
Or if you want to discourage the optimizer from producing different plans depending on what it sniffs for the date parameters, you could add:
-
IF @fromdate IS NOT NULL AND @todate IS NOT NULL
- @sql += ' OPTION (OPTIMIZE FOR (@fromdate UNKNOWN, @todate UNKNOWN))'
-
The optimizer will now apply its standard assumption for a closed interval, which is 10 % or so, and typically too much to make the index interesting.
-
Conclusion
-
You have now learnt that there are two ways to implement dynamic search conditions: static SQL and dynamic SQL. Solutions with static SQL almost always use OPTION (RECOMPILE), except in a very simple cases where the optimizer's use of startup filters can be good enough. You have also seen that solutions with static SQL are easy to implement as long as the requirements are moderately complex. Once the requirements increase in complexity, the solutions with static SQL easily becomes unwieldy. A second disadvantage with solutions using OPTION (RECOMPILE) is that very frequent searches can incur an unwanted load on the system because of all the compilations.
-
More than half of the text in this article was taken up by the discussion on dynamic SQL. This is a good indication of the fact that dynamic SQL is more difficult to work with and requires more understanding from you as a programmer. But dynamic SQL has the advantage that when the requirements for what conditions to handle increase in diversity, the complexity of the code grows more linearly than with static SQL. Correctly used, dynamic SQL reduces the amount of resources needed for query compilation. A special issue with dynamic SQL that you must not forget is that you need to cater for permissions on the tables accessed by the dynamic SQL. Certificate signing is the best way to resolve this when direct SELECT permissions on the tables are not acceptable.
-
It is important to stress that you cannot only apply the methods in this article on auto-pilot. You need to make your own judgements. And moreover, you need to test your queries, both for logic and for performance. Since you may have a multitude of parameter combinations, it may not be feasible to test all combinations, but you should at least test all parameters in isolation, as well as combinations you expect to be common. With dynamic SQL, you should be careful to test all parameters in combination with some other parameter, because with dynamic SQL you can easily slip so that a certain combination results in a syntax error.
-
Finally, when testing for performance, you need a database of some size. The article was based on Northgale, and while larger than its source Northwind, it is still a very small database.
-
Feedback and Acknowledgements
-
All through the years of this article, and its predecessor, a lot of people have given valuable suggestions and input. My fellow SQL Server MVPs: Steve Kass, Marcello Poletti, Simon Sabin, Alejandro Mesa, Adam Machanic, and Umachandar
-Jaychandran. And all the rest of you: Mark Gordon, Phillipp
- Sumi, Thomas Joseph Olaes, Simon Hayes, Sloan Holliday, Travis Gan and Eric Garza .
- I would also like to give a special credit to Tony Rogerson, Steve Kass, Ivan Arjentinski and Graham Kent for their involvement
- with the bug with OPTION (RECOMPILE) in SQL 2008 RTM. My big thanks to all of you.
-
If you have questions or comments on the contents in the article, feel free
- to mail me at esquel@sommarskog.se. (And that most emphatically includes any spelling or grammar error that you spot!) If you are working with a specific problem and need help, you can mail me
- too. However, I would encourage you in such case to post your question on a
- public forum for SQL Server, as there are more people who can answer your
- questions. (And you may get your answer more rapidly!)
-
Revision History
-
-
2015-11-15
-
Corrected a couple of small errors in code fragments. In search_orders_1, I had failed to prefix the call to intlist_to_tbl with dbo, which is necessary to make sure that the cache entry can be shared among users.
-
2014-12-27
-
Not a total makeover, but a general overhaul in an attempt to make the presentation clearer. The introductions for static and dynamic SQL now both begin with a summary of advantages and disadvantages. Some significant additions to the content:
-
-
On popular demand: I'm now giving examples how you should handle multi-choice parameters. To this end there are two new two parameters to search_orders.
-
There is now a deeper discussion on dynamic sort order and alternate tables with more examples.
-
Reworked the text about the original bug with OPTION (RECOMPILE), since you should be on a much later service pack by now and added text about the new bug with OPTION (RECOMPILE) uncovered in the autumn of 2014.
-
-...and then there is a formatting makeover to adapt to my new style sheet.
-
-
2013-11-02
-
Travis Gan pointed out that in the section Performance: The Fine Print, there is a risk for parameter sniffing and I've added a short discussion on this. Also, corrected a silly error in the demo procedure search_orders_4. (The arguments to datediff were in the wrong order.)
-
2011-08-26
Håkan Borneland was kind to point out that my update of 2011-08-01 was not complete, but I still said that there was no service pack for SQL 2008 R2 in one place.
-
2011-08-01
Updated the article to reflect the release of Service Pack 1 for SQL 2008 R2.
There is now a Cumulative Update for SQL 2008 R2 with
-the corrected behaviour of OPTION (RECOMPILE).
-
2010-05-13
Updated the article for SQL 2008 R2. Note that
-RTM-version of R2 has the old behaviour of OPTION (RECOMPILE).
-
2009-11-22
Republished the article, since CU5 of SQL 2008 SP1
-restores the RTM behaviour of OPTION (RECOMPILE), but now without the bug.
-
2009-02-14
Pulled the article, since Microsoft had reverted to the
-old behaviour of OPTION (RECOMPILE) because of a bug.
-
-
2008-08-03
The first version of the article for SQL 2008. A lot of the material from the older version has been ripped out, and a new section on Alternate Key Lookup has been added. Static SQL is now covered before dynamic SQL.
\ No newline at end of file
diff --git a/Articles/Error and Transaction Handling in SQL Server.htm b/Articles/Error and Transaction Handling in SQL Server.htm
deleted file mode 100644
index b64e274d..00000000
--- a/Articles/Error and Transaction Handling in SQL Server.htm
+++ /dev/null
@@ -1,342 +0,0 @@
-
-
-
-
-
-Error and Transaction Handling in SQL Server
-
-
-
-
This article is the first in a series of three about error and transaction handling in SQL Server. The aim of this first article is to give you a jumpstart with error handling by showing you a basic pattern which is good for the main bulk of your code. This part is written with the innocent and inexperienced reader in mind, why I am intentionally silent on many details. The purpose here is to tell you how without dwelling much on why. If you take my words for your truth, you may prefer to only read this part and save the other two for a later point in your career.
-
On the other hand, if you question my guidelines, you certainly need to read the other two parts, where I go into much deeper detail exploring the very confusing world of error and transaction handling in SQL Server. Parts Two and Three, as well as the three appendixes, are directed towards readers with a more general programming experience, although necessarily not with SQL Server. This first article is short; Parts Two and Three are considerably longer.
Why do we have error handling in our code? There are many reasons. In a forms application we validate the user input and inform the users of their mistakes. These user mistakes are anticipated errors. But we also need to handle unanticipated errors. That is, errors that occur because we overlooked something when we wrote our code. A simple strategy is to abort execution or at least revert to a point where we know that we have full control. Whatever we do, simply ignoring an unanticipated error is something we should never permit us. This can have grave consequences and cause the application to present incorrect information to the user or even worse to persist incorrect data in the database. It is also important to communicate that an error has occurred, lest that the user thinks that the operation went fine, when your code in fact performed nothing at all.
-
In a database system, we often want updates to be atomic. For instance, say that the task is to transfer money from one account to another. To this end, we need to update two rows in the CashHoldings table and add two rows to the Transactions table. It's absolutely impermissible that an error or an interruption would result in money being deposited into the receiving account without it being withdrawn from the other. For this reason, in a database application, error handling is also about transaction handling. In this example, we need to wrap the operation in BEGIN TRANSACTION and COMMIT TRANSACTION, but not only that: in case of an error, we must make sure that the transaction is rolled back.
-
Essential Commands
-
We will start by looking at the most important commands that are needed for error handling. In Part Two, I cover all commands related to error and transaction handling.
-
TRY-CATCH
-
The main vehicle for error handling is TRY-CATCH, very reminiscent of similar constructs in other languages. The structure is:
If any error occurs in <regular code>, execution is transferred to the CATCH block, and the error-handling code
- is executed. Typically, your CATCH rolls back any open transaction and reraises the error, so that the calling client program understand that something went wrong. As for how to reraise the error, we will come to this later in this article.
-
Here is a very quick example:
-
BEGIN TRY
- DECLARE @x int
- SELECT @x = 1/0
- PRINT 'Not reached'
-END TRY
-BEGIN CATCH
- PRINT 'This is the error: ' + error_message()
-END CATCH
-
The output:
-
This is the error: Divide by zero error encountered.
-
-
We will return to the function error_message() later. It is worth noting that using PRINT in your CATCH handler is something you only would do when experimenting. You should never do so in real application code.
-
If <regular code> calls stored procedures or invokes triggers, any error that occurs in these will also transfer execution to the CATCH block. More exactly, when an error occurs, SQL Server unwinds the stack until it finds a CATCH handler, and if there isn't any, SQL Server sends the error message to the client.
-
There is one very important limitation with TRY-CATCH you need to be aware of: it does not catch compilation errors that occur in the same scope. Consider:
-
CREATE PROCEDURE inner_sp AS
- BEGIN TRY
- PRINT 'This prints'
- SELECT * FROM NoSuchTable
- PRINT 'This does not print'
- END TRY
- BEGIN CATCH
- PRINT 'And nor does this print'
- END CATCH
-go
-EXEC inner_sp
-
The output is:
-
-
This prints
-
-
Msg 208, Level 16, State 1, Procedure inner_sp, Line 4
-
Invalid object name 'NoSuchTable'.
-
-
-
As you see the TRY block is entered, but when the error occurs, execution is not transferred to the CATCH block as expected. This is true for all compilation errors such as missing columns, incorrect aliases etc that occur at run-time. (Compilation errors can occur at run-time in SQL Server due to deferred name resolution, a (mis)feature where SQL Server permits you to create a procedure that refers to non-existing tables.)
-
These errors are not entirely uncatchable; you cannot catch them in the scope they occur, but you can catch them in outer scopes. Add this code to the example above:
-
CREATE PROCEDURE outer_sp AS
- BEGIN TRY
- EXEC inner_sp
- END TRY
- BEGIN CATCH
- PRINT 'The error message is: ' + error_message()
- END CATCH
-go
-EXEC outer_sp
-
Now we get this output:
-
This prints
-
-
The error message is: Invalid object name 'NoSuchTable'.
-
-
This time the error is caught because there is an outer CATCH handler.
-
SET XACT_ABORT ON
-
Your stored procedures should always include this statement in the beginning:
-
SET XACT_ABORT, NOCOUNT ON
-
This turns on two session options that are off by default for legacy reasons, but experience has proven that best practice is to always have them on. The default behaviour in SQL Server when there is no surrounding TRY-CATCH is that some errors abort execution and roll back any open transaction, whereas with other errors execution continues on the next statement. When you activate XACT_ABORT ON, almost all errors have the same effect: any open transaction is rolled back and execution is aborted. There are a few exceptions of which the most prominent is the RAISERROR statement.
-
The option XACT_ABORT is essential for a more reliable error and transaction handling. Particularly, with the default behaviour there are several situations where execution can be aborted without any open transaction being rolled back, even if you have TRY-CATCH. We saw one such example in the previous section where we learnt that TRY-CATCH does not catch compilations errors in the same scope. An open transaction which is not rolled back in case of an error can cause major problems if the application jogs along without committing or rolling back.
-
For good error handling in SQL Server, you need both TRY-CATCH and SET XACT_ABORT ON. Of these two, SET XACT_ABORT ON is the most important. For production-grade code it's not really sufficient to rely on XACT_ABORT, but for quick and simple stuff it can do.
-
The option NOCOUNT has nothing to do with error handling, but I included in order to show best practice. The effect of NOCOUNT is that it suppresses messages like (1 row(s) affected) that you can see in the Message tab in SQL Server Management Studio. While these row counts can be useful when you work interactively in SSMS, they can degrade performance in an application because of the increased network traffic. The row counts can also confuse poorly written clients that think they are real result sets.
-
Above, I've used a syntax that is a little uncommon. Most people would probably write two separate statements:
-
SET NOCOUNT ON
-SET XACT_ABORT ON
-
There is no difference between this and the above. I prefer the version with one SET and a comma since it reduces the amount of noise in the code. As these statements should appear in all your stored procedures, they should take up as little space as possible.
-
General Pattern for Error Handling
-
Having looked at TRY-CATCH and SET XACT_ABORT ON, let's piece it together to a pattern that we can use in all our stored procedures. To take it slow and gentle, I will first show an example where I reraise the error in a simple-minded way, and in the next section I will look into better solutions.
-
For the example, I will use this simple table.
-
CREATE TABLE sometable(a int NOT NULL,
- b int NOT NULL,
- CONSTRAINT pk_sometable PRIMARY KEY(a, b))
-
Here is a stored procedure that showcases how you should work with errors and transactions.
-
CREATE PROCEDURE insert_data @a int, @b int AS
- SET XACT_ABORT, NOCOUNT ON
- BEGIN TRY
- BEGIN TRANSACTION
- INSERT sometable(a, b) VALUES (@a, @b)
- INSERT sometable(a, b) VALUES (@b, @a)
- COMMIT TRANSACTION
- END TRY
- BEGIN CATCH
- IF @@trancount > 0 ROLLBACK TRANSACTION
- DECLARE @msg nvarchar(2048) = error_message()
- RAISERROR (@msg, 16, 1)
- RETURN 55555
- END CATCH
-
The first line in the procedure turns on XACT_ABORT and NOCOUNT in single statement as I showed above. This line is the only line to come before BEGIN TRY. Everything else in the procedure should come after BEGIN TRY: variable declarations, creation of temp tables, table variables, everything. Even if you have other SET commands in the procedure (there is rarely a reason for this, though), they should come after BEGIN TRY.
-
The reason I prefer to have SET XACT_ABORT, NOCOUNT ON before BEGIN TRY is that I see this as one line of noise: it should always be there, but that I don't want it to strain my eyes. This is certainly a matter of preference, and if you prefer to put the SET commands after BEGIN TRY, that's alright. What is important is that you should never put anything else before BEGIN TRY.
-
The part between BEGIN TRY and END TRY is the main meat of the procedure. Because I wanted to include a user-defined transaction, I introduced a fairly contrived business rule which says that when you insert a pair, the reverse pair should also be inserted. The two INSERT statements are inside BEGIN and COMMIT TRANSACTION. In many cases you will have some lines code between BEGIN TRY and BEGIN TRANSACTION. Sometimes you will also have code between COMMIT TRANSACTION and END TRY, although that is typically only a final SELECT to return data or assign values to output parameters. If your procedure does not perform any updates or only has a single INSERT/UPDATE/DELETE/MERGE statement, you typically don't have an explicit transaction at all.
-
Whereas the TRY block will look different from procedure to procedure, the same is not true for the CATCH block. Your CATCH blocks should more or less be a matter of copy and paste. That is, you settle on something short and simple and then use it all over the place without giving it much thinking. The CATCH handler above performs three actions:
-
-
Rolls back any open transaction.
-
Reraises the error.
-
Makes sure that the return value from the stored procedure is non-zero.
-
-
These actions should always be there. Always. You may argue that the line
-
IF @@trancount > 0 ROLLBACK TRANSACTION
-
is not needed if there no explicit transaction in the procedure, but nothing could be more wrong. Maybe you call a stored procedure which starts a transaction, but which is not able to roll it back because of the limitations of TRY-CATCH. Maybe you or someone else adds an explicit transaction to the procedure two years from now. Will you remember to add the line to roll back then? Don't count on it. I can also hear readers that object if the caller started the transaction we should not roll back.... Yes, we should, and if you want to know why you need to read Parts Two and Three. Always rolling back the transaction in the CATCH handler is a categorical imperative that knows of no exceptions.
-
The code for reraising the error includes this line:
-
DECLARE @msg nvarchar(2048) = error_message()
-
The built-in function error_message() returns the text for the error that was raised. On the next line, the error is reraised with the RAISERROR statement. This is an unsophisticated way to do it, but it does the job. We will look at alternatives in the next chapter.
-
Note: the syntax to give variables an initial value with DECLARE was introduced in SQL 2008. If you are on SQL 2005, you will need to split the line in one DECLARE and one SELECT statement.
-
Always reraise? What if you only want to update a row in a table with the error message? Yes, that is a situation that occurs occasionally, although you would typically do that in an inner CATCH block which is part of a loop. (I have a longer example demonstrating this in Part Three.) The outer CATCH block in a procedure is exactly for catching and reraising unexpected errors you did not foresee. Dropping these errors on the floor is a criminal sin. They must be reraised.
-
The final RETURN statement is a safeguard. Recall that RAISERROR never aborts execution, so execution will continue with the next statement. As long as all procedures are using TRY-CATCH and likewise all client code is using exception handling this is no cause for concern. But your procedure may be called from legacy code that was written before SQL 2005 and the introduction of TRY-CATCH. In those days, the best we could do was to look at return values. What you return does not really matter, as long as it's a non-zero value. (Zero is usually understood as success.)
-
The last statement in the procedure is END CATCH. You should never have any code after END CATCH for the outermost TRY-CATCH of your procedure. For one thing, anyone who is reading the procedure will never see that piece of code.
-
Having read all the theory, let's try a test case:
-
EXEC insert_data 9, NULL
-
The output is:
-
-
Msg 50000, Level 16, State 1, Procedure insert_data, Line 12
-
- Cannot insert the value NULL into column 'b', table 'tempdb.dbo.sometable'; column does not allow nulls. INSERT fails.
-
-
Let's add an outer procedure to see what happens when an error is reraised repeatedly:
-
CREATE PROCEDURE outer_sp @a int, @b int AS
- SET XACT_ABORT, NOCOUNT ON
- BEGIN TRY
- EXEC insert_data @a, @b
- END TRY
- BEGIN CATCH
- IF @@trancount > 0 ROLLBACK TRANSACTION
- DECLARE @msg nvarchar(2048) = error_message()
- RAISERROR (@msg, 16, 1)
- RETURN 55555
- END CATCH
-go
-EXEC outer_sp 8, 8
-
The output is:
-
-
Msg 50000, Level 16, State 1, Procedure outer_sp, Line 9
-
Violation of PRIMARY KEY constraint 'pk_sometable'. Cannot insert duplicate key in object 'dbo.sometable'. The duplicate key value is (8, 8).
-
-
We get the correct error message, but if you look closer at the headers of this message and the previous, you may note a problem:
-
-
Msg 50000, Level 16, State 1, Procedure insert_data, Line 12
-
Msg 50000, Level 16, State 1, Procedure outer_sp, Line 9
-
-
The error messages give the location of the final RAISERROR statement that was executed. In the first case, only the line number is wrong. In the second case, the procedure name is incorrect as well. For simple procedures like our test procedures, this is not a much of an issue, but if you have several layers of nested complex stored procedures, only having an error message but not knowing where it occurred makes your troubleshooting a lot more difficult. For this reason, it is desirable to reraise the error in such a way that you can locate the failing piece of code quickly, and this is what we will look at in the next chapter.
-
Three Ways to Reraise the Error
-
Using error_handler_sp
-
We have seen error_message(), which returns the text for an error message. An error message consists of several components, and there is one error_xxx() function for each one of them. We can use this to reraise a complete message that retains all the original information, albeit with a different format. Doing this in each and every CATCH handler would be a gross sin of code duplication, and there is no reason to. You don't have to be in the CATCH block to call error_message() & co, but they will return exactly the same information if they are invoked from a stored procedures that your CATCH block calls.
The first thing error_handler_sp does is to capture the value of all the error_xxx() functions into local variables. (Exactly what all these mean, is something I am not covering in this introductory article, but I leave that for Part Two.) I will return to the IF statement in a second. Instead let's first look at the SELECT statement inside of it:
The purpose of this SELECT statement is to format an error message that we pass to RAISERROR, and which includes all information in the original error message which we cannot inject directly into RAISERROR. We need to give special treatment to the procedure name, since it will be NULL for errors that occur in ad-hoc batches or in dynamic SQL. Whence the use of the coalesce() function. (If you don't really understand the form of the RAISERROR statement, I discuss this in more detail in Part Two.)
-
The formatted error message starts with three asterisks. This serves two purposes: 1) We can directly see that this is a message reraised from a CATCH handler. 2) This makes it possible for error_handler_sp to filter out errors it has reraised once or more already with the condition NOT LIKE '***%' to avoid that error messages get modified a second time.
-
Here is how a CATCH handler should look like when you use error_handler_sp:
-
BEGIN CATCH
- IF @@trancount > 0 ROLLBACK TRANSACTION
- EXEC error_handler_sp
- RETURN 55555
-END CATCH
-
Let's try some test cases.
-
EXEC insert_data 8, NULL
-EXEC outer_sp 8, 8
-
This results in:
-
-
Msg 50000, Level 16, State 2, Procedure error_handler_sp, Line 20
-
*** [insert_data], Line 5. Errno 515: Cannot insert the value NULL into column 'b', table 'tempdb.dbo.sometable'; column does not allow nulls. INSERT fails.
-
Msg 50000, Level 14, State 1, Procedure error_handler_sp, Line 20
-
*** [insert_data], Line 6. Errno 2627: Violation of PRIMARY KEY constraint 'pk_sometable'. Cannot insert duplicate key in object 'dbo.sometable'. The duplicate key value is (8, 8).
-
-
The header of the messages say that the error occurred in error_handler_sp, but the texts of the error messages give the original location, both procedure name and line number.
-
I will present two more methods to reraise errors. However, error_handler_sp is my main recommendation for readers who only read this part. It's simple and it works on all versions of SQL Server from SQL 2005 and up. There is really only one drawback: in some situations SQL Server raises two error messages, but the error_xxx() functions return only information about one of them, why one of the error messages is lost. This can be quite difficult with administrative commands like BACKUP/RESTORE, but it is rarely an issue in pure application code.
-
Using ;THROW
-
In SQL 2012, Microsoft introduced the ;THROW statement to make it easier to reraise errors. Unfortunately, Microsoft made a serious design error with this command and introduced a dangerous pitfall.
-
With ;THROW you don't need any stored procedure to help you. Your CATCH handler becomes as simple as this:
-
BEGIN CATCH
- IF @@trancount > 0 ROLLBACK TRANSACTION
- ;THROW
- RETURN 55555
-END CATCH
-
The nice thing with ;THROW is that it reraises the error message exactly as the original message. If there were two error messages originally, both are reraised which makes it even better. As with all other errors, the errors reraised by ;THROW can be caught in an outer CATCH handler and reraised. If there is no outer CATCH handler, execution is aborted, so that RETURN statement is actually superfluous. (I still recommend that you keep it, in case you change your mind on ;THROW later.)
-
If you have SQL 2012 or later, change the definition of insert_data and outer_sp, and try the tests cases again. The output this time:
-
-
-
Msg 515, Level 16, State 2, Procedure insert_data, Line 5
-
Cannot insert the value NULL into column 'b', table 'tempdb.dbo.sometable'; column does not allow nulls. INSERT fails.
-
Msg 2627, Level 14, State 1, Procedure insert_data, Line 6
-
Violation of PRIMARY KEY constraint 'pk_sometable'. Cannot insert duplicate key in object 'dbo.sometable'. The duplicate key value is (8, 8).
-
-
The procedure name and line number are accurate and there is no other procedure name to confuse us. Also, the original error numbers are retained.
-
At this point you might be saying to yourself: he must be pulling my legs, did Microsoft really call the command ;THROW? Isn't it just THROW? True, if you look it up in Books Online, there is no leading semicolon. But the semicolon must be there. Officially, it is a terminator for the previous statement, but it is optional, and far from everyone uses semicolons to terminate their T‑SQL statements. More importantly, if you leave out the semicolon before THROW this does not result in a syntax error, but in a run-time behaviour which is mysterious for the uninitiated. If there is an active transaction you will get an error message – but a completely different one from the original. Even worse, if there is no active transaction, the error will silently be dropped on the floor. Something like mistakenly leaving out a semicolon should not have such absurd consequences. To reduce the risk for this accident, always think of the command as ;THROW.
-
It should not be denied that ;THROW has its points, but the semicolon is not the only pitfall with this command. If you want to use it, I encourage you to read at least Part Two in this series, where I cover more details on ;THROW. Until then, stick to error_handler_sp.
-
Using SqlEventLog
-
The third way to reraise an error is to use SqlEventLog, which is a facility that I present in great detail in Part Three. Here I will only give you a teaser.
-
SqlEventLog offers a stored procedure slog.catchhandler_sp that works similar to error_handler_sp: it uses the error_xxx() functions to collect the information and reraises the error message retaining all information about it. In addition, it logs the error to the table slog.sqleventlog. Depending on the type of application you have, such a table can be a great asset.
-
To use SqlEventLog, your CATCH hander would look like this:
-
BEGIN CATCH
- IF @@trancount > 0 ROLLBACK TRANSACTION
- EXEC slog.catchhandler_sp @@procid
- RETURN 55555
-END CATCH
-
@@procid returns the object id of the current stored procedure, something that SqlEventLog uses when it writes the log information to the table. Using the same test cases, this is the output with catchhandler_sp:
-
-
-
Msg 50000, Level 16, State 2, Procedure catchhandler_sp, Line 125
-
{515} Procedure insert_data, Line 5
-
Cannot insert the value NULL into column 'b', table 'tempdb.dbo.sometable'; column does not allow nulls. INSERT fails.
-
Msg 50000, Level 14, State 1, Procedure catchhandler_sp, Line 125
-
{2627} Procedure insert_data, Line 6
-
Violation of PRIMARY KEY constraint 'pk_sometable'. Cannot insert duplicate key in object 'dbo.sometable'. The duplicate key value is (8, 8).
-
-
-
As you see, the error messages from SqlEventLog are formatted somewhat differently from error_handler_sp, but the basic idea is the same. Here is a sample of what is logged to the table slog.sqleventlog:
2 2015-01-25 22:40:24.395 2627 14 insert_data 6 Violation of ...
-
-
If you want to play with SqlEventLog right on the spot, you can download the file sqleventlog.zip. For installation instructions, see the section Installing SqlEventLog in Part Three.
-
Final Remarks
-
You have now learnt a general pattern for error and transaction handling in stored procedures. It is not perfect, but it should work well for 90-95 % of your code. There are a couple of limitations you should be aware of:
-
-
As we have seen, compilation errors such as missing tables or missing columns cannot be trapped in the procedure where they occur, only in outer procedures.
-
The pattern does not work for user-defined functions, since neither TRY-CATCH nor RAISERROR are permitted there.
-
When you call a stored procedure on a linked server that raises
- an error, this error may bypass the error handler in the procedure on the
- local server and go to directly to the client.
-
When a procedure is called by INSERT-EXEC, you will get an ugly error, because ROLLBACK TRANSACTION is
- not permitted in this case.
-
As noted above, if you use error_handler_sp or SqlEventLog, you will lose one error message when SQL Server raises two error messages for the same error. This is not an issue with ;THROW.
-
-
I cover these situations in more detail in the other articles in the series.
-
Before I close this off, I like to briefly cover triggers and client code.
-
Triggers
-
The pattern for error handling in triggers is not any different from error handling in stored procedures, except in one small detail: you should not include that RETURN statement. (Because RETURN with a value is not permitted in triggers.)
-
What is important to understand about triggers is that they are part of the command that fired the trigger, and in a trigger you are always in a transaction, even if you did not use BEGIN TRANSACTION. Sometimes I see people in SQL Server forums ask if they can write a trigger that does not roll back the command that fired the trigger if the trigger fails. The answer is that there is no way that you can do this reliably, so you better not even try. If you have this type of requirement, you should probably not use a trigger at all, but use some other solution. In Parts Two and Three, I discuss error handling in triggers in more detail.
-
-
Client Code
-
Yes, you should have error handling in client code that accesses the database. That is, you should always assume that any call you make to the database can go wrong. Exactly how to implement error handling depends on your environment, and to cover all possible environments out there, I would have to write a couple of more articles. And learn all those environments.
-
Here, I will only point out one important thing: your reaction to an error raised from SQL Server should always be to submit this batch to avoid orphaned transactions:
-
IF @@trancount > 0 ROLLBACK TRANSACTION
-
This also applies to the famous message Timeout expired (which is not a message from SQL Server, but the client API).
This is the end of Part One of this series of articles. If you just wanted to learn the pattern quickly, you have completed your reading at this point. If your intention is to read it all, you should continue with Part Two which is where your journey into the confusing jungle of error and transaction handling in SQL Server will begin for real.
-
If you have questions, comments or suggestions specific to this article, please feel free to contact me at esquel@sommarskog.se. This includes small things like spelling errors, bad grammar, errors in code samples etc. Since I don't have a publisher, I need to trust my readership to be my tech editors and proof-readers. :-) If you have questions relating to a problem you are working with, I recommend that you ask that question in a public forum, as this is more likely to give you a quick response.
-
For a list of acknowledgements, please see the end of Part Three. Below is a revision history for Part One.
-
...and don't forget to add this line first in your stored procedures:
When designing an application for SQL Server, you rarely want users to have
- full permissions to access the tables in the database. Many applications are
- designed to perform all database access through stored procedures, and it is
- through the stored procedures users can access and update data. The
- procedures perform validations of business rules to protect the integrity of
- the database.
-
In this article I will in depth discuss three different ways to achieve this:
This article applies to SQL 2005 SP2 and later. Particularly, there were
- some bugs and limitations in the RTM version of SQL 2005, that I don't touch, as
- there is no reason why you should be running SQL 2005 RTM or SP1. (And for that
- matter, SP2. You should have installed at least Service Pack 3 by now, if not
-SP4.) If you are using SQL 2000, you should know that this article focuses on features added in SQL 2005.
The classic method for granting permissions through stored procedures is
-
- ownership chaining. This is the prime method for plain table
- access, but there are permissions that are not grantable through ownership chaining. Two such cases that we will look at in this
- article are
- dynamic SQL and reloading a table through BULK INSERT. Due to its importance, ownership
- chaining is the first mechanism that I will cover in this article.
- However, before that I will discuss owner/schema-separation,
- a change in SQL 2005 that may boggle the mind of old-time users of SQL Server and which
- has some effects on ownership chaining.
-
- SQL 2005 introduced two new methods to give users access through stored
- procedures: you can sign procedures with certificates,
- and you can use impersonation with the EXECUTE AS clause.
- Both these methods permit you to encapsulate any permission in a stored
- procedure. Certificates are more complex to use, whereas EXECUTE AS can be
- deceivingly simple. To wit, EXECUTE AS has some side effects that can be
- nasty. If you are a developer, this text tries to make you aware of what harm
- casual use of EXECUTE AS could cause. And if you are a DBA, this
- article warns you of what creative developers can inflict to your database with EXECUTE AS.
-
Whereas the above-mentioned methods can be applied to individual procedures,
- application roles, "application proxies"
-and Terminal Server are
- solutions that you typically use on an application-wide scale. (I have put "application proxy" in
- quotes throughout the article, as this is a term that I've coined myself and
- it may not be established terminology.)
This article includes several example scripts that demonstrate the various
- methods. Before you start to run these scripts all over town, I like to point
- out a few things.
-
All these scripts assume that you are logged in with sysadmin rights,
- and I strongly recommend that you run the examples on a development machine.
- Some scripts assume that you have enabled xp_cmdshell, which is
- disabled by default. Enable it with sp_configure, if this is acceptable with your local security policy.
- The use of xp_cmdshell is mainly for convenience, and it is not
- required to demonstrate the essentials of the examples. You can perform
- those actions manually if needed.
-
- Furthermore, all scripts create at least one database and at least one login.
- Some scripts also create files in the file system. If the scripts run
- uninterrupted, all objects are dropped at the end; logins,
- databases and files alike. (So first check that you don't have any database
- with names that coincide with the databases in the scripts!)
-
The reason the scripts create databases is simplicity. That permits me to
- create objects, users etc in the database, and clean up all by dropping the
- database. The scripts create logins because it's difficult to
- demonstrate security features when running as sysadmin.
-
To contain everything into one script, I make heavily use of the
-EXECUTE
- AS and REVERT statements, although it will take until the second half of the
- article before I discuss them in detail. For now, just think of them as an
- alternative to open a second query window to run as a test user. If you
- prefer, you can stop the scripts at EXECUTE AS, log into a second query
- window as the test user to run the part up to REVERT.
Before I go on to the main body of this text, I would like to make a short digression
- about security in general.
-
Security is often in
- conflict with other interests in the programming trade. You have users screaming
- for a solution, and they want it now. At this point, they don't really care
- about security, they just want to get their business done. But if you give them a
- solution that has a hole, and that hole is later exploited, you are the one
- that will be hung. So as a programmer you
- always need to have security in mind, and make sure that you play your part right
-
One common mistake in security is to think "we have this
- firewall/encryption/whatever, so we are safe". I like to think of security of
- something that consists of a number of defence lines.
- Anyone who has worked with computer systems knows that there are a lot of changes
- in them, both in their configuration and in the program code. Your initial design
- may be sound and safe, but as the system evolves, there might suddenly be a
- security hole and a serious vulnerability in your system.
-
By having multiple lines of defence you can reduce the risk for this to happen.
- If a hole is opened, you can reduce the impact of what is possible to do
- through that hole. An integral part of this strategy is to never
- grant more permissions than is absolutely necessary. Exactly what this means in this
- context is something I shall return to.
Before we look at any of the methods to grant permissions, we need to look at
- a change in SQL 2005 which can be a bit breath-taking to users coming from
-older versions of SQL Server.
-
Since the dawn of time, SQL Server have permitted a four-part notation of
- objects, and it has usually been presented as
-
server.database.owner.object
-
But in SQL 2005 this changed to
-
server.database.schema.object
-
You may ask, what is this schema? The answer is that schema has
- always been there, but up to SQL 2000, schema and owner was always the same.
- In SQL 2005 owner and schema are two different entities.
-
The purpose of a schema is simple to understand: it permits you to have
- different namespaces in database. Say that for a larger application, there
- are several groups that work more or less independently. Each group could
- have their own schema for their specific objects to avoid name clashes.
- While you could do this in SQL 2000 as well, the fact that all schemas had
- different owners, made this unpractical. In SQL 2005 all schemas can have the
- same owner.
-
An example of a database with several schemas is the
-AdventureWorks
- database; the database which Microsoft use for all their samples since SQL 2005.
-
SQL Server comes with no less than 13 pre-defined schemas. That's a lot, but
- ten of them exist solely for backwards compatibility, and they are namesakes
- with predefined users and roles in SQL 2000. (Since users and roles also were
- schemas in SQL 2000, Microsoft figured that there could be applications using them.) You can drop the nine
- schemas that stem from roles (db_owner etc)
- from your database, and if you drop them from the model database, the
- schemas will not appear in new databases. For some reason you cannot drop the
- guest schema.
-
Two schemas, sys and INFORMATION_SCHEMA,
-are reserved for system objects, and you cannot create objects in these schemas.
-
Finally, there is the dbo schema, which is the only predefined schema
- you normally create objects in. The tacky name is short for database owner,
- and is a heritage from the previous days of owner/schema-unification.
There are several statements related to schemas and users, and I will give a brief
-overview here to point out the differences between the new commands added in SQL 2005, and the older system procedures from previous versions.
-
To create a schema, you use not surprisingly CREATE SCHEMA, and most often
- you just say like:
-
CREATE SCHEMA myschema
-
CREATE SCHEMA is one of these statements that must be alone in batch. That is,
- no statements can precede or follow it. That may seem a little funny for such
- a simple command, but there is an older form of CREATE SCHEMA which is more
- complex that was
- introduced in SQL 6.5 and which serves a different purpose. (Please see Books Online for details, if you really want to know.)
-
The preferred way to create a user since SQL 2005 is:
-
CREATE USER newuser [WITH DEFAULT_SCHEMA = someschema]
-
There are two system procedures to create users, sp_adduser and
-sp_grantdbaccess. They are both deprecated and will be removed eventually. There is an important difference between CREATE USER and
-the two system procedures: CREATE USER creates a user whose default schema is dbo,
- unless you specify otherwise. On the other hand, sp_adduser
- and sp_grantdbaccess
- for compatibility reasons
- perform the corresponding to:
-
CREATE SCHEMA newuser
-go
-CREATE USER newuser WITH DEFAULT_SCHEMA = newuser
-go
-ALTER AUTHORIZATION ON SCHEMA::newuser TO newuser
-
(The last command makes newuser owner of the schema created in his
- name.) Most likely, you don't need that schema, so there is
- good reason to avoid these old system procedures entirely.
-CREATE USER also has some
- options not offered by sp_adduser and sp_grantdbaccess. For
-instance, you can say:
-
CREATE USER thisdbonly WITHOUT LOGIN
-
This creates a database user that is not tied to a login. In some of the the test scripts, I use this option
-to create test users, but you will also see examples where WITHOUT LOGIN can be
-used to create a user that is a container for a certain permission. We will look
-at other options later in this article.
-
There is also CREATE ROLE that replaces sp_addrole in the same vein that CREATE USER
- replaces sp_adduser. That is, CREATE ROLE creates the role only.
- sp_addrole also creates a schema that you are unlikely to have any need
- for. And while we are at it, there is a CREATE LOGIN
-which replaces
- sp_addlogin. As with CREATE USER, CREATE LOGIN has some new options, that we will come back to
- later in this article.
-
Finally, there is DROP USER instead of sp_dropuser
- etc. A little note here: if you have users created with sp_addlogin or
-sp_grantdbaccess, sp_dropuser is the most convenient way to drop them, since there is a schema that needs to be dropped before you can drop
-the user, and DROP USER will not do that for you.
If you create objects in a schema that is owned by another user, the
- schema owner will be the owner of the objects you create, not you.
- Thus, if you give a user permission to create objects in a schema you own,
- but no other permissions in the schema, he will not be able to access the
- objects he creates.
-
This can be a bit of a surprise, but it's actually logical. Assume that all
- developers of an application have their own user, while they create objects in a
- common schema. For ownership chaining to work (which we look at in a second), all objects must have the same
- owner, so it much simpler if all objects are owned by the schema owner from
- the start. Else you would constantly have to change the ownership of the procedures.
Ownership chaining is the classical way of giving users access to objects
- through stored procedures in SQL Server. And while SQL Server provides two
- other methods, ownership chaining is what you will use 99 % of the time.
- Certificates and impersonation is something you only have reason to use when
- ownership chaining does not do the job.
-
How does ownership chaining work? Say that you have a procedure sp1
- owned by user A. sp1 performs a SELECT from tbl1 and tbl2.
- tbl1 is owned by A, whereas tbl2 is owned by user B. User C has
- permission to execute sp1. To be able run this procedure successfully,
- C needs SELECT permission on tbl2 but not
- on tbl1. Since
- sp1 and tbl1 have the same owner, the permission check is suppressed, and this is ownership
- chaining. Ownership chaining is also in effect in triggers,
- user-defined functions and views.
-
Now, this may seem a little complex to grasp, but in real life it is often a
- lot simpler. In my experience, having several object owners in a database is
- not very common. In very many cases, dbo, the database owner, owns all
- objects in a database. A common way to implement security in a database
- application is to perform all access
- through stored procedures that validates input parameters, enforces business
- rules etc. When dbo owns all procedures and tables, users only need permissions to execute the
- stored procedures. Thanks to ownership chaining, they do not need any direct
- permissions on the tables. But as we will learn soon, there are permissions
- that cannot be transferred through ownership chaining.
-
Note: in older versions of SQL Server, applications might have used different object owners in order to implement different namespaces, that is schemas. But since
-in SQL 2005, dbo can own all schemas, this should no longer be necessary.
Here is an example script that demonstrates ownership chaining. Despite what
- I said in the previous section about dbo owning everything, the
- example includes two objects owned by other users, to demonstrate what
- happens when the ownership chain is broken.
-
(Please refer to the introductory note about
- the example scripts in this article.)
-
USE master
-go
--- Create a test user and a test database.
-CREATE LOGIN testuser WITH PASSWORD = 'TesT=0=UsEr'
-CREATE DATABASE ownershiptest
-go
--- Move to the test database.
-USE ownershiptest
-go
--- Create a user to run the tests.
-CREATE USER testuser
-go
--- Create two database-only users that will own some objects.
-CREATE USER procowner WITHOUT LOGIN
-CREATE USER tableowner WITHOUT LOGIN
-go
--- Create three test tables. As this is an example to demonstrate
--- permissions, we don't care about adding any data to them.
-CREATE TABLE tbl1 (a int NOT NULL)
-CREATE TABLE tbl2 (b int NOT NULL)
-CREATE TABLE tbl3 (c int NOT NULL)
-go
--- Make the user tableowner owner of tbl3.
-ALTER AUTHORIZATION ON tbl3 TO tableowner
-go
--- Create a couple of stored procedures.
-CREATE PROCEDURE sp1 AS
- SELECT a FROM tbl1
-go
-CREATE PROCEDURE sp2inner AS
- SELECT a FROM tbl1
-go
-CREATE PROCEDURE sp2 AS
- SELECT b FROM tbl2
- EXEC sp2inner
-go
-CREATE PROCEDURE sp3 AS
- SELECT c FROM tbl3
-go
-CREATE PROCEDURE sp2procowner AS
- SELECT b FROM tbl2
- EXEC sp2inner
-go
--- Make procowner the owner of sp2procowner.
-ALTER AUTHORIZATION ON sp2procowner TO procowner
-go
--- Grant permissions to testuser to execute all procedures,
--- except for sp2inner.
-GRANT EXECUTE ON sp1 TO testuser
-GRANT EXECUTE ON sp2 TO testuser
-GRANT EXECUTE ON sp2procowner TO testuser
-GRANT EXECUTE ON sp3 TO testuser
-go
--- Run some commands as testuser, with its permissions etc.
-EXECUTE AS LOGIN = 'testuser'
-go
--- sp1 runs fine, as dbo owns both sp1 and tbl1.
-PRINT 'EXEC sp1, this runs fine'
-EXEC sp1
-go
--- Also sp2 runs fine. Note that testuser can run sp2inner, when
--- it's called from sp2. Ownership chaining applies here as well.
-PRINT 'EXEC sp2, this runs fine, despite no priv on sp2inner'
-EXEC sp2
-go
--- But sp2procowner fails twice. Because sp2procowner has a different
--- owner than tbl2 and sp2inner, testuser would need direct permission on
--- these objects, but he hasn't.
-PRINT 'EXEC sp2procowner, two permission errors'
-EXEC sp2procowner
-go
--- And this fails as well, because while sp3 is owned by dbo, tbl3 is
--- owned by another user, so ownership chaining is broken.
-PRINT 'EXEC sp3, permission error'
-EXEC sp3
-go
--- Stop being tester and clean up.
-REVERT
-go
-USE master
-go
-DROP LOGIN testuser
-DROP DATABASE ownershiptest
Since ownership chaining is so commonly used, and works so smoothly when all
- objects are owned by dbo, it often comes as a surprise when users get
- a permission error when they run a stored procedure.
-
The story is that ownership chaining does not apply to all statements. Essentially, ownership
- chaining applies to DML statements (SELECT, INSERT, DELETE, UPDATE and MERGE) and
- EXECUTE of stored procedures and functions. If you put a statement like
- CREATE TABLE into a stored procedure, the user must have permissions to
- create tables (which a plain user rarely has, save for temp tables). Same
- goes for many other administrative commands.
-
A statement that is worth special mention here is TRUNCATE TABLE, which
- logically is a DML statement; a quicker way to
- delete all rows in a table. But the permissions for this command are not
- transferable through ownership chaining, so if you want to write a stored
- procedure to permits users to empty a table, you may prefer to use DELETE
- although this is less efficient.
-
Another example of a command where ownership chaining does not work is BULK
- INSERT; this command requires a server-level permission.
-
These are situations that can be resolved by signing
- procedures with certificates or by using impersonation with EXECUTE AS, methods that we
- shall look
- into later in this article.
Another case where ownership chaining does not work is dynamic SQL. Consider:
-
CREATE PROCEDURE myproc AS
- EXEC('SELECT a, b FROM tbl')
-
(This is certainly not how you would use dynamic SQL in real life, but I
- wanted to keep the example short. Please see my article
- The Curse and Blessings of Dynamic SQL for
- a longer discussion on dynamic SQL, when to use it – and when to not.)
-
To run this procedure, a user needs SELECT permissions on tbl. The
- reason for this is that the batch of dynamic SQL is a scope of its own that
- is
- not part of the stored procedure. And this batch does not really have any
- owner at all, and thus the ownership chain is broken.
-
Since dynamic SQL is very powerful for some tasks – dynamic search conditions
- being the prime example – it was not uncommon in SQL 2000
-and earlier version to give users
- SELECT rights, as long as this was compliant with corporate
- security policy. But since SQL 2005 this is not necessary;
-you can use
- procedure signing and
- impersonation to give users permission to execute dynamic
- SQL.
In SQL Server you can write stored procedures,
- triggers and user-defined functions in a CLR language such as C# or Visual
- Basic. You can perform data access from a CLR module by running a batch of SQL
- statements, but ownership chaining does not apply in this case. The reason
- for this is the same as with dynamic SQL: the SQL batch is a scope of its own that does not have any owner.
-
So when you write CLR modules that accesses tables,
-you must either grant the users direct
- permissions to these tables or employ module signing or impersonation. I am
-not covering how to use these mechanisms with CLR modules in this article, but
-the topic Module Signing in Books Online includes an example.
If a stored procedure sp1 in database A accesses a table
- tbl2 in database B, ownership chaining can apply as
- well, if the procedure owner also owns tbl2. In
- the trivial case, the two databases have the same owners and all involved
- objects are owned by dbo. The user running sp1 must also be a
- user in database B. (Unless you have enabled access for the guest user
- in database B, something I don't recommend.)
-
However, starting with SQL 2000 SP3, ownership
- chaining across databases is turned off by default. You can enable it on
- server level, or per database. To enable it on server level, set the configuration option cross db
- ownership chaining to 1 (with sp_configure or through SQL Server
- Management Studio). Now all databases on the server will be open for cross-db
- chaining.
-
To open an individual database for cross-db chaining, use the command
- ALTER DATABASE db SET DB_CHAINING ON. In the example above, both A and B must
- be enabled for DB chaining for users being able to access B..tbl2
- through sp1 without any own permission on tbl2. To enable a database for
- chaining, you need sysadmin privileges.
-
As you might guess, there is a reason for database chaining being off by
- default. Assume that Jack and Jill
- own one database each. Jack is a user in Jill's database, but he only has
- permissions to run a few stored procedures there. If their databases are
- enabled for database chaining, Jack can get to Jill's inner secrets, by taking the following
- steps.
-
-
Add Jill as a user in his own database.
-
Create a schema in his database owned by Jill.
-
Create stored procedures in the Jill schema that accesses Jill's
- database. Since Jill owns the schema, she also owns the procedures, as
- noted above. (Jack could also create the
- procedures
- in the dbo schema, and then make Jill
- owner of those procedures.)
-
-
Jack can now access all tables in Jill's database as he likes.
-
Microsoft are very discouraging about turning on database chaining, but for a
- server that hosts a single application that uses several databases, turning
- on database chaining on server level appears uncontroversial. It's a
- different thing on a consolidated server that hosts databases for many
- unrelated applications. Here, you should most probably never turn on the
- configuration option to open DB chaining for all databases. What if a user who owns two databases asks you
- to turn on
- chaining on these databases? As long it's only those two, it's fine, but then
- the next guy comes with his two databases. There is no way to say that
- db1 may chain to db2 but not to db3 or db4.
-
According to Books Online, you cannot enable master, model and
- tempdb for database chaining with ALTER DATABASE. It does not really
- say whether chaining is enabled for these databases if you turn on cross db
- ownership chaining, but some quick tests that I did indicate that even
- if this option is on, it does not apply to master, model,
- msdb and tempdb.
-
Personally, I recommend that you try to keep cross-database access to stored
- procedure calls. That is, rather than directly access a table in the other
- database, call a procedure in that database. In this case, ownership chaining
- across database is not really needed – instead give the users EXECUTE
- permission to the procedures in the other database.
We will now turn to the first of the two methods added in SQL 2005 to grant
- permissions through stored procedures, signing a procedure with a
- certificate.
We will first look at using certificates for giving permissions on database level. As an example, I will use dynamic SQL, which probably is the most
- common situation where you will want to use certificates as a supplement to
- ownership chaining.
-
Our example setup is this one:
-
CREATE TABLE testtbl (a int NOT NULL,
- b int NOT NULL)
-go
-CREATE PROCEDURE example_sp AS
- EXEC ('SELECT a, b FROM testtbl')
-go
-GRANT EXECUTE ON example_sp TO public
-go
-
As noted above, ownership chaining does not
- work in this case, because the batch of dynamic SQL does not have any real
- owner, and thus the chain is broken. To make it possible for a user to
- run this procedure without SELECT permission on testtbl, you need to
- take these four steps:
-
-
Create a certificate.
-
Create a user associated with that certificate.
-
Grant that user SELECT rights on
- testtbl.
-
Sign the procedure with the certificate, each time you have
- changed the procedure.
-
-
When the procedure is invoked, the rights of the certificate user
- are
- added to the rights of the actual user.
- Technically, we can describe this as the certificate user is added to the
- current user token. If the procedure invokes another SQL module –
- stored procedure, trigger, function etc – the certificate user is removed
- from the user token (unless that module is also signed by the
- certificate). There are two exceptions to this rule: system procedures and
-dynamic SQL invoked through
- EXEC() or sp_executesql.
-In this case the certificate user is still present in the
- user token, and its rights can apply.
-
This example shows the four steps in code.
-
CREATE CERTIFICATE examplecert
- ENCRYPTION BY PASSWORD = 'All you need is love'
- WITH SUBJECT = 'Certificate for example_sp',
- START_DATE = '20020101', EXPIRY_DATE = '21000101'
-go
-CREATE USER examplecertuser FROM CERTIFICATE examplecert
-go
-GRANT SELECT ON testtbl TO examplecertuser
-go
--- And each time you change the procedure:
-ADD SIGNATURE TO example_sp BY CERTIFICATE examplecert
- WITH PASSWORD = 'All you need is love'
-
In the following sections, we will look closer at each of these statements.
CREATE CERTIFICATE examplecert
- ENCRYPTION BY PASSWORD = 'All you need is love'
- WITH SUBJECT = 'Certificate for example_sp',
- START_DATE = '20020101', EXPIRY_DATE = '21000101'
-
The statement CREATE CERTIFICATE has several options, but for our purposes
- the form above suffices. Here we create a new self-signed
- certificate which is protected by a password. The password is not awfully strong; I will return to the topic of passwords in the section Managing Certificates and Passwords.
-
The WITH SUBJECT clause is part of the metadata for the certificate; in
- the catalog view sys.certificates the subject appears in the column
- issuer_name.
-
There is no requirement to enter a start date and an expiry date for the
- certificate, but for practical reasons you may want to enter both. If you enter neither, the certificate is valid one year
- from now. Since it is likely that your procedure will be in use for more than
- one year, it's recommendable to give an expiry date far into the future.
- If you leave out the start date, SQL 2005
- may produce this message:
-
Warning: The certificate you created is not yet valid; its start
-date is in the future.
-
The message is bogus since the default for the start date is the same second as you issue the command.
- The message is not an error, but informational only. If you don't want to see it, specify a
- start date. This issue has been fixed in SQL 2008.
CREATE USER examplecertuser FROM CERTIFICATE examplecert
-
We see here one more option for CREATE USER: we create a user from a certificate. Such a user exists in the database only and is not associated
-with any login. You can only create one user for each certificate.
Here's the beauty of it: we grant examplecertuser
- exactly
- the rights it
- needs for our stored procedure to work. Of course, if you use a lot of dynamic SQL, you may prefer to grant
- the certificate user SELECT on the dbo schema or add it to db_datareader. You might even consider to add it to db_owner to relieve you from any further hassle, as you add more dynamic
- SQL to other stored procedures.
-
But stop there! Recall that discussion on philosophy in the beginning
- of the article and
- that one line of defence is to not grant more rights than necessary. This very much applies when you work with
- dynamic SQL. You know about SQL injection, don't you?
- If not, a quick
- recap: if you build SQL strings from input data, a malicious user might be
- able to inject SQL commands you did not intend
- your code to execute by including a single quote (') in the input data. For a longer recap, see the section on
- SQL injection in my article on
- dynamic SQL.
-
You may already be aware of the risk of SQL injection, and you have taken
- the steps necessary to protect your procedure against this attack. But that is today. Code changes throughout the life-time of an
- application, and one day there is a need for an enhancement of the procedure,
- and the task is given to an inexperienced programmer who, unaware of the dangers of SQL injection, breaks that line of defence. By giving the certificate user exactly the rights
- needed for the stored procedure, you have set up a second line of defence
- that reduces the potential damage significantly.
ADD SIGNATURE TO example_sp BY CERTIFICATE examplecert
- WITH PASSWORD = 'All you need is love'
-
To use the certificate, you need to specify its password. You can sign a
-procedure with more than one certificate to add permissions from several
-certificate users.
-
If you change the procedure, the signature is lost, and you need to resign
-the procedure. Given for what we want to use certificates for, this may seem impractical. When we grant someone execution rights on a stored procedure, these permissions are retained when we alter the procedure. So why do we need to resign a procedure when we change it? Isn't that a shortcoming? It may seem so, but it is worth to understand the general purpose of signing things with certificates, which extends far beyond stored procedures in SQL Server. Say that you have a important message you want to pass to someone else, for instance over e-mail. You want to make it possible for the receiver to verify that he got exactly the message you sent him. Therefore you sign your message, which requires both a public and a private key. You make your public key available, and the receiver can then apply that key to message and the signature to verify that they agree. If someone has altered the text or the signature, the validation will fail.
-
That is, every time you change the stored procedure, the signature will change, and this is why you must resign the procedure. It could seem that for the particular purpose that we are using certificates for here, that this is just hassle. But as I discuss in the section Managing Certificates and Passwords, the fact that the procedure must be resigned can in fact be a considerable security advantage.
Here is a full-fledged example that you can play with. To show the
- difference, there are two procedures, of which only one is signed. (Please
- refer to the introductory note on the examples
- in this article.)
-
USE master
-go
--- Create a test login and test database
-CREATE LOGIN testuser WITH PASSWORD = 'CeRT=0=TeST'
-CREATE DATABASE certtest
-go
--- Move to the test database.
-USE certtest
-go
--- Create the test user.
-CREATE USER testuser
-go
--- Create the test table and add some data.
-CREATE TABLE testtbl (a int NOT NULL,
- b int NOT NULL)
-INSERT testtbl (a, b) VALUES (47, 11)
-go
--- Create two test stored procedures, and grant permission.
-CREATE PROCEDURE unsigned_sp AS
- SELECT SYSTEM_USER, USER, name, type, usage FROM sys.user_token
- EXEC ('SELECT a, b FROM testtbl')
-go
-CREATE PROCEDURE example_sp AS
- SELECT SYSTEM_USER, USER, name, type, usage FROM sys.user_token
- EXEC ('SELECT a, b FROM testtbl')
- -- EXEC unsigned_sp
-go
-GRANT EXECUTE ON example_sp TO public
-GRANT EXECUTE ON unsigned_sp TO public
-go
--- Create the certificate.
-CREATE CERTIFICATE examplecert
- ENCRYPTION BY PASSWORD = 'All you need is love'
- WITH SUBJECT = 'Certificate for example_sp',
- START_DATE = '20020101', EXPIRY_DATE = '20200101'
-go
--- Create the certificate user and give it rights to access the test table.
-CREATE USER examplecertuser FROM CERTIFICATE examplecert
-GRANT SELECT ON testtbl TO examplecertuser
-go
--- Sign the procedure.
-ADD SIGNATURE TO example_sp BY CERTIFICATE examplecert
- WITH PASSWORD = 'All you need is love'
-go
--- Run as the test user, to actually see that this works.
-EXECUTE AS USER = 'testuser'
-go
--- First run the unsigned procedure. This gives a permission error.
-EXEC unsigned_sp
-go
--- Then run the signed procedure. Now we get the data back.
-EXEC example_sp
-go
--- Become ourselves again.
-REVERT
-go
--- Clean up
-USE master
-DROP DATABASE certtest
-DROP LOGIN testuser
As you can see, I added this statement to the two test procedures in the
- example:
-
SELECT SYSTEM_USER, USER, name, type, usage FROM sys.user_token
-
When we run unsigned_sp, this returns
-
SYSTEM_USER USER name type usage
------------- ---------- --------- --------- --------------
-testuser testuser testuser SQL USER GRANT OR DENY
-testuser testuser public ROLE GRANT OR DENY
-
What this tells us is that we are logged in as testuser, and this is also the
- name of the user in the database. There are two rows in sys.user_token, one
- for the user, and one for the single role that testuser is a member of.
-
But when we run example_sp, which is signed, there is an extra line:
-
SYSTEM_USER USER name type usage
----------- -------- ----------- --------------------------- ---------------
-testuser testuser testuser SQL USER GRANT OR DENY
-testuser testuser public ROLE GRANT OR DENY
-testuser testuser examplecertuser USER MAPPED TO CERTIFICATE GRANT OR DENY
-
We see here that the user for the certificate has been added
- to the user token, so its permissions can apply as well. We can also see that we still
- are testuser, and no one else. This may seem like a pointless thing to
- mention, but as we shall see later, this is not the case when you use
- EXECUTE AS.
-
As you see, example_sp includes a call to unsigned_sp that has been
- commented out. If you remove that comment, and run the script again, when you call unsigned_sp from example_sp, you get a permission error just like when unsigned_sp is called directly.
- You will also see in the output from sys.user_token, that
- examplecertuser is not there.
-
There is one situation where certificate signing does not work. If the user has explicitly been denied access to one or more of the tables in the query with the DENY command, this takes precedence over the permissions granted to the certificate user. This is different from ownership chaining, where DENY never interferes with the permissions given through the stored procedure. (This is because ownership chaining suppresses the permission check altogether.) As will see later, this obstacle does not exist when you use impersonation with EXECUTE AS.
Another common situation where ownership chaining does not suffice is when
- you need to give users permissions to empty a table and reload it with BULK INSERT
- from a file. Here is a very simple procedure for this task:
-
CREATE PROCEDURE reload_sp AS
- TRUNCATE TABLE reloadable
- BULK INSERT reloadable FROM 'E:\temp\reloadable.csv'
- WITH (FIELDTERMINATOR=',', ROWTERMINATOR='\n')
-
Ownership chaining fails here for two reasons: 1) it does not apply to
- TRUNCATE TABLE. 2) to perform bulk operations, you need the
- server-level permission ADMINISTER BULK OPERATIONS or membership in the fixed server role bulkadmin.
-
You can address this by signing reload_sp, but this is more
- complicated than in the previous example, because you can only add server permissions when you are in the master database.
- Therefore, to set up reload_sp so it can be executed by an
- unprivileged user, there are no less than ten steps to go through:
-
-
Create a certificate in the master database.
-
Create a login for that certificate.
-
Grant that login rights to perform bulk operations.
-
Export the certificate to file.
-
Switch to the application database.
-
Import the certificate from the file.
-
Delete the file from disk.
-
Create a user for the certificate.
-
Grant the certificate user rights to truncate the target table and insert into it.
-
Sign the stored procedure with the certificate, each time you have
- changed the procedure.
-
-
In SQL Server 2012 the steps 4, 6 and 7 can be carried out in a different way. Since SQL 2012 at this writing still is in beta, I put the focus on the steps that works in all versions from SQL 2005 and on, and cover the new features in SQL 2012 later.
-
First some example code for the bit in master.
-
USE master
-go
-CREATE CERTIFICATE reloadcert
- ENCRYPTION BY PASSWORD = 'All you need is love'
- WITH SUBJECT = 'For bulk-load privileges',
- START_DATE = '20020101', EXPIRY_DATE = '20200101'
-go
-CREATE LOGIN reloadcert_login FROM CERTIFICATE reloadcert
-go
-GRANT ADMINISTER BULK OPERATIONS TO reloadcert_login
-go
-BACKUP CERTIFICATE reloadcert TO FILE = 'C:\temp\reloadcert.cer'
-WITH PRIVATE KEY (FILE = 'C:\temp\reloadcert.pvk' ,
- ENCRYPTION BY PASSWORD = 'Tomorrow never knows',
- DECRYPTION BY PASSWORD = 'All you need is love')
-go
-
The creation of the certificate is the same as in the example with dynamic
- SQL. Since we need to grant a server
- permission, a mere certificate user won't do, but we must associate the
- certificate with a login. (Or more in line with the lingo introduced in SQL 2005, a
- server principal. "Login" is a misnomer here, as the login created for a
- certificate cannot actually log in.) Next we grant the certificate login
- the rights to run bulk load.
-
Finally we export the certificate to disk with the command BACKUP CERTIFICATE. The certificate consists of two parts: a public key which goes into
- the first file, and a private key. The private key requires a password on its
- own, Tomorrow never knows, in this example. The path where to write the files is a small complication that I will come back to. In this example I use C:\temp to keep the script simple. However, you may find that C:\temp does not work for you, because it does not exist at all, or the service account for SQL Server does not have permission to this directory.
-
Here are the parts you would run in the application database:
-
CREATE CERTIFICATE reloadcert FROM FILE = 'C:\temp\reloadcert.cer'
-WITH PRIVATE KEY (FILE = 'C:\temp\reloadcert.pvk',
- DECRYPTION BY PASSWORD = 'Tomorrow never knows',
- ENCRYPTION BY PASSWORD = 'A day in life')
-go
-EXEC xp_cmdshell 'DEL C:\temp\reloadcert.*'
-go
-CREATE USER reloadcert_user FOR CERTIFICATE reloadcert
-go
-GRANT ALTER, INSERT ON reloadable TO reloadcert_user
-go
--- Sign the test procedure each time you have changed it.
-ADD SIGNATURE TO reload_sp BY CERTIFICATE reloadcert
- WITH PASSWORD = 'A day in life'
-go
-
Here we use CREATE CERTIFICATE in a different way
- than before. Instead of creating
- a new certificate, we import the certificate
- that we exported from master. We need to specify the password for the
- private key to be able to access the file. We must also define a password for the certificate in this
- database. In this example, I'm using different passwords for the certificate
- in master and in the application database just to show you that this is
- possible. It's
- probably more practical to use the same password in both databases, though.
-
We delete the files with the certificate from disk. This is a security precaution, since any database
-owner on the machine could load the certificate into his database. But it is also a matter of convenience; if you re-run the script and the certificate files are already on disk, BACKUP CERTIFICATE will fail.
-
Note: xp_cmdshell
- is disabled by default. An alternative is to delete the file directly from Windows manually.
-
Next, we create the certificate user. This user is not related to the
- login for the certificate, and I've stressed this by giving them different names.
- Again, in practice, you may prefer to use the same name for both. We grant the
- certificate user the database permissions that are needed:
- ALTER permission for TRUNCATE TABLE, and INSERT permission for BULK INSERT.
- Finally, we sign the procedure, using the password for the certificate in this
- database.
-
We are almost done, but if you do all this and try to run the procedure reload_sp
- as a non-privileged user, you will nevertheless get an error message that you don't have
- permissions to do bulk load. Because of a
- bug in SQL
- Server, we need to modify the procedure:
-
CREATE PROCEDURE reload_sp AS
- TRUNCATE TABLE reloadable
- EXEC('BULK INSERT reloadable FROM ''C:\temp\reloadtest.csv''
- WITH (FIELDTERMINATOR='','', ROWTERMINATOR=''\n'')')
-
This bug is specific to bulk-load permissions, and I have not found any other
- server-level permission that has the same issue. (The specifics of the bug
- are
- that SQL Server checks the permissions for BULK INSERT
- before the certificate has been added to the user token. By putting BULK INSERT in an inner scope with dynamic SQL, we can work around the bug.)
As in the previous example there are two procedures, one signed and one
- unsigned, and I've
- added SELECT from sys.login_token and sys.user_token, so
- that you
- can see how the certificate login and the certificate user are added and deleted. (Again, please refer to
- the introductory note for general notes on the
- examples.) If you get errors when you run the script that C:\temp does not exist, or you get permissions errors with C:\temp, see below.
-
USE master
-go
--- Create a test file for bulk load.
-EXEC xp_cmdshell 'ECHO 978,123,234 > C:\temp\reloadtest.csv', no_output
-EXEC xp_cmdshell 'ECHO -98,13,85 >> C:\temp\reloadtest.csv', no_output
-go
--- Create a test login.
-CREATE LOGIN testuser WITH PASSWORD = 'CeRT=0=TeST'
-go
--- Create test database.
-CREATE DATABASE bulkcerttest
-go
--- Create certificate in master.
-CREATE CERTIFICATE reloadcert
- ENCRYPTION BY PASSWORD = 'All you need is love'
- WITH SUBJECT = 'For bulk-load privileges',
- START_DATE = '20020101', EXPIRY_DATE = '20200101'
-go
--- Create a login for the certificate.
-CREATE LOGIN reloadcert_login FROM CERTIFICATE reloadcert
-go
--- Grant rights for the certificate login.
-GRANT ADMINISTER BULK OPERATIONS TO reloadcert_login
-go
--- Save the certificate to disk.
-BACKUP CERTIFICATE reloadcert TO FILE = 'C:\temp\reloadcert.cer'
-WITH PRIVATE KEY (FILE = 'C:\temp\reloadcert.pvk' ,
- ENCRYPTION BY PASSWORD = 'Tomorrow never knows',
- DECRYPTION BY PASSWORD = 'All you need is love')
-go
--- Move to test database.
-USE bulkcerttest
-go
--- Create the non-priv user.
-CREATE USER testuser
-go
--- A test table.
-CREATE TABLE reloadable (a int NOT NULL,
- b int NOT NULL,
- c int NOT NULL)
-go
--- Insert some test data. If test succeeds, this data should disappear.
-INSERT reloadable (a, b, c) VALUES (12, 23, 34)
-go
--- Test procedure with BULK INSERT. BULK INSERT needs to be in
--- EXEC() because of a bug in SQL Server.
-CREATE PROCEDURE reload_sp AS
- SELECT name, type, usage FROM sys.login_token
- SELECT name, type, usage FROM sys.user_token
- TRUNCATE TABLE reloadable
- EXEC('BULK INSERT reloadable FROM ''C:\temp\reloadtest.csv''
- WITH (FIELDTERMINATOR='','', ROWTERMINATOR=''\n'')')
-go
--- The same code, but this procedure we will not sign.
-CREATE PROCEDURE unsigned_sp AS
- SELECT name, type, usage FROM sys.login_token
- SELECT name, type, usage FROM sys.user_token
- --TRUNCATE TABLE reloadable
- EXEC('BULK INSERT reloadable FROM ''C:\temp\reloadtest.csv''
- WITH (FIELDTERMINATOR='','', ROWTERMINATOR=''\n'')')
-go
--- Give test user right to execute the procedures.
-GRANT EXECUTE ON reload_sp TO testuser
-GRANT EXECUTE ON unsigned_sp TO testuser
-go
--- Import the certificate we created in master into the test database.
-CREATE CERTIFICATE reloadcert FROM FILE = 'C:\temp\reloadcert.cer'
-WITH PRIVATE KEY (FILE = 'C:\temp\reloadcert.pvk',
- DECRYPTION BY PASSWORD = 'Tomorrow never knows',
- ENCRYPTION BY PASSWORD = 'A day in life')
-go
--- Delete the files.
-EXEC master..xp_cmdshell 'DEL C:\temp\reloadcert.*', 'no_output'
-go
--- And create a user for the certificate.
-CREATE USER reloadcert_user FOR CERTIFICATE reloadcert
-go
--- Grant this user rights to truncate and insert to the test table.
-GRANT ALTER, INSERT ON reloadable TO reloadcert_user
-go
--- Sign the test procedures.
-ADD SIGNATURE TO reload_sp BY CERTIFICATE reloadcert
- WITH PASSWORD = 'A day in life'
-go
--- Switch to the test user.
-EXECUTE AS LOGIN = 'testuser'
-go
--- Run the unsigned procedure. You will get a permission error.
-EXEC unsigned_sp
-go
--- Run the real reload procedure.
-EXEC reload_sp
-go
--- Back to ourselves.
-REVERT
-go
--- The data in the table has been replaced.
-SELECT a, b, c FROM reloadable
-go
--- Clean up.
-USE master
-go
-DROP DATABASE bulkcerttest
-DROP LOGIN reloadcert_login
-DROP CERTIFICATE reloadcert
-DROP LOGIN testuser
-EXEC xp_cmdshell 'DEL C:\temp\reloadtest.csv', 'no_output'
-
In unsigned_sp I have commented TRUNCATE TABLE, in order to
- demonstrate the error you get because lack of bulk permissions. If you
- uncomment TRUNCATE TABLE, you will get a different permission error from
- unsigned_sp.
-
One problem here is that we need to bounce the certificate over disk. To do this, you need to determine a directory where you can write the certificate. This can be particularly difficult if you need to do this in a deployment script to be run on servers you never have seen. In this example, I used C:\temp for the sake of simplicity, but C:\temp does not exist on all servers. Even if it does, the service account for SQL Server may not have write access to that folder. If you leave out the path entirely, BACKUP CERTIFICATE will write the files to the default directory for new databases and likewise CREATE CERTIFICATE will read from this directory. It's reasonable to expect that SQL Server has write access to this folder, so far so good. Unfortunately, this path is not easily determined from within SQL Server, so there is a challenge if you want to delete the files programmatically from your deployment script. One way to get a path that is known to be writeable is this SELECT:
-
SELECT substring(physical_name, 1, len(physical_name) - charindex('\', reverse(physical_name)) + 1) FROM sys.database_files WHERE file_id = 1
-
This retrieves the path to the directory where the first file for the current database resides. You would use this path throughout the script, which means that BACKUP/CREATE CERTIFICATE has to be embedded in dynamic SQL, as they don't accept variables for the file name.
-
CREATE CERTIFICATE FROM BINARY in SQL 2012
-
It would certainly be convenient, if you could copy a certificate directly from one database to another without bouncing it over disk, and there is a new feature in SQL Server 2012 that permits you to do this. There is a new clause to CREATE CERTIFICATE: FROM BINARY which permits you to specify the certificate as a binary constant. SQL 2012 also offers two new functions certencoded and certprivatekey which permits you to retrieve the public and the private keys of the certificate. Thus, you can say:
Almost. The functions do not accept the name for the certificate, but they want the the certificate id in sys.certificates. You can retrieve it with the cert_id function, see example below for how to use it. Furthermore, CREATE CERTIFICATE does not accept variables for the binary value, but you must provide a constant, which means that you are in for some dynamic SQL.
-
To use this new functionality to copy a certificate between databases, we replace the steps 4-7 above to read:
-
-
Save the keys of the certificae to a temp table.
-
Switch to the application database.
-
Create the certificate from the data in the temp table.
-
Drop the temp table.
-
-
The reason we like to use a temp table is that our example script is split into a number of batches. We cannot use variables, as they exist only for the duration of a batch. Whence the temp table. This is how step 4 looks like:
-
CREATE TABLE #keys (pubkey varbinary (MAX) NOT NULL,
- privkey varbinary(MAX) NOT NULL)
-INSERT #keys (pubkey, privkey)
-SELECT certencoded(cert_id('reloadcert')),
- certprivatekey(cert_id('reloadcert'), 'Tomorrow never knows',
- 'All you need is love')
-
The passwords you pass to certprivatekey correspond to the passwords we used with BACKUP CERTIFICATE above. That is, the first password is the password for the private key, which you have to make up at this point. The second password is the password for the public key that you used when you created the certificate in master.
-
Since we need to use dynamic SQL to create the certificate from the data in the temp table, this part gets a little more complicated than it would have to be. Here is how it looks with our bulk-copy example:
-
DECLARE @sql nvarchar(MAX)
-SELECT @sql =
- 'CREATE CERTIFICATE reloadcert
- FROM BINARY = ' + convert(nvarchar(MAX), pubkey, 1) + '
- WITH PRIVATE KEY (BINARY = ' + convert(nvarchar(MAX), privkey, 1) + ',
- DECRYPTION BY PASSWORD = ''Tomorrow never knows'',
- ENCRYPTION BY PASSWORD = ''A day in life'')'
-FROM #keys
-
PRINT @sql
-EXEC (@sql)
-DROP TABLE #keys
-
A key here is the third argument to the convert function; this converts the binary value to a hex-string with a leading 0x. This style to convert was added in SQL 2008, in case you are not familiar with it. If you compare with the CREATE CERTIFICATE command when we imported the certificate from a file, this is very similar; all that has changed is that FILE is now BINARY and the extra syntactical fireworks imposed to us because we have to use dynamic SQL.
-
Before we execute the command, we print it, so we can understand what is going on if there is a syntax error in our dynamic SQL. Finally, we drop the temp table as a safety precaution. If we would leave it around, we could run into problems later if we would re-run the script or run a similar script from the same query window.
-
The script bulkcopy-2012.sql has the full example for bulk-load for SQL 2012, using CREATE CERTIFICATE FROM BINARY.
-
All and all, this is a welcome addition to SQL 2012, since it makes it easier to copy certificates between databases. Not so much for the different syntax, but you don't have to worry about disk paths in your scripts.
When you need to write a stored procedure that accesses data in another
- database, you can arrange permissions by signing your procedure with a
- certificate that exists in both databases. The steps are similar to the
- bulk-copy case, so I will go directly to an example
- script.
-
There are two things to note with this script: 1) testuser is never
- granted access to db1. That is, by signing your procedures with a
- certificate, you can give users access to data in a database they do not have
- access to themselves. This is different from ownership chaining, where the user must
- have been granted access to the target database. 2) I don't create
- any user for the certificate in db2, simply because in this example no permissions are
- needed to be granted through the certificate in db2.
-
Here is the script (please see the introductory
- note for general notes on the example scripts):
-
USE master
-go
--- Create a test login.
-CREATE LOGIN testuser WITH PASSWORD = 'CeRT=0=TeST'
-go
--- Create test two databases
-CREATE DATABASE db1
-CREATE DATABASE db2
-go
--- Move to first test database.
-USE db1
-go
--- Create certificate in db1
-CREATE CERTIFICATE crossdbcert
- ENCRYPTION BY PASSWORD = 'Lucy in the Skies with Diamonds'
- WITH SUBJECT = 'Cross-db test',
- START_DATE = '20020101', EXPIRY_DATE = '20200101'
-go
--- Save the certificate to disk.
-BACKUP CERTIFICATE crossdbcert TO FILE = 'C:\temp\crossdbcert.cer'
-WITH PRIVATE KEY (FILE = 'C:\temp\crossdbcert.pvk' ,
- ENCRYPTION BY PASSWORD = 'She said She said',
- DECRYPTION BY PASSWORD = 'Lucy in the Skies with Diamonds')
-go
--- Create the certificate user. Note that we do not grant access to
--- testuser.
-CREATE USER certuser FROM CERTIFICATE crossdbcert
-go
--- A test table.
-CREATE TABLE testtbl (a int NOT NULL,
- b int NOT NULL,
- c int NOT NULL)
-go
--- Insert some test data.
-INSERT testtbl (a, b, c) VALUES (12, 23, 34)
-go
--- The certificate user needs to access this table.
-GRANT SELECT ON testtbl TO certuser
-go
--- Switch to the second database.
-USE db2
-go
--- Welcome the test user to this database.
-CREATE USER testuser
-go
--- Signed test procedure.
-CREATE PROCEDURE signed_sp AS
- SELECT a, b, c FROM db1..testtbl
-go
--- Same code, but we will leave this one unsigned.
-CREATE PROCEDURE unsigned_sp AS
- SELECT a, b, c FROM db1..testtbl
-go
--- Give test user right to execute the procedures.
-GRANT EXECUTE ON signed_sp TO testuser
-GRANT EXECUTE ON unsigned_sp TO testuser
-go
--- Import the certificate we created in the first test database into the second.
-CREATE CERTIFICATE crossdbcert FROM FILE = 'C:\temp\crossdbcert.cer'
-WITH PRIVATE KEY (FILE = 'C:\temp\crossdbcert.pvk',
- DECRYPTION BY PASSWORD = 'She said She said',
- ENCRYPTION BY PASSWORD = 'Helter Skelter')
-go
--- Delete the file with the certificate.
-EXEC master..xp_cmdshell 'DEL C:\temp\crossdbcert.*', 'no_output'
-go
--- Sign the test procedures.
-ADD SIGNATURE TO signed_sp BY CERTIFICATE crossdbcert
- WITH PASSWORD = 'Helter Skelter'
-go
--- Switch to the test login.
-EXECUTE AS LOGIN = 'testuser'
-go
--- Run the unsigned procedure. You will get a permission error.
-EXEC unsigned_sp
-go
--- Run the signed procedure. testuser can now access testdbl, even though
--- he is not a user of db1.
-EXEC signed_sp
-go
--- Back to ourselves.
-REVERT
-go
--- Clean up.
-USE master
-go
-DROP DATABASE db1
-DROP DATABASE db2
-DROP LOGIN testuser
-
See the file crossdb-2012.sql for a version that uses the new FROM BINARY clause on SQL Server 2012 to copy the certificate.
-
-
Counter Signatures
-
If you look up the command ADD SIGNATURE in Books Online, you will find that there is an optional keyword COUNTER which you can put before SIGNATURE, but in Books Online for SQL 2005 and SQL 2008 there is no information what this keyword means. It was added to Books Online first with SQL 2008 R2. Before that, the only place to learn about counter signatures was a a blog post from Laurenţiu Cristofor. He was one of the Program Managers for the security enhancements in SQL 2005.
-
When you counter-sign a procedure P1 with a certificate C, this has in itself no effect at all, even if permissions has been granted to a user for that certificate. But assume that there is also a procedure P2 that has been signed (and not counter-signed) with C, and that P2 calls P1. Normally, when you call an inner procedure from a signed procedure, the certificate user is removed from the user token. But when P1 is counter-signed with C, the certificate user remains in the user token. The net effect of this is that you can get the powers of P1 only if you call it through P2.
-
How could we use this? Here is one example. Assume that we have generic search procedure that in itself permits users to search all data. However, there are business rules that say that users may only see customers (or products or whatever) they have access to according to some scheme. These rules are enforced by an outer procedure that computes the values for some of the parameters to the inner procedure, thereby constraining the search. In the example below, this is extremely simple: the user may only see rows he owns. In a real-world scenario, both procedures would be far more elaborate. (Please see the introductory
-note for general notes on the example scripts).
-
USE master
-go
--- Create a test login and test database.
-CREATE LOGIN testuser WITH PASSWORD = 'CeRT=0=TeST'
-CREATE DATABASE certtest
-go
--- Move to the test database.
-USE certtest
-go
--- Create the test user, and grant him permission to execute any
--- stored procedure.
-CREATE USER testuser
-GRANT EXECUTE TO testuser
-go
--- Create a test table and add some data.
-CREATE TABLE testtbl (a int NOT NULL,
- b int NOT NULL,
- owner sysname NOT NULL)
-INSERT testtbl (a, b, owner) VALUES (47, 11, 'testuser')
-INSERT testtbl (a, b, owner) VALUES (17, 89, 'someotheruser')
-go
--- This is the inner procedure that permits you to view all data,
--- but the selection could be constrained to a certain owner.
-CREATE PROCEDURE inner_sp @owner sysname = NULL AS
- SELECT SYSTEM_USER, USER, name, type, usage FROM sys.user_token
- DECLARE @sql nvarchar(MAX)
- SELECT @sql = N'SELECT a, b FROM testtbl WHERE 1 = 1 '
- IF @owner IS NOT NULL
- SELECT @sql = @sql + ' AND owner = @owner'
- EXEC sp_executesql @sql, N'@owner sysname', @owner
-go
--- The outer procedure which forces the owner to be the current user.
-CREATE PROCEDURE outer_sp AS
- SELECT SYSTEM_USER, USER, name, type, usage FROM sys.user_token
- DECLARE @owner sysname
- SELECT @owner = SYSTEM_USER
- EXEC inner_sp @owner
-go
--- Create the certificate.
-CREATE CERTIFICATE examplecert
- ENCRYPTION BY PASSWORD = 'Being for the benefit of Mr Kite'
- WITH SUBJECT = 'Certificate for counter-sign example',
- START_DATE = '20020101', EXPIRY_DATE = '20200101'
-go
--- Create the certificate user and grant access the test table.
-CREATE USER examplecertuser FROM CERTIFICATE examplecert
-GRANT SELECT ON testtbl TO examplecertuser
-go
--- Sign the outer procedure.
-ADD SIGNATURE TO outer_sp BY CERTIFICATE examplecert
- WITH PASSWORD = 'Being for the benefit of Mr Kite'
-go
--- And counter-sign the inner procedure.
-ADD COUNTER SIGNATURE TO inner_sp BY CERTIFICATE examplecert
- WITH PASSWORD = 'Being for the benefit of Mr Kite'
-go
--- Run as the test user, to actually see that this works.
-EXECUTE AS USER = 'testuser'
-go
--- First run the inner procedure directly. This gives a permission
--- error.
-EXEC inner_sp
-go
--- Then run the outer procedure. Now we get the data back, but
--- only what we are permitted to see.
-EXEC outer_sp
-go
--- Become ourselves again.
-REVERT
-go
--- Clean up.
-USE master
-DROP DATABASE certtest
-DROP LOGIN testuser
-
True, this could also be implemented by signing inner_sp with the certificate directly, and then make sure that users does not have EXECUTE permission on this procedure, for instance with an explicit DENY. Thanks to ownership signing, users would still be able to call the inner procedure if they come from the outer procedure. But this would require you to manage two security mechanisms to achieve your goal, whereas with counter-signing you only need one.
-
Here is a second example, inspired by a newsgroup question. A poster wanted users of an application to be able to start a certain job with sp_start_job. To be able to start a job owned by someone else, you need to be member of the fixed role SQLAgentOperatorRole in msdb. A start is to write a stored procedure that calls sp_start_job for this specific job, sign that procedure with a certificate, and then create a user from the certificate and make that user a member of SQLAgentOperatorRole.
-
We have learnt previously that when you call a system procedure, the certificate user remains in the user token, and thus you can take benefit of the permissions granted to the certificate user. But it turns out that the procedures in msdb are not system procedures in that sense. So we need to sign sp_start_job as well, but a normal signature is not a very good idea since this would permit users to start any job. Instead we counter-sign sp_start_job with the same certificate that we sign the wrapper procedure with, and we are almost there. I found by testing that sp_start_job calls two other procedures, sp_sqlagent_notify and sp_verify_job_identifiers, and they must be counter-signed as well.
-
I should hasten to add, that this solution is not unquestionable. Does Microsoft support signing of msdb procedures? If you install a service pack or a hotfix, you will need to reapply the signatures if Microsoft replaces the procedures with updated versions. They may also restructure the code, requiring you to counter-sign a different set of procedures.
-
Nevertheless, here is a complete script that demonstrates this technique. Note that to run it successfully, you need to have SQL Server Agent running, and you need to create a job called Testjob (which can do PRINT 'Hello world!' or whatever.) As always, please see the introductory
-note for general notes on the example scripts. For the SQL 2012 version, please see the file jobstart-2012.sql.
-
USE master
-go
--- Create a test login.
-CREATE LOGIN testuser WITH PASSWORD = 'CeRT=0=TeST'
-go
--- Create test database.
-CREATE DATABASE jobstarttest
-go
-USE msdb
--- Create certificate in msdb.
-CREATE CERTIFICATE jobstartcert
- ENCRYPTION BY PASSWORD = 'Strawberry Fields Forever'
- WITH SUBJECT = 'To permit starting the Testjob',
- START_DATE = '20020101', EXPIRY_DATE = '20200101'
-go
--- Create a user for the certificate.
-CREATE USER jobstartcert_user FROM CERTIFICATE jobstartcert
-go
--- Grant rights for the certificate login to run jobs.
-EXEC sp_addrolemember SQLAgentOperatorRole, jobstartcert_user
-go
--- Counter-sign sp_start_job and its subprocedures.
-ADD COUNTER SIGNATURE TO sp_start_job BY CERTIFICATE jobstartcert
- WITH PASSWORD = 'Strawberry Fields Forever'
-ADD COUNTER SIGNATURE TO sp_verify_job_identifiers BY CERTIFICATE jobstartcert
- WITH PASSWORD = 'Strawberry Fields Forever'
-ADD COUNTER SIGNATURE TO sp_sqlagent_notify BY CERTIFICATE jobstartcert
- WITH PASSWORD = 'Strawberry Fields Forever'
-go
--- Save the certificate to disk.
-BACKUP CERTIFICATE jobstartcert TO FILE = 'C:\temp\jobstartcert.cer'
-WITH PRIVATE KEY (FILE = 'C:\temp\jobstartcert.pvk' ,
- ENCRYPTION BY PASSWORD = 'Looking through a Glass Onion',
- DECRYPTION BY PASSWORD = 'Strawberry Fields Forever')
-go
--- Move to test database.
-USE jobstarttest
-go
--- Create a database user for the test login.
-CREATE USER testuser
-go
--- Create a procedure that starts a certain job.
-CREATE PROCEDURE start_this_job AS
- EXEC msdb..sp_start_job 'Testjob'
-go
--- Give test user right to execute the procedure.
-GRANT EXECUTE ON start_this_job TO testuser
-go
--- Import the certificate we created in msdb into the test database.
-CREATE CERTIFICATE jobstartcert FROM FILE = 'C:\temp\jobstartcert.cer'
-WITH PRIVATE KEY (FILE = 'C:\temp\jobstartcert.pvk',
- DECRYPTION BY PASSWORD = 'Looking through a Glass Onion',
- ENCRYPTION BY PASSWORD = 'Fixing a Hole')
-go
--- Delete the files.
-EXEC master..xp_cmdshell 'DEL C:\temp\jobstartcert.*', 'no_output'
-go
--- Sign the test procedures.
-ADD SIGNATURE TO start_this_job BY CERTIFICATE jobstartcert
- WITH PASSWORD = 'Fixing a Hole'
-go
--- Switch to the test user.
-EXECUTE AS LOGIN = 'testuser'
-go
--- Start the job, this succeeds.
-EXEC start_this_job
-go
--- Back to ourselves.
-REVERT
-go
--- Clean up.
-USE msdb
-go
-DROP COUNTER SIGNATURE FROM sp_sqlagent_notify
- BY CERTIFICATE jobstartcert
-DROP COUNTER SIGNATURE FROM sp_verify_job_identifiers
- BY CERTIFICATE jobstartcert
-DROP COUNTER SIGNATURE from sp_start_job
- BY CERTIFICATE jobstartcert
-DROP USER jobstartcert_user
-DROP CERTIFICATE jobstartcert
-go
-USE master
-go
-DROP DATABASE jobstarttest
-DROP LOGIN testuser
Instead of signing your procedure with certificate, you can use asymmetric keys.
- You create an asymmetric key in SQL Server
- with the command CREATE ASYMMETRIC KEY. The
- syntax is similar, but not identical, to CREATE
- CERTIFICATE. Please see Books Online for details.
-
From a cryptographic point of view, a certificate is an asymmetric key that has
- an issuer and an expiration date. Since it has an issuer, a certificate can
- participate in a chain of trust, which is important in for instance Service
- Broker dialogues. When it comes to signing stored procedures, I have (with
- quite some help from Razvan Socol) identified the following practical
- differences:
-
-
An asymmetric key never expires, which for procedure-signing purposes is a
- slight advantage.
-
You don't have to specify a subject for an asymmetric key.
-
You cannot export an asymmetric key from a database. If you want to sign
- procedures in two databases with the same key, you could create an
- asymmetric key outside SQL Server and
- import it into the databases. (This is possible.) I will need to add the
- disclaimer that I have not tested whether this actually works.
-
The fact that an asymmetric key cannot be exported, can on the other hand
- be seen as a security advantage, as someone cannot take your key into another
- database without your knowing.
-
The key for a certificate in SQL Server is
- always 1024 bits, where as for an asymmetric key you can choose between
- 512, 1024 and 2048 bits. It's possible that there is a performance gain by
- using a shorter key for signing your procedures. However, I have not
- tested this, nor have I had it confirmed, so it's pure speculation on my
- part.
-
-
All and all, I can't find any of these points convincing enough to mandate
- any over the other. I have preferred to talk only about certificates in the
- main part of this text to simplify the presentation.
To see which procedures that have been signed in a database, you can run
- this query. crypt_type_desc will tell you whether the procedure is signed with a certificate or an asymmetric key, and whether it's regularly signed or counter-signed.
-
SELECT Module = object_name(cp.major_id),
- [Cert/Key] = coalesce(c.name, a.name),
- cp.crypt_type_desc
-FROM sys.crypt_properties cp
-LEFT JOIN sys.certificates c ON c.thumbprint = cp.thumbprint
-LEFT JOIN sys.asymmetric_keys a ON a.thumbprint = cp.thumbprint
-
To find the users mapped to certificates, you can use this query:
-
SELECT certname = c.name, "username" = dp.name
-FROM sys.certificates c
-JOIN sys.database_principals dp ON c.sid = dp.sid
-
In the same vein, to find logins mapped to certificates:
-
SELECT certname = c.name, loginname = sp.name
-FROM master.sys.certificates c
-JOIN sys.server_principals sp ON c.sid = sp.sid
-
(Queries for users/logins mapped to asymmetric keys are similar.)
-
If you want to find all databases where a certificate has
- been used, you will need to query them all, using the thumbprint and/or the
- subject as the key.
Normally passwords should be strong and kept secret, but I have already
- hinted that for procedure signing this may not always be necessary.
-
Let's first consider the case when you use a certificate to grant permissions on database level. What if an unauthorised user learns the password for a certificate that is used to sign one or more procedures? To be able to use the password for some evil, he would first need to have the rights to create procedures in some schema. Furthermore, to use ADD SIGNATURE he needs CONTROL permission on the certificate. In practice you would only have that permission if you are member of the db_owner role, in which case you can create your own certificates and sign procedures with them all day long. The potential threat I can see is that another database owner could borrow your keyboard while you are away, and export a certificate that gives access to some sensitive table. He could import the certificate into his database and sign a procedure that reads this data. Of course, he could just as well create a new certificate when he uses your keyboard, but if he uses an existing certificate the data theft is more likely to go unnoticed.
-
All and all, for certificates used for procedure signing on database level, the password is not your biggest secret. Nevertheless, below I present an approach that permits throw away the password altogether so that no one knows it, not even you.
-
Let's now look at using certificates to grant server-level permissions. (I am not discussing cross-database access specifically, but what I say here can be applied to cross-database access as well.) There is the plain and simple case where everyone who has db_owner rights in the user databases also are members of sysadmin or have CONTROL SERVER. This scenario is no different from database permissions: there isn't really anyone to hide the password for. All examples presented this far have been written under this assumption, since I wanted to focus on the mechanism as such. But if there are users who have db_owner rights in a database without being sysadmin, it's a different story. Here you need to apply care.
-
Say that you are the DBA on a consolidated server and you are approached by an application admin, let's call her Anna DeMin who has db_owner rights in the database for her application. Anna has written the procedure reload_sp and wants you to sign it. To this end, you first review her code to ensure that she reads from the directory allotted for her application. You can then follow the steps outlined in the example script we saw previously.
-
In this situation, you need to make sure that Anna's does not learn the password for the certificate that you create in her database, since else she could change the procedure to read from somewhere else. You also need to hide the password for the private key, or delete it from disk directly so she cannot import it. Here is much of the beauty with certificates: as a server DBA, you can have full control over what permissions you have granted to user databases and to what code. To do that, you need to be able to manage your passwords.
-
Now, if you are a server DBA, I can hear you say that you don't have the time for all this, and you trust your application admins, so you will give Anna the cert and the password, and that's that. Of course, if you trust your colleagues that's great, but no matter whether you do or not, I have a script for you that permits you to automate most of this process. The one step I cannot automate for you is the code review.
-
The key points of the script.
-
-
There is one certificate for each procedure you sign. Every time you need to re-sign a procedure after a change, the script throws the old certificate away and creates a new one. All certificates have names that start with SIGN followed by the fully qualified name of the signed procedure. The subject also includes the permissions granted. Thus, you can easily review which permissions you have granted by querying sys.certificates in master. Logins have the same names as the certificates.
-
The password are GUIDs (with some extra characters to make sure that they pass the complexity rules enforced by Windows), and they are used only for the duration of the script and not saved.
-
When the procedure has been signed, the private key is removed from the certificate with ALTER CERTIFICATE cert REMOVE PRIVATE KEY. Once the private key has been removed, the certificate is only good for validation, but cannot be used to sign any new procedures.
-
The script does not grant database-level permissions. In the bulk-load example, we granted INSERT and ALTER permissions on the target table. The application admin needs to create a separate certificate for this. Keep in mind that a procedure can be signed by more than one certificate.
-
-
The script does have any support for counter-signatures, but if you need this, you could extend the script for this purpose.
-
The script consists of two parts. The first part is the setup part, where you need define three things: 1) The target database. 2) The stored procedure (or function or trigger) to sign. 3) The server-level permission(s) to grant. Everything below the line with ====== is the fixed part that you normally don't have to change. (Why is this a script and not a stored procedure? I wrote it as a script, because I figure that if you administer many servers, it is better to have as script on disk than installing a stored procedure on every server. Particularly, if you change the script by time, it's good to have a single copy of it.)
-
Here are all the steps the script takes. Note that if there is an error, the script aborts on the spot.
-
-
Validate and normalise database and procedure names. This is to make sure that the script always generates the same name for the certificate, even if you use different case or is inconsistent with specifying the schema.
-
Generate the name, subject and password for the certificate.
-
If a login with the certificate name exists, drop it.
-
Drop any old certificate in master.
-
If the procedure is signed with the old certificate, remove the signature.
-
As a safety precaution, remove any user created from the certificate in the target database.
-
Drop the certificate in the target database, if it exists there.
-
Create the new certificate in master.
-
Create a login from the certificate.
-
Grant permissions to the login.
-
Export the certificate.
-
Import the certificate in the target database.
-
If xp_cmdshell is enabled, delete the certificate files. (Else you will need to delete them manually; they are located in the same directory as the master database.)
-
Sign the procedure.
-
Remove the private key from the certificate, both in the target database and in master.
-
-
If you want to test the script, you can use the bulk-load example above with some modifications: remove the certificate handling in master, and change CREATE CERTIFICATE in the user database to create a local certificate. Keep in mind that you still need to sign the procedure to grant ALTER and INSERT permissions on the table. Once you have run the script below, you can run the EXECUTE AS part in the bulk-load script to verify that the test user have all permissions. You find such a prepared version of the bulk-load example in the file grantrights-test.sql, instructions are included.
-
-- This script takes it base in the master database.
-USE master
-go
-DECLARE @procname nvarchar(260),
- @database sysname,
- @perms nvarchar(4000),
- @sp_executesql nvarchar(150),
- @certname sysname,
- @username sysname,
- @subject nvarchar(4000),
- @pwd char(39),
- @sql nvarchar(MAX),
- @filename nvarchar(1024),
- @cmd varchar(1024),
- @debug bit
-
--- Set up parameters: the procedure to sign and the database it belongs to.
-SELECT @procname = 'reload_sp',
- @database = 'bulkcerttest'
-
--- The permissions to grant through the certificate. Set NULL if you only
--- want to remove current signature.
-SELECT @perms = 'ADMINISTER BULK OPERATIONS'
-
--- Run with debug or not?
-SELECT @debug = 1
-
---============================ END OF SETUP ==========================
-
--- A big TRY-CATCH block around everything to abort on first error.
-BEGIN TRY
-
--- First verify that the database exists.
-IF db_id(@database) IS NULL
- RAISERROR('Database %s does not exist', 16, 1, @database)
-
--- Make sure that database name is quoted and appears exactly as in sys.databases.
-SELECT @database = quotename(name) FROM sys.databases WHERE name = @database
-
--- We will call sp_executesql a number of times in the target database.
-SELECT @sp_executesql = @database + '.sys.sp_executesql'
-
--- Next we verify that the procedure exists and make sure that
--- we have a normalised quoted name. We need to run a query in the
--- target database.
-SELECT @sql =
- 'SELECT @procname = MIN(quotename(s.name) + ''.'' + quotename(o.name))
- FROM sys.objects o
- JOIN sys.schemas s ON o.schema_id = s.schema_id
- WHERE o.object_id = object_id(@procname)'
-IF @debug = 1 PRINT @sql
-EXEC @sp_executesql @sql, N'@procname nvarchar(260) OUTPUT', @procname OUTPUT
-
-IF @procname IS NULL
- RAISERROR('No procedure with the given name in database %s', 16, 1, @database)
-
--- Construct name, subject and password for the certificate.
-SELECT @certname = 'SIGN ' + @database + '.' + @procname,
- @subject = 'Signing ' + @database + '.' + @procname + ' for ' + @perms,
- @pwd = convert(char(36), newid()) + 'Aa0'
-
--- If a login exists for the cerficiate, we drop it
-IF EXISTS (SELECT *
- FROM sys.server_principals
- WHERE name = @certname
- AND type = 'C')
-BEGIN
- SELECT @sql = 'DROP LOGIN ' + quotename(@certname)
- IF @debug = 1 PRINT @sql
- EXEC (@sql)
-END
-
--- And drop the certificate itself.
-IF EXISTS (SELECT * FROM sys.certificates WHERE name = @certname)
-BEGIN
- SELECT @sql = 'DROP CERTIFICATE ' + quotename(@certname)
- IF @debug = 1 PRINT @sql
- EXEC(@sql)
-END
-
--- In the target database, we must remove the signature from the procedure,
--- so that we can drop the certificate.
-SELECT @sql = '
- IF EXISTS (SELECT *
- FROM sys.crypt_properties cp
- JOIN sys.certificates c ON cp.thumbprint = c.thumbprint
- WHERE cp.major_id = object_id(@procname)
- AND c.name = @certname)
- DROP SIGNATURE FROM ' + @procname + ' BY CERTIFICATE ' + quotename(@certname)
-IF @debug = 1 PRINT @sql
-EXEC @sp_executesql @sql, N'@certname sysname, @procname nvarchar(260)',
- @certname, @procname
-
--- No user should have been created from the cert, but if so, we drop it.
--- Since this may been performed by some else, we cannot trust the username
--- to be the same as the certificate name.
-SELECT @sql = '
- SELECT @username = NULL
- SELECT @username = dp.name
- FROM sys.database_principals dp
- JOIN sys.certificates c ON dp.sid = c.sid
- WHERE c.name = @certname'
-IF @debug = 1 PRINT @sql
-EXEC @sp_executesql @sql, N'@certname sysname, @username sysname OUTPUT',
- @certname, @username OUTPUT
-
-IF @username IS NOT NULL
-BEGIN
- SELECT @sql = 'DROP USER ' + quotename(@username)
- IF @debug = 1 PRINT @sql
- EXEC @sp_executesql @sql
-END
-
--- And here goes the old cert.
-SELECT @sql = '
- IF EXISTS (SELECT * FROM sys.certificates WHERE name = @certname)
- DROP CERTIFICATE ' + quotename(@certname)
-IF @debug = 1 PRINT @sql
-EXEC @sp_executesql @sql, N'@certname sysname', @certname
-
-IF @perms IS NULL
- PRINT 'No new permissions set, cleanup completed.'
-ELSE
-BEGIN
- -- Now we start to (re)create things. First create the certificate in master.
- SELECT @sql = 'CREATE CERTIFICATE ' + quotename(@certname) + '
- ENCRYPTION BY PASSWORD = ''' + @pwd + '''
- WITH SUBJECT = ''' + @subject + ''',
- START_DATE = ''20020101'', EXPIRY_DATE = ''20200101'''
- IF @debug = 1 PRINT @sql
- EXEC(@sql)
-
- -- And the login for the certificate.
- SELECT @sql = 'CREATE LOGIN ' + quotename(@certname) +
- ' FROM CERTIFICATE ' + quotename(@certname)
- IF @debug = 1 PRINT @sql
- EXEC(@sql)
-
- -- Grant the permissions.
- SELECT @sql = 'GRANT ' + @perms + ' TO ' + quotename(@certname)
- IF @debug = 1 PRINT @sql
- EXEC(@sql)
-
- -- Determine a path to where we can write the files for the certs.
- SELECT @filename = substring(physical_name, 1, len(physical_name) -
- charindex('\', reverse(physical_name)) + 1) +
- convert(char(36), newid())
- FROM sys.database_files
- WHERE file_id = 1
-
- -- And backup up the certificate to disk.
- SELECT @sql = '
- BACKUP CERTIFICATE ' + quotename(@certname) + '
- TO FILE = ''' + @filename + '.cer' + '''
- WITH PRIVATE KEY (FILE = ''' + @filename + '.pvk' + ''',
- ENCRYPTION BY PASSWORD = ''' + @pwd + ''',
- DECRYPTION BY PASSWORD = ''' + @pwd + ''')'
- IF @debug = 1 PRINT @sql
- EXEC(@sql)
-
- -- And then restore in the target database.
- SELECT @sql = '
- CREATE CERTIFICATE ' + quotename(@certname) + '
- FROM FILE = ''' + @filename + '.cer' + '''
- WITH PRIVATE KEY (FILE = ''' + @filename + '.pvk' + ''',
- ENCRYPTION BY PASSWORD = ''' + @pwd + ''',
- DECRYPTION BY PASSWORD = ''' + @pwd + ''')'
- IF @debug = 1 PRINT @sql
- EXEC @sp_executesql @sql
-
- -- If possible, delete the certs from disk.
- SELECT @cmd = 'DEL "' + @filename + '.*"'
- IF (SELECT value_in_use
- FROM sys.configurations
- WHERE name = 'xp_cmdshell') = 1
- BEGIN
- IF @debug = 1 PRINT @cmd
- EXEC xp_cmdshell @cmd
- END
- ELSE
- BEGIN
- PRINT '******** xp_cmdshell disabled, you need run this command manually'
- PRINT @cmd
- END
-
- -- We can now sign the procedure.
- SELECT @sql = 'ADD SIGNATURE TO ' + @procname + ' BY CERTIFICATE ' +
- quotename(@certname) + ' WITH PASSWORD = ''' + @pwd + ''''
- IF @debug = 1 PRINT @sql
- EXEC @sp_executesql @sql
-
- -- Finally, drop the private key of the cert from the databases.
- SELECT @sql = 'ALTER CERTIFICATE ' + quotename(@certname) + ' REMOVE PRIVATE KEY'
- IF @debug = 1 PRINT @sql
- EXEC (@sql)
-
- SELECT @sql = 'ALTER CERTIFICATE ' + quotename(@certname) + ' REMOVE PRIVATE KEY'
- IF @debug = 1 PRINT @sql
- EXEC @sp_executesql @sql
-END
-END TRY
-BEGIN CATCH
- DECLARE @msg nvarchar(4000)
- SELECT @msg = error_message()
- RAISERROR(@msg, 16, 1)
-END CATCH
-
Before we move on, I like to point out a few virtues for dynamic SQL, even if they are not directly related to the topic of this article:
-
-
Before all execution of dynamic SQL, I have a debug PRINT, so I can inspect the statement in case of an error.
-
To run dynamic SQL in the target database, I make use of that you can run a system procedure in a different database by using three-part notation, and that EXEC accepts a variable for the procedure name.
-
I consistently use quotename() to avoid syntax errors if there is a special character in an object name. For the database and procedure I apply the brackets once for all, whereas for the certificate name I do it every time I need to. (Since I also use the cert name in queries.)
-
I fail on one point though: if the database or procedure name would include a a single quote, there would be a syntax error when creating the certificate because of the subject.
-
-
There is a version for SQL 2012 of this script in the file grantrights-2012.sql. It is worth dwelling on the piece where the certificate is copied for a second:
Since the script is a single batch, there is no need for temp tables. Instead, I copy the certificate in a single group of statements. The above three statements replaces no less than four groups of statements in the script above. Observe also that in the call to cert_id, I apply qoutename on @certname. This is required, since the name of the certificates includes brackets.
We will now turn to the third method in SQL Server to provide
- permission through stored procedures: the EXECUTE AS clause. On
- the surface, EXECUTE AS is much simpler to use than certificates, but as it
- works through impersonation, there are side effects which may be
- unacceptable. We will also see that for granting server-level permissions, EXECUTE AS is inappropriate in environments where there are users who have full permissions on database level, but not on server-level.
EXECUTE AS is two things. It is a clause that you can add to a stored
- procedure or any other SQL module, and that is
- what you can use to grant
- permissions to non-privileged users. There is also a statement
- EXECUTE AS, and we will look at the statement before we turn to the clause.
-
The statement EXECUTE AS permits you to switch your execution context to
- impersonate another login or user. Here are
- examples of the two possibilities:
-
EXECUTE AS LOGIN = 'somelogin'
-EXECUTE AS USER = 'someuser'
-
Once you want to become your original self,
- you use the REVERT statement. (If you have changed databases, you will first
- need to return to the database where you issued the EXECUTE AS statement.)
- If the EXECUTE AS statement is executed in a lower-level scope – that is, in a
- stored procedure or a batch of dynamic SQL – there is an implicit REVERT when
- the scope exits. Thus if you run:
-
EXEC('EXECUTE AS LOGIN = ''frits''; SELECT SYSTEM_USER')
-SELECT SYSTEM_USER
-
the second SELECT will not return frits, but your own login name.
-
To perform EXECUTE AS you need IMPERSONATE rights on the login/user
- in question. (This permission is implied on all logins if you have sysadmin
- rights
- and on all users in a database where you have db_owner rights.)
-
As an extra thrill, you can stack EXECUTE AS,
- so you could first become login1, then user2 etc. Each REVERT would take you
- back to the previous context. This would require each login/user to have
- impersonation rights on the next login/user in the chain.
-
There are two apparent uses for the EXECUTE AS statement:
-
-
A privileged user can use EXECUTE AS to
- test queries and procedures as another user, without having to open a new
- query window. This can be very handy, and all example scripts in this
- article use EXECUTE AS for this purpose.
-
To implement "application proxies". In this case, the application authenticates
- the users outside the server. The
- application connects to the server with a proxy login that has
- IMPERSONATE
- rights on the real users and then issues EXECUTE AS
- to run as them. When you create a user in SQL 2005, you can specify the
- clause WITHOUT LOGIN to create a user that exists in the database only. Thus, you can implement a
- solution where the real users do
- not need any sort of direct access to SQL server.
-
-
In the latter case, the application should add the clause WITH NO REVERT or
- WITH COOKIE to the EXECUTE AS statement. Else a
- malicious user could inject a REVERT
- statement and gain the rights of the proxy login. (As this goes a little beyond the
- scope for this article, I refer you to Books Online for further details.)
-
If you use EXECUTE AS LOGIN this is exactly the same as if you had logged into SQL Server as that user directly. You will have the permissions of that login, you can access the databases that login can access and so on. I have not been able to detect any difference at all, save for the function original_login() that I will return to.
-
If you use EXECUTE AS USER it is a little different. As long as you only run commands within the database, it is just as if you had logged in as that user. But if you try to access another user database you will get an error message, and if you try to perform some server-level action like sp_who you will only get back a minimum of data, even if this user maps to a login in the sysadmin role. When you impersonate a database user you are by default sandboxed into that database. We will look more into this later. For now, I say that if you use EXECUTE AS to test permissions, you should in most cases use EXECUTE AS LOGIN. The exception is when you are testing access rights for users that are purposely created WITHOUT LOGIN.
-
I should also mention that there is an impersonation shortcut for the
-EXECUTE() command, so that you can say:
-
EXECUTE(@somesql) AS LOGIN = 'somelogin'
-EXECUTE(@somesql) AS USER = 'someuser'
-
The purpose of this is the same as for the EXECUTE AS
- statement; for a high-privileged user to impersonate a low-privileged
- user.
-
Before I move on, I should mention that there is an older command SETUSER which also can be used for impersonation. The semantics for SETUSER are less clear than for EXECUTE AS, and SETUSER is deprecated. If you are still using SETUSER, there is all reason to change to EXECUTE AS.
-
Note: When impersonating a Windows user, it's a common mistake to put the name in brackets, but this does not work and results in somewhat cryptic error message. That is, it should be EXECUTE AS 'Domain\User', not EXECUTE AS '[Domain\User]'.
So far the statement EXECUTE AS. We will now look at the clause WITH EXECUTE AS you can add to your stored procedure. As for certificates, we will first look at using the EXECUTE AS clause to
- give users rights for actions within the database, and as with certificates
-we will use dynamic SQL as our example.
-
To repeat, these were the presumptions for the dynamic SQL example:
-
CREATE TABLE testtbl (a int NOT NULL,
- b int NOT NULL)
-go
-CREATE PROCEDURE example_sp AS
- EXEC ('SELECT a, b FROM testtbl')
-go
-GRANT EXECUTE ON example_sp TO public
-go
-
As we saw earlier, ownership chaining does not
- work here. To use EXECUTE AS to make it possible for users to run
- example_sp
- without SELECT permission on testtbl, the steps to take are:
-
-
Create a proxy user.
-
Grant the proxy user the necessary permissions.
-
Add the EXECUTE AS clause to the stored procedure.
-
-
In code, it looks like this:
-
-- Create a proxy user.
-CREATE USER exampleproxy WITHOUT LOGIN
--- Give it permissions on the table.
-GRANT SELECT ON testtbl TO exampleproxy
-go
--- Add EXECUTE AS to the procedure.
-CREATE PROCEDURE example_sp WITH EXECUTE AS 'exampleproxy' AS
-EXEC ('SELECT a, b FROM testtbl')
-go
-
Since the sole purpose for this user is to carry permissions, we create the user
- WITHOUT LOGIN. As for what rights to grant to
- the proxy user, the discussion in the section Granting
- Rights to the Certificate User applies here as well: only grant the
- permissions needed.
-
The effect of the EXECUTE AS clause is the same as of the EXECUTE AS
- USER statement: that is, impersonation. As with certificates, the
- user gets the rights of exampleproxy, but there are two important
- differences: 1) It's not that the rights of the proxy user are added to your rights, but you are John
- Malkovich. 2) If there is a call to an inner stored procedure or
- a trigger fires, you are not reverted back to your original self;
- you continue to execute in the context of the proxy user. It is not until you exit the
- stored procedure with the EXECUTE AS clause that you return to your true self.
-
This can have drastic and far-reaching consequences, which we shall look into
- in a moment. First though, a complete script that shows the use EXECUTE AS
- to grant permissions for dynamic SQL.
- (Again, please refer to the introductory note
- about the example scripts in this article):
-
USE master
-go
--- Create a test login.
-CREATE LOGIN testuser WITH PASSWORD = 'ExECaS=0=TeST'
-go
--- Create the database to run the test in.
-CREATE DATABASE execastest
-go
-USE execastest
-go
--- Create the test user.
-CREATE USER testuser
-go
--- Create the test table.
-CREATE TABLE testtbl (a int NOT NULL,
- b int NOT NULL)
-INSERT testtbl (a, b) VALUES (47, 11)
-go
--- Create a proxy user and give it rights to access the test table.
-CREATE USER exampleproxy WITHOUT LOGIN
-GRANT SELECT ON testtbl TO exampleproxy
-go
--- Create two test stored procedures, one with EXECUTE AS and one
--- without, and grant permission.
-CREATE PROCEDURE noexecas_sp AS
- SELECT SYSTEM_USER, USER, name, type, usage FROM sys.user_token
- EXEC ('SELECT a, b FROM testtbl')
-go
-CREATE PROCEDURE example_sp WITH EXECUTE AS 'exampleproxy' AS
- SELECT SYSTEM_USER, USER, name, type, usage FROM sys.user_token
- EXEC ('SELECT a, b FROM testtbl')
- EXEC noexecas_sp
-go
-GRANT EXECUTE ON example_sp TO public
-GRANT EXECUTE ON noexecas_sp TO public
-go
--- Switch to the test user.
-EXECUTE AS LOGIN = 'testuser'
-go
--- First run the procedure without EXECUTE AS. This gives a permission
--- error.
-EXEC noexecas_sp
-go
--- Then the signed procedure with EXECUTE AS. Now get the data back.
-EXEC example_sp
-go
--- Become ourselves again.
-REVERT
-go
--- Clean up
-USE master
-DROP DATABASE execastest
-DROP LOGIN testuser
-
This is similar to the script for certificates, but you will notice that the
- outcome is different. When the test user runs noexecas_sp directly, he gets a
- permission error as expected. But when example_sp calls noexecas_sp,
- there is no permission error, as was the case when we used a certificate. And when we
- look at the output from sys.user_token we see why. When noexecas_sp
- is called directly, we get:
-
SYSTEM_USER USER name type usage
-------------- ------------ ---------- --------- --------------
-testuser testuser testuser SQL USER GRANT OR DENY
-testuser testuser public ROLE GRANT OR DENY
-
-
But when noexecas_sp is called from example_sp, we see this:
-
SYSTEM_USER USER name type usage
---------------- ----------- ----------- --------- --------------
-S-1-9-3-2024... exampleproxy exampleproxy SQL USER GRANT OR DENY
-S-1-9-3-2024... exampleproxy public ROLE GRANT OR DENY
-
-
As you see, there is no trace of testuser. (The data in the column
- for SYSTEM_USER is due to that
- exampleproxy
- was created WITHOUT LOGIN. In lieu of a login name, SYSTEM_USER returns the SID.)
-
With certificates, the permissions of the certificate user are added to the rights of the current user. This means that if there is some basic permission granted to everyone, say SELECT permission in a certain schema, you don't have to grant that permission to the certificate user. For a proxy user for EXECUTE AS you must grant all permissions needed. But this cuts both ways. Recall that certificates do not help when users have been explicitly denied permission, since DENY takes precedence over GRANT. This limitation does not exist with EXECUTE AS, since it's only the permissions of the proxy user that count.
SQL Server has a couple of functions that returns the
- current login or user: SYSTEM_USER, SESSION_USER, USER, user_name(),
- suser_sname() and a few more. All these are affected by the EXECUTE AS
- clause: instead of returning the current login/user, they return the login or user of the identity in the EXECUTE AS
- clause.
-
Now, where do you use these functions? I can think of two of very typical
- cases.
-
-
In the WHERE clause of a view or stored procedure for row-level security.
-
To fill in the values of auditing columns, through a DEFAULT constraint
- or a trigger or directly in a stored procedure.
-
-
When you use EXECUTE AS both these schemes break. Code that implements
- row-level security will return no data, or even worse, data that the
- real user does not have permission to see. Auditing will be useless, as
- all updates will appear to come from the same user.
-
Had the effect been
- constrained only to the very procedure with the EXECUTE AS clause, it could
- have been somewhat manageable. But since the impersonation lingers when
- other SQL modules are invoked, for instance triggers, this means that code
- that are not aware of the EXECUTE AS clause, will cease to work. Now, how is
- that for backwards compatibility?
-
Another side effect concerns existing code. Say that a procedure with
- EXECUTE AS calls an existing stored procedure old_sp, and this procedure
- makes some assumptions of what rights the current user (= the user behind the
- keyboard) has. For instance, it could use the built-in functions is_member() or
- permissions() to determine whether a user is entitled to see some
- data or whether some special action should be taken. When called from a procedure with EXECUTE AS,
-old_sp will draw the wrong conclusions.
-
There are also concerns for the DBA who likes to monitor his system with help of Profiler and various DMVs, that I will look into separately a little later.
-
What can you do to mitigate these consequences? We will look at four
- different possibilities: 1) EXECUTE AS CALLER, 2) original_login(), 3) SET
- CONTEXT_INFO and 4) DDL triggers. You
- will find none of these measures address the issues very satisfactorily. The first
- only solves a minor part of the problem and the next two require you to
- rewrite existing code. The last method performs
- a solid job – by outlawing the feature altogether.
-
Before looking into the methods above, we need to look at the EXECUTE AS clause in
- full, to see its full powers – or I am tempted to say its full horrors.
Rather than specifying an explicit user in the EXECUTE AS clause, you can specify any
- of the keywords CALLER, OWNER and SELF.
-
CALLER is innocent. This means that the procedure should execute in the
- context of the calling user. That is, how stored procedures how normally work, so EXECUTE AS CALLER is merely a way of explicitly expressing
- the default.
-
EXECUTE AS SELF is short for EXECUTE AS 'yourusername'. That is, if you
- create a procedure and add WITH EXECUTE AS SELF to it, anyone who runs the
- procedure will execute with your permissions. (And anything they update, you
- will be held accountable for.)
-
EXECUTE AS OWNER, finally, means that the procedure executes in the context
- of the procedure owner. As I discussed in the
- beginning of the article this is normally the schema owner. Thus, if the procedure is created in the dbo
- schema, or any other schema owned by the database owner, the procedure will
- execute with permissions to do anything in the database!
-
Here are some serious implications. If all you care about is
- simplicity, then you can ignore all about creating proxy users and granting them
- permissions. All you need to do is:
-
CREATE PROCEDURE example_sp WITH EXECUTE AS OWNER AS
- --SELECT SYSTEM_USER, USER, name, type, usage FROM sys.user_token
- EXEC ('SELECT a, b FROM testtbl')
-go
-
And no more permissions problems!
-
But remember that philosophy about multiple lines
- of defence in the beginning of
- this text. As we discussed for certificates, by using a dedicated proxy user you add one more line of defence,
- so if your procedure would be open for
- SQL injection, an exploiter can only do a limited amount of harm.
- On the other hand, if you use EXECUTE AS OWNER, the database will be wide open to an
- intruder. (Access outside the database is another matter, that we will come
- back to.) Again, keep in mind that even if your use of dynamic SQL is tight
- and free from injection vulnerabilities, someone who modifies the procedure
- tomorrow may make a blunder and change that.
-
Note here also a possible fatal consequence for a row-level security scheme.
- It is not unlikely that such scheme is set up so that dbo
- is permitted see all rows. This means that casual use of EXECUTE AS can result int users having access to data they don't have permission
- to see.
-
If you are the DBA (or at least the database owner) and are fortunate to have
- full control of all code that is added to the database (because you write all
- the code, or at least review all of it), it is only up to you. But if you are
- responsible for a larger application with many stored procedures, contributed
- by many developers, be afraid, be very afraid. One day you find that your auditing
- records say that a lot of data was changed by dbo, instead of the
- actual user. Some developer ran into an urgent problem with his dynamic SQL,
- posted a question on the forums and quickly learnt the four magic words WITH EXECUTE AS OWNER.
- His problems were solved, but yours had only just begun.
-
We will now look into what methods you can use to reduce the impact
- of the EXECUTE AS clause.
It's possible to do this in a procedure with an EXECUTE AS clause:
-
CREATE PROCEDURE some_sp WITH EXECUTE AS 'proxyuser' AS
- DECLARE @realuser sysname
- EXECUTE AS CALLER
- SELECT @realuser = SYSTEM_USER
- REVERT
- -- Do whatever requires extra privileges
-go
-
That is, with the EXECUTE AS CALLER statement, you revert
- to the context of the
- caller, and you can find out who actually
- called the procedure. Provided, that is, there were no impersonation on upper
- levels.
-
- If the procedure is a longer one, and there is only one action that needs
- special privileges, for instance dynamic SQL, you can even do:
-
CREATE PROCEDURE someother_sp WITH EXECUTE AS 'proxyuser' AS
- DECLARE ...
- EXECUTE AS CALLER
- ...
- -- Here we need the powers of the proxy user
- REVERT
- EXEC sp_executesql @sql, ... -- Or something else which needs privs.
- EXECUTE AS CALLER
- -- Rest of the procedure
-
While this certainly is recommendable from the philosophy of not using more
- permissions than necessary, it takes more effort than just adding the EXECUTE
- AS clause in the beginning and run with it. It would be more reasonable to
- write:
-
CREATE PROCEDURE someother_sp AS
- DECLARE ...
- ...
- -- Here we need the powers of the proxy user
- EXECUTE AS USER = 'proxyuser'
- EXEC sp_executesql @sql, ... -- Or something else which needs privs.
- REVERT
- -- Rest of the procedure
-
Alas, this does not work An unprivileged user will get a permission error,
- as the
- rights to impersonate someone can not be given to a user through the body of
- a stored procedure, only the header. (Of course, by signing the procedure with a certificate you can
- grant that permission, but if you use certificates, you don't really need
- EXECUTE AS at all.)
-
There are many situations where EXECUTE AS CALLER does not help. If that
- dynamic SQL accesses a view with row-level security, it does not help to save
- the real user's name into a variable, as the call to SYSTEM_USER (or
- similar) is in the text of the view itself. The same applies if the dynamic SQL
- performs an update, and the auditing is based on a trigger or a default
- constraint. Furthermore, if a procedure sp1 with
- an EXECUTE AS clause calls sp2, sp2 cannot use
- EXECUTE AS CALLER to set its context to the
- caller of sp1, as the caller to sp2 is the user in the
- EXECUTE AS clause in sp1.
-
On top of that, EXECUTE AS CALLER requires a conscious action
- from the
- programmer. Someone who just heard about EXECUTE AS OWNER on the forums
- is not going to get through that extra hoop.
While SYSTEM_USER, USER, user_name() etc
- all are affected by EXECUTE AS,
- there is one function that returns the login that originally
- connected to SQL Server: original_login().
-
Thus, anywhere you have schemes for row-level security or code for auditing it's better to use original_login() rather than
-SYSTEM_USER to be protected against the risk that EXECUTE AS leads to incorrect auditing or users getting access to data they are not entitled to see. At least as long as you
- are not using "application proxies",
- something I will return to in
-the next section.
-
If your row-level security and auditing schemes are based on the username in the database rather than the server-level login name, you are likely
- to ask for an original_user()
- only to find that there isn't such a function. In this case you will have to rework your
-scheme to use logins instead.
-
Why isn't there any original_user()? Actually, there is a good reason.
- Things get complicated with cross-database access. Say that a
- procedure sp1 in database A has an EXECUTE AS clause for
- user1, and sp1 invokes sp2 in database B to which
- user1 has access. sp1 is invoked by user2 that maps to
- login2, but login2 has no access to database B. Say now
- that sp2 calls this fictive original_user(), what should it return?
- user2 is flat wrong in the given context. NULL? Are your auditing columns
- nullable? Mine aren't.
-
If you are really paranoid and want to make sure that your procedure are not
- run with elevated privileges because the calling procedure has an EXECUTE AS
- clause, you could add this test to the beginning of your procedure:
-
IF SYSTEM_USER <> original_login()
-BEGIN
- RAISERROR('This procedure does not support impersonated users', 16, 1)
- RETURN 1
-END
original_login() works as long as the users themselves log into SQL Server
- with their personal login. But consider the case of an "application proxy". That is, the application authenticates users outside SQL Server, and the proxy login issues EXECUTE AS (or SETUSER for a legacy application) on the behalf of the
- actual user. Guess what original_login() will return in this case? That's
- right, the name for the application's proxy login. Not a very useful
- piece of information. While SQL 2005 was still in beta, I submitted a Connect item that asked for a way to retrieve the full impersonation stack to address this situation. It hasn't happened yet.
-
One possible way out here is the command SET CONTEXT_INFO and the
- context_info() function. SET CONTEXT_INFO was added already in SQL 2000, but
- it may not be widely known. It sets a binary value of 128 bytes that you can retrieve with the
- context_info() function.
-
Here is how you would use it. When connecting for a user, the application
- would do something like:
A table with an auditing column could look like this:
-
CREATE TABLE audited
- (somedata int NOT NULL,
- moduser sysname NOT NULL
- CONSTRAINT def_moduser DEFAULT
- coalesce(convert(nvarchar(64),
- substring(context_info(), 1, charindex(0x0000, context_info()) - 1)),
- original_login())
-)
-go
-
The expression to get data from context_info() is
-surprisingly complex; this is because context_info() returns
-binary(128), so we need to strip the trailing zeroes.
-Despite the name, charindex() works on binary data too. We
-must specify 0x0000 to find where the zeroes start, since with nvarchar,
-every second byte is often 0 for data using the Latin alphabet.
-
On top of that, we use coalesce() with original_login() as a second argument to have a
- fallback alternative, in case SET CONTEXT_INFO never was issued, for instance
- because the action was performed by an administrator who logged in directly to SQL
- Server from SQL Server Management Studio.
-
I feel obliged to point out that the solution with SET CONTEXT_INFO is not entirely
- secure.
- If there are SQL injection holes in
- the application, a malicious user could inject a SET CONTEXT_INFO command to
- hide his identity. This could permit him to do actions anonymously, and
- to access data from row-level security schemes that he should not see.
-
One more thing to add about SET CONTEXT_INFO: normally the effect of a SET
- statement issued in a stored procedure is reverted when the procedure exits.
-SET CONTEXT_INFO is an exception to this rule, and the effect of SET CONTEXT_INFO is always global to the connection.
If you are a DBA who is not in the position that you can review all code that
- is deployed into the database (or a lead programmer/database architect who
- cannot review all code that is checked into the version-control system) and
- you are scared of the damage that EXECUTE AS could cause to your application, you may ask: is there a
- way to stop all this? After all, there is no need to use EXECUTE AS
- to grant permissions, when you can use certificates without side
- effects.
-
Microsoft touts SQL Server as "secure by default", so you
- would expect a knob to control whether the EXECUTE AS clause is available, and you would
- expect that knob to be in the OFF position by default. Not so. There is no
- knob at all. But you can implement your own.
-
If you are the permissive sort of person, you may be content to every once in
- a while run:
-
SELECT module = object_name(object_id),
- execute_as = CASE m.execute_as_principal_id
- WHEN -2 THEN 'OWNER'
- ELSE d.name
- END
-FROM sys.sql_modules m
-LEFT JOIN sys.database_principals d
- ON m.execute_as_principal_id = d.principal_id
-WHERE m.execute_as_principal_id IS NOT NULL
-
This displays which modules have been decorated with the EXECUTE AS
- clause and with
- which user name.
-
If you are the more evil sort of person, then you can put this DDL
- trigger in place:
-- Get the schema and name for the object created/altered.
-SELECT @eventdata = eventdata()
-SELECT @schema = C.value(N'SchemaName[1]', 'nvarchar(128)'),
- @object_name = C.value(N'ObjectName[1]', 'nvarchar(128)')
-FROM @eventdata.nodes('/EVENT_INSTANCE') AS E(C)
-
-- Find its object id.
-SELECT @object_id = o.object_id
-FROM sys.objects o
-JOIN sys.schemas s ON o.schema_id = s.schema_id
-WHERE o.name = @object_name
- AND s.name = @schema
-
-- If we don't find it, it may be because the creator does not have
--- have permission on the object. (Yes, this can happen.)
-IF @object_id IS NULL
-BEGIN
- SELECT @msg = 'Could not retrieve object id for [%s].[%s], operation aborted'
- RAISERROR(@msg, 16, 1, @schema, @object_name)
- ROLLBACK TRANSACTION
- RETURN
-END
-
-- Finally check that the catalog views whether the module has any
--- EXECUTE AS clause.
-IF EXISTS (SELECT *
- FROM sys.sql_modules
- WHERE object_id = @object_id
- AND execute_as_principal_id IS NOT NULL)
-BEGIN
- ROLLBACK TRANSACTION
- SELECT @msg = 'Module [%s].[%s] has an EXECUTE AS clause. ' +
- 'This is not permitted in this database.'
- RAISERROR (@msg, 16, 1, @schema, @object_name)
- RETURN
-END
-go
-
The trigger first retrieves the schema and object names for the created
- object from the eventdata() function. This function returns an XML
- document, and we use XQuery to extract the data we need. Next we translate
- the object name to an id. We check that we are actually able to do this. (Since the owner of a procedure is the schema owner, it is possible to have a user that is permitted to create
- a procedure without being permitted to see the definition of it.) Finally there is the check that the
- module does not have any EXECUTE AS.
-
Variations of this theme include checking execute_as_principal_id for
- -2 (OWNER) and power users, or permit
- EXECUTE AS if the proxy user does not map to
- a login. (That is, a user created WITHOUT LOGIN.)
-
Would anyone be this evil? Well, if you have an auditing scheme that relies
- on SYSTEM_USER or similar function, and you don't want to rewrite your code
- right now, do you have any choice?
-
Note: If you are on SQL 2008, you may ask if this could be implemented with Policy-Based Management. It probably can, but I would not recommend that use you the On Prevent option in PBM, as PBM may silently decide to turn off checking if it deems your conditions to be too complex. (See this Connect bug for details.) Possibly you could use PBM to monitor the use of EXECUTE AS.
-
EXECUTE AS and Monitoring
-
As I mentioned, EXECUTE AS also has implications for the DBA who likes to monitor his system. Say that there is a procedure which has the heading:
-
CREATE PROCEDURE some_sp WITH EXECUTE AS 'proxyuser' AS
-
Say that the user Nisse runs this procedure, and there is a trace with captures the statements in this procedure. What will the column LoginName display? That depends. If proxyuser was created from a login with the same name, the value in LoginName will be proxyuser. If proxyuser was created WITHOUT LOGIN, the value will be a SID, that is, a value starts like S-1-9-3-913356... But in no case the name Nisse will be displayed.
-
This has some ugly ramifications. If you commonly apply filters on LoginName, EXECUTE AS can cause users to fall off the radar for the duration of the procedure with the clause. If you rely on tracing for auditing, EXECUTE AS can also result in the wrong person being credited/blamed for a certain action.
-
LoginName is not the only column that is affected, but also the column NTUserName, although this column does not always change. It changes if the impersonated user is a Windows user or a user created WITHOUT LOGIN, but not if the user is created from an SQL Server login. At least, that is what my quick testing indicates.
-
This also extends do DMVs like sys.dm_exec_sessions. The columns login_name and nt_user_name behaves like LoginName and NTUserName in Profiler and reflect the name of the impersonated user. The same is true for sysprocesses etc.
-
Thankfully, there are alternatives. In Profiler you can use the column SessionLoginName. The value in this column corresponds to the value returned by the function original_login() and thus it will never change during the lifetime of the connection. The column is not visible by default, but you have to check the box Show all columns to find it. (Why SessionLoginName is not visible by default, while LoginName is? As I recall, SessionLoginName was added in SP2 of SQL 2005, and I guess Microsoft did not want to meddle with the existing templates.) You could define your own template, so that you don't have to remember to add it every time.
-
Likewise, in sys.dm_exec_sessions there is the column original_login_name, which is one of the columns at end of the table; it was added in SP2 of SQL 2005. In sysprocesses, there is no value corresponding to original_login(), but sysprocesses is a compatibility view, which Microsoft prefers us not to use.
So far we have looked at using EXECUTE AS to give permissions within a single database. What happens if you try to access other databases or perform an action that requires a server-level permission?
-
Answer: you run into a roadblock. Consider this procedure created in some
-other database than AdventureWorks:
-
CREATE PROCEDURE crossdb WITH EXECUTE AS OWNER AS
- SELECT COUNT(*) FROM AdventureWorks.Person.Address
-go
-EXEC crossdb
-
If you run this logged in as sa you get:
-
Server: Msg 916, Level 14, State 1, Procedure crossdb, Line 2
-The server principal "sa" is not able to access the database "AdventureWorks"
-under the current security context.
-
Since sa usually can access everything, this comes as quite unexpected. But
- this is because there is a safeguard here. The EXECUTE AS clause always impersonates a database user, never a server login. And when you impersonate a user, you are sandboxed into the current database,
-and you are denied any access outside that database. This applies to the EXECUTE AS clause in a procedure as well as the statement EXECUTE AS USER. (But not to EXECUTE AS LOGIN.)
-
The same is true for server-level permissions. If you try:
-
CREATE PROCEDURE reload_sp WITH EXECUTE AS OWNER AS
- TRUNCATE TABLE reloadable
- EXEC('BULK INSERT reloadable FROM ''C:\temp\reloadtest.csv''
- WITH (FIELDTERMINATOR='','', ROWTERMINATOR=''\n'')')
-go
-EXEC reload_sp
-
Even if you are logged with sysadmin rights, you will get this error message:
-
Msg 4834, Level 16, State 4, Line 2
-You do not have permission to use the bulk load statement.
-
To open the sandbox, you must open two doors. If the database is owned by a user with sysadmin permission, one of the doors are already open. The other door is this statement:
-
ALTER DATABASE db SET TRUSTWORTHY ON
-
If the database is trustworthy, and you impersonate user1 with the statement EXECUTE AS USER = 'user1' or the clause EXECUTE AS 'user1' in a stored procedure, you will be able to exercise any rights that user1 may have in other databases or on server level.
-
To set a database as trustworthy you need sysadmin rights. And this is by no means a step you should take casually. There are some scenarios where this setting is safe play, but there are also many where it opens a glaring hole in your server security. I will discuss this in detail, but to keep the focus of the main topic – granting permissions to stored procedures – I will first show how to use EXECUTE AS to grant bulk-copy permissions.
As with certificates, using EXECUTE AS to give bulk-copy permissions takes
- a little more work. The steps are:
-
-
Create a proxy login, in the master database.
-
Grant the proxy login ADMINISTER BULK OPERATIONS. Again in master.
-
Mark the target database as trustworthy.
-
Switch to the application database.
-
Create a user for the proxy login.
-
Grant the proxy user ALTER and INSERT on the target table.
-
Add an EXECUTE AS clause to the procedure.
-
-
As there is not much new here, I will just make a few comments, before I give
- you a complete script with all steps and a test case.
-
Since ADMINISTER BULK OPERATIONS is a server-level permission, we need to create a
- full login in this case. It's a good idea to revoke the proxy login the
- right to connect to SQL, and I do this in the test script below.
-
As discussed in the previous section, we need to mark the database as trustworthy to break out from the sandbox.
-
Just like we did with certificates, we must put the BULK INSERT statement in dynamic SQL,
- because of a
- bug in SQL Server.
-
So here is the test script for using BULK INSERT with EXECUTE AS.
- (And as always, the introductory note on the
- examples applies):
-
USE master
-go
--- Create a test file for bulkload.
-EXEC xp_cmdshell 'ECHO 978,123,234 > C:\temp\reloadtest.csv', no_output
-EXEC xp_cmdshell 'ECHO -98,13,85 >> C:\temp\reloadtest.csv', no_output
-go
-CREATE LOGIN testuser WITH PASSWORD = 'ExECaS=0=TeST'
-go
--- Create the database to run the test in.
-CREATE DATABASE bulkcopytest
-go
--- Mark the database as trustworthy.
-ALTER DATABASE bulkcopytest SET TRUSTWORTHY ON
-go
--- Create a proxy login, which is to have the bulk-copy rights.
-CREATE LOGIN bulkproxy WITH PASSWORD = 'lkjSeF&hskldjh?löKDdf/jlk98sdfjälksdjg'
-go
--- Grant rights for the proxy login and make it unable to login.
-GRANT ADMINISTER BULK OPERATIONS TO bulkproxy
-REVOKE CONNECT SQL FROM bulkproxy
-go
--- Move to test database.
-USE bulkcopytest
-go
--- Create the non-priv user and the proxy user.
-CREATE USER testuser
-CREATE USER bulkproxy
-go
--- A test table.
-CREATE TABLE reloadable (a int NOT NULL,
- b int NOT NULL,
- c int NOT NULL)
-go
--- Test procedure with BULK INSERT.
-CREATE PROCEDURE reload_sp WITH EXECUTE AS 'bulkproxy' AS
- TRUNCATE TABLE reloadable
- EXEC('BULK INSERT reloadable FROM ''C:\temp\reloadtest.csv''
- WITH (FIELDTERMINATOR='','', ROWTERMINATOR=''\n'')')
-go
--- Give test user right to execute them.
-GRANT EXECUTE ON reload_sp TO public
-go
--- Grant the proxy user rights to truncate and insert to the test table.
-GRANT ALTER, INSERT ON reloadable TO bulkproxy
-go
--- Insert some test data. If test succeeds, this data should disappear.
-INSERT reloadable (a, b, c) VALUES (12, 23, 34)
-go
--- Switch to the test user.
-EXECUTE AS LOGIN = 'testuser'
-go
--- Run the bulk load.
-EXEC reload_sp
-go
--- Back to ourselves.
-REVERT
-go
--- Verify that bulk load succeeded.
-SELECT a, b, c FROM reloadable
-go
-REVERT
-go
--- Clean up.
-USE master
-DROP DATABASE bulkcopytest
-DROP LOGIN bulkproxy
-DROP LOGIN testuser
-EXEC xp_cmdshell 'DEL C:\temp\reloadtest.csv', no_output
-
-
Considerations on TRUSTWORTHY
-
Exactly how dangerous is TRUSTWORTHY? Permit me to approach this question in a somewhat roundabout way. For many years, this article just said that you should think twice before turning on TRUSTWORTHY, but did not go into details. Then one day, I got a mail from a reader who asked a question that got me thinking.
-
My correspondent had a problem. He wanted to grant access to BULK INSERT, and used my example for EXECUTE AS as a template, but he could not get it to work. There was a twist in his case, he wanted the database owner to be a plain server login, and not a member of sysadmin.
-
I sat down and played with my bulk-copy example and I was able to confirm his findings. I read through the topic
- Extending Database Impersonation by Using EXECUTE AS in Books Online and this was when I learnt that the sandbox has two doors that both must be open. Say there is a database A, and in this database we impersonate a user U – with the statement EXECUTE AS USER or the EXECUTE AS clause in a stored procedure. To be able to exercise the rights that the user U may have outside the database, the following conditions must be true.
-
-
1.
The database A must be TRUSTWORTHY.
-
2a.
-
- For access to another database B, the owner of A must have been granted the permission AUTHENTICATE in the database B.
-
2b.
-
For actions that require server-level permissions, the owner of A must have been granted the permission AUTHENTICATE SERVER.
-
-
So did I answer to my correspondent that he should grant his database owner AUTHENTICATE SERVER? No. I had a nagging feeling that there was something hiding here, and after some thinking, I came to the realisation that this was just a different way to give the DB owner the possibility to do everything on the server – that is, the rights of sysadmin. How can it be? Consider this scenario:
-
Say that you are DBA for a server that hosts many databases, owned by various people in your organisation. One database owner, let's call him David B Owner, comes to you with this stored procedure to perform BULK INSERT. He now needs your help to get the server-level permissions for the procedure to work. We have already looked at how do this with certificates, and you have learnt that this way you can have full control what permissions you have granted to what code. If David changes his code, he has to come to you again so you can sign it anew.
-
But assume that David B Owner persuades you to instead take the route with EXECUTE AS. David has already written a procedure and tested it out on his personal server, and you are swamped with other things. And maybe you don't want David come to you again and again, every time he changes the procedure. After all, what damage can you do with ADMINISTER BULK OPERATIONS alone? Following the example in the previous section, you create the proxy login which you grant ADMINISTER BULK OPERATIONS, you make David's database trustworthy, and you grant David AUTHENTICATE SERVER. David merrily leaves your office. But what exactly did you do now? Did you in any way ensure that all David's database can do on server level is BULK INSERT?
-
Back at his desk, David runs this in his database:
-
CREATE USER [Domain\ServerDBA] -- That's you!
-go
-EXECUTE AS USER = 'Domain\ServerDBA'
-
That is, David creates a user for you in his database, and then he impersonates that user. Since he owns the database, he has full permissions to do anything in the database, including these two actions. As long as at least one of the two doors in the sandbox are closed, David can only play that he is you inside in his own database. But you were kind to open both doors to him, and now he has all powers on the server that you have. On top of all, auditing will give you the blame for what he is doing, unless auditing is based on original_login() and the similar columns in Profiler and the DMVs. When David is done, he can drop you as a user from the database to cover his tracks.
-
This is a classical example of privilege elevation, and the sandbox exists precisely to prevent this from happening by default.
-
In this last example, a non-privileged user was the database owner, but in many shops is customary to have sa or some dedicated SQL login as the database owner for all databases. (The problem with having individuals as database owners is that when people leave the company the DBA is not always informed when the user is dropped from the Active Directory, leaving the DBA with a database owned by an orphaned user.) But there are still people like Anna DeMin and David B Owner who are application admins or whatever, and they are member of db_owner in that database. In this scenario, what does it mean to set the database as trustworthy?
-
If the database is owned by sa (or some other user with sysadmin rights) the situation is just like above. Since sa is the owner, one of the doors of the sandbox is open from the start. If you make the database trustworthy, any person with db_owner rights can impersonate a server login with sysadmin rights just and do whatever he likes. What if the databases are owned by a generic login which has no other server permissions than owning all the databases? In this case, the door to server-level permission is closed, but the doors to all user databases are open. A malicious user with db_owner rights can do
-
EXECUTE AS USER = 'dbo'
-
and if the database is trustworthy, he can access all databases on the server owned by that login with full permission, which means that the user can read and write data he is not authorised to access.
-
In these examples I have assumed that the evil user is in the db_owner role. But db_owner is not required. More precisely, it's sufficient to have permission create users in the database and and have permission to impersonate users. Being member of db_securityadmin and db_accessadmin is sufficient. You should also not overlook the possibility that two users with supplementing permissions can work together.
-
You have now seen that TRUSTWORTHY is a switch that applied casually that can be utilised by malicious persons. But is this switch ever secure?
-
Certainly. When it comes to give plain users server-level permission through stored procedures, EXECUTE AS + TRUSTWORTHY is safe if all persons who have elevated permissions in the database also are members of sysadmin or have CONTROL SERVER. In this trivial case, there is no person who can use impersonation to elevate his permissions. This scenario is not unlikely on a server that is dedicated to a single application. However, keep in mind that one day you may be oblivious and grant a person you don't trust sysadmin rights to have db_owner permissions in that database. Maybe a support person for a vendor application. Maybe a junior DBA (who may prove to be less than junior when it comes to exploit security holes!) So while EXECUTE AS may seem simpler, I would say that for server-level access, you should always use certificates. Keep in mind that with certificates you have full control over what permissions you grant. Even if you don't want to review Anna's and David's bulk-insert procedures over and over again but instead give them the password to the certificate, the only permission they can ever abuse is ADMINISTER BULK OPERATIONS. Whereas with EXECUTE AS and a trustworthy database, there are no restrictions at all.
-
Cross-Database Access
-
In the previous section I showed that it is dangerous to make a database trustworthy, if all databases are owned by the same generic user. But if all databases have individual owners, it's a different matter. Note here that individual owners do not have to be physical persons, but it could be a generic login for each database. If this is the situation, there are a few scenarios for cross-database access where EXECUTE AS + TRUSTWORTHY may be perfectly acceptable.
-
Consider an application that consists of several databases all with the same owner, and there is a need for stored procedures to access data in more than one database. In this article we have looked three alternatives to address this situation: 1) Database chaining and the database option DB_CHAINING. 2) Certificates. 3) EXCUTE AS + Trustworthy. If the requirement is that every application database should be able to access all the other databases, then database chaining may be the simplest solution.
-
But say that there is only one database where there are stored procedures with cross-database access, and you don't want to permit access from the other databases. Since DB_CHAINING must be enabled for all databases, this rules out this option. The advantage with EXECUTE AS + TRUSTWORTHY over database chaining is that you can select which databases you make trustworthy. Of course, if you decide to use EXECUTE AS for cross-database access, you need to make sure that you can handle the consequences of impersonation and make sure that you don't rely on SYSTEM_USER et al, but only use original_login() or context_info(). If not, certificates are, as always, an option.
-
Here is a second scenario: there are two databases, A and B, which are part of different, but related, applications, and the databases have different owners. There is a need to access data in database B from A. To do this with EXECUTE AS, database A must be TRUSTWORTHY, and furthermore the database owner of A must be granted the permission AUTHENTICATE in database B. For this to be permissible, all users with db_owner or similar rights in database A must be entitled to see all data in database B, since they now can do:
-
CREATE USER owner_of_database_B
-go
-EXECUTE AS USER = 'owner_of_database_B'
-
They can now do whatever they want in database B. To some extent this is a matter about trust. If the owner of database B trusts all users in database B not to mess up his database, he can grant AUTHENTICATE to the owner of database A. After all, having indirect permission through AUTHENTICATE is from a legal point of view not the same as being added to the db_owner role in the database. Still owner of B is taking a risk, and personally, I say if there is sensitive data in the database he should not accept to grant AUTHENTICATE to the owner of A, but insist on certificate signing, and review all code that accesses his database.
-
Obviously, the point about trust can be made about server permissions as well. If you trust Anna DeMin and David B Owner, you can grant them AUTHENTICATE SERVER. But in my opinion, there is too much at stake here to even consider this.
-
I like to stress again, that a presumption for it to be acceptable to make a database TRUSTWORTHY is that the database is owned by a user specific to that database, or group of databases. As soon there is a generic owner who owns unrelated databases, TRUSTWORTHY cannot be considered permissible. (Unless there never are any users who are only db_owner in a subset of the databases.)
-
Starting Jobs
-
We looked previously at how we could make it possible for users of an application to start a certain job with help of certificates. The solution is somewhat dubious, since it requires you to counter-sign three procedures in msdb. Could this be done better with EXECUTE AS without compromising security? I think so. Here are the steps for a possible solution.
-
-
The source database must have an individual owner.
-
The source database must be TRUSTWORTHY.
-
The database owner is added to msdb and granted AUTHENTICATE in that database.
-
Create a login-less user jobstartuser in msdb and add this user to SQLAgentOperatorRole.
-
You create a stored procedure in msdb to start the job in question. The procedure should have EXECUTE AS 'jobstartuser'.
-
The database owner is granted EXECUTE permission on this procedure.
-
The database owner creates a stored procedure in his database with EXECUTE AS 'dbo' that calls the procedure in msdb.
-
-
The reader may be shocked here, since we have learnt that if you own a trustworthy database and have AUTHENTICATE permission in another database, then you can get the power of the owner of that database by creating a user for him in your own database and then impersonate him. And yet I'm suggesting this? And with msdb, a system database?
-
Yes. You see, there is a special case. The owner of msdb is, by default, sa. And if you try any of:
-
CREATE USER sa
-CREATE USER Nisse FROM LOGIN sa
-
You will be told:
-
Msg 15405, Level 16, State 1, Line 1
-Cannot use the special principal 'sa'.
-
You may ask: what happens if I create a user for someone I know is member of sysadmin and impersonate that user? The answer is that in this case, you will access msdb as guest. As long as that person is not an explicit member of msdb, that is. And there is a weakness with this solution. There is maybe little reason to add members of sysadmin to msdb. But what if there are operators or junior DBAs who are not sysadmin, but who are entitled to administer jobs? They have to be users in msdb, so they can be added to the various SQL Server Agent roles. And with AUTHENTICATE permission in msdb, the owner of database A can impersonate these guys and do things he should not be permitted to.
-
There is potentially a second problem with this solution. Who says that it is supported to put user procedures in msdb? Maybe it is, but I have not been able to find an answer in either direction. When I asked in our internal MVP forum, the only reply I got was Why don't you create the procedure in master? At first I did not see the point, as it would only serve to make the solution to be more complicated. Sure, no risk that the database owner would be able to impersonate operators in msdb, but instead he would have to be granted AUTHENTICATE in master.
-
But after some more thinking I realised that using an intermediate database was the right thing, but it should not be master, but a dedicated database. So here is the modified list of steps:
-
-
The source database must have an individual owner.
-
The source database must be TRUSTWORTHY.
-
Create an intermediate database, call it jobstarter. This database
- MUST
-be owned by sa.
-
Make jobstarter TRUSTWORTHY.
-
Create a login jobstartuser who is to be the proxy user to start jobs. Deny this login the CONNECT SQL, that is, the right to log in to SQL Server.
-
Add jobstartuser to msdb and make it member of the SQLAgentOperatorRole.
-
Add jobstartuser to the jobstarter database.
-
Add the owner of the source database to jobstarter, and grant him AUTHENTICATE.
-
In jobstarter create a procedure that calls sp_start_job for the specific job. The procedure should have EXECUTE AS 'jobstartuser'.
-
Grant the database owner EXECUTE permission on the procedure.
-
The database owner adds a procedure to his database with EXECUTE AS 'dbo' that calls the procedure in jobstarter.
-
-
When I devised this solution, I debated with myself whether I should really have this jobstartuser. If you instead use EXECUTE AS OWNER in the procedure that calls sp_start_job, there is no need to create this extra login. Since I have advocated that you should never grant more permissions than needed, I chose to follow this line. But in this particular case, I cannot really blame you if you prefer EXECUTE AS OWNER. And you could argue that this is safer, since if jobstartuser is mistakenly granted permissions in jobstarter it should not have, this could lead to a security hole.
-
Before I show you an example script, I like to point out an important difference to the solution with certificates. In that solution, there is no code in msdb, nor is there any intermediate database. Instead the procedure that calls sp_start_job is in the source database. This is possible with certificates, since the DBA can have full control over what can be done with the ceritificate, for instance by dropping the private key. But when we use EXECUTE AS, the call to sp_start_job must be outside of reach for the database owner.
-
Here is a complete script that demonstrates the solution (the introductory remark on the example scripts applies as always). If you want to run this, you need to create a job called Testjob. It does not have to do anything particularly meaningful.
-
USE master
-go
--- Create a login for a database owner as well plain test user.
-CREATE LOGIN databaseowner WITH PASSWORD = 'JoBS=tA7RTte5t'
-CREATE LOGIN testuser WITH PASSWORD = 'eXEc=a$=TeST'
-CREATE LOGIN jobstartuser WITH PASSWORD = 'No login !!'
-DENY CONNECT SQL TO jobstartuser
-go
--- Create test database and set owner. We set the database trustworthy.
-CREATE DATABASE jobstarttest
-ALTER AUTHORIZATION ON DATABASE::jobstarttest TO databaseowner
-ALTER DATABASE jobstarttest SET TRUSTWORTHY ON
-go
--- Create an intermediate database. This database *must* be owned by sa.
--- This database should never have any non-sysadmin privileged users.
-CREATE DATABASE jobstarter
-ALTER AUTHORIZATION ON DATABASE::jobstarter TO sa
-ALTER DATABASE jobstarter SET TRUSTWORTHY ON
-go
--- Next stop is msdb.
-go
-USE msdb
-go
--- Create a user for jobstartuser and give permissions.
-CREATE USER jobstartuser
-EXEC sp_addrolemember SQLAgentOperatorRole, jobstartuser
-go
--- Set up things the intermediate database.
-USE jobstarter
-go
--- Create a user for the jobstartuser.
-CREATE USER jobstartuser
-go
--- We add the database owner as a user and grant him AUTHENTICATE.
-CREATE USER databaseowner
-GRANT AUTHENTICATE TO databaseowner
-go
--- Create a procedure to start a certain job.
-CREATE PROCEDURE start_this_job WITH EXECUTE AS 'jobstartuser' AS
- EXEC msdb..sp_start_job 'Testjob'
-go
--- Permit the databaseowner to run this procedure.
-GRANT EXECUTE ON start_this_job TO databaseowner
-go
--- Move to test database.
-USE jobstarttest
-go
--- Create a database user for the test login as well as the proxyuser.
-CREATE USER testuser
-go
--- Create a procedure that calls our start procedure in msdb.
-CREATE PROCEDURE start_our_job WITH EXECUTE AS 'dbo' AS
- EXEC jobstarter..start_this_job
-go
--- Give test user right to execute the procedure.
-GRANT EXECUTE ON start_our_job TO testuser
-go
--- Switch to the test user.
-EXECUTE AS LOGIN = 'testuser'
-go
--- Start the job, this succeeds.
-EXEC start_our_job
-go
--- Back to ourselves.
-REVERT
-go
--- Clean up.
-go
-USE msdb
-go
-DROP USER jobstartuser
-go
-USE master
-go
-DROP DATABASE jobstarttest
-DROP DATABASE jobstarter
-DROP LOGIN testuser
-DROP LOGIN databaseowner
-DROP LOGIN jobstartuser
-
You may find this solution a bit too elaborate, and I can certainly agree. A better solution may to be use a mix of impersonation and certificate signing. Put the procedure start_this_job in msdb and use EXECUTE AS to get access to sp_start_job. But instead of making the source database TRUSTWORTHY, you use certificate signing to give permission to run start_this_job. This also relieves you of the requirement that the database must not have an individual owner.
-
As a final note: if you want to see which user in the source database that actually started the job, counter-signing the system procedures is the only choice. The auditing in msdb is performed through SYSTEM_USER so any impersonation breaks that.
Before we leave EXECUTE AS, there is one more side effect I have yet to discuss. This is a little more on the advanced side, and something I learnt from SQL Server MVP Adam Machanic.
-
In a CLR module, you can access the WindowsIdentity object. The main
- purpose for this is in assemblies that have been marked as EXTERNAL_ACCESS or UNSAFE where you want to access resources outside SQL Server with the Windows
- permissions of the actual user. To do this, you need to impersonate that user,
- or else the access will be through the service account for SQL Server.
-
As long as there has not been any impersonation through EXECUTE AS, SqlContext.WindowsIdentity.Name will return the domain and the Windows user name,
- if the user logged in through Windows authentication. For an SQL login, WindowsIdentity is Null, so access to SqlContext.WindowsIdentity.Name yields a Null exception.
-
But if there is an EXECUTE AS clause somewhere on the call stack, you can no
- longer retrieve the user name for the Windows user. In most cases, WindowsIdentity is Null. But, if the database was set as trustworthy, and
- the EXECUTE AS is for a user with sysadmin privileges, then WindowsIdentity.Name will return the name of the service account for SQL Server.
-
Other Methods
-
In this section I will cover three other methods to secure SQL Server.
-Sometimes I see people ask on the newsgroups and forums How can I grant
-access to an application? That is, they don't want the users to be able to
-access the tables directly from SSMS or Excel, but only from the application. The regular approach to achieve this is
-to use stored procedures, and we have already looked what possibilities they offer. But not all applications use stored procedures. In this section, I will
- briefly look at three solutions you can employ regardless whether you use
-stored procedures or not.
Application roles were added in SQL 7. The idea is that you
- create a role to which you assign the necessary privileges to run the
- application. The users have no permissions at all beyond the database access. The application calls the system procedure
- sp_setapprole to activate the role. To do this, the application must pass a password
- that can be obfuscated when sent over the wire.
-
Application roles may seem what you are looking for, but the password is a
-weak point. If you have a two-tier application, you can never achieve
-a secure solution with application roles. The password has to be embedded in the
-application, or stored somewhere the user has read access. You can chop it into
-pieces and store the pieces in the four corners of the application, but at best
-that is security by obscurity. It's a different matter if you have a three-tier
-application. Then you can store the password on the middle tier somewhere the
-users do not have read access. You should still need to beware that anyone who can get
-access to the network wire to SQL Server may be able to eavesdrop and crack the
-password.
-
By default, when you activate an application role, you cannot back out of it.
-This has an effect on connection pooling; if you try to reuse a connection where
-an application role has been active, you will get an error. But you can get a
-cookie back from sp_setapprole, which you then can pass to
-sp_unsetapprole before you disconnect.(Please see
- sp_setapprole in Books Online for the exact syntax.)
-
This also makes it possible for having several application roles with
- custom permissions for various tasks, similar to what we have discussed for
- certificates and EXECUTE AS. That is, you would set the application role, perform the SQL that needs special permissions, and then unset the role.
- (Note that you cannot call sp_setapprole from within a stored procedure;
- it must be called from the top-level scope.) But due to the password issue, it
- is not a solution that I recommend.
-
Since application roles are database entities, you cannot use them for things
- that require server-level permissions, for instance bulk load.
-
When you use application roles, functions that return login names – SYSTEM_USER, suser_sname() etc – still return the login name of the
- actual user. However, functions that return the database-level user name –
- USER, user_name() – return the name of the application role.
I have already touched at application proxies in several places, mainly in
- the sections on the EXECUTE AS statement and
- SET CONTEXT_INFO. Here I like
- to give just a few more remarks.
-
For an "application proxy" to be meaningful, the application must have at
- least three tiers. The middle tier authenticates the user and then connects to
- SQL Server. The same arrangement can be achieved with application roles, but
- with one difference: the application proxy can be a Windows login, so there is
- no password crossing the wire.
-
An interesting observation on SET CONTEXT_INFO
- is that it
- could serve as a full alternative to EXECUTE AS to impersonate the real user. All checks and auditing in the application that require knowledge about the real user would use context_info() to get this information. But as I discussed earlier, if there are holes in the application that permits for SQL injection, a malicious user could inject a SET CONTEXT_INFO to change his identity. For this reason, the EXECUTE AS statement
- with its NO REVERT and WITH COOKIE
- clauses appears as safer.
It is possible to set up a Remote Desktop connection so that a specific application is started, when the user
-connects. Furthermore, on Windows 2008, it is
-possible to set this up so that the user arrives directly to the login screen of
-the application, and the application appears as if it executes from his
-computer. That is, there is no desktop from the computer running Terminal
-Server. Please don't ask me how you do to set this up; I'm an SQL Server MVP,
-not a Windows MVP. But I've seen a demo of it.
-
If you have a two-tier application, you can use this to ensure that users can
-connect only through the application, and not through Access, Excel, Management
-Studio or whatever. You need to configure the network so that the SQL Server
-machine is not directly accessible from the users' computers, only from the
-computer running Terminal Server. One way to do this is to configure the firewall
-on the SQL Server machine to only accept connections from certain IP addresses.
-
Since this solution builds on things outside my realm, I cannot fully asses
-how secure it is. For instance, I don't know if there is any possibility for
-users to intercept the login process in Terminal Server. Nevertheless, it is an interesting option. Not the least if you have a two-tier application, you don't want to re-architect.
-
Final Words
-
Security is always a challenge. One aspect is that security and convenience rarely goes hand in hand. Better security often means more hassle.
-
But security is also a challenge, because the holes in your security scheme may not always be apparent. To work with security means that you constantly have to think around corners. Can this permission be exploited by a malicious user? Could there be privilege elevation? You cannot only consider the current situation, but you must also try to see into the future. Maybe your current setup is secure because of some assumptions that are true now. But what if those assumptions are not true to tomorrow?
-
In this article I have presented a number of solutions and suggestions, which I believe to be secure. But I cannot rule out that I've made a shortcut too many somewhere. By all means, if you apply any of my solutions in an area where security is top priority, you should make your own evaluation of the solution to assess whether there is a hole somewhere.
-
In this article we have looked at three different solutions to grant permissions through stored procedures: ownership chaining, certificates and EXECUTE AS.
-
Of these, ownership signing only works in a limited scenario, but a very common one, and ownership signing is what you will use 99 % of the time or even more.
-
In the situations where ownership signing is not sufficient, you can always use certificate signing to grant other permissions. With certificates you can have very tight control over what permissions you grant. Not the least is this important if you are a server DBA who needs to grant server-level permission to users in application databases.
-
And then there is EXECUTE AS... As you have realised from this article, I am less than enthusiastic over EXECUTE AS. Everything you can do with EXECUTE AS you can do with certificates. (Save to cover up for an explicit DENY.) But it has to be admitted that EXECUTE AS is simpler. So I think that EXECUTE AS is OK to grant database permissions under these circumstances:
-
-
The application was designed with EXECUTE AS in mind. That is row-level security and auditing is based on original_login() or context_info().
-
You use proxy users with specific permissions and don't descend to EXECUTE AS OWNER as the miracle cure.
-
-
From this follows that if you are a plain developer and need a solution to grant permissions beyond what is possible with ownership chaining, you cannot start using EXECUTE AS on your own initiative. You first need to discuss with your DBA or the chief designer of the application, so that you don't wreak havoc of something.
-
There are also some situations where EXECUTE AS is meaningful for cross-database access, and we have looked at some examples. The presumption is that the database has an individual owner, so that the effect of making it trustworthy is limited.
-
But when it comes to server-level permissions, you should be extremely conservative with using EXECUTE AS, since this requires the database to be trustworthy and the database owner to be granted AUTHENTICATE SERVER. Any user in that database with sufficient permission will be able to elevate his permission to the sysadmin role. You should have very good reasons not to use certificates here.
-I like to thank SQL
-Server MVPs Dan Guzman, Martin Bell, Adam Machanic, Hugo Kornelis, Razvan Socol, Kent
-Tegels and Victor Isakov as well as Imran Mohamed and Jerry Horochowianka for submitting valuable
-suggestions for this article.
-
If you have suggestions for improvements, corrections on
- contents, language or
-formatting, please mail me at
-esquel@sommarskog.se. If you have technical questions that any knowledgeable
-person could answer, I encourage you to post a question to the SQL Server Security forum on MSDN/Technet.
2011-12-31 – Added text about a new feature in SQL Server 2012, that makes it easier to copy a certificate from one database to another, including the new section CREATE CERTIFICATE FROM BINARY in SQL 2012.
-
2011-07-13 – A major overhaul of the article to reflect that five years had passed since the original publication. I have also added some quite important new material. Changes in summary:
-
-
I wrote the original article when SQL 2005 was brand-new, it is no longer. I've revised the article to change that perspective a bit.
-
Added a section on counter-signing stored procedures and added an example how to use this for starting jobs.
-
Replaced the old section What About the Password? with a new section, Managing Certificates and Passwords for a better and deeper discussion on the security around certificates. There is also a script to show how you can use throw-away passwords when you deploy signed stored procedures for server-level permissions.
Added a section about the implications on Profiler and the DMVs when you use EXECUTE AS.
-
Added three new sections in the chapter on EXECUTE AS: One that discusses the risks with making a database trustworthy. There is a new section on cross-database access, and there is also an example how to use EXECUTE AS to start jobs.
-
Added a brief description of one more method – using Terminal Server.
2011-01-11 – Corrected the expression to decode
- context_info(). The old expression would
- result in a number trailing NUL characters in the character data. Thanks to
-Imran Mohamed for pointing out the error.
-
2006-03-28 – Rewrote the section on asymmetric keys on suggestions
- from Razvan Socol.
-
-
-
-
\ No newline at end of file
diff --git a/Articles/How to share data between stored procedures.htm b/Articles/How to share data between stored procedures.htm
deleted file mode 100644
index 02c92774..00000000
--- a/Articles/How to share data between stored procedures.htm
+++ /dev/null
@@ -1,1152 +0,0 @@
-
-
-
-
-How to share data between stored procedures
-
-
-
-
-
-
How can I
- use the result set from one stored procedure in another, also expressed
- as How can I
- use the result set from a stored procedure in a SELECT statement?
-
How can I pass a table data in a parameter from one stored procedure to
- another?
-
-
In this text I will discuss a number of possible solutions and point out their
- advantages and drawbacks. Some methods apply only when you want to
- access the output from a stored procedure, whereas other methods are good for the input scenario, or both input and output. In the case
- you want to access a result set, most methods require you to rewrite the
- stored procedure you are calling (the callee) in one way or another, but some solutions do
- not.
-
Here is a summary of the methods that I will cover. Required version refers to the minimum version of SQL Server where the solution is available. When the column is empty, this means all versions from SQL 2000 and up.
At the end of the article, I briefly discuss the particular situation when
-your stored procedures are on different servers, which is a quite challenging situation.
-
A related question is how to pass table data
- from a client, but this is a topic which is outside the scope for this text. Of the methods
- that I discuss in this article, only table-valued parameters and XML are useful for this case. For
- a more general discussion on passing structured data from a client to SQL
- Server, see my article Arrays and
- Lists in SQL Server.
-
Examples in the article featuring tables such as authors, titles, sales etc run in the old sample database pubs. You can download the script for pubs from Microsoft's web site. (Some examples use purely fictive tables, and do not run in pubs.)
This method can only be used when the result set is one single row.
- Nevertheless, this is a method that is sometimes overlooked. Say you have
- this simple stored procedure:
You can now easily call insert_customer from another stored procedure.
- Just recall that in T‑SQL you need to specify the OUTPUT keyword also in the
- call:
When all you want to do is to reuse the result set from a stored procedure, the first thing to investigate is whether it is possible to rewrite the stored procedure as a table-valued function. This is far from always possible, because SQL Server is very restrictive with what you can put into a function. But when it is possible, this is often the best choice.
-
There are two types of table functions in SQL Server: inline and multi-statement functions.
Here is a example of an inline function adapted from Books Online for SQL 2000:
-
CREATE FUNCTION SalesByStore (@storeid varchar(30))
-RETURNS TABLE AS
-RETURN (SELECT t.title, s.qty
- FROM sales s
- JOIN titles t ON t.title_id = s.title_id
- WHERE s.stor_id = @storeid)
-To use it, you simply say:
-
SELECT * FROM SalesByStore('6380')
-You can filter the data with WHERE or use it in a bigger query that includes other tables. That is, you use the function just like was a table or a view. You could say that an inline function is a parameterised view, because the query optimizer expands the function
- as if it was a macro, and generates the plan as if you had provided the expanded
- query. Thus, there is no performance cost for packaging a SELECT statement into
- an inline function. For this reason, when you want to reuse a stored
- procedure that consists of a single SELECT statement, rewriting it into an
- inline UDF is without doubt the best choice. (Or instead of rewriting it, move
- the SELECT into a UDF, and rewrite the existing procedure as a wrapper on the
- function, so that the client is unaffected.)
-
There are a couple of system functions you cannot use in a UDF, because SQL Server thinks it matters that they are side-effecting. The most commonly used ones are newid(),and rand(). On SQL 2000 this restriction goes further and disallows all system functions that are nondeterministic, that is, functions that do not return the same value for the same
-input parameters on each call. A typical example is getdate().
-A multi-statement function has a body that can have as many statements as you
-like. You need to declare a return table, and you insert
-the data to return into that table.
-Here is the function above as a multi-statement function:
-
CREATE FUNCTION SalesByStore (@storeid varchar(30))
- RETURNS @t TABLE (title varchar(80) NOT NULL PRIMARY KEY,
- qty smallint NOT NULL) AS
-BEGIN
- INSERT @t (title, qty)
- SELECT t.title, s.qty
- FROM sales s
- JOIN titles t ON t.title_id = s.title_id
- WHERE s.stor_id = @storeid
- RETURN
-END
-
-You use multi-statement functions in the same way as you use inline functions, but in difference to
-inline functions, they are not expanded in place, but instead it's like you
-would call a stored procedure in the middle of the query and return the data in
-a table variable. This permits you to move the code of a more complex stored procedure into
-a function.
-
As you can see in the example, you can define a primary key for your return table. I like to point out that this definitely best practice for two reasons:
-
-
It states your assumptions of the data. If your assumptions are incorrect, you will be told up front. (Instead of spending time to understand why your application presents incorrect data.)
-
This is information that is valuable to the optimizer when you use the function in a larger query.
-
-
It goes without saying, that this is only meaningful if you define a primary key on the columns you produce in the body of the UDF. Adding an IDENTITY column to the return table only to get a primary key is pointless.
-
- Compared to inline functions, multi-statement functions
- incur some overhead due to the return table. More important, though, is that if you use the function in
- a query where you join with other tables, the optimizer will have no idea of what the function returns, and will
-make standard assumptions. This is far from always an issue, but the more rows the function returns, the higher the risk that the optimizer will make incorrect estimates and produce an inefficient query plan. One way to avoid this is to insert the results from the function into a temp table. Since a temp table has statistics this helps the optimizer to make a better plan.
-
It follows from this, that there is not much reason to consider which sort of
- function to use. If you can express your problem in a single query, use an
-inline function. Only use a multi-statement function when an inline function is not possible.
-
User-defined functions are quite restricted in what they can do, because a UDF is not permitted to change the database state. The most important restrictions are:
-
-
You can only perform INSERT, UPDATE or DELETE statements on table
- variables local to the function.
-
You cannot call stored procedures (with the exception of extended stored
- procedures).
-
You cannot invoke dynamic SQL.
-
You cannot create tables, neither permanent tables nor temp tables. You can use table variables.
-
You cannot use RAISERROR, TRY-CATCH or BEGIN/COMMIT/ROLLBACK TRANSACTION.
-
You cannot use "side-effecting" system functions, such as newid() and rand().
-
On SQL 2000, you cannot use non-deterministic system functions.
-
-
Please see the Remarks section in the topic for CREATE FUNCTION in Books Online
- for a complete list of restrictions.
What could be better for passing data in a database than a table? When using a table there are no restrictions, but you have a solution that works in all situations. We will look at two ways to do this, as well as a third way which is a variation of the second. It should be admitted, though, that this is a little more heavy-handed than some of the other solutions in this article. Using tables can also lead to performance issues due to recompilation.
In this example, caller creates the temp table, and called_procedure
- fills it in, that is, the table is output-only. A different scenario is that caller fills the table
- with input data whereupon called_procedure performs some general computation, and the caller uses the result from that computation for some purpose. That is, the table is used for both input and output. Yet a scenario is that the caller prepares the temp table with data, and the callee first performs checks to verify that a number of business rules are not violated, and then goes on to update one or more tables. This would be an input-only scenario.
-
Changing Existing Code
-
Say that you have this procedure:
-
CREATE PROCEDURE SalesByStore @storeid varchar(30) AS
- SELECT t.title, s.qty
- FROM sales s
- JOIN titles t ON t.title_id = s.title_id
- WHERE s.stor_id = @storeid
-
You want to reuse this result set in a second procedure that returns only titles that have sold above a certain quantity. How would you achieve this by sharing a temp table without affect existing clients? The solution is to move the meat of the procedure into a sub-procedure, and make the original procedure a wrapper on the original like this:
-
CREATE PROCEDURE SalesByStore_core @storeid varchar(30) AS
- INSERT #SalesByStore (title, qty)
- SELECT t.title, s.qty
- FROM sales s
- JOIN titles t ON t.title_id = s.title_id
- WHERE s.stor_id = @storeid
-go
-CREATE PROCEDURE SalesByStore @storeid varchar(30) AS
- CREATE TABLE #SalesByStore(title varchar(80) NOT NULL PRIMARY KEY,
- qty smallint NOT NULL)
- EXEC SalesByStore_core @storeid
- SELECT * FROM #SalesByStore
-go
-CREATE PROCEDURE BigSalesByStore @storeid varchar(30),
- @qty smallint AS
- CREATE TABLE #SalesByStore(title varchar(80) NOT NULL PRIMARY KEY,
- qty smallint NOT NULL)
- EXEC SalesByStore_core @storeid
- SELECT * FROM #SalesByStore WHERE qty >= @qty
-go
-EXEC SalesByStore '7131'
-EXEC BigSalesByStore '7131', 25
-go
-DROP PROCEDURE SalesByStore, BigSalesByStore, SalesByStore_core
-
Note: This script is a complete repro script that creates some objects, tests them, and then drops them, to permit simple resting of variations. We will look at more versions of these procedures later in this text.
-
Just like in the example with the multi-statement function, I have defined a primary key for the temp table, and exactly for the same reasons. Speaking of best practices, some readers may wonder about the use of SELECT * here. I think using SELECT * from a temp table created in the same procedure is OK, particularly if the purpose is to return all columns in the temp table. (In difference to using SELECT * from a table created elsewhere, and which may be altered without your knowledge.)
-
While this solution is straightforward, you may feel uneasy by the fact that the CREATE TABLE statement for the temp table appears in two places, and there is a third procedure that depends on the definition. Here is a solution which is a little more convoluted that to some extent alleviates the situation:
-
CREATE PROCEDURE SalesByStore_core @storeid varchar(30),
- @wantresultset bit = 0 AS
- IF object_id('tempdb..#SalesByStore') IS NULL
- BEGIN
- CREATE TABLE #SalesByStore(title varchar(80) NOT NULL PRIMARY KEY,
- qty smallint NOT NULL)
- END
-
- INSERT #SalesByStore (title, qty)
- SELECT t.title, s.qty
- FROM sales s
- JOIN titles t ON t.title_id = s.title_id
- WHERE s.stor_id = @storeid
-
- IF @wantresultset = 1
- SELECT * FROM #SalesByStore
-go
-CREATE PROCEDURE SalesByStore @storeid varchar(30) AS
- EXEC SalesByStore_core @storeid, 1
-go
-
I've moved the CREATE TABLE statement for the wrapper into the core procedure, which only creates the temp table only if it does not already exist. The wrapper now consists of a single EXEC statement and passes the parameter @wantresultset as 1 to instruct the core procedure to produce the result set. Since this parameter has a default of 0, BigSalesByStore can be left unaffected.
-
A Note on the Virtues of Code Reuse
-
Before we move on, I like to point out that the given example as such is not very good practice. Not because the concept of sharing temp tables as such is bad, but as with all solutions, you need to use them in the right place. As you realise, defining a temp table and creating one extra stored procedure is too heavy artillery for this simple problem. But an example where sharing temp tables would be a good solution would have to consist of many more lines of code, which would have obscured the forest with a number of trees. Thus, I've chosen a very simple example to highlight the technique as such.
-
Keep in mind that compared to languages such as C# and Java, Transact-SQL is poorly equipped for code reuse, why solutions in T‑SQL to reuse code are clumsier. For this reason, the bar for reuse is somewhat higher in T‑SQL. It's still a virtue, but not as big virtue as in modern object-oriented languages. In this simple problem, the best would of course be to add @qty as a parameter to SalesByStore. And if that would not be feasible for some reason, it would still be better to create BigSalesByStore by means of copy-paste than sharing a temp table.
-
Beside the poverty of T‑SQL as a language, there is a second reason why code reuse is something that you should be a little careful with. Say that there is a requirement to show the sales for all stores in a certain state. In a pure C# or Java environment, it would be normal to write a loop that calls SalesByStore for every store. But in a database with several hundred gigabytes of data, the performance penalty for such a solution can be severe.
-
A Maintenance Problem
-
If the callee is called from many places, and you want to change which
-columns it reads/writes, you need to revisit all calling stored procedures
- to edit the temp-table definition. For this reason, sharing temp tables
- is mainly useful when you have a single pair of caller and callee.
- Then again, if the temp is narrow, maybe only a single column of customer IDs
-to process, the table is likely to be very stable.
-
There are some alternatives to overcome the maintenance problem. One is to use a process-keyed table, which we will look into in the next section. I have also received some interesting ideas from readers of this article.
-
One solution comes from Richard St-Aubin. The callers create the temp table with a single dummy column, and then call a stored procedure that uses ALTER TABLE to add the real columns. It would look something like this:
-
CREATE PROCEDURE called_procedure @par1 int,
- @par2 bit,
- ... AS
- ...
- INSERT/UPDATE/DELETE #mytemp
-go
-CREATE PROCEDURE define_temp_table AS
- ALTER TABLE #mytemp ADD col1 int NOT NULL,
- col2 char(5) NULL,
- ...
-go
-CREATE PROCEDURE caller AS
- DECLARE ...
- CREATE TABLE #mytemp (dummycol bit)
- EXEC define_temp_table
- ...
- EXEC called_procedure @par1, @par2 ...
- SELECT * FROM #mytemp
-go
-
You must create the temp table in caller, since if you were to put the CREATE TABLE statement in define_temp_table, the table would be dropped when that procedure exits. This method can definitely be
- worth exploring, but I like to add a word of caution. Adding columns to a table at run-time can lead to unexpected errors if the procedure is recompiled. If you call the procedure that adds the columns directly after the CREATE TABLE statement, you should be
-fairly safe. But this depends on the fine print in SQL Server, so it could break with a new release. A second issue is that this method prevents SQL Server from caching the temp-table definition. This could have a significant impact if the procedures are called with a high frequency.
-
Another solution, which requires SQL 2008, comes from Wayne Bloss. He creates a table type that holds the definition of the temp table. You can only use table types for declaring table variable and table parameters. But Wayne has a cure for this:
-
DECLARE @dummy my_table_type
-SELECT * INTO #mytemp FROM @dummy
-
From this point you work with #mytemp; the sole purpose of @dummy is to be able to create #mytemp from a known and shared definition. (If you are unacquainted with table types, we will take a closer look on them in the section on table-valued parameters.) A limitation with this method is that you can only centralise column definitions this way, but not constraints as they are not copied with SELECT INTO. You may think that constraints are odd things you rarely put in a temp table, but I have found that it is often fruitful to add constraints to my temp tables as assertions for my assumptions about the data. This does not the least apply for temp tables that are shared between stored procedures. Also, defining primary keys for your temp tables can avoid performance issues when you start to join them.
-
Let me end this section by pointing out that sharing temp tables opens for an interesting possibility for flexibility. The callee
- only cares about the columns it reads or writes. This permits a caller
- to add extra columns for its own usage when it creates the temp table. Thus, two callers to the same callee could have different definitions of the
-temp table, as long as the columns accessed by the callee are defined consistently.
-
Note: A more advanced way to tackle the maintenance problem is to use a
- pre-processor and put the definition of the temp table in an include-file. If you have a C compiler around, you can use the C pre-processor. My AbaPerls includes a pre-processor, Preppis, which we use in the system I spend most of my time with.
-
The Impact of Recompilation
-
One distinct drawback with this method is that it causes a lot of recompilation in the callee. Each time the caller is invoked, a new instance
-of the temp table is created, and for this reason SQL Server must recompile all statements in the callee that refer to the temp table. (Recall what I said about flexibility in the previous paragraph. The definition could really be different.) If the execution time for the callee is expected to be subsecond and there are several complex statements in the procedure, the recompilation may add an overhead of more than 100 %. On the other hand, if the typical execution time of the callee is one minute, the cost of recompilation is likely to be negligible.
-
One way to reduce the amount of recompilation is to copy any input data in the shared table to a local table first thing, and then write back the result at the end. This restricts the recompilation to these two statements, but it goes without saying that this adds an overhead in itself, and it's mainly an option when you expect the table to hold a small amount of data.
-
I should hasten to add that recompilation can happen for several reasons. It is very common for temp tables to cause recompilation because of changed statistics, a topic I will return to when I discuss process-keyed tables.
-
Note: if you are still on SQL 2000, you should be aware of that in this version of SQL Server, recompilation is always on procedure level and therefore more expensive. Statement-level recompilation was introduced in SQL 2005.
-
A Note on SQL Server Data Tools
-
-
Simultaneously with SQL Server 2012, Microsoft released SQL Server Data Tools, SSDT. This is a very versatile environments that gives you many benefits. One benefit is that if you write a stored procedure like:
-
CREATE PROCEDURE example_sp AS
- CREATE TABLE #temp(a int NOT NULL)
- SELECT a FROM #temmp
-
SSDT will tell you up front of the misspelling about the temp table name, before you try to run the batch to create the procedure. This is certainly a very helpful feature, because a typo can be trapped early. However, SSDT has no notion about sharing temp tables, so SSDT will also give you a warning for a procedure like SalesByStore_core, or more precisely three: one per column. They are only warnings, so you can proceed, but it takes a handful of such procedures to clutter up the Error List window so there is a risk that you miss other and more important issues.
-
There is a way to suppress the warning: right-click the file in Solution Explorer and select Properties. There is a property Suppress T-Sql Warning and here you can enter the code for the error. But this means that you lose the checking of all table names in the procedure; there is no means to only suppress the warning only for the shared temp table.
-
All and all, if you are using SSDT, you will find an extra resistence barrier against sharing temp tables.
This method evades the
- maintenance problem by using a permanent table instead. There is still a recompilation problem, though, but of a different
- nature.
-
Outline
-
A process-keyed table is simply a permanent table that serves as a temp
- table. To permit processes to use the table simultaneously, the table
- has an extra column to identify the process. The simplest way to do this is the global
- variable @@spid (@@spid is the process id in SQL Server). In fact, this is so
- common, that these tables are often referred to as spid-keyed tables.
- Here is an outline; I will give you a more complete example later.
-
CREATE TABLE process_keyed (spid int NOT NULL,
- col1 int NOT NULL,
- col2 char(5) NULL,
- ...)
-go
-CREATE CLUSTERED INDEX processkey_ix ON process_keyed (spid)
--- Add other columns as needed.
-go
-...
-DELETE process_keyed WHERE spid = @@spid
-INSERT process_keyed (spi, col1, col2, ....)
- VALUES (@@spid, @val1, @val2, ...)
-...
-SELECT col1, col2, ...
-FROM process_keyed
-WHERE spid = @@spid
-...
-DELETE process_keyed WHERE spid = @@spid
-
A few things to note here:
-
-
The table should have a clustered index on the process key (spid
- in this example), as all queries against the table will include the
- condition WHERE spid = @@spid.
-
You should delete any existing data for @@spid before you insert any
- data into the table, as a safety precaution.
-
When you are finished using the data you should delete it, so that it
- does not occupy any extra space.
-
-
Choosing the Process-key
-
While it's common to use @@spid as the process key there are two problems with this:
-
-
If sloppy programmers neglect to clear the spid before and after use, old data may be passed to the callee, causing incorrect results that are difficult to understand how they arose.
-
If a client needs to pass a process-key around, there is no guarantee that it will have the same spid every time, since modern clients typically connect and disconnect for each call they make.
-
-
One alternative for the process-key is to use a GUID (data type
-uniqueidentifier). If you create the process key in SQL Server, you can use the function newid(). (You can rely on newid() to return a unique value, which is why it addresses the first point.) You may have heard that you should not have guids in your clustered index, but that applies when the guid is the primary key alone, since this can cause fragmentation and a lot of page splits. In a process-keyed table, you will typically have many rows for the same guid, so it is a different situation.
-
SQL 2012 offers a new alternative: get the process-key from a sequence, which is a new type of object in SQL 2012. A sequence is akin to an IDENTITY column, but it is an object of its own.
-
A Longer Example
-
Let's say that there are several places in the application where you need to compute the total number of sold books for one or more stores. You put this computation in a procedure ComputeTotalStoreQty, which operates on the table stores_aid. In this example, the procedure is nothing more than a simple UPDATE statement that computes the total number of books sold per store. A real-life problem could have a complex computation that runs over several hundred lines of code. There is also an example procedure TotalStoreQty which returns the returns the total sales for a certain state. It fills stores_aid with all stores in that state, calls ComputeTotalStoreQty and then returns the result to the client. Note that TotalStoreQty is still careful to clear its entry in stores_aid both before and after the call.
-
CREATE TABLE stores_aid
- (process_key uniqueidentifier NOT NULL,
- storeid char(4) NOT NULL,
- totalqty smallint NULL,
- CONSTRAINT pk_stores_aid PRIMARY KEY (process_key, storeid)
-)
-go
-CREATE PROCEDURE ComputeTotalStoreQty @process_key uniqueidentifier AS
- UPDATE stores_aid
- SET totalqty = s.totalqty
- FROM stores_aid sa
- JOIN (SELECT stor_id, SUM(qty) AS totalqty
- FROM sales
- GROUP BY stor_id) AS s ON s.stor_id = sa.storeid
- WHERE sa.process_key = @process_key
-go
-CREATE PROCEDURE TotalStoreQty @state char(2) AS
- DECLARE @process_key uniqueidentifier
- SELECT @process_key = newid()
-
- DELETE stores_aid WHERE process_key = @process_key
- INSERT stores_aid(process_key, storeid)
- SELECT @process_key, stor_id
- FROM stores
- WHERE state = @state
-
- EXEC ComputeTotalStoreQty @process_key
-
- SELECT storeid, totalqty
- FROM stores_aid
- WHERE process_key = @process_key
-
- DELETE stores_aid WHERE process_key = @process_key
-go
-EXEC TotalStoreQty 'CA'
-go
-DROP PROCEDURE TotalStoreQty, ComputeTotalStoreQty
-DROP TABLE stores_aid
-
Please note that I have defined a proper key for stores_aid adhering to best practices.
-
Name Convention and Clean-up
-
You may wonder what that _aid in the table name comes from. In the environment where I do my daily chores, we have quite a few process-keyed tables, and we have adapted the convention that all these tables end in -aid. This way, when you read some code, you know directly that this is not a "real" table with persistent data. (Nevertheless some of our aid tables are very important in our system as they are used by core functions.)
-
There is a second point with this name convention. It cannot be denied
- that a drawback with process-keyed tables is that sloppy programmers could forget to
-delete data when they are done. Not only this wastes space, it can also result in incorrect row-count estimates leading to poor query plans. For this reason it is a good idea to clean up these tables on a regular basis. For instance, in our night-job we have a procedure that runs the query below and then executes the generated statements:
-
SELECT 'TRUNCATE TABLE ' + quotename(name)
-FROM sysobjects
-WHERE type = 'U'
- AND name LIKE '%aid'
-
-
Issues with Recompilation
-
As we saw, when sharing temp tables, this causes recompilations in the callee, because the temp table is a new table every time. While this issue does not exist with process-keyed tables, you can still get a fair share of recompilation because of auto-statistics, a feature which is enabled in SQL Server by default. For a permanent table, auto-statistics kicks in when the first 500 rows have been added, and then every time
- 20 % of the rows have changed. (For full details on recompilation, see this
- white paper by Eric Hanson and Yavor Angelov.) Since a process-keyed table is typically
- empty when it is not in use, auto-statistics sets in often. Sometimes this
- can be a good thing, as the statistics may help the optimizer to find a
-better plan. But as I noted previously, recompilation may also cause an unacceptable performance overhead.
-
As when sharing temp tables, one way to circumvent the recompilation is to copy data to a local table on input and copy back on output. But for process-keyed tables there are two more options:
-
-
Disable auto-statistics for the table entirely with sp_autostats.
-
Use the query hint OPTION (KEEPFIXED PLAN) for queries which are costly to recompile, and where the changed statistics are unlikely to affect the outcome of the compilation.
-
-
The Cost of Logging
-
Compared to sharing temp tables, one disadvantage with process-keyed tables is that you tend to put them
- in the same database as your other tables. This has two ramifications:
-
-
The tables are subject to complete logging; temp tables are only logged for rollbacks, not for recovery on start-up, since tempdb is always recreated when SQL Server starts.
-
If the database has full recovery, the process-keyed table will consume extra space in your transaction-log backups.
-
-
The second point can be addressed by putting
-all your process-keyed tables in a separate database with simple recovery. Both points can be addressed by using a global temp table, which I will discuss in the next session.
-
Using Memory-optimised Tables in SQL 2014
-
If you are on SQL 2014 – which of this writing is only available as a CTP and not yet released – there is an excellent solution to this problem. Use a table created with these options:
-
WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_ONLY)
-
This is part of an entirely new feature in SQL 2014, known under the code name Hekaton. Hekaton tables are entirely in memory, and for really blazing performance you access them from stored procedures that have been compiled to C code. You can also access them from traditional T-SQL and still see significant performance improvements compared to traditional tables. Hekaton tables can hold persistent data, just like regular tables, and in such case there is still an overhead of writing to the transaction log. However, when you create a Hekaton table, there is also the option to say you don't want data to be durable. Such tables need very little logging, and this is perfect for process-keyed tables, where you don't want any data to survive a server crash.
-
A couple of notes:
-
-
The database must be configured to permit Hekaton tables. Specifially, you need to add a filegroup for memory-optimized data. (This is a directory, akin to what you have for FILESTREAM data.)
-
The surface area for Hekaton is limited, and currently these data types are not supported: MAX data types, xml, text, ntext, image, sql_variant, datetimeoffset and CLR data types. Furthermore, the maximum data size for a row must not exceed 8060 bytes.
-
You must define a primary key for the table, which must be either nonclustered or a hash (a new index type, specific to Hekaton). This can be a bit of a bummer – some of my process-keyed tables are a bit denormalised as they contain different type of data.
-
While I mentioned natively compiled stored procedured, these have a very limited feature set, and it is not likely that you will have much use for them with your process-keyed tables. For one thing, natively compiled stored procedures cannot access disk-based tables, which you probably want to join your process-keyed table with.
-
At this writing, it is not clear whether Hekaton will be available in all editions of SQL Server.
-
-
Conclusion
-
While process-keyed tables are not without issues when it comes to performance, and they are certainly a bit heavy-handed for the simpler cases, I still see this is the best overall solution that I present in this article. It does not come with a ton of restrictions like table-valued functions and it is robust, meaning that code will not break because of simple changes in difference to some of the other methods we will look at later.
-
But that does not mean that using a process-keyed table is always the way to go. For instance, if you only need output-only, and your procedure can be written as a table-valued function, that should be your choice.
If you create a table with two leading hash marks (e.g. ##temp), this is a global temp
-table. In difference to a regular temp table, a global temp table is visible to
-all processes. However, when the process that created the table goes away, so
-does the table (with some delay if another process is running a query against
-the table in that precise moment). That makes global temp tables difficult to
-use on any real global basis, but only when you have control over all
-involved processes like when spawning a second process through xp_cmdshell.
-
Nevertheless, there is a special case that SQL Server MVP Itzik Ben-Gan made me aware of: if you create a global temp table in a start-up procedure, the global temp
- table will be around as long as the server is up, unless someone explicitly
- drops it. This makes it possible to use a global temp table as a process-keyed
-table. This way you can have a fixed and known schema for your process-keyed table but still get the reduced logging of tempdb.
-
Here is a quick sample of how you create a global temp table when SQL Server starts:
-
USE master
-go
-CREATE PROCEDURE create_global_temp AS
- CREATE TABLE ##global(process_key uniqueidentifier NOT NULL,
- -- other columns here
- )
-go
-EXEC sp_procoption create_global_temp, 'startup', 'true'
-
It cannot be denied that there are some problems with this solution. What
- if you need to change the definition of the global temp table in way that cannot
- be handled with ALTER TABLE? Having to restart the server to get the new definition
- in place may not be acceptable. One way to address is to refer to your
- process-keyed table through a synonym (a feature added in SQL 2005). In
- development, you let the synonym point to a local table, and only when you are
-ready for production you change the synonym to refer to the global temp table. If you need to change the table definition while system is live, you create the new version of the table in the local database and change the synonym and run it that way until the server is restarted.
Table-valued parameters (TVP) were introduced in SQL 2008. They permit you to pass a table variable as a parameter to a stored procedure. When you
- create your procedure, you don't put the table definition directly in the
- parameter list, instead you first have to create a table type
- and use that in the procedure definition. At first glance, it may seem like an extra step
- of work, but when you think of it, it makes very much sense: you will
-need to declare the table in at least two places, in the caller and in the callee. So why not have the definition in one place?
-
Here is a quick example of a table-valued parameter in play:
-
CREATE TYPE my_table_type AS TABLE(a int NOT NULL,
- b int NOT NULL)
-go
-CREATE PROCEDURE the_callee @indata my_table_type READONLY AS
- INSERT targettable (col1, col2)
- SELECT a, b FROM @indata
-go
-CREATE PROCEDURE the_caller AS
- DECLARE @data my_table_type
- INSERT @data (a, b)
- VALUES (5, 7)
- EXEC the_callee @data
-go
-
One thing to note is that a table-valued parameter always has an implicit default value of an empty table. So saying EXEC the_callee in this example would not be an error.
-
Table-valued parameters certainly seem like the definite solution, don't they? Unfortunately, TVPs have a very limited usage for the problems I'm discussing in this article. If you look closely at the procedure definition, you find the keyword READONLY. And that is not an optional keyword, but it is compulsory for TVPs. So if you want to use TVPs to pass data between stored procedures, they are usable solely for input-only scenarios. I don't know about you, but in almost all situations where I share a temp table or use
- a process-keyed table it's for input-output or
-output-only.
-
When I first heard that SQL 2008 was to have TVPs, I was really excited. And when I learnt that they were readonly, I was equally disappointed. During the beta of SQL 2008 I wrote an article, Why read-only table parameters is not enough, where I tried to whip up
- support for a Connect item in order to persuade the dev team to permit read-write TVPs when they are passed between stored procedures. The Connect item is still active, but with the release of SQL Server 2012 around the corner, the limitation is still there. Let's really hope that in the next version of SQL Server, we can use table parameters to pass data in all directions!
-
Note: While outside the scope for this article, table-valued parameters is still a welcome addition to SQL Server, since it makes it a lot easier to pass a set of data from client to server, and this context the READONLY restriction is not a big deal. I give an introduction how to use TVPs from ADO .Net in my article Arrays and Lists in SQL Server 2008.
-
INSERT-EXEC
-
Overview
-
INSERT-EXEC is a method that has been in the product for a long time. It's a method that is seemingly very appealing, because it's very simple to use and understand. Also, it permits you use the result of a stored procedure without any changes to it. Above we had the example with the procedure SalesByStore. Here is a how we can implement BigSalesByStore with INSERT-EXEC:
-
CREATE PROCEDURE SalesByStore @storeid varchar(30) AS
- SELECT t.title, s.qty
- FROM sales s
- JOIN titles t ON t.title_id = s.title_id
- WHERE s.stor_id = @storeid
-go
-CREATE PROCEDURE BigSalesByStore @storeid varchar(30),
- @qty smallint AS
-
- CREATE TABLE #SalesByStore(title varchar(80) NOT NULL PRIMARY KEY,
- qty smallint NOT NULL)
-
- INSERT #SalesByStore (title, qty)
- EXEC SalesByStore @storeid
-
- SELECT * FROM #SalesByStore WHERE qty >= @qty
-go
-EXEC SalesByStore '7131'
-EXEC BigSalesByStore '7131', 25
-go
-DROP PROCEDURE SalesByStore, BigSalesByStore
-
In this example, I receive the data in a temp table, but it could also be a permanent table or a table variable. (Except on SQL 2000, where you cannot use a table variable.)
-
It cannot be denied that this solution is simpler than the solution with sharing a temp table. So why then did I first present a more complex solution? Because when we peel off the surface, we find that this method has a couple of issues that are quite problematic.
Msg 8164, Level 16, State 1, Procedure BigSalesByStore, Line 8
-An INSERT EXEC statement cannot be nested.
-
This is a restriction in SQL Server and there is not much you can do about it. Except than to save the use of INSERT-EXEC until when you really need it. That is, when rewriting the callee is out of the question, for instance because it is a system stored procedure.
-
There is a Serious Maintenance Problem
-
Six months later there is a user requirement for the application function that uses the result set from SalesByStore that the column title_id should be displayed. A developer merrily adds the column to the result set. Unfortunately, any attempt to use the function calling BigSalesByStore now ends in tears:
-
Msg 213, Level 16, State 7, Procedure SalesByStore, Line 2
-Column name or number of supplied values does not match table definition.
-
What it says. The result set from the called procedure must match the column list in the INSERT statement exactly. The procedure may produce multiple result sets, and that's alright as long as all of them match the INSERT statement.
-
From my perspective, having spent a lot of my professional life with systems development, this is completely unacceptable. Yes, there are many ways to break code in SQL Server. For instance, a developer could add a new mandatory parameter to SalesByStore and that would also break BigSalesByStore. But most developers are aware the risks with such a change to an API and therefore adds a default value for the new parameter. Likewise, most developers understand that removing a column from a result set could break client code that expects that column and they would not do this without checking all code that uses the procedure. But adding a column to a result set seems so innocent. And what is really bad: there is no way to find out that there is a dependency – save searching through all the database code for calls.
-
Provided that you may alter the procedure you are calling, there are two ways to alleviate the problem. One is simply to add a comment in the code of the callee, so that the next developer that comes around is made aware of the dependency and hopefully changes your procedure as well.
-
Another way is to use table types (if you are on SQL 2008 or later).
- Here is an example:
-
CREATE TYPE SalesByStore_tbl AS TABLE
- (titleid varchar(80) NOT NULL PRIMARY KEY,
- qty smallint NOT NULL)
-go
-CREATE PROCEDURE SalesByStore @storeid varchar(30) AS
- DECLARE @ret SalesByStore_tbl
- INSERT @ret (titleid, qty)
- SELECT t.title, s.qty
- FROM sales s
- JOIN titles t ON t.title_id = s.title_id
- WHERE s.stor_id = @storeid
- SELECT * FROM @ret
-go
-CREATE PROCEDURE BigSalesByStore @storeid varchar(30),
- @qty smallint AS
- DECLARE @data SalesByStore_tbl
- INSERT @data
- EXEC SalesByStore @storeid
- SELECT title, qty FROM @data WHERE qty >= @qty
-go
-EXEC SalesByStore '7131'
-EXEC BigSalesByStore '7131', 25
-go
-DROP PROCEDURE SalesByStore, BigSalesByStore
-DROP TYPE SalesByStore_tbl
-
It is interesting to note that this code makes virtue of two things that usually are bad practice, to wit SELECT * and INSERT with out an explicit column list. This is not a matter of sloppiness – it is essential here. If someone wants to extend the result set of SalesByStore, the developer has to change the table type, and BigSalesByStore will survive, even if the developer does not know about its existence.
-
You could argue that this almost like an output TVP, but don't forget the other problems with INSERT-EXEC – of which there are two more to cover.
-
The Procedure is Executed in the Context of a Transaction
-
Even if there is no explicit transaction started with BEGIN TRANSACTION, an INSERT statement constitutes a transaction of its own. (So that the statement can be rolled back in case of an error.) That includes any procedure called through INSERT-EXEC. Is this bad or not? In many cases, this is not much of an issue. But there are a couple of situations where this can cause problems:
-
-
The procedure performs an update intended to be quick. Locks are now held for a longer duration, which may cause contention problems.
-
The isolation level is REPEATABLE READ or SERIALIZABLE, as opposed to the default READ COMMITTED. This also causes locks to held longer than intended.
-
Some system procedures disagree to be called within a transaction.
-
If the procedure accesses a linked server, you now have a distributed transaction. Distributed transactions are sometimes difficult to get working. See more about this in the closing chapter on linked servers.
-
-
Rollback and Error Handling is Difficult
-
In my article on error handling, I suggest that you should always have an error handler like
-
BEGIN CATCH
- IF @@trancount > 0 ROLLBACK TRANSACTION
- EXEC error_handler_sp
- RETURN 55555
-END CATCH
-
The idea is that even if you do not start a transaction in the procedure, you should always include a ROLLBACK, because if you were not able to fulfil your contract, the transaction is not valid.
-
Unfortunately, this does not work well with INSERT-EXEC. If the called procedure executes a ROLLBACK statement, this happens:
-
Msg 3915, Level 16, State 0, Procedure SalesByStore, Line 9
-Cannot use the ROLLBACK statement within an INSERT-EXEC statement.
-
-
The execution of the stored procedure is aborted. If there is no CATCH handler anywhere, the entire batch is aborted, and the transaction is rolled back. If the INSERT-EXEC is inside TRY-CATCH, that CATCH handler will fire, but the transaction is doomed, that is, you must roll it back. The net effect is that the rollback is achieved as requested, but the original error message that triggered the rollback is lost. That may seem like a small thing, but it makes troubleshooting much more difficult, because when you see this error, all you know is that something went wrong, but you don't know what.
-
And, no, before you ask, there is no way to find out at run-time that you are called from INSERT-EXEC.
-Presumably, you have created the statement in @sql within your stored procedure, so it is unlikely that a change in the result set will go unnoticed. So from this perspective, INSERT-EXEC is fine. But the restriction that INSERT-EXEC can't nest remains, so if you use it, no one can call you with INSERT-EXEC. For this reason, in many cases it is better to put the INSERT statement inside
-the dynamic SQL.
-
There is also a performance aspect, that SQL
- Server MVP Adam Machanic has detailed in a
- blog post. The short
- summary is that with INSERT-EXEC, data does not go directly to the target table but bounces over a "parameter table",
- which incurs some overhead. Then again, if your target table is a temp table, and you put the INSERT inside the dynamic SQL, you
-may face a performance issue because of recompilation.
-
Occasionally, I see people who use INSERT-EXEC to get back scalar values from their dynamic SQL statement, which they typically invoke with EXEC(). In this case, you should not use INSERT-EXEC at all, but instead use sp_executesql
- which permits you to use OUTPUT parameters.Dynamic SQL is a complex topic, and if you are not acquainted
- with it, I recommend you to read my article The
- Curse and Blessings of Dynamic SQL.
-
Conclusion
-
INSERT-EXEC is simple to use, and if all you want to do is to grab a big result set from a stored procedure for further analysis ad hoc, it's alright.
-
But you should be very restrictive to use it in application code. Only use it when rewriting the procedure you are calling is completely out of the question. That is, the procedure is not part of your application: a system stored procedure or part of a third-party product. And in this case, you should make it a routine to always test your code before you take a new version of the other product in use.
If INSERT-EXEC shines in its simplicity, using the CLR is complex and bulky. It is not likely to be
-your first choice, and nor should it. However, if you are in the situation that you cannot change the callee, and nor it possible for you to use INSERT-EXEC because of any of its limitations, the CLR can be your last resort.
-
As a recap, here are the main situations where INSERT-EXEC fails you, and you would want to turn to the CLR:
-
-
The called procedure returns several result sets with different
- structures. This is true for many system procedures in SQL Server.
-
The called procedure cannot be called within an active transaction. See
- the final note in this section for an example.
The called procedure accesses a linked server, and you cannot get the distributed transaction to work.
-
-
The CLR has one more advantage over INSERT-EXEC: it is less sensitive to
- changes in the procedure you call. If a column is added to the
- result set of the procedure, your CLR procedure will not break.
-
The idea as such is simple: you write a stored procedure in a CLR language like C# or
- VB .NET that runs the callee and captures the result set(s) into a DataSet object.
- Then you write the data from the DataSet back to the table where you want the
-data. While simple, you need to write some code.
-
Let's have a look at an example. When you call the system procedure sp_helpdb
- for a specific database, it produces two result sets, of which the second result set
- lists the files for the database. Say that you want to gather this output for
- all databases on the server. You cannot use INSERT-EXEC
- due to the multiple result sets. To address this issue, I wrote a stored
- procedure in C# that you find in the file
- helpdb.cs.
- In the script
- helpdb.sql
- you can see how I employ it. The C# procedure first runs sp_helpdb with the
- DataAdapter.Fill method to get the data into a DataSet. It then iterates over
- the rows in the second DataTable in the DataSet and inserts these into the temp
-table created by the SQL script.
-
On SQL 2008 it is possible to simplify the solution somewhat with help of a table-valued parameter. I've written a
- second version of the helpdb procedure, available in the file
-
- helpdb-2008.cs, where I simply pass the DataTable to the INSERT statement with a TVP and insert all rows in
- one go. To achieve this, I need to create a table type.
-I like to highlight two more things in helpdb-2008:
-
-
Since I want the database name in the final output, I pass this as a
- separate parameter to the INSERT statement, as it is not included in the
- DataTable.
-
The first column from sp_helpdb is called name, and in the temp table
- I've changed that to logicalname to make the final output clearer. However, in the table
- type the column is called name, since it must match the names in the
- DataTable which gets its names from the output of sp_helpdb.
-
-
Undoubtedly, this solution requires more work. You need to write more code than with most other methods, and you get an assembly that you must somehow deploy. If you already are using the CLR in your database, you probably already have routines for dealing with assemblies. But if you are not, that first assembly you add to the database is quite of a step to take. A further complication is that the CLR in SQL Server is disabled by default. To enabled it, you (or the DBA) need to run:
-
EXEC sp_configure 'clr enabled', 1
-RECONFIGURE
-
Another issue is that this solution goes against best practices for using the CLR in SQL Server. First of all, data access from the CLR should be avoided, simply because T‑SQL is better equipped for this. But here we are talking about situations where we need to circumvent limitations in T‑SQL. Another violation of best practice is the use of the DataAdapter, DataTable and DataSet classes. This is something to be avoided, because it means that you have data in memory in SQL Server outside the buffer pool. Of course, a few megabytes is not an issue, but if you would read several gigabytes of data into a DataSet, this could have quite nasty effects for the stability of the entire SQL Server process.
-
The alternative is to use a plain ExecuteReader and insert the rows as they come, possibly buffering them in small sets of say 500 rows to improve performance. This is certainly a viable solution, but it makes deployment even more difficult. To wit, you cannot perform the INSERT statements on the context connection while the DataReader is running, so you would need to open a second connection and this requires that the assembly has the permission EXTERNAL_ACCESS. So for practical purposes, you would only go this road, if you are anxious that you will read too much data than what is defensible for a DataSet.
-
Note: Initially, I got this idea when SQL Server MVP Steve Jones tried to run
- DBCC SHRINKDATABASE from INSERT-EXEC to
- capture the result set that SHRINKDATABASE
- produces. However, this command cannot be run inside a transaction, so that did not
- work out. I suggested to him that the CLR could work, and when I tested it I
- found that it did ... on SQL 2008 only. On SQL 2005, my process was killed
- with an access violation (which means a bug in SQL Server), so in this particular case not
-even the last resort worked.
Just like INSERT-EXEC this is a method where you can use the called stored procedure as-is. The purpose of OPENQUERY and its cousin OPENROWSET is to
- permit you to run pass-through queries on linked servers. It can be very
-useful, not the least if you want to join multiple tables on the remote server and want to be sure that the join is evaluated remotely. Instead of accessing a remote server, you can make a loopback connection to your own server, so you can to say
-things like:
-
SELECT * FROM OPENQUERY(LOCALSERVER, 'EXEC sp_who') WHERE status = 'runnable'
-
If you want to create a table from the output of a stored procedure with SELECT INTO to save typing, this is the only method in the article that fits the bill.
-
-
So far, OPENQUERY looks very simple, but as this chapter moves on you will learn that OPENQUERY can be very difficult to use. Moreover, it is not aimed at improving performance. It may save you from rewriting your stored procedure, but most likely you will have to put in more work overall – and in the end you get a poorer solution. While I'm not enthusiastic over INSERT-EXEC, it is still a far better choice than OPENQUERY.
-
Setup
-
In the example, LOCALSERVER may look like a keyword, but it is only name. This is how you define it:
To create a linked server, you must have the permission ALTER ANY SERVER, or
- be a member of any of the fixed server roles sysadmin or setupadmin. Instead of SQLOLEDB, you can specify SQLNCLI, SQLNCLI10 or SQLNCLI11 depending on your version of SQL Server. SQL Server seems to use the most recent version of the provider anyway.
-
Implications of Using a Loopback Connection
-
It's important to understand that OPENQUERY opens a new connection to SQL Server. This has some implications:
-
-
The procedure that you call with OPENQUERY cannot refer temp tables
- created in the current connection.
-
The new connection has its own default database (defined with sp_addlinkedserver, default is master), so all object
- specifications must include a database name.
-
If you have an open transaction and you are holding locks when you call OPENQUERY, the called procedure can not access what you lock. That is, if
- you are not careful you will block yourself.
-
Connecting is not for free, so there is a performance penalty.
-
There is also a performance penalty for passing the data out from SQL Server and back. Even if there is no network involved, data is copied twice extra compared to a plain SELECT query. This can be costly if the result set is big.
-
-
ANSI Settings
-
The settings ANSI_NULLS and ANSI_WARNINGS must be ON for queries
- involving linked servers. Thankfully, these setting are also on by default in most contexts. There are mainly two exceptions: 1) very old client APIs like DB-Library. 2) If you are still on SQL 2000, beware that if you create stored procedures from Enterprise Manager, they will be created with ANSI_NULLS OFF, and this is a setting that is saved with the procedure and overrides the setting for the connection. (If you use Query Analyzer to create your procedures, the issue does not arise.) It's not very likely that you will run into this issue, but if you see the error message
-
Msg 7405, Level 16, State 1, Line 1
-Heterogeneous queries require the ANSI_NULLS and ANSI_WARNINGS options
-to be set for the connection. This ensures consistent query semantics.
-Enable these options and then reissue your query.
-
you will need to investigate where the bad setting is coming from.
-
The Query Parameter
-
The second parameter to OPENQUERY is the query to run on the remote server, and you may expect to be able to use a variable here, but you cannot. The query string must be a constant, since SQL Server needs to be able to determine the shape of the result set at compile time. This means that you as soon your query has a parameter value, you need to use dynamic SQL. Here is how to implement BigSalesByStore with OPENQUERY:
What initially seemed simple to use, is no longer so simple. What I did not say above is there are two reasons why we need dynamic SQL here. Beside the parameter @storeid, there is also the database name. Since OPENQUERY opens a loopback connection, the EXEC statement must include the database name. Yes, you could hardcode the name, but sooner or later that will bite you, if nothing else the day you want to restore a copy of your database on the same server for test purposes. From this follows that in practice, there are not many situations in application code where you can use OPENQUERY without having to use dynamic SQL.
-
The code certainly requires some explanation. The function quotestring is a helper, taken from my article on dynamic SQL. It encloses a string in single quotes, and doubles any quotes within it to conform to the T‑SQL syntax. The problem with writing dynamic SQL which involves OPENQUERY is that you get at least three levels of nested strings, and if you try to do all at once, you will find yourself writing code which has up to eight consecutive single quotes that you or no one else can read. Therefore it is essential to approach the problem in a structured way like I do above. I first form the query on the remote server, and I use quotestring to embed the store id. Then I form the SQL string to execute locally, and again I use quotestring to embed the remote query. I could also have embedded @qty in the string, but I prefer to adhere to best practices and pass it as a parameter to the dynamic SQL string, As always when I use dynamic SQL, I include a @debug parameter, so that I can inspect the statement I've generated.
-
Note: the example is written for SQL 2005 and later. If you are on SQL 2000, you need to replace all occurrences of MAX with 4000.
-
The Battle with FMTONLY ON
-
To be able to compile a query that includes
-OPENQUERY, SQL Server must retrieve metadata from the linked server to determine the shape of the result set for the pass-through query. SQL Server
- makes all connections to the linked server through OLE DB, and the way OLE DB
- determines metadata on SQL Server up to SQL 2008 is to run the command batch preceded by SET FMTONLY ON.
- When FMTONLY is ON, SQL
- Server does not execute any data-retrieving statements, but only sifts through the statements to return metadata about the
- result sets. FMTONLY can be a source for confusion in more than one way. One situation is a procedure that creates a temp table: you will get an error message,
-since the table never gets created in FMTONLY mode. Here is one example:
-
SELECT * FROM OPENQUERY(LOCALSERVER, 'EXEC msdb..sp_helpindex sysjobs')
-
On SQL 2008, this results in:
-
Msg 208, Level 16, State 1, Procedure sp_helpindex, Line 104
-Invalid object name '#spindtab'.
-
(The actual error message is different on about every version of SQL Server.)
-
This happens because the CREATE TABLE statement for the temp table is not executed. (Note that this is different for table variables. Since they are declared entities, they exist from the moment the procedure starts executing, FMTONLY or not.) Now when we know why this error occurs, we can spot a workaround:
-
SELECT * FROM OPENQUERY(LOCALSERVER,
- 'SET FMTONLY OFF EXEC msdb..sp_helpindex sysjobs')
-
That is, we override the FMTONLY ON setting. But beware! This means that the procedure is executed twice, so
- there certainly is a performance cost. Moreover, if the procedure performs updating
- actions, these are also performed twice which is likely to be the completely wrong thing
-to do. While I mention this trick here, I strongly recommend against using it, particularly in production code. This becomes even more emphasised with the release of SQL Server 2012: on SQL 2012, SET FMTONLY OFF has no effect at all! I will come back to why and what the alternatives are.
-
If you absolutely want to use a stored procedure that uses a temp table, here is a different trick. This definitely counts as one of the most obscure pieces of T‑SQL I've ever come up with:
-
CREATE PROCEDURE temp_temp_trick AS
- DECLARE @fmtonlyon int
- SELECT @fmtonlyon = 0
- IF 1 = 0 SELECT @fmtonlyon = 1
- SET FMTONLY OFF
- CREATE TABLE #temp(...)
- IF @fmtonlyon = 1 SET FMTONLY ON
- -- Rest of the code goes here.
-
The reason that this works is that when FMTONLY is in effect, IF conditions are not evaluated, but both branches of IF ELSE are "executed". And while queries and CREATE TABLE statements are not performed in FMTONLY mode, variable assignments are. This way we lure SQL Server to create the temp table at compile-time, but the full procedure is not executed. This trick is arguably better than putting SET FMTONLY OFF in the call to OPENQUERY. But it still does not work with SQL 2012, so it is nothing you should put in code that is supposed to live for a couple of years. And obviously, this is not an option, if you cannot change the procedure you are calling.
-
Another common reason you get problems with FMTONLY is that the result set is produced in dynamic SQL. Again, this prevents SQL Server from determining the metadata. The famous, but undocumented, system stored procedure sp_who2 uses dynamic SQL to size the columns of the result set. On SQL 2008 the query
-
SELECT * FROM OPENQUERY(LOCALSERVER, 'EXEC sp_who2')
-results in:
-
Msg 7357, Level 16, State 2, Line 1
-Cannot process the object "EXEC sp_who2". The OLE DB provider "SQLNCLI10"
-for linked server "LOCALSERVER" indicates that either the object has no columns
-or the current user does not have permissions on that object.
-
Again, the workaround with SET FMTONLY OFF can be applied if you are on SQL 2008 or earlier. (Except that in this particular example it still does not work on SQL 2005 and SQL 2008 because sp_who2 returns two columns called SPID.) The same caveats apply: the procedure is executed twice, and it does not work on SQL 2012. So don't go there.
-
Metadata Retrieval in SQL 2012
-
In SQL 2012, Microsoft have scrapped SET FMTONLY ON which never did a good job; there are several other issues with it, that I have not covered here. Instead they use the new stored procedure sp_describe_first_result_set which is a more robust way to determine metadata, why the trick with SET FMTONLY OFF is no longer applicable. (To clarify: SET FMTONLY ON still works in SQL 2012 to support calls from legacy clients, and SQL 2012 also uses SET FMTONLY ON for linked servers running earlier versions of SQL Server. But for a loopback connection, SQL 2012 only uses sp_describe_first_result_set.)
-
While this procedure avoids many of the problems with SET FMTONLY ON, you will still get an error if your procedure uses a temp table or dynamic SQL. The good news is that Microsoft now offers a method to describe the result set. You can say:
-
SELECT * FROM OPENQUERY(LOCALSERVER,
- 'EXEC msdb..sp_helpindex sysjobs
- WITH RESULT SETS ((index_name sysname,
- index_description nvarchar(500),
- index_keys nvarchar(500)))')
-
That is, the new WITH RESULT SETS clause permits you to declare how the result set from the stored procedure looks like. SQL Server validates the actual result set against the description, and if there is an inconsistency, you will get an error. Pay attention to the syntax: the column list is enclosed in two pair of parentheses.
-
Rather than specify a list of columns, you can also specify the name of a table, view, table-valued function or a table type. Please refer to the topic on EXECUTE in Books Online for full details on the WITH RESULT SETS clause.
-
If you want to know how the result set from the stored procedure you are calling looks like, you can say:
-
EXEC sp_describe_first_result_set N'your_sp'
-
It has to be admitted that it takes some work to translate the output to a column list for WITH RESULT SETS. And obviously, if you wanted to use SELECT INTO with OPENQUERY to save your from typing a CREATE TABLE statement, this was not what you wanted.
-
The Effect of DML Statements
-
Yet a problem with OPENQUERY is demonstrated by
-this script:
-
CREATE TABLE nisse (a int NOT NULL)
-go
-CREATE PROCEDURE silly_sp @x int AS
- --SET NOCOUNT ON
- INSERT nisse VALUES (@x)
- SELECT @x * @@trancount
- SELECT @x * 3
-go
-SELECT * FROM OPENQUERY(LOCALSERVER, 'EXEC tempdb.dbo.silly_sp 7')
-go
-SELECT * FROM nisse
-go
-
The script yields the same errors as for sp_who2, saying that there are no columns.
-The reason for this message is that the first "result set" is the
-rows affected
-message generated by the INSERT statement, and this message lures OPENQUERY to think that there were no columns in the result set. Adding SET NOCOUNT ON to the procedure resolves this
-issue. You could also add SET NOCOUNT ON the command string you pass to OPENQUERY. (And in difference to tricking with SET FMTONLY ON, this is a perfectly valid thing to do.)
-
Implicit Transactions
-
When SQL Server executes the query
-for real, the OLE DB provider first issues SET IMPLICIT_TRANSACTIONS ON. With this setting
- SQL Server starts a transaction when an INSERT, UPDATE or DELETE statement is
- executed. (This also applies to a few more statements, see Books Online for
- details.) This can give some surprises. For instance, take the script above.
-Once SET NOCOUNT ON is in force, this is the output:
We get back '7' from the call to silly_sp, which indicates
- that @@trancount is 1, and there is thus an open transaction, despite there
- is no BEGIN TRANSACTION in the procedure. (We don't get the '21' that we get
- when we execute silly_sp directly, because with OPENQUERY, we only get one
- result set.) You also see that when we SELECT directly from nisse after
- the call to OPENQUERY, that the table is empty. This is because the implicit
- transaction was rolled back.
-
Final Words
-
As you have seen, at first OPENQUERY seems very simple to use, but the stakes quickly gets higher. If you are still considering to use OPENQUERY after having read this section, I can only wish you good luck and I hope that you really understand what you are doing. OPENQUERY was not intended for
- accessing the local server, and you should think twice before you use
-it that way.
XML is a solution that aims at the same spot as sharing a temp table and process-keyed tables. That is, the realm of general solutions without restrictions, to the price of a little more work. While SQL 2000 has support for XML, if you want to use XML to pass data between stored procedures, you need to have at least SQL 2005.
-
Constructing the XML
-
We will look at a version of SalesByStore and BigSalesByStore which uses XML, but since this is a little too much to digest in one go, we first only look at SalesByStore_core to see how we construct the XML:
-
CREATE PROCEDURE SalesByStore_core @storeid varchar(30),
- @xmldata xml OUTPUT AS
- SET @xmldata = (
- SELECT t.title, s.qty
- FROM sales s
- JOIN titles t ON t.title_id = s.title_id
- WHERE s.stor_id = @storeid
- FOR XML RAW('SalesByStore'), TYPE)
-go
-
In the previous version of SalesByStore_core, we stored the data from the result in a temp table. Here we use FOR XML RAW to generate an XML document that we save to the output parameter @xmldata.
-
This is how the resulting XML document may look like:
-
<SalesByStore title="Is Anger the Enemy?" qty="20" />
-<SalesByStore title="The Gourmet Microwave" qty="25" />
-<SalesByStore title="Computer Phobic AND Non-Phobic Individuals: Behavior Variations" qty="20" />
-<SalesByStore title="Life Without Fear" qty="25" />
-<SalesByStore title="Prolonged Data Deprivation: Four Case Studies" qty="15" />
-<SalesByStore title="Emotional Security: A New Algorithm" qty="25" />
-
FOR XML has three more options beside RAW: AUTO, ELEMENTS and PATH, but for our purposes here, RAW is the simplest to use. You don't have to specify a name for the elements; the default in this case will be row, but I would suggest that using a name is good for clarity.
-
The keyword TYPE ensures that the return type of the SELECT query is the xml data type; without TYPE the type would be nvarchar(MAX). TYPE is not needed here, since there will be an implicit conversion to xml anyway, but it can be considered good practice to include it. Except... there is a bug in SQL 2008 which makes XML documents created with TYPE to be less efficient.
-
Converting the XML Data Back to Tabular Format
-
Since SalesByStore should work like it did originally, it has to convert the data back to tabular format, a process known as shredding. Here is how the XML version looks like:
-
CREATE PROCEDURE SalesByStore @storeid varchar(30) AS
- DECLARE @xmldata xml
- EXEC SalesByStore_core @storeid, @xmldata OUTPUT
-
- SELECT T.c.value('@title', 'varchar(80)') AS title,
- T.c.value('@qty', 'smallint') AS qty
- FROM @xmldata.nodes('SalesByStore') AS T(c)
-go
-
To shred the document, we use two of the xml type methods. The first is nodes which shreds the documents into fragments of a single element. That is, this part:
-
FROM @xmldata.nodes('SalesByStore') AS T(c)
-
The part T(c) defines as alias for the one-column table as well as an alias for the column. To get the values out of the fragments, we use another xml type
- method, value, to get the individual values out of the fragment. The value method
- takes two arguments whereof the first addresses the value we want to extract, and the
- second specifies the data type. The first parameter is a fairly complex story, but as
- long as you follow the example above, you don't really need to know any more. Just keep in mind that you must put an @ before the attribute names, else you would be addressing an element. In the XML section of my article Arrays
- and Lists in SQL Server 2005 and Beyond, I have some more information about nodes and value.
-
To make the example complete, here is the XML version of BigSalesByStore. To avoid having to repeat the call to value in the WHERE clause, I use a CTE (Common Table Expression).
-
CREATE PROCEDURE BigSalesByStore @storeid varchar(30),
- @qty smallint AS
- DECLARE @xmldata xml
- EXEC SalesByStore_core @storeid, @xmldata OUTPUT
-
- ; WITH SalesByStore AS (
- SELECT T.c.value('@title', 'varchar(80)') AS title,
- T.c.value('@qty', 'smallint') AS qty
- FROM @xmldata.nodes('SalesByStore') AS T(c)
- )
- SELECT title, qty
- FROM SalesByStore
- WHERE qty >= @qty
-go
-
Input and Output
-
In this is example the XML document is output-only, but it's easy to see that the same method can be used for input-only scenarios. The caller builds the XML document and the callee shreds it back to a table.
-
What about input-output scenarios like the procedure ComputeTotalStoreQty? One possibility is of course that the callee shreds the data into a temp table, performs its operation, and converts the data back to XML. A second alternative is that the callee modifies the XML directly using the xml type method modify. I will spare you from an example of this, however, as it unlikely that you would try it, unless you already are proficient in XQuery. A better alternative may be to mix methods: use a table-valued parameter for input and only use XML for output.
-
Parent-child Data
-
The result set in the example is from a single table, but what if we have some form of parent/child-relationship?
- Say that we want to return the name of all authors, as well as all the titles they have written. With temp tables or
- process-keyed tables, the natural solution would be to
- use two tables (or actually three, since in pubs there is a many-to-many
- relationship between titles and authors, but I overlook this here.) But since
- XML is hierarchical, it would be more natural to put everything in a single XML
- document, and here is a query to do this:
-
SELECT a.au_id ,
- a.au_lname,
- a.au_fname ,
- (SELECT t.title
- FROM pubs..titleauthor ta
- JOIN pubs..titles t ON t.title_id = ta.title_id
- WHERE a.au_id = ta.au_id
- FOR XML RAW('titles'), TYPE)
-FROM pubs..authors a
-FOR XML RAW('authors'), TYPE
-
-Rather than a regular join query, I use a subquery for the titles, because I
-only want one node per author with all titles. With a join, I get one author
-node for each title, so that authors with many books appear in multiple nodes.
-The subquery uses FOR XML to create a nested XML document, and
-this time the
-TYPE option is mandatory, since without it the nested XML data would be included as a plain string.
-
- To retrieve the
-titles from the XML document, you could use this query:
-
SELECT au_id = A.item.value('@au_id', 'varchar(11)'),
- title = T.item.value('@title', 'varchar(80)')
-FROM @x.nodes('/authors') AS A(item)
-CROSS APPLY A.item.nodes('titles') AS T(item)
-
The first call to nodes gives you a fragment per authors node, and then you use CROSS APPLY to dig down to the titles node. For a little longer discussion on this way of shredding a hierarchical XML document, see the XML section of my article Arrays
-and Lists in SQL Server 2005 and Beyond.
-
Assessing the Method
-
So far the technique to use this method. Let's now assess it. If you have never worked with XML in SQL Server, you are probably saying to yourself I will never use that!. And one can hardly blame you. This method is like pushing the table camel through the needles eye of the parameter list of a stored procedure. Personally, I think the method spells k-l-u-d-g-e. But it's certainly a matter of opinion. I got a mail from David Walker, and he
-went as far as saying this is the only method that really works.
-
And, that cannot be denied, there are certainly advantages with XML over about all the other methods I have presented here. It is less contrived than using the CLR, and it is definitely a better option than OPENQUERY. You are not caught up with
-the limitations of table-valued functions. Nor do you have any of the issues with INSERT-EXEC. Compared to
- temp tables and process-keyed tables, you don't have to be worried about recompilation or that programmers fail to clean up a process-keyed table after use.
-
- When it comes to performance, you get some cost for building the XML document
-and shredding it shortly thereafter. Then again, as long as the amount of data is small, say less than 200 KB, the data will stay in memory and there is no logging involved like when you use a table of any sort. Larger XML documents will spill to disk, though. A general caveat is that inappropriate addressing in a large XML
-document can be a real performance killer, so if you expect large amounts of data, you have to be careful. (And these issues can appear with sizes below 200 KB.)
-
Besides the daunting complexity, there are downsides with XML from a robustness perspective. XML is more sensitive to errors. If you make
- a spelling mistake in the first argument to value, you will silently get NULL
-back, and no error message. Likewise, if you get the argument to nodes
- wrong, you will simply get no rows back. The same problem arises if you change a
- column alias or a node name in the FOR XML query, and forget to update a caller. When you use a process-keyed table or a temp
-table you will get an error message at some point, either at compile-time or at run-time.
-
Another weak point is that you have to specify the data type for each column in the call to value, inviting you to make the mistake to use different data types for the same value in different procedures. This mistake is certainly possible when use temp tables as well, although copy-and-paste are easier to apply on the latter. With a process-keyed table it cannot happen at all.
-
One thing I like with tables is that they give you a description of the data you are passing around; this is not the least important when many procedures are using the same process-keyed table. This is more difficult to achieve with XML. You could use schema collections for the task, but you will not find very many SQL Server DBAs who speak XSD fluently. Also, schema-bound XML tends to incur a performance penalty in SQL Server.
-
For these reasons, I feel that using a temp table or a process-keyed table are better choices than XML. And while I find XML an overall better method than INSERT-EXEC or OPENQUERY, these methods have the advantage that you don't have to change the callee. So that kind of leaves XML in nowhere land. But as they say, your mileage may vary. If you feel that XML is your thing, go for it!
This method was suggested to me by Peter Radocchia. Cursor variables were
- introduced in SQL 7, but I suspect that many SQL developers are at most only
- dimly aware of their existence. I never use them myself. Here is an example
-of how you use them to bring the result set from one procedure to another:
-
CREATE PROCEDURE get_cursor @cursor CURSOR VARYING OUTPUT AS
- SET @cursor = CURSOR STATIC FOR
- SELECT au_id, au_lname, au_fname FROM pubs..authors
- OPEN @cursor
-go
-CREATE PROCEDURE caller AS
- DECLARE @cursor CURSOR
- DECLARE @au_id char(11),
- @au_fname varchar(40),
- @au_lname varchar(40)
- SET NOCOUNT ON
- EXEC get_cursor @cursor OUTPUT
- WHILE 1 = 1
- BEGIN
- FETCH NEXT FROM @cursor into @au_id, @au_lname, @au_fname
- IF @@fetch_status <> 0
- BREAK
- PRINT 'Au_id: ' + @au_id + ', name: ' + @au_fname + ' ' + @au_lname
- END
- DEALLOCATE @cursor
-go
-EXEC caller
-go
-DROP PROCEDURE caller, get_cursor
-
Note that the cursor is STATIC. Static cursors are much preferable over dynamic cursors, the default cursor type, since the latter essentially evaluates the query for every FETCH. When you use a static cursor, the result set of the SELECT statement is saved into a temp table, from where FETCH retrieves the data.
-
I will have to admit that I see little reason to use this method. Just like
- INSERT-EXEC, this method requires an exact match between the caller and the
- callee for the column list. And since data is processed row by row,
- performance is likely to take a serious toll if there are any volumes.
If your procedures are on different servers, the level of difficulty rises steeply. There are many restrictions with linked servers, and several of the methods I have presented cannot be used at all. Ironically, some of the methods that I have discouraged you from, suddenly step up as the better alternatives. One reason for this is that with linked servers, things are difficult anyway.
-
It is somewhat easier to retrieve data from a procedure on a linked server than passing data to it, so let's look at output first. If you have an input-output scenario, you should probably look into mixing methods.
-
Output
-
If all you want to do is to get data back, these methods works:
-
OUTPUT parameters – but only for data types that
-are 8000 bytes or less. That is, you cannot retrieve the value of output parameters that are
-varchar(MAX) etc.
-
INSERT-EXEC – INSERT-EXEC works fine with linked servers. Actually even better than with local procedures, since if the procedure you call uses INSERT-EXEC, this will not matter. The only restriction is that the result set must not include types that are not supported in distributed queries, for instance xml. ((n)varchar(MAX) is OK.) The fact that INSERT-EXEC starts a transaction can cause a real nightmare, since the transaction now will be a distributed transaction and this requires that you configure MSDTC (Microsoft Distributed Transaction Coordinator) correctly. If both servers are in the same domain, it often works out of the box. If they are not, for instance because you only have a workgroup, it may be impossible (at least I have not been able to). On SQL 2008 and later, you may be able to escape the problem by setting the option remote proc transaction promotion for the linked server to false. (Note that this affects all uses of the linked server, and there may be situations where a distributed transaction is desirable.)
-
OPENQUERY – since OPENQUERY is a feature for linked
-servers in the first place, there is no difference to what I discussed above. It is still difficult with lots of pitfalls, but the land of linked servers is overall difficult. Nevertheless, INSERT-EXEC will in many cases be simpler to use. But with OPENQUERY you don't have to bounce the remote data over a table, and if result set of the remote procedure is extended with more columns, your code will not break.
-
Using the CLR – Using the CLR for linked servers is interesting, because the normal step would be to connect to the remote server directly, and bypass the local definition of linked servers – and thereby bypass all restrictions with regards to data types. When you make a connection to a remote server through the CLR, the default is enlist into the current transaction, which means that you have to battle MSDTC. However, you can easily escape this battle by adding enlist=false in the connection string to the remote server. This works on all versions of SQL Server from SQL 2005 and on. When using the CLR to access a remote server, there are no obstacles with using ExecuteReader and store the data into a local table as they come, since you are using two different connections. For a CLR procedure to be able to access a remote server, the assembly must be installed with the permission EXTERNAL_ACCESS.
-
XML – You cannot use the xml data type in a call to a remote stored procedure. However, you can make the OUTPUT parameter to be varchar(8000) and return the XML document that way – if it fits.
-
The other methods do not work, and that includes user-defined functions.
-You cannot call a user-defined function on a linked server.
-
Input
-
If you want to pass a large amount of data for input over a linked server, there are
-three possibilities. Or three kludges if you like.
-
XML might be the easiest. The xml data type is not supported in calls to remote procedures, so you need to convert the XML document to
-nvarchar(MAX) or varbinary(MAX). The parameter on the other side
-can still be xml.
-
You cannot pass a table-valued parameter to a remote stored procedure. But you could have a CLR stored procedure that connects to the remote server and passes the TVP directly; as noted above, the assembly needs to have the permission EXTERNAL_ACCESS. You cannot pass a TVP to a CLR stored procedure from T‑SQL, so you would either have to pass the data as XML to the CLR procedure, or the CLR procedure would have read the data from a (temp) table.
-
The last alternative is really messy. The caller stores the data in a
- process-keyed table locally and then calls the remote
- procedure, passing the process-key. The remote procedure then calls back to the
- first server and either selects directly from the process-keyed table, or calls a
-procedure on the source server with INSERT-EXEC. For an input-output scenario, the callee could write data back directly to the process-keyed table.
The issue about using SET FMTONLY ON is something that I learnt from Umachandar Jayachandran
- at Microsoft. SQL Server MVP Tony Rogerson pointed out
-that a process-keyed table should have a clustered index on the process key. Simon Hayes suggested some clarifications.
- Peter Radocchia suggested the cursor method. Richard St-Aubin and Wayne Bloss both suggested interesting approaches when sharing temp tables.
-Thanks
-to SQL Server MVP Iztik Ben-Gan for making me aware of global temp tables and
-start-up procedures. Sankar Reddy pointed out to me that my original suggestion
-for XML as a solution for linked servers was flawed. Greg Borota pointed out that
-an old
-leftover from SQL 2000 still was in the text. SQL Server MVP Adam Machanic made some
-interesting revelations about INSERT-EXEC with dynamic SQL.
-David Walker encouraged me to write more in depth on XML,
-and SQL Server MVP
-Denis Gobo gave me a tip on that part. Jay Michael pointed out an error in the section on table parameters.
-
If you have suggestions for improvements, corrections on topic, language or
- formatting, please mail me at
- esquel@sommarskog.se. If you have technical questions that any knowledgeable
-person could answer, I encourage you to post to the Transact-SQL forum on MSDN/Technet or any other SQL forum you frequent.
2013-11-02 – Added a subsection about process-keyed tables how they could be implemented with non-durable Hekaton tables in SQL 2014.
-
2013-03-24 – Modified the subsection A Maintenance Problem to include a good suggestion from Wayne Bloss about using a table type as the base for a shared temp table.
-
2012-07-18 – There were a few errors and mumblings in the paragraph about using the CLR for linked servers that I have corrected. Particularly I incorrectly said that you would not be enlisted in any transaction unless you specify this. The reverse applies: by default you are enlisted, but you can include enlist=true to the connection string.
-
2012-05-11 – Added a note about SQL Server Data Tools (SSDT) and sharing temp tables.
-
2011-12-31 – I have performed a general overhaul of the article in hope to make things clearer. Particularly, there are now more complete examples for the various techniques. In terms of new technical content I have updated the article for SQL 2012, which mainly affects OPENQUERY, since the trick with SET FMTONLY OFF does not work on SQL 2012. I have also expanded the closing chapter on linked servers a bit.
-
2010-01-10 – Extended the XML section with more
- examples and a deeper discussions on pros and cons. Updated the section
- table parameters for the fact that SQL 2008 is no
- longer in beta, and fixed error in code sample. Modified the section on
- OPENQUERY to explain why FMTONLY ON exists more
- accurately.
-
2009-06-29 – Added a brief discussion on performance about INSERT-EXEC with dynamic SQL, and a reference
-to a blog post from SQL
-Server MVP Adam Machanic.
-
2009-05-18 – The section on INSERT-EXEC said that it does not work with table variables, which is right
-on SQL 2000 only.
-
2008-08-16 – Added a trick for sharing temp tables, suggested by Richard St-Aubin.
-
2008-06-06 – Added a section on linked
-servers, and removed the note on linked servers in the
-XML section, since it was not very accurate.
-
2008-03-03 – Added a section on how could use the CLR
-when INSERT-EXEC fails you.
-Reviewed the section on XML anew, pointing out that it's
-useful when working with linked servers.
2005-12-19 – Article revised to cover SQL 2005, and added
- section on cursor variables.
-
2005-03-27 – Various minor clarifications on suggestion from Simon
- Hayes. The bug about INSERT-EXEC and IMPLICIT_TRANSACTIONS is now fixed in
- SQL 2000 SP4 and SQL 2005.
\ No newline at end of file
diff --git a/Articles/README.md b/Articles/README.md
index 8649f844..09dccaca 100644
--- a/Articles/README.md
+++ b/Articles/README.md
@@ -1,43 +1,675 @@
-# Must read Microsoft SQL Server articles
+# Microsoft SQL Server Articles
+Articles types:
+ - **[AZ]** Azure Articles
+ - **[B]** Backup Articles
+ - **[BENCH]** Benchmarking Articles
+ - **[IDX]** Index Articles
+ - **[CLR]** [SQL Server Common Language Runtime Integration](https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/sql-server-common-language-runtime-integration) Articles
+ - **[COR]** Corruption Articles
+ - **[DAX]** Data Analysis Expressions Articles
+ - **[DBA]** DBA Articles
+ - **[DEV]** Developers Articles
+ - **[DM]** Database Mail
+ - **[DBCC]** DBCC commands
+ - **[DS]** Dynamic SQL
+ - **[MG]** Migration Articles
+ - **[J]** Jobs Articles
+ - **[P]** Performance Articles
+ - **[PS]** Powershell Articles
+ - **[QS]** Query Store Articles
+ - **[R]** R Language
+ - **[SSIS]** [SQL Server Integration Services](https://docs.microsoft.com/en-us/sql/integration-services/sql-server-integration-services)
+ - **[V]** Visualization Articles
+ - **[X]** XML, JSON, YAML, HTML Articles
+ - **[XE]** [Extended events](https://docs.microsoft.com/en-us/sql/relational-databases/extended-events/extended-events)
-| Title | Author | Modified Date |
-|-----------------------------------------------------------------------------------|------------------------------------------|---------------|
-| [SQL Server Index Design Guide] | Microsoft | ? |
-| [SQL Server 2012 Security Best Practices - Microsoft] | Bob Beauchemin | 2012-01-15 |
-| [Help, my database is corrupt. Now what?] | Gail Shaw | 2010-04-23 |
-| [Knee-Jerk Performance Tuning : Incorrect Use of Temporary Tables] | Paul Randal | 2016-04-06 |
-| [The Curse and Blessings of Dynamic SQL] | Erland Sommarskog | 2015-04-14 |
-| [Dynamic Search Conditions in T-SQL] | Erland Sommarskog | 2015-11-15 |
-| [Slow in the Application, Fast in SSMS] | Erland Sommarskog | 2013-08-30 |
-| [How to share data between stored procedures] | Erland Sommarskog | 2013-11-02 |
-| [Arrays and Lists in SQL Server 2008] | Erland Sommarskog | 2012-07-01 |
-| [Giving Permissions through Stored Procedures] | Erland Sommarskog | 2011-12-31 |
-| [Error and Transaction Handling in SQL Server] | Erland Sommarskog | 2015-05-03 |
-| [SQL Server Columnstore Articles] | Niko Neugebauer | 2016-05-09 |
-| [Documentation: It Does not Suck!] | Jes Schultz Borland | 2013-01-15 |
-| [The Data Loading Performance Guide] | Thomas Kejser, Peter Carlin, Stuart Ozer | 2009-01-15 |
-| [Required Testing for Installing SQL Server Cumulative Updates and Service Packs] | Kendra Little | 2016-04-28 |
-| [Stop Shrinking Your Database Files. Seriously. Now.] | Brent Ozar | 2009-08-19 |
-| [How to shrink a database in 4 easy steps] | Andy Mallon | 2016-04-28 |
-| [Introduction to the Index Operational Statistics Dynamic Management Function] | Tim Ford | 2016-04-26 |
-| [Updating Statistics in SQL Server: Maintenance Questions & Answers] | Kendra Little | 2016-04-18 |
-| [Overcoming Variable Limitations in SQLCmd Mode] | Robert L Davis | 2015-11-23 |
-| [Contents of a Run Book] | Microsoft | 2002-11-12 |
-| [Compressed and Encrypted Backups on the Cheap] | Randolph West | 2002-11-12 |
-
+| Title | Author | Modified | Type |
+|-------------------------------------------------------------------------------------------------------------------------|------------------------------------------|------------|-------------|
+| [SQL Server Index Design Guide] | Microsoft | ? | [IDX] |
+| [SQL Server 2012 Security Best Practices - Microsoft] | Bob Beauchemin | 2012-01-15 | |
+| [Help, my database is corrupt. Now what?] | Gail Shaw | 2010-04-23 | [COR] |
+| [Understanding how SQL Server executes a query] | Remus Rusanu | 2016-04-15 | |
+| [What to Do When DBCC CHECKDB Reports Corruption] | Brent Ozar | 2016-05-19 | [COR] |
+| [Troubleshooting SQL Server CPU Performance Issues] | Joe Sack | 2013-05-28 | [P] |
+| [Knee-Jerk Performance Tuning : Incorrect Use of Temporary Tables] | Paul Randal | 2016-04-06 | [P] |
+| [High Performance T-SQL using Code Patterns] | Dwain Camps | 2015-05-27 | |
+| [SQL Server Database Corruption Repair] | Steve Stedman | 2015-08-26 | [COR] |
+| [Basic SQL Server Performance Troubleshooting For Developers] | Tony Davis | 2015-08-14 | [P] |
+| [The Curse and Blessings of Dynamic SQL] | Erland Sommarskog | 2015-04-14 | [DS] |
+| [Dynamic Search Conditions in T-SQL] | Erland Sommarskog | 2016-10-29 | |
+| [Slow in the Application, Fast in SSMS] | Erland Sommarskog | 2013-12-18 | |
+| [How to share data between stored procedures] | Erland Sommarskog | 2013-11-02 | |
+| [Arrays and Lists in SQL Server 2008] | Erland Sommarskog | 2016-08-21 | |
+| [Giving Permissions through Stored Procedures] | Erland Sommarskog | 2011-12-31 | |
+| [Error and Transaction Handling in SQL Server] | Erland Sommarskog | 2015-05-03 | |
+| [Using the Bulk-Load Tools in SQL Server] | Erland Sommarskog | 2016-12-08 | |
+| [Using Table-Valued Parameters in SQL Server and .NET] | Erland Sommarskog | 2016-12-08 | |
+| [SQL Server Columnstore Articles] | Niko Neugebauer | 2016-05-09 | |
+| [Documentation: It Does not Suck!] | Jes Schultz Borland | 2013-01-15 | |
+| [The Data Loading Performance Guide] | Thomas Kejser, Peter Carlin, Stuart Ozer | 2009-01-15 | |
+| [Required Testing for Installing SQL Server Cumulative Updates and Service Packs] | Kendra Little | 2016-04-28 | |
+| [Stop Shrinking Your Database Files. Seriously. Now.] | Brent Ozar | 2009-08-19 | |
+| [How to shrink a database in 4 easy steps] | Andy Mallon | 2016-04-28 | |
+| [Introduction to the Index Operational Statistics Dynamic Management Function] | Tim Ford | 2016-04-26 | [IDX] |
+| [Updating Statistics in SQL Server: Maintenance Questions & Answers] | Kendra Little | 2016-04-18 | |
+| [Overcoming Variable Limitations in SQLCmd Mode] | Robert L Davis | 2015-11-23 | |
+| [Contents of a Run Book] | Microsoft | 2002-11-12 | |
+| [Compressed and Encrypted Backups on the Cheap] | Randolph West | 2015-04-19 | [B] |
+| [Curing Data-Obesity in OLTP Databases] | Feodor Georgiev | 2015-02-06 | |
+| [Understanding GRANT, DENY, and REVOKE in SQL Server] | K. Brian Kelley | 2013-02-27 | |
+| [Monitor SQL Server Transaction Log File Free Space] | Mike Eastland | 2015-05-12 | |
+| [Dynamically Query a 100 Million Row Table-Efficiently] | Gary Strange | 2016-05-27 | |
+| [Understanding and Using Parallelism in SQL Server] | Paul White | 2011-03-03 | |
+| [Diagnosing and Resolving Latch Contention on SQL Server] | Microsoft | 2014-02-28 | |
+| [Parallel Execution Plans – Branches and Threads] | Paul White | 2013-10-07 | |
+| [Nasty Fast PERCENT_RANK] | Alan Burstein | 2016-06-07 | |
+| [Looking at VIEWs, Close Up] | Joe Celko | 2016-05-10 | |
+| [SQL Server 2016: It Just Runs Faster] | Thomas LaRock | 2016-06-01 | |
+| [TSQL JOIN Types Poster] | Steve Stedman | 2015-05-28 | |
+| [It is Hard To Destroy Data] | Michael J Swart | 2015-05-20 | |
+| [How to transfer logins and passwords between instances of SQL Server] | Microsoft | 2013-12-07 | |
+| [Finding File Growths with Extended Events] | Andy Galbraith | 2016-06-13 | [XE] |
+| [Questions You Should Ask About the Databases You Manage] | Brent Ozar | 2016-06-16 | |
+| [Clustered Indexes in SQL Server] | Derik Hammer | 2016-06-22 | [IDX] |
+| [Triage Quiz: Is Your SQL Server Safe?] | Angie Rudduck | 2016-06-15 | |
+| [Why Not Just Create Statistics?] | Erik Darling | 2016-07-14 | |
+| [Understanding the SQL Server NOLOCK hint] | Greg Robidoux | 2011-08-16 | |
+| [Recover access to a SQL Server instance] | Aaron Bertrand | 2012-08-30 | |
+| [SQL Server 2016 Upgrade Planning] | Jen Underwood | 2016-06-28 | |
+| [Graphs and Graph Algorithms in T-SQL] | Hans Olav Norheim | 2010-05-22 | |
+| [Episode 4: SQL Server R Services makes you a smarter T-SQL Developer] | Sanjay Mishra | 2016-07-12 | [DEV],[R] |
+| [How to Set Max Degree of Parallelism in SQL Server] | Kendra Little | 2016-07-14 | |
+| [Undocumented Query Plans: Equality Comparisons] | Paul White | 2016-06-22 | |
+| [Simplified Order Of Operations] | Michael J. Swart | 2016-07-20 | |
+| [SQL Server Statistics Basics] | Robert Sheldon | 2016-07-22 | |
+| [Learn to Use sp_Blitz, sp_BlitzCache, sp_BlitzFirst, and sp_BlitzIndex with These Tutorial Videos] | Brent Ozar | 2016-09-12 | |
+| [Where is a record really located?] | Tim Chapman | 2016-09-15 | |
+| [Instant File Initialization (IFI)] | Steve Stedman | 2016-09-19 | |
+| [How to Query the StackExchange Databases] | Brent Ozar | 2014-01-17 | |
+| [How to Troubleshoot Performance in SQL Server (Dear SQL DBA)] | Kendra Little | 2016-06-02 | |
+| [How to Log Activity Using sp_whoisactive in a Loop] | Brent Ozar | 2016-07-01 | |
+| [Logging Activity Using sp_WhoIsActive – Take 2] | Tara Kizer | 2016-07-26 | |
+| [How To Fix Forwarded Records] | Tara Kizer | 2016-07-29 | |
+| [Should I Automate my Windows Updates for SQL Server?] | Kendra Little | 2016-07-28 | |
+| [Finding the Right Path] | Jason Brimhall | 2016-08-24 | |
+| [#BackToBasics : An Updated "Kitchen Sink" Example] | Aaron Bertrand | 2016-06-01 | |
+| [Locking and Blocking in SQL Server] | Brent OZar | 2016-01-01 | |
+| [Nested Loops Prefetching] | Paul White | 2013-08-31 | |
+| [Performance tuning backup and restore operations] | Derik Hammer | 2015-12-21 | [B],[P] |
+| [Execution Plan Analysis: The Mystery Work Table] | Paul White | 2013-03-08 | |
+| [How to move data between File Groups in SQL Server] | Klaus Aschenbrenner | 2016-09-26 | |
+| [Optimizing Your Query Plans with the SQL Server 2014 Cardinality Estimator] | Joseph Sack | 2014-06-24 | |
+| [Parallelism in SQL Server Query Tuning] | Itzik Ben-Gan | 2011-03-14 | |
+| [What You Need to Know about the Batch Mode Window Aggregate Operator in SQL Server 2016: Part 1] | Itzik Ben-Gan | 2016-05-31 | |
+| [What To Do If sp_BlitzFirst Warns About High Compilations] | Erik Darling | 2016-09-27 | |
+| [Questions You Should Be Asking About Your Backups] | Erik Darling | 2016-10-13 | [B] |
+| [Evolutionary Database Design] | Martin Fowler | 2016-05-01 | |
+| [Implementing a custom sort] | Rob Farley | 2016-10-17 | |
+| [Deletes that Split Pages and Forwarded Ghosts] | Paul White | 2012-08-31 | |
+| [Query Optimizer Deep Dive - Part 1] | Paul White | 2012-04-28 | |
+| [Query Optimizer Deep Dive - Part 2] | Paul White | 2012-04-28 | |
+| [Query Optimizer Deep Dive - Part 3] | Paul White | 2012-04-29 | |
+| [Query Optimizer Deep Dive - Part 4] | Paul White | 2012-05-01 | |
+| [Should You Rebuild or Reorganize Indexes on Large Tables?] | Kendra Little | 2016-10-13 | [IDX] |
+| [Retrieving SQL Server Query Execution Plans] | Robert Sheldon | 2016-10-18 | |
+| [Introduction to Latches in SQL Server] | Klaus Aschenbrenner | 2014-06-23 | |
+| [Latch Coupling in SQL Server] | Klaus Aschenbrenner | 2016-10-24 | |
+| [Partitioned Views? A How-To Guide] | Erik Darling | 2016-09-22 | |
+| [How to Choose Between RCSI and Snapshot Isolation Levels] | Kendra Little | 2016-02-18 | |
+| [TroubleShooting SQL Server Memory Consumption] | Satnam Singh | 2012-09-28 | |
+| [Time Series Algorithms in SQL Server] | Dinesh Asanka | 2015-06-01 | |
+| [Heap Tables in SQL Server] | Klaus Aschenbrenner | 2015-10-19 | |
+| [Internals of the Seven SQL Server Sorts – Part 1] | Paul White | 2015-04-29 | |
+| [Internals of the Seven SQL Server Sorts – Part 2] | Paul White | 2015-05-07 | |
+| [The 9 Letters That Get DBAs Fired] | Brent Ozar | 2011-12-22 | |
+| [Restarting SQL Server – always a good idea?] | Klaus Aschenbrenner | 2016-08-08 | |
+| [Don’t believe everything you read: Reconfigure flushes the plan cache] | Matt Bowler | 2012-06-25 | |
+| [How-to load data fast into SQL Server 2016] | Henk | 2016-10-24 | |
+| [Database Design Matters, RTO and Filegroups] | Raul Gonzalez | 2016-10-28 | |
+| [Automate Alerting for SQL Server Suspect Database Pages] | Ben Snaidero | 2016-01-25 | |
+| [Successful Anti-Patterns, Storage Requirements] | Raul Gonzalez | 2016-10-19 | |
+| [SQL Server table columns under the hood] | Remus Rusanu | 2011-10-20 | |
+| [How to analyse SQL Server performance] | Remus Rusanu | 2014-02-24 | |
+| [To BLOB or Not To BLOB: Large Object Storage in a Database or a Filesystem?] | Jim Gray | 2006-04-01 | |
+| [Asynchronous procedure execution] | Remus Rusanu | 2009-08-05 | |
+| [What is the CXPACKET Wait Type, and How Do You Reduce It?] | Brent Ozar | 2013-08-27 | |
+| [New indexes, hypothetically] | Kenneth Fisher | 2016-11-02 | [IDX] |
+| [Indexing Wide Keys in SQL Server] | Brent Ozar | 2013-05-08 | [IDX] |
+| [The Anatomy and (In)Security of Microsoft SQL Server Transparent Data Encryption (TDE), or How to Break TDE] | Simon McAuliffe | 2016-03-31 | |
+| [Correctly adding data files to tempdb] | Paul Randal | 2014-10-14 | |
+| [Why You Should Test Your Queries Against Bigger Data] | Erik Darling | 2016-11-01 | |
+| [Tally OH! An Improved SQL 8K “CSV Splitter” Function] | Jeff Moden | 2012-12-28 | |
+| [Set Statistics… Profile?] | Erik Darling | 2016-10-11 | |
+| [Hierarchies on Steroids #1: Convert an Adjacency List to Nested Sets] | Jeff Moden | 2014-09-19 | |
+| [Optimizing T-SQL queries that change data] | Paul White | 2013-01-26 | |
+| [Measuring Query Duration: SSMS vs SQL Sentry Plan Explorer] | Kendra Little | 2016-09-27 | |
+| [Inside the Statistics Histogram & Density Vector] | Klaus Aschenbrenner | 2014-01-28 | |
+| [Misconceptions on parameter sniffing] | Hugo Kornelis | 2016-11-03 | |
+| [CAST vs. CONVERT] | Aaron Bertrand | 2016-11-02 | |
+| [What Every Accidental DBA Needs to Know Now: Basics of SQL Security] | Tim Ford | 2016-10-03 | |
+| [SQL Server Perfmon (Performance Monitor) Best Practices] | Brent Ozar | 2006-12-30 | |
+| [Top 5 Overlooked Index Features] | Erik Darling | 2016-11-10 | [IDX] |
+| [A Sysadmin’s Guide to Microsoft SQL Server Memory] | Brent Ozar | 2016-09-15 | |
+| [Searching Strings in SQL Server is Expensive] | Brent Ozar | 2016-10-18 | |
+| [Altering an INT Column to a BIGINT] | Kendra Little | 2016-08-04 | |
+| [Query tuning 101: Problems with IN ()] | Daniel Janik | 2016-11-10 | |
+| [Admin: Bulkadmin vs ADMINISTER BULK OPERATIONS] | Richard A Brown | 2012-01-31 | |
+| [Can Indexes My Query Doesn’t Use Help My Query?] | Erik Darling | 2016-11-09 | [IDX] |
+| [SQL Server Audit Walkthrough] | Sadequl Hussain | 2016-01-01 | |
+| [The SQL Server 2016 Query Store: Overview and Architecture] | Enrico van de Laar | 2015-11-16 | [QS] |
+| [Reading, Writing, and Creating SQL Server Extended Properties] | Phil Factor | 2015-10-21 | [XE] |
+| [Questions About SQL Server Security and Access Control You Were Too Shy to Ask] | William Brewer | 2016-11-04 | |
+| [The Ten Commandments of SQL Server Monitoring] | Adam Machanic | 2013-04-09 | |
+| [Should I use NOT IN, OUTER APPLY, LEFT OUTER JOIN, EXCEPT, or NOT EXISTS?] | Adam Machanic | 2012-12-27 | |
+| [Parameter Sniffing, Embedding, and the RECOMPILE Options] | Paul White | 2013-08-28 | |
+| [Can comments hamper stored procedure performance?] | Aaron Bertrand | 2016-11-09 | |
+| [SQL Server Temporary Table Caching] | Simon Liew | 2016-08-12 | |
+| [Techniques to Monitor SQL Server memory usage] | Basit Farooq | 2016-08-01 | |
+| [Troubleshooting Query Regressions Caused By The New Cardinality Estimator] | SQL Scotsman | 2016-11-28 | |
+| [Migrating Databases to Azure SQL Database] | Tim Radney | 2016-10-25 | [MG],[AZ] |
+| [Solve Common SQL Server Restore Issues] | Sergey Gigoyan | 2015-04-12 | |
+| [Spills SQL Server Doesn’t Warn You About] | Erik Darling | 2016-11-30 | |
+| [How often should I run DBCC CHECKDB?] | Erik Darling | 2016-02-25 | |
+| [Why is My Query Faster the Second Time it Runs?] | Kendra Little | 2016-11-25 | |
+| [Downgrading the SQL Server Edition of a Dev Environment] | Kendra Little | 2016-11-15 | |
+| [Date Math In The WHERE Clause] | Erik Darling | 2016-12-01 | |
+| [Why is This Partitioned Query Slower?] | Kendra Little | 2015-09-01 | |
+| [A Beginner’s Guide to the True Order of SQL Operations] | JOOQ | 2016-12-09 | |
+| [Logical Query Processing: What It Is And What It Means to You] | Itzik Ben-Gan | 2016-01-15 | |
+| [Forcing a Parallel Query Execution Plan] | Paul White | 2011-12-23 | |
+| [Join Containment Assumption and CE Model Variation] | Dmitri Pilugin | 2014-05-04 | |
+| [Table Variable Tip] | Itzik Ben-Gan | 2015-02-08 | |
+| [Heap tables in SQL Server] | Derik Hammer | 2016-04-13 | |
+| [The ‘B’ in B-Tree – Indexing in SQL Server] | Derik Hammer | 2016-04-04 | [IDX] |
+| [How to read the SQL Server Database Transaction Log] | Manvendra Singh | 2013-10-31 | |
+| [Filtered Statistics Follow-up] | Erik Darling | 2016-12-22 | |
+| [SQL Server Query Optimization: No Unknown Unknowns] | Itzik Ben-Gan | 2015-10-13 | |
+| [Sync Vs Async Statistics: The Old Debate] | SQL Scotsman | 2016-12-10 | |
+| [Recommended updates and configuration options for SQL Server 2012 and SQL Server 2014 with high-performance workloads] | Microsoft | 2016-03-08 | |
+| [Troubleshooting SQL Server backup and restore operations] | Microsoft | 2016-07-23 | [B] |
+| [SQL Server 2016: Getting tempdb a little more right] | Aaron Bertrand | 2015-09-30 | |
+| [Practical uses of binary types] | Daniel Hutmacher | 2017-01-09 | |
+| [Backing Up SQL Server Databases is Easier in PowerShell than T-SQL] | Aaron Nelson | 2017-01-12 | |
+| [Creating, detaching, re-attaching, and fixing a SUSPECT database] | Paul Randal | 2008-08-29 | |
+| [Modifying Tables Online – Part 1: Migration Strategy] | Michael J Swart | 2012-04-16 | [MG] |
+| [Modifying Tables Online – Part 2: Implementation Example] | Michael J Swart | 2012-04-17 | [MG] |
+| [Modifying Tables Online – Part 3: Example With Error Handling] | Michael J Swart | 2012-04-20 | [MG] |
+| [Modifying Tables Online – Part 4: Testing] | Michael J Swart | 2012-04-26 | [MG] |
+| [Modifying Tables Online – Part 5: Just One More Thing] | Michael J Swart | 2012-04-27 | |
+| [DATEDIFF vs. DATEADD] | Guy Glanster | 2017-01-25 | |
+| [Disaster recovery 101: hack-attach a damaged database] | Paul Randal | 2010-06-18 | |
+| [Bones of SQL - The Calendar Table] | Bob Hovious | 2016-09-08 | |
+| [SQL Server 2016, Double or Nothing, Always Encrypted with temporal tables] | Raul Gonzalez | 2016-07-27 | |
+| [Reclaiming Space After Column Data Type Change] | David Fundakowski | 2016-08-09 | |
+| [Packing Intervals with Priorities] | Itzik Ben-Gan | 2015-11-10 | |
+| [Avoid Unnecessary Lookups when Using ROW_NUMBER for Paging] | Itzik Ben-Gan | 2014-12-11 | |
+| [Migrating a Disk-Based Table to a Memory-Optimized Table in SQL Server] | Alex Grinberg | 2017-02-26 | [MG] |
+| [SQL Server Hardware Optimization] | Basit Farooq | 2016-06-01 | |
+| [Index Types Heaps, Primary Keys, Clustered and Nonclustered Indexes] | Kendra Little | 2017-02-02 | [IDX] |
+| [Identifying Existence of Intersections in Intervals] | Itzik Ben-Gan | 2017-02-08 | |
+| [Cheat Sheet How to Configure TempDB for Microsoft SQL Server] | Brent Ozar | 2016-01-14 | |
+| [A Tourist’s Guide to the sp_Blitz Source Code, Part 1: The Big Picture] | Brent Ozar | 2017-02-09 | |
+| [SQL Server Default Configurations That You Should Change] | Pio Balistoy | 2017-02-06 | |
+| [Decoding Key and Page WaitResource for Deadlocks and Blocking] | Kendra Little | 2016-10-17 | |
+| [Security in the CLR World Inside SQL Server] | Kiely Don | 1990-01-01 | [CLR] |
+| [On the Advantages of DateTime2(n) over DateTime] | William Assaf | 2012-12-04 | |
+| [Build Your Own Tools] | Michael J. Swart | 2016-09-23 | |
+| [Enhanced T-SQL Error Handling With Extended Events] | Dave Mason | 2016-09-14 | [XE] |
+| [Compression and its Effects on Performance] | Erin Stellato | 2017-01-20 | |
+| [Does Truncate Table Reset Statistics] | Kendra Little | 2016-12-08 | |
+| [SQL Server Database Decommissioning Check List] | Svetlana Golovko | 2016-06-23 | |
+| [New SQL Server Database Request Questionnaire and Checklist] | Svetlana Golovko | 2015-02-24 | |
+| [Adding Partitions to the Lower End of a Left Based Partition Function] | Kendra Little | 2017-02-21 | |
+| [Don't Panic Busting a File Space Myth] | Tim Ford | 2016-11-14 | |
+| [#BackToBasics : Dating Responsibly] | Aaron Bertrand | 2016-04-06 | |
+| [How to Establish Dedicated Admin Connection (DAC) to SQL Server] | Mika Wendelius | 2016-10-05 | |
+| [SQL and SQL only Best Practice] | Nagaraj Venkatesan | 2013-05-27 | |
+| [There Is No Difference Between Table Variables, Temporary Tables, and Common Table Expressions] | Grant Fritchey | 2016-08-04 | |
+| [Availability Group on SQL Server 2016] | Guy Glantser | 2017-02-01 | |
+| [Using SQL Server and R Services for analyzing DBA Tasks] | Tomaž Kaštrun | 2017-02-17 | |
+| [SQLskills SQL101: Dealing with SQL Server corruption] | Paul Randal | 2017-02-28 | [COR] |
+| [Advanced Analytics with R & SQL: Part I - R Distributions] | Frank A. Banin | 2016-10-31 | [R] |
+| [T-SQL Tuesday #85 STOP! Restore Time!] | Derik Hammer | 2016-12-13 | |
+| [Filtered Indexes: Rowstore vs Nonclustered Columnstore] | Kendra Little | 2016-11-10 | [IDX] |
+| [ALTER SCHEMA TRANSFER for Zero Downtime Database Upgrades] | Dave Wentzel | 2013-05-21 | |
+| [Delayed Durability in SQL Server 2014] | Aaron Bertrand | 2014-04-28 | |
+| [Daylight Savings end affects not only you, but your SQL Server too] | Aaron Bertrand | 2014-04-28 | |
+| [Searching Strings in SQL Server is Expensive] | Brent Ozar | 2016-10-18 | |
+| [Let’s Corrupt a SQL Server Database Together, Part 1: Clustered Indexes] | Brent Ozar | 2017-02-22 | [COR][IDX] |
+| [Let’s Corrupt a Database Together, Part 2: Nonclustered Indexes] | Brent Ozar | 2017-02-28 | [COR][IDX] |
+| [The Guide SQL Server Installation Checklist (settings that increase SQL Server Performance)] | Mark Varnas | 2017-03-03 | |
+| [SQL Browser, what is it good for? Absolutely something!] | Chris Sommer | 2017-03-01 | |
+| [PowerShell Getting More From Generic Error Messages] | Shane O'Neill | 2017-03-02 | [PS] |
+| [#BackToBasics : Common Table Expressions (CTEs)] | Aaron Bertrand | 2016-01-06 | |
+| [SQL VNext sp_configure on Windows and Linux with dbatools] | Rob Sewell | 2017-03-02 | [PS] |
+| [Adding a T-SQL Job Step to a SQL Agent Job with PowerShell] | Rob Sewell | 2017-02-20 | [PS],[J] |
+| [Setting up Database Mail to use my Gmail account] | Mat Hayward | 2017-03-01 | [DM] |
+| [Using DBCC CLONEDATABASE and Query Store for Testing] | Erin Stellato | 2017-02-22 | [DBCC],[QS] |
+| [Getting Started with Natural Earth — A SQL Server Shapefile Alternative (Geospatial Resource)] | Jeff Pries | 2017-02-17 | [V] |
+| [SQL Server Temporal Tables: How-To Recipes] | Alex Grinberg | 2017-02-10 | [DEV] |
+| [The Migration Checklist] | Steve Jones | 2017-03-08 | [MG] |
+| [Upgrading to SQL Server 2014: A Dozen Things to Check] | Steve Jones | 2014-06-03 | [MG] |
+| [Introducing the Set-based Loop] | Luis Cazares | 2015-07-27 | [DEV] |
+| [Representing Hierarchical Data for Mere Mortals] | Phil Factor | 2016-10-06 | [DEV] |
+| [KPIs For DBAs to Show Their CIOs] | Thomas Larock | 2017-03-08 | [DBA] |
+| [How To Forecast Database Disk Capacity If You Don’t Have A Monitoring Tool] | Edwin M Sarmiento | 2015-07-31 | [DBA] |
+| [Statistical Sampling for Verifying Database Backups] | Thomas Larock | 2010-05-13 | [DBA],[B] |
+| [Using dbatools for automated restore and CHECKDB] | Anthony Nocentino | 2017-03-04 | [DBA],[PS] |
+| [Bad Habits Revival] | Aaron Bertrand | 2017-01-26 | [DBA] |
+| [Deploying Multiple SSIS Projects via PowerShell] | Nat Sundar | 2017-02-27 | [SSIS,][PS] |
+| [Determining the Cost Threshold for Parallelism] | Grant Fritchey | 2017-02-28 | [DBA] |
+| [Identifying a row’s physical location] | Wayne Sheffield | 2017-03-08 | [DBA] |
+| [Split a file group into multiple data files] | Trayce Jordan | 2017-03-03 | [DBA] |
+| [Why PFS pages cannot be repaired] | Paul Randal | 2017-03-05 | [DBA] |
+| [ERRORLOG records max out at 2049 characters] | Cody Konior | 2017-03-02 | [DEV] |
+| [How to Build a SQL Server Disaster Recovery Plan with Google Compute Engine] | Tara Kizer | 2017-03-10 | [DBA] |
+| [SQL Server Performance Tuning in Google Compute Engine] | Erik Darling | 2017-03-09 | [DBA],[P] |
+| [Configuring R on SQL Server 2016] | Ginger Grant | 2016-12-06 | [DBA],[R] |
+| [Knee-Jerk PerfMon Counters: Page Life Expectancy] | Paul Randal | 2014-10-20 | [DBA],[P] |
+| [Change Management Template for SQL Server DBAs and Developers] | Kendra Little | 2016-04-12 | [DBA] |
+| [Performance Myths: Clustered vs. Non-Clustered Indexes] | Aaron Bertrand | 2017-03-17 | [IDX] |
+| [Bad habits: Counting rows the hard way] | Aaron Bertrand | 2014-10-30 | [DEV] |
+| [Why Cost Threshold For Parallelism Shouldn’t Be Set To 5] | Erik Darling | 2017-03-14 | [DBA] |
+| [Join Performance, Implicit Conversions, and Residuals] | Paul White | 2011-07-18 | [DEV] |
+| [Implicit Conversions that cause Index Scans] | Jonathan Kehayias | 2011-04-11 | [DEV] |
+| [When Is It Appropriate To Store JSON in SQL Server?] | Bert Wagner | 2017-03-14 | [DEV] |
+| [The Performance Penalty of Bookmark Lookups in SQL Server] | Klaus Aschenbrenner | 2017-03-17 | [IDX] |
+| [Why You Should Change the Cost Threshold for Parallelism] | Grant Fritchey | 2017-03-13 | [DBA] |
+| [Why Update Statistics can cause an IO storm] | Kendra Little | 2014-01-29 | [DBA] |
+| [SQLskills SQL101 Temporary table misuse] | Paul White | 2017-03-13 | [DEV] |
+| [SQL Server sp_execute_external_script Stored Procedure Examples] | Vitor Montalvao | 2017-03-10 | [R] |
+| [Transparent Data Encryption and Replication] | Drew Furgiuele | 2017-03-15 | [DBA] |
+| [SQL Server Installation Checklist] | Jonathan Kehayias | 2010-03-22 | [DBA] |
+| [Indexed Views And Data Modifications] | Erik Darling | 2017-03-16 | [DEV] |
+| [Deployment Automation for SQL Server Integration Services (SSIS)] | Nat Sundar | 2017-01-12 | [DEV] |
+| [Why Developers Should Consider Microsoft SQL Server] | Brent Ozar | 2017-03-22 | [DEV] |
+| [SQLskills SQL101: Indexes on Foreign Keys] | Kimberly Tripp | 2017-03-21 | [DEV] |
+| [SQLskills SQL101: Updating SQL Server Statistics Part I – Automatic Updates] | Erin Stellato | 2017-03-23 | [DBA] |
+| [Processing Loops in SQL Server] | CHill60 | 2017-03-23 | [DEV] |
+| [The Mysterious Case of the Missing Default Value] | Raul Gonzalez | 2017-03-24 | [DEV] |
+| [Plan Caching] | Klaus Aschenbrenner | 2017-03-20 | [DEV] |
+| [sp_executesql Is Not Faster Than an Ad Hoc Query] | Grant Fritchey | 2016-11-07 | [DEV] |
+| [Backing up SQL Server on Linux using Ola Hallengrens Maintenance Solution] | Rob Sewell | 2017-03-22 | [B] |
+| [Delayed Durability in SQL Server 2014 Paul Randal] | Paul Randal | 2014-11-20 | [DBA] |
+| [Why Is This Query Sometimes Fast and Sometimes Slow] | Brent Ozar | 2016-11-16 | [DEV] |
+| [Using Plan Guides to Remove OPTIMIZE FOR UNKNOWN Hints] | Brent Ozar | 2016-11-17 | [DEV] |
+| [ETL Best Practices] | Tim Mitchel | 2017-01-01 | [DEV] |
+| [Resolving Key Lookup Deadlocks with Plan Explorer] | Greg Gonzalez | 2017-03-21 | [DEV] |
+| [Why ROWLOCK Hints Can Make Queries Slower and Blocking Worse in SQL Server] | Kendra Little | 2016-02-04 | [DEV] |
+| [Does a Clustered Index really physically store the rows in key order] | Wayne Sheffield | 2012-10-21 | [DEV] |
+| [Ugly Pragmatism For The Win] | Michael J. Swart | 2016-02-11 | [DEV] |
+| [Architecting Microsoft SQL Server on VMware vSphere] | Niran Even-Chen | 2017-03-15 | [DBA] |
+| [Hiding tables in SSMS Object Explorer] | Kenneth Fisher | 2017-04-03 | [DEV] |
+| [Clustered columnstore: on-disk vs. in-mem] | Ned Otter | 2017-03-21 | [DBA] |
+| [Generating Plots Automatically From PowerShell and SQL Server Using Gnuplot] | Phil Factor | 2017-03-27 | [DEV] |
+| [How to Benchmark Alternative SQL Queries to Find the Fastest Query] | Luka Seder | 2017-03-29 | [DEV] |
+| [Checking for Strange Client Settings with sys.dm_exec_sessions] | Brent Ozar | 2017-03-31 | [DEV] |
+| [Decrypting Insert Query Plans] | Eric Darling | 2017-03-30 | [DEV] |
+| [SQLskills SQL101: Partitioning] | Kimberly Tripp | 2017-03-27 | [DBA] |
+| [SQLskills SQL101: Switching recovery models] | Paul Randal | 2017-03-29 | [DBA] |
+| [Using AT TIME ZONE to fix an old report] | Rob Farley | 2017-02-14 | [DEV] |
+| [What the heck is a DTU] | Andy Mallon | 2017-03-30 | [AZ] |
+| [Hack-Attaching a SQL Server database with NORECOVERY] | Argenis Fernandez | 2016-01-24 | [DBA] |
+| [Switch in Staging Tables Instead of sp_rename] | Kendra Little | 2017-01-19 | [DBA] |
+| [Performance Myths: Table variables are always in-memory] | Derik Hammer | 2017-04-04 | [DEV] |
+| [Questions About SQL Server Collations You Were Too Shy to Ask] | Robert Sheldon | 2017-04-06 | [DBA],[DEV] |
+| [NULL - The database's black hole] | Hugo Kornelis | 2007-07-06 | [DEV] |
+| [For The Better Developer: SQL Server Indexes] | Davide Mauri | 2017-04-02 | [DEV] |
+| [#EntryLevel: Compression & Data Types] | Melissa Connors | 2016-04-17 | [DEV] |
+| [Cardinality Estimation for a Predicate on a COUNT Expression] | Paul White | 2017-04-12 | [DEV] |
+| [Changing SQL Server Collation After Installation] | Douglas P. Castilho | 2015-02-19 | [DBA] |
+| [Does a TempDB spill mean statistics are out of date?] | Brent Ozar | 2017-04-12 | [DEV] |
+| [Transaction log growth during BACKUP] | Andy Mallon | 2017-04-10 | [DBA] |
+| [When is a SQL function not a function?] | Rob Farley | 2011-11-08 | [DEV] |
+| [Introducing Batch Mode Adaptive Joins] | Joseph Sack | 2017-04-19 | [DEV] |
+| [Investigating the proportional fill algorithm] | Paul Randal | 2016-10-04 | [DBA] |
+| [Understanding Logging and Recovery in SQL Server] | Paul Randal | 2009-02-01 | [DBA] |
+| [Bad Habits to Kick: Using shorthand with date/time operations] | Aaron Bertrand | 2011-09-20 | [DEV] |
+| [Generating Charts and Drawings in SQL Server Management Studio] | Zanevsky | 2012-03-26 | [DEV] |
+| [How expensive are column-side Implicit Conversions?] | Jonathan Kehayias | 2013-04-15 | [DEV] |
+| [Execution Plan Basics] | Grant Fritchey | 2008-05-11 | [DEV] |
+| [Disabling ROW and PAGE Level Locks in SQL Server] | Klaus Aschenbrenner | 2016-10-31 | [DEV] |
+| [Fixing Cardinality Estimation Errors with Filtered Statistics] | Klaus Aschenbrenner | 2013-10-29 | [DEV] |
+| [Cardinality Estimation for Multiple Predicates] | Paul Randal | 2014-01-15 | [DEV] |
+| [Weaning yourself off of SQL Profiler (Part 1)] | Wayne Sheffield | 2017-04-19 | [DBA],[DEV] |
+| [Properly Persisted Computed Columns] | Paul White | 2017-05-25 | [DEV] |
+| [A SQL Server DBA myth a day: (17/30) page checksums] | Paul Randal | 2010-04-17 | [DBA] |
+| [What are different ways to replace ISNULL() in a WHERE clause that uses only literal values?] | Eric Darling | 2017-05-27 | [DEV] |
+| [Weaning yourself off of SQL Profiler (Part 1)] | Wayne Sheffield | 2017-04-19 | [DEV] |
+| [SQL Server 2016 enhancements – Truncate Table and Table Partitioning] | Prashanth Jayaram | 2017-04-18 | [DBA],[DEV] |
+| [SQL Server Mysteries: The Case of the Not 100% RESTORE…] | Bob Ward | 2017-04-21 | [DBA] |
+| [Transactional Replication and Stored Procedure Execution: Silver Bullet or Poison Pill?] | Drew Furgiuele | 2017-04-11 | [DBA] |
+| [STOPAT And Date Formats] | Dave Mason | 2017-07-12 | [DBA],[XE] |
+| [Row-count Estimates when there are no Statistics] | Matthew McGiffen | 2017-06-28 | [DEV] |
+| [SQL Server DBA On-Boarding Checklist] | Svetlana Golovko | 2017-06-20 | [DBA] |
+| [Be Wary of Date Formatting in T-SQL] | Randolph West | 2017-07-12 | [DEV] |
+| [The ultimate guide to the datetime datatypes] | Tibor Karaszi | 2010-01-01 | [DEV] |
+| [Statistics and Cardinality Estimation] | Matthew McGiffen | 2017-06-20 | [DEV] |
+| [Message queues for the DBA: sending data out into the world] | Drew Furgiuele | 2017-07-21 | [DBA] |
+| [Schema-Based Access Control for SQL Server Databases] | Phil Factor | 2017-04-09 | [DBA] |
+| [SQL Server: large RAM and DB Checkpointing] | Guillaume Fourrat | 2017-06-29 | [DBA] |
+| [Handling SQL Server Deadlocks With Event Notifications] | Dave Mason | 2017-07-17 | [R],[XE] |
+| [SQL Server R Services: Digging into the R Language] | Robert Sheldon | 2017-06-29 | [DBA],[DEV] |
+| [Investigating the Cause of SQL Server High CPU Load Conditions When They Happen] | Laerte Junior | 2017-07-17 | [DBA] |
+| [In-Memory Engine DURABILITY = SCHEMA_ONLY And Transaction Rollback] | Chris Adkin | 2017-07-17 | [DEV] |
+| [Builder Day: Doing a Point-in-Time Restore in Azure SQL DB] | Brent Ozar | 2017-06-20 | [DBA],[AZ] |
+| [Creating Continuous Integration Build Pipelines With Jenkins, Docker and SQL Server] | Chris Adkin | 2017-07-18 | [DBA] |
+| [Scale-able Windows Aggregate Functions With Row Store Object] | Chris Adkin | 2017-07-24 | [DEV] |
+| [Azure DWH part 11: Data Warehouse Migration Utility] | Daniel Calbimonte | 2017-07-17 | [DBA], [AZ] |
+| [Representing a simple hierarchical list in SQL Server with JSON, YAML, XML and HTML] | William Brewer | 2017-07-18 | [DEV], [X] |
+| [Advanced Analytics with R and SQL Part II - Data Science Scenarios] | Frank A. Banin | 2017-07-27 | [DEV], [R] |
+| [Think twice before using table variables] | Matthew McGiffen | 2017-07-11 | [DEV] |
+| [ColumnStore Indexes And Recursive CTEs] | Erik Darling | 2017-07-27 | [DEV] |
+| [CCIs and String Aggregation] | Joe Obbish | 2017-07-03 | [DEV] |
+| [Brad’s Sure DBA Checklist] | Brad McGehee | 2010-01-20 | [DBA] |
+| [Query Store and Parameterization Problems] | Dennes Torres | 2017-07-06 | [QS] |
+| [SQL Server Event Handling: Event Notifications] | Dave Mason | 2016-11-30 | [DBA],[XE] |
+| [Identifying Deprecated Feature Usage (Part 1)] | Dave Mason | 2017-07-20 | [DBA],[XE] |
+| [Let’s Corrupt a Database Together, Part 3: Detecting Corruption] | Brent Ozar | 2017-07-25 | [DBA],[COR] |
+| [XML vs JSON Shootout: Which is Superior in SQL Server 2016?] | Bert Wagner | 2017-05-16 | [DEV],[X] |
+| [One SQL Cheat Code For Amazingly Fast JSON Queries] | Bert Wagner | 2017-05-09 | [DEV],[X] |
+| [The Ultimate SQL Server JSON Cheat Sheet] | Bert Wagner | 2017-03-07 | [DEV],[X] |
+| [Are your indexes being thwarted by mismatched datatypes?] | Bert Wagner | 2017-08-01 | [DEV] |
+| [Why Missing Index Recommendations Aren’t Perfect] | Brent Ozar | 2017-08-02 | [DBA],[DEV] |
+| [Top 5 Misleading SQL Server Performance Counters] | Kendra Little | 2017-06-05 | [DBA],[DEV] |
+| [The Case of the Space at the End] | Adam St. Pierre | 2017-07-24 | [DEV] |
+| [SELECT…INTO in SQL Server 2017] | Andrew Pruski | 2017-08-02 | [DEV] |
+| [Your Service Level Agreement is a Disaster] | Jennifer McCown | 2017-07-24 | [DBA] |
+| [SQLskills SQL101: REBUILD vs. REORGANIZE] | Paul Randal | 2017-08-03 | [DBA] |
+| [Where do the Books Online index fragmentation thresholds come from?] | Paul Randal | 2009-12-08 | [DBA] |
+| [The SQL Hall of Shame] | Adam Machanic | 2017-06-14 | [DBA],[DEV] |
+| [A Better Way To Select Star] | Erik Darling | 2017-07-05 | [DEV] |
+| [UDP vs TCP] | Kenneth Fisher | 2017-06-07 | [DBA] |
+| [When a Nonclustered Index and Statistics Make a Query Slower] | Kendra Little | 2017-03-24 | [DBA],[DEV] |
+| [Lipoaspiration in your SQL Server Database] | Fabiano Amorim | 2011-03-03 | [DEV] |
+| [13 Things You Should Know About Statistics and the Query Optimizer] | Fabiano Amorim | 2010-01-07 | [DBA],[DEV] |
+| [Creating R Stored Procedures in SQL Server 2016 Using sqlrutils] | Niels Berglund | 2017-06-25 | [DEV],[R] |
+| [A Quick start Guide to Managing SQL Server 2017 on CentOS/RHEL Using the SSH Protocol] | Prashanth Jayaram | 2017-08-08 | [DEV] |
+| [SQL Server v.Next : STRING_AGG Performance, Part 2] | Aaron Bertrand | 2017-01-06 | [DEV] |
+| [Why Parameter Sniffing Is Making Your Queries Receive Sub-Optimal Execution Plans] | Bert Wagner | 2017-08-08 | [DEV] |
+| [Persisting statistics sampling rate] | Pedro Lopes | 2017-08-11 | [DBA] |
+| [All about locking in SQL Server] | Nikola Dimitrijevic | 2017-06-16 | [DBA],[DEV] |
+| [All about Latches in SQL Server] | Nikola Dimitrijevic | 2017-08-10 | [DBA],[DEV] |
+| [All about SQL Server spinlocks] | Nikola Dimitrijevic | 2017-08-23 | [DBA],[DEV] |
+| [How to monitor object space growth in SQL Server] | Jefferson Elias | 2017-08-16 | [DBA],[DEV] |
+| [How to Read a Transaction Log Backup] | Greg Larsen | 2017-07-03 | [DBA] |
+| [How to Find Out Which Database Object Got Deleted] | Greg Larsen | 2017-07-03 | [DBA] |
+| [In-Memory OLTP Enhancements in SQL Server 2016] | Ahmad Yaseen | 2017-08-22 | [DBA],[DEV] |
+| [Sync SQL Logins and Jobs] | Ryan J. Adams | 2017-08-21 | [DBA] |
+| [The Trillion Row Table] | Joe Obbish | 2017-08-16 | [BENCH] |
+| [Dynamic Data Unmasking] | Joe Obbish | 2017-08-25 | [DEV] |
+| [Why is My Database Application so Slow?] | Dan Turner | 2017-08-24 | [DEV] |
+| [Generating Concurrent Activity] | Michael J Swart | 2017-01-23 | [DBA],[DEV] |
+| [Required Testing for Installing SQL Server Cumulative Updates and Service Packs] | Kendra Little | 2017-04-28 | [DBA] |
+| [Microsoft SQL Server R Services - Internals X] | Niels Berglund | 2017-08-29 | [DEV],[R] |
+| [Clustered columnstore: on-disk vs. in-mem] | Ned Otter | 2017-08-29 | [DBA],[DEV] |
+| [Hands on Full-Text Search in SQL Server] | Jefferson Elias | 2017-08-25 | [DBA],[DEV] |
+| [SQL Code Smells] | Phil Factor | 2017-08-31 | [DBA],[DEV] |
+| [Corruption demo databases and scripts] | Paul Randal | 2013-01-08 | [DBA],[COR] |
+| [Understanding Cross-Database Transactions in SQL Server] | Grahaeme Ross | 2015-04-11 | [DBA],[DEV] |
+| [Optional Parameters and Missing Index Requests] | Brent OZar | 2017-09-14 | [DBA],[DEV] |
+| [Uniquifier is a rather unique word isn’t it?] | Kenneth Fisher | 2017-09-18 | [DBA],[DEV] |
+| [Importance of proper transaction log size management] | Paul Randal | 2009-04-10 | [DEV] |
+| [#TSQL2sDay – Starting Out with PowerShell] | Rob Sewell | 2017-09-12 | [DBA],[PS] |
+| [Using native compilation to insert parent/child tables] | Ned Otter | 2017-09-11 | [DEV] |
+| [Questions About RDS SQL Server You Were Too Shy to Ask] | Laerte Junior | 2017-09-13 | [DEV] |
+| [Active Directory Authentication with SQL Server on Ubuntu] | Drew Furgiuele | 2017-09-19 | [DBA] |
+| [Temporary Tables in Stored Procedures] | Paul Randal | 2012-08-15 | [DEV] |
+| [SQLCLR in Practice: Creating a Better Way of Sending Email from SQL Server] | Darko Martinović | 2017-07-17 | [CLR] |
+| [T-SQL commands performance comparison – NOT IN vs NOT EXISTS vs LEFT JOIN vs EXCEPT] | Ahmad Yaseen | 2017-09-22 | [DBA],[DEV] |
+| [Clustered vs Nonclustered: Index Fundamentals You Need To Know] | Bert Wagner | 2017-09-26 | [DBA],[DEV] |
+| [How to Write Efficient TOP N Queries in SQL] | JOOQ | 2017-09-22 | [DEV] |
+| [Checklist: DR Plan Sanity Check] | Robert Davis | 2017-09-04 | [DBA] |
+| [Table level recovery for selected SQL Server tables] | Tibor Nagy | 2012-11-30 | [DEV] |
+| [SQL Mirroring, Preserving the Log Chain During Database Migrations] | SQL Undercover | 2017-01-21 | [DBA] |
+| [How NOLOCK Will Block Your Queries] | Bert Wagner | 2017-10-10 | [DEV] |
+| [8 Ways to Export SQL Results To a Text File] | Daniel Calbimonte | 2017-10-06 | [DBA],[DEV] |
+| [SQL Server Installation Failed Due to Pending Restart of Server?] | thelonedba | 2017-09-18 | [DBA],[DEV] |
+| [Six Scary SQL Surprises] | Brent Ozar | 2017-09-06 | [DEV] |
+| [How the rowversion datatype works when adding and deleting columns] | Louis Davidson | 2017-09-26 | [DEV] |
+| [Quick! What's the difference between RANK, DENSE_RANK, and ROW_NUMBER?] | Douglas Kline | 2017-10-01 | [DEV] |
+| [A Serial Parallel Query] | Joe Obbish | 2017-10-20 | [DEV] |
+| [Add or Remove IDENTITY Property From an Existing Column Efficiently] | Dan Guzman | 2017-04-16 | [DBA],[DEV] |
+| [How Do I Analyze a SQL Server Execution Plan?] | Kendra Little | 2017-09-22 | [DEV] |
+| [A Subtle Difference Between COALESCE and ISNULL] | Shaneis | 2017-10-09 | [DEV] |
+| [Puzzle Challenge: Graph Matching with T-SQL Part 1-Concepts] | Itzik Ben-Gan | 2017-08-08 | [DEV] |
+| [Graph Matching with T-SQL Part 3: Maximum Matching] | Itzik Ben-Gan | 2017-10-12 | [DEV] |
+| [Running PowerShell in a SQL Agent Job] | Derik Hammer | 2017-03-04 | [PS] |
+| [Line-Continuation in T-SQL] | Solomon Rutzky | 2017-10-27 | [DEV] |
+| [SQL Server 2017: Making Backups Great Again!] | John Sterrett | 2017-10-31 | [DBA],[DEV] |
+| [Say NO to Venn Diagrams When Explaining JOINs] | JOOQ | 2016-07-05 | [DBA],[DEV] |
+| [Surprise Delta Stores] | Joe Obbish | 2017-11-07 | [DEV] |
+| [SQL 2014 Clustered Columnstore index rebuild and maintenance considerations] | Denzil Ribeiro | 2015-07-08 | [DBA],[DEV] |
+| [The Case of the Weirdly Long COLUMNSTORE_BUILD_THROTTLE Wait] | Kendra Little | 2017-11-09 | [DEV] |
+| [Multiple Output Datasets With R and SQL Server] | Kendra Little | 2017-11-06 | [DEV],[R] |
+| [How to Avoid Excessive Sorts in Window Functions] | JOOQ | 2017-11-06 | [DEV] |
+| [Extracting a DAX Query Plan With Analysis Services 2016 Extended Events] | Koen Verbeeck | 2017-10-03 | [DAX], [XE] |
+| [What impact can different cursor options have?] | Aaron Bertrand | 2012-09-10 | [DBA],[DEV] |
+| [SQL Smackdown!!! Cursors VS Loops] | SQL Undercover | 2017-11-16 | [DBA],[DEV] |
+| [Using the OPTION (RECOMPILE) option for a statement] | Kimberly Tripp | 2010-04-15 | [DBA],[DEV] |
+| [Execution Plan Caching and Reuse] | Brett Shearer | 2015-02-12 | [DBA],[DEV] |
+| [Buffer Management] | Microsoft | ? | [DBA],[DEV] |
+| [RECOMPILE Hints and Execution Plan Caching] | Kendra Little | 2017-12-17 | [DBA],[DEV] |
+| [Improving query performance with OPTION (RECOMPILE), Constant Folding and avoiding Parameter Sniffing issues] | Robin Lester | 2016-08-10 | [DBA],[DEV] |
+| [Eight Different Ways to Clear the SQL Server Plan Cache] | Glenn Berry | 2016-03-26 | [DBA],[DEV] |
+| [Introduction and FAQs about Microsoft Azure technologies] | Daniel Calbimonte | 2017-10-13 | [AZ],[DEV] |
+| [Inside the XEvent Profiler] | Derik Hammer | 2017-10-11 | [DBA],[DEV] |
+| [Does The Join Order of My Tables Matter?] | Bert Wagner | 2017-11-21 | [DBA],[DEV] |
+| [Encrypting SQL Server connections with Let’s Encrypt certificates] | Derik Hammer | 2017-11-12 | [DBA] |
+| [Start SQL Server without tempdb] | Kenneth Fisher | 2016-01-20 | [DBA] |
+| [How to configure database mail in SQL Server] | Bojan Petrovic | 2017-11-22 | [DBA] |
+| [Understanding SQL server memory grant] | Jay Choe | 2010-02-16 | [DBA],[DEV] |
+| [Cleanly Uninstalling Stubborn SQL Server Components] | Aaron Bertrand | 2015-10-06 | [DBA] |
+| [Hey! What's the deal with SQL Server NOCOUNT and T-SQL WHILE loops?] | @sqL_handLe | 2017-17-30 | [DEV] |
+| [Query Store Settings] | Erin Stellato | 2010-11-28 | [QS] |
+| [Using Plan Explorer with Entity Framework] | Jason Hall | 2010-11-28 | [DEV] |
+| [Overview of Encryption Tools in SQL Server] | Matthew McGiffen | 2017-12-05 | [DBA],[DEV] |
+| [Clustered Index Uniquifier Existence and Size] | Solomon Rutzky | 2017-09-18 | [DBA],[DEV] |
+| [Understanding Logging and Recovery in SQL Server] | Paul Randal | 2009-02-01 | [DBA],[B] |
+| [Understanding SQL Server Backups] | Paul Randal | 2009-07-01 | [DBA],[B] |
+| [Recovering from Disasters Using Backups] | Paul Randal | 2009-11-01 | [DBA],[B] |
+| [Simple SQL: Handling Location Datatypes] | Joe Celko | 2017-10-19 | [DEV] |
+| [Improve SQL Server Performance by Looking at Plan Cache (Part 1)] | Thomas LaRock | 2014-10-30 | [DBA],[DEV] |
+| [Improve SQL Server Performance by Looking at Plan Cache (Part 2)] | Thomas LaRock | 2014-10-30 | [DBA],[DEV] |
+| [Improve SQL Server Performance by Looking at Plan Cache (Part 3)] | Thomas LaRock | 2014-10-30 | [DBA],[DEV] |
+| [Take Care When Scripting Batches] | Michael J Swart | 2014-09-09 | [DBA],[DEV] |
+| [When Measuring Timespans, try DATEADD instead of DATEDIFF] | Michael J Swart | 2017-12-20 | [DBA],[DEV] |
+| [Which user function do I use?] | Kenneth Fisher | 2015-06-24 | [DBA],[DEV] |
+| [What’s So Bad About Shrinking Databases with DBCC SHRINKDATABASE?] | Brent Ozar | 2017-12-29 | [DBA],[DEV] |
+| [Which Collation is Used to Convert NVARCHAR to VARCHAR in a WHERE Condition? (Part A of 2: “Duck”)] | Solomon Rutzky | 2017-12-08 | [DBA],[DEV] |
+| [Which Collation is Used to Convert NVARCHAR to VARCHAR in a WHERE Condition? (Part B of 2: “Rabbit”)] | Solomon Rutzky | 2017-12-11 | [DBA],[DEV] |
+| [Current State of the NewSQL/NoSQL Cloud Arena] | Warner Chaves | 2017-11-27 | [DBA],[DEV] |
+| [SQL Server 2017: JSON] | Sergey Syrovatchenko | 2017-11-17 | [X] |
+| [Simulating Bad Networks to Test SQL Server Replication] | John Paul Cook | 2018-01-02 | [DBA] |
+| [How to Turn on Instant File Initialization] | Greg Larsen | 2017-12-04 | [DBA] |
+| [Bad Idea Jeans: Finding Undocumented Trace Flags] | Brent Ozar | 2017-10-04 | [DEV] |
+| [A Method to Find Trace Flags] | Joe Obbish | 2018-01-16 | [DEV] |
+| [Using Windows stored credentials to connect to SQL in containers] | Andrew Pruski | 2018-01-17 | [DEV] |
+| [Step by Step Guide to Migrate SQL Server Data to SQL Server 2017] | Anoop Kumar | 2017-12-21 | [DBA] |
+| [Nasty Fast PERCENT_RANK] | Alan Burstein | 2018-01-05 | [DEV] |
+| [Administrative Logins and Users] | Kenneth Fisher | 2015-11-02 | [DEV] |
+| [Parallelism in Hekaton (In-Memory OLTP)] | Niko Neugebauer | 2018-01-20 | [DEV] |
+| [Troubleshooting THREADPOOL Waits] | Klaus Aschenbrenner · | 2015-10-20 | [DEV] |
+| [Andy’s Excellent SSIS-in-the-Cloud Adventure, Part 1 – Build an ADFv2 IR Instance] | Andy Leonard · | 2018-01-28 | [AZ],[SSIS] |
+| [PRINT vs. RAISERROR] | sqlity.net · | 2012-05-27 | [DEV] |
+| [Does a Clustered Index Give a Default Ordering?] | Kendra Little · | 2018-02-02 | [DEV] |
+| [Without ORDER BY, You Can’t Depend On the Order of Results] | Michael J Swart · | 2013-09-13 | [DEV] |
+| [Query Store and “in memory”] | Erin Stellato · | 2018-01-31 | [QS] |
+| [Setting and Identifying Row Goals in Execution Plans] | Paul White · | 2018-02-12 | [DEV] |
+| [Azure and Windows PowerShell: The Basics] | Nicolas Prigent · | 2017-12-29 | [AZ] |
+| [Auditing Linked Servers] | Thomas LaRock | 2018-02-08 | [DEV] |
+| [An alternative to data masking] | Daniel Hutmacher | 2018-02-05 | [DEV] |
+| [Safely and Easily Use High-Level Permissions Without Granting Them to Anyone: Server-level] | Solomon Rutzky | 2018-02-15 | [DBA] |
+| [PLEASE, Please, please Stop Using Impersonation, TRUSTWORTHY, and Cross-DB Ownership Chaining] | Solomon Rutzky | 2018-12-30 | [DBA] |
+| [Indexing and Partitioning] | DBA From The Cold | 2018-02-21 | [DEV] |
+| [Schema Compare for SQL Server] | Thomas Larock | 2018-02-14 | [DEV] |
+| [How to change SQL Server ERRORLOG location] | Mark Varnas | 2018-03-04 | [DBA] |
+| [The Uni-Code: The Search for the True List of Valid Characters for T-SQL Regular Identifiers, Part 1] | Solomon Rutzky | 2018-04-02 | [DBA],[DEV] |
+| [The Uni-Code: The Search for the True List of Valid Characters for T-SQL Regular Identifiers, Part 2] | Solomon Rutzky | 2018-04-04 | [DBA],[DEV] |
+| [What’s in a Name?: Inside the Wacky World of T-SQL Identifiers] | Solomon Rutzky | 2018-04-09 | [DBA],[DEV] |
+| [Programming SQL Server with SQL Server Management Objects Framework] | Darko Martinović | 2018-04-09 | [DEV] |
+| [Interval Queries in SQL Server] | Itzik Ben-Gan | 2013-06-12 | [DEV] |
+| [Dealing with date and time instead of datetime] | Rob Farley | 2018-03-29 | [DEV] |
+| [Insight into the SQL Server buffer cache] | Ed Pollack | 2018-02-18 | [DBA],[DEV] |
+| [A concrete example of migration between an Oracle Database and SQL Server using Microsoft Data Migration Assistant] | Jefferson Elias | 2018-04-12 | [DBA],[DEV] |
+| [Audit SQL Server stop, start, restart] | Steve Keeler | 2018-03-12 | [DBA] |
+| [Query tuning: Apply yourself] | Daniel Janik | 2018-04-06 | [DEV] |
+| [How to identify and monitor unused indexes in SQL Server] | Nikola Dimitrijevic | 2018-04-17 | [IDX] |
+| [Benchmarking: 1-TB table population (part 1: the baseline)] | Paul Randal | 2010-01-21 | [BENCH] |
+| [Benchmarking: 1-TB table population (part 2: optimizing log block IO size and how log IO works)] | Paul Randal | 2010-01-27 | [BENCH] |
+| [An overview of SQL Server database migration tools provided by Microsoft] | Jefferson Elias | 2018-03-16 | [DBA] |
+| [Calling Http endpoints in T-SQL using CURL extension] | Jovan Popovic | 2018-04-17 | [CLR] |
+| [Why Table Join Orders In Relational Databases] | Bert Wagner | 2018-04-16 | [DEV] |
+| [Finding overlapping ranges of data] | Louis Davidson | 2018-04-18 | [DEV] |
+| [Avoid use of the MONEY and SMALLMONEY datatypes] | Phil Factor | 2018-04-18 | [DEV] |
+| [Provisioning SQL Server Instances with Docker] | Laerte Junior | 2018-04-18 | [DBA] |
+| [Understanding the graphical representation of the SQL Server Deadlock Graph] | Minette Steynberg | 2016-08-16 | [DBA],[DEV] |
+| [Digitally Signing a Stored Procedure To Allow It To Run With Elevated Permissions] | SQL Undercover | 2018-05-02 | [DBA],[DEV] |
+| [NOLOCK and Top Optimization] | Dmitry Piliugin | 2018-04-12 | [DEV] |
+| [Operator Precedence versus the Confusing Constraint Translation] | Louis Davidson | 2018-04-30 | [DEV] |
+| [Interval Queries in SQL Server] | Itzik Ben-Gan | 2013-06-13 | [DEV] |
+| [Query Trace Column Values] | Dmitry Piliugin | 2018-04-23 | [XE] |
+| [Concurrency Week: How to Delete Just Some Rows from a Really Big Table] | Brent Ozar | 2018-04-27 | [DEV] |
+| [Break large delete operations into chunks] | Aaron Bertrand | 2013-03-13 | [DBA],[DEV] |
+| [How to perform a page level restore in SQL Server] | Prashanth Jayaram | 2018-08-18 | [DBA],[DEV] |
+| [Grouping dates without blocking operators] | Daniel Hutmacher | 2018-05-14 | [DEV] |
+| [What’s CHECKDB doing in my database restore?] | Mike Fal | 2018-04-10 | [DBA] |
+| [How To Hide An Instance Of SQL Server] | Thomas Larock | 2018-04-10 | [DBA] |
+| [Troubleshooting Parameter Sniffing Issues the Right Way: Part 1] | Tara Kizer | 2018-03-06 | [DEV] |
+| [Troubleshooting Parameter Sniffing Issues the Right Way: Part 2] | Tara Kizer | 2018-03-07 | [DEV] |
+| [Troubleshooting Parameter Sniffing Issues the Right Way: Part 3] | Tara Kizer | 2018-03-06 | [DEV] |
+| [When to use the SELECT…INTO statement] | Phil Factor | 2018-03-19 | [DEV] |
+| [Temp Tables In SSIS] | Tim Mitchel | 2018-05-29 | [SSIS] |
+| [Changing the Collation of the Instance, the Databases, and All Columns in All User Databases] | Solomon Rutzky | 2018-06-11 | [DBA] |
+| [10 Cool SQL Optimisations That do not Depend on the Cost Model] | Jooq | 2017-09-28 | [DBA],[DEV] |
+| [Scheduling powershell tasks with sql agent] | Chrissy Lemaire | 2017-09-26 | [J],[PS] |
+| [Three ways to track logins using dbatools] | Chrissy Lemaire | 2018-04-10 | [PS] |
+| [Impact of Fragmentation on Execution Plans] | Jonathan Kehayias | 2017-12-18 | [DEV] |
+| [How to “debug” a Linked Server from SQL Server to an Oracle Database instance] | Jefferson Elias | 2018-06-11 | [DEV] |
+| [How to implement error handling in SQL Server] | Bojan Petrovic | 2018-06-15 | [DEV] |
+| [SQL Server Closure Tables] | Phil Factor | 2018-04-10 | [DEV] |
+| [Deadlock victim choice in SQL Server - an exception?] | Josh the Coder | 2018-05-10 | [DBA],[DEV] |
+| [Azure and Windows PowerShell: The Basics] | Nicolas Prigent | 2017-12-29 | [AZ],[PS] |
+| [Azure and Windows PowerShell: Getting Information] | Nicolas Prigent | 2018-06-26 | [AZ],[PS] |
+| [Be our guest, be our guest, put our database to the test] | Kenneth Fisher | 2018-06-25 | [DBA] |
+| [Finding code smells using SQL Prompt: the SET NOCOUNT problem (PE008 and PE009)] | Phil Factor | 2018-01-04 | [DEV] |
+| [DATABASES 101 guide for the non-technical professional] | Thomas LaRock | 2018-07-05 | [DBA],[DEV] |
+| [Understanding your Azure EA Billing Data and Building a Centralized Data Storage Solution] | Feodor Georgiev | 2018-07-17 | [AZ] |
+| [READ COMMITTED SNAPSHOT ISOLATION and High version_ghost_record_count] | Uwe Ricken | 2018-03-06 | [DBA],[DEV] |
+| [In-Memory OLTP Indexes – Part 1: Recommendations.] | Kunal Karoth | 2017-11-02 | [IDX] |
+| [In-Memory OLTP Indexes – Part 2: Performance Troubleshooting Guide.] | Kunal Karoth | 2017-11-14 | [IDX] |
+| [Optimization Thresholds – Grouping and Aggregating Data, Part 1] | Itzik Ben-Gan | 2018-04-10 | [DEV] |
+| [Optimization Thresholds – Grouping and Aggregating Data, Part 2] | Itzik Ben-Gan | 2018-05-09 | [DEV] |
+| [Optimization Thresholds – Grouping and Aggregating Data, Part 3] | Itzik Ben-Gan | 2018-06-13 | [DEV] |
+| [Optimization Thresholds – Grouping and Aggregating Data, Part 4] | Itzik Ben-Gan | 2018-07-11 | [DEV] |
+| [Optimization Thresholds – Grouping and Aggregating Data, Part 5] | Itzik Ben-Gan | 2018-08-08 | [DEV] |
+| [When DBCC OpenTran doesn’t list all open transactions] | Mohamed | 2013-02-17 | [DBA] |
+| [How I spot not-yet-documented features in SQL Server CTPs] | Aaron Bertrand | 2015-12-02 | [DBA] |
+| [More ways to discover changes in new versions of SQL Server] | Aaron Bertrand | 2016-03-30 | [DBA] |
+| [Tail-Log Backup and Restore in SQL Server] | Prashanth Jayaram | 2018-05-31 | [DBA] |
+| [Database Filegroup(s) and Piecemeal restores in SQL Server] | Prashanth Jayaram | 2018-06-22 | [DBA] |
+| [Updating Statistics with Ola Hallengren’s Script] | Erin Stellato | 2018-06-22 | [DBA] |
+| [Interview questions on SQL Server database backups, restores and recovery – Part I] | Prashanth Jayaram | 2018-07-25 | [DBA] |
+| [Interview questions on SQL Server database backups, restores and recovery – Part II] | Prashanth Jayaram | 2018-07-25 | [DBA] |
+| [Interview questions on SQL Server database backups, restores and recovery – Part III] | Prashanth Jayaram | 2018-07-25 | [DBA] |
+| [Can Rowstore Compression Beat Columnstore Compression?] | Joe Obbish | 2018-06-28 | [DBA],[DEV] |
+| [Inside the Storage Engine: Anatomy of a record] | Paul Randal | 2007-09-30 | [DBA],[DEV] |
+| [Inside the Storage Engine: Using DBCC PAGE and DBCC IND to find out if page splits ever roll back] | Paul Randal | 2007-10-01 | [DBA],[DEV] |
+| [Inside the Storage Engine: Anatomy of a page] | Paul Randal | 2007-10-03 | [DBA],[DEV] |
+| [Inside the Storage Engine: Anatomy of an extent] | Paul Randal | 2007-10-03 | [DBA],[DEV] |
+| [Inside the Storage Engine: IAM pages, IAM chains, and allocation units] | Paul Randal | 2007-10-04 | [DBA],[DEV] |
+| [Inside The Storage Engine: GAM, SGAM, PFS and other allocation maps] | Paul Randal | 2008-03-14 | [DBA],[DEV] |
+| [Disaster recovery 101: fixing a broken boot page] | Paul Randal | 2015-06-23 | [DBA],[DEV] |
+| [How to download a sqlservr.pdb symbol file] | Paul Randal | 2011-04-13 | [DBA],[DEV] |
+| [A cause of high-duration ASYNC_IO_COMPLETION waits] | Paul Randal | 2014-03-19 | [DBA],[DEV] |
+| [How to solve the Identity Crisis in SQL Server] | Ed Pollack | 2017-11-14 | [DBA],[DEV] |
+| [Azure SQL Database Performance and Service Tiers Explained] | Glenn Berry | 2018-08-01 | [AZ] |
+| [What To Do When Wait Stats Don’t Help] | Joe Obbish | 2018-07-20 | [DEV] |
+| [SQL Server Brute Force Attack Detection: Part 1] | Ryan G Conrad | 2018-03-26 | [DBA] |
+| [SQL Server Brute Force Attack Detection: Part 2] | Ryan G Conrad | 2018-03-26 | [DBA] |
+| [SQL Server Brute Force Attack Detection: Part 3] | Ryan G Conrad | 2018-03-26 | [DBA] |
+| [SQLCLR vs SQL Server 2017, Part 8: Is SQLCLR Deprecated in Favor of Python or R (sp_execute_external_script)?] | Solomon Rutzky | 2018-08-09 | [DBA],[DEV] |
+| [Sql Server Agent For Azure Sql Database, Azure Elastic Database Pools & Azure Managed Instance] | ? | 2018-07-20 | [AZ] |
+| [Storage performance best practices and considerations for Azure SQL DB Managed Instance (General Purpose)] | Dimitri Furman | 2018-07-20 | [AZ] |
+| [T-SQL Tuesday #017: APPLY: It Slices! It Dices! It Does It All!] | Brad Schulz | 2011-04-12 | [DEV] |
+| [SQL Server Encryption, What’s The Key Hierarchy All About?] | David Fowler | 2018-08-12 | [DBA],[DEV] |
+| [Overview of the SQLCMD utility in SQL Server] | Prashanth Jayaram | 2018-08-13 | [DBA],[DEV] |
+| [The BCP (Bulk Copy Program) command in action] | Prashanth Jayaram | 2018-08-13 | [DBA],[DEV] |
+| [Measuring Query Execution Time] | Grant Fritchey | 2018-08-13 | [DBA],[DEV] |
+| [How to Check Performance on a New SQL Server] | Brent Ozar | 2018-08-03 | [DBA],[DEV] |
+| [Questions About Kerberos and SQL Server That You Were Too Shy to Ask] | Kathi Kellenberger | 2018-08-21 | [DBA] |
+| [SQL Server Execution Plans overview] | Ahmad Yaseen | 2018-07-04 | [DBA],[DEV] |
+| [SQL Server Execution Plans types] | Ahmad Yaseen | 2018-07-23 | [DBA],[DEV] |
+| [How to Analyze SQL Execution Plan Graphical Components] | Ahmad Yaseen | 2018-09-07 | [DBA],[DEV] |
+| [Query optimization techniques in SQL Server: the basics] | Ed Pollack | 2018-05-30 | [DBA],[DEV] |
+| [Query optimization techniques in SQL Server: tips and tricks] | Ed Pollack | 2018-06-19 | [DBA],[DEV] |
+| [Query optimization techniques in SQL Server: Database Design and Architecture] | Ed Pollack | 2018-07-13 | [DBA],[DEV] |
+| [SQL Query Optimization Techniques in SQL Server: Parameter Sniffing] | Ed Pollack | 2018-09-04 | [DBA],[DEV] |
+| [Similarities and Differences among RANK, DENSE_RANK and ROW_NUMBER Functions] | Ben Richardson | 2018-08-20 | [DBA],[DEV] |
+| [Temporal Tables Under The Covers] | Randolph West | 2015-11-17 | [DBA],[DEV] |
+| [Faking Temporal Tables with Triggers] | Bert Wagner | 2018-09-11 | [DBA],[DEV] |
+| [SQL queries to manage hierarchical or parent-child relational rows in SQL Server] | Dipon Roy | 2014-09-16 | [DBA],[DEV] |
+| [Choosing Between Table Variables and Temporary Tables] | Phil Factor | 2018-05-11 | [DBA],[DEV] |
+| [What's New in the First Public CTP of SQL Server 2019] | Aaron Bertrand | 2018-09-24 | [DBA],[DEV] |
+| [SQL Server support for TLS 1.2 – Read This First!] | Aaron Bertrand | 2016-03-03 | [DBA],[DEV] |
+| [Misconceptions in SQL Server: A Trio of table variables] | Gail Shaw | 2010-10-12 | [DBA],[DEV] |
+| [Using the Same Column Twice in a SQL UPDATE Statement] | SQL Theater | 2018-09-13 | [DBA],[DEV] |
+| [How to perform a performance test against a SQL Server instance] | Jefferson Elias | 2018-09-14 | [DBA],[DEV] |
+| [The Black Art Of Spatial Index Tuning In SQL Server] | Todd Jackson | 2011-04-26 | [DEV] |
+| [Patching SQL Server on Windows notes from the field] | Kevin Chant | 2019-01-10 | [DBA] |
+| [Availability Group Readable Secondaries – Just Say No] | Jonathan Kehayias | 2019-01-10 | [DBA] |
+| [Finding the Slowest Query in a Stored Procedure] | Erin Stellato | 2018-12-13 | [DBA],[DEV] |
+| [A Monumental Migration to SQL Server 2016 – Part 1] | Andy Levy | 2019-01-07 | [DBA] |
+| [A Monumental Migration to SQL Server 2016 – Part 2] | Andy Levy | 2019-01-09 | [DBA] |
+| [A unique review of SQL Server index types] | Kevin Chant | 2019-10-18 | [DBA],[DEV] |
+| [Don’t Just Rely on Query Execution Stats for T-SQL Execution] | Kevin Chant | 2018-09-18 | [DBA],[DEV] |
+| [Posting SQL Server notifications to Slack] | Alessandro Alpi | 2018-09-19 | [DBA],[DEV] |
+| [How to create DACPAC file?] | Kamil Nowinski | 2018-10-31 | [DBA],[DEV] |
+| [Find the Next Non-NULL Row in a Series With SQL] | JOOq | 2018-09-03 | [DEV] |
+| [Calculate Percentiles to Learn About Data Set Skew in SQL] | JOOq | 2019-01-22 | [DEV] |
+| [Comparing multiple rows insert vs single row insert with three data load methods] | Phil Factor | 2013-02-21 | [DBA],[DEV] |
+| [The Cause of Every Deadlock in SQL Server] | Thomas Larock | 2018-09-19 | [DBA],[DEV] |
+| [Deadlock Troubleshooting, Part 1] | Bart Dunkan | 2006-09-08 | [DBA],[DEV] |
+| [Deadlock Troubleshooting, Part 2] | Bart Dunkan | 2006-09-12 | [DBA],[DEV] |
+| [Deadlock Troubleshooting, Part 3] | Bart Dunkan | 2006-09-08 | [DBA],[DEV] |
+| [The Good, the Bad and the Ugly of Table Variable Deferred Compilation – Part 1] | Milosra Divojevic | 2018-10-04 | [DBA],[DEV] |
+| [The Good, the Bad and the Ugly of Table Variable Deferred Compilation – Part 2] | Milosra Divojevic | 2018-10-05 | [DBA],[DEV] |
+| [The Good, the Bad and the Ugly of Table Variable Deferred Compilation – Part 3] | Milosra Divojevic | 2018-10-08 | [DBA],[DEV] |
+| [Creating a SQL Server 2019 Demo Environment in a Docker Container] | Cathrine Wilhelmsen | 2018-12-02 | [DBA],[DEV] |
+| [Overview of Data Compression in SQL Server] | Prashanth Jayaram | 2018-12-06 | [DBA],[DEV] |
+| [SQL Server Hash Match Operator] | Hugo Kornelis | 2018-06-01 | [DBA],[DEV] |
+| [How to use Microsoft Assessment and Planning (MAP) Toolkit for SQL Server] | Musab Umair | 2017-03-31 | [DBA] |
+| [Improve the Performance of Your Azure SQL Database (and Save Money!) with Automatic Tuning] | Monica Rathbun | 2019-01-30 | [AZ],[DBA] |
+| [The Importance of Database Compatibility Level in SQL Server] | Glenn Berry | 2019-01-14 | [DBA] |
+| [Azure Managed vs Unmanaged disks : The choice] | Samir Farhat | 2017-05-31 | [AZ] |
+| [Storage options for SQL Server database files in Azure] | James Serra | 2019-01-29 | [AZ] |
+| [The Performance of Window Aggregates Revisited with SQL Server 2019] | Kathi Kellenberger | 2019-02-11 | [DEV] |
+| [Super Scaling Singleton Inserts] | Chris Adkin | 2015-02-19 | [DEV] |
+| [Preparation for SQL Server Installation] | Michal Sadowski | 2018-12-12 | [DBA] |
+| [Executing xp_cmdshell with Non SysAdmin Account] | Lucas Kartawidjaja | 2019-01-04 | [DBA] |
+| [Generating SQL using Biml (T-SQL Tuesday #110)] | Cathrine Wilhelmsen | 2019-01-08 | [DEV] |
+| [Avoiding SQL Server Upgrade Performance Issues] | Glenn Berry | 2019-02-05 | [DBA] |
[SQL Server Index Design Guide]:https://technet.microsoft.com/en-us/library/jj835095.aspx
[SQL Server 2012 Security Best Practices - Microsoft]:http://download.microsoft.com/download/8/f/a/8fabacd7-803e-40fc-adf8-355e7d218f4c/sql_server_2012_security_best_practice_whitepaper_apr2012.docx
[Help, my database is corrupt. Now what?]:http://www.sqlservercentral.com/articles/Corruption/65804/
+[What to Do When DBCC CHECKDB Reports Corruption]:https://www.brentozar.com/archive/2016/05/dbcc-checkdb-reports-corruption/
+[Understanding how SQL Server executes a query]:http://rusanu.com/2013/08/01/understanding-how-sql-server-executes-a-query/
+[Troubleshooting SQL Server CPU Performance Issues]:http://sqlperformance.com/2013/05/io-subsystem/cpu-troubleshooting
[Knee-Jerk Performance Tuning : Incorrect Use of Temporary Tables]:http://sqlperformance.com/2016/04/t-sql-queries/knee-jerk-temporary-tables
-[The Curse and Blessings of Dynamic SQL]:http://sommarskog.se/dyn-search.html
+[High Performance T-SQL using Code Patterns]:https://dwaincsql.com/2015/05/27/high-performance-t-sql-using-code-patterns/
+[SQL Server Database Corruption Repair]:http://stevestedman.com/2015/08/sql-server-database-corruption-repair/
+[Basic SQL Server Performance Troubleshooting For Developers]:https://www.simple-talk.com/sql/performance/basic-sql-server-performance-troubleshooting-for-developers/
+[The Curse and Blessings of Dynamic SQL]:http://sommarskog.se/dynamic_sql.html
[Dynamic Search Conditions in T-SQL]:http://www.sommarskog.se/dynamic_sql.html
[Slow in the Application, Fast in SSMS]:http://www.sommarskog.se/query-plan-mysteries.html
[How to share data between stored procedures]:http://www.sommarskog.se/share_data.html
[Arrays and Lists in SQL Server 2008]:http://www.sommarskog.se/arrays-in-sql-2008.html
[Giving Permissions through Stored Procedures]:http://www.sommarskog.se/grantperm.html
[Error and Transaction Handling in SQL Server]:http://www.sommarskog.se/error_handling/Part1.html
+[Using the Bulk-Load Tools in SQL Server]:http://www.sommarskog.se/bulkload.html
+[Using Table-Valued Parameters in SQL Server and .NET]:http://www.sommarskog.se/arrays-in-sql-2008.html
[SQL Server Columnstore Articles]:http://www.nikoport.com/columnstore/
[Documentation: It Does not Suck!]:https://www.brentozar.com/archive/2013/01/documentation-it-doesnt-suck/
[The Data Loading Performance Guide]:https://msdn.microsoft.com/en-us/library/dd425070%28v=sql.100%29.aspx
@@ -49,3 +681,599 @@
[Overcoming Variable Limitations in SQLCmd Mode]:http://www.sqlsoldier.com/wp/sqlserver/tsqltuesday65overcomingvariablelimitationsinsqlcmdmode
[Contents of a Run Book]:https://technet.microsoft.com/en-us/library/cc917702.aspx
[Compressed and Encrypted Backups on the Cheap]:https://bornsql.ca/2016/04/compressed-encrypted-backups-cheap/
+[Curing Data-Obesity in OLTP Databases]:https://www.simple-talk.com/sql/database-administration/curing-data-obesity-in-oltp-databases/
+[Understanding GRANT, DENY, and REVOKE in SQL Server]:https://www.mssqltips.com/sqlservertip/2894/understanding-grant-deny-and-revoke-in-sql-server/
+[Monitor SQL Server Transaction Log File Free Space]:https://www.mssqltips.com/sqlservertip/3617/monitor-sql-server-transaction-log-file-free-space/
+[Dynamically Query a 100 Million Row Table-Efficiently]:http://www.sqlservercentral.com/articles/T-SQL/121906/
+[Understanding and Using Parallelism in SQL Server]:https://www.simple-talk.com/sql/learn-sql-server/understanding-and-using-parallelism-in-sql-server/
+[Diagnosing and Resolving Latch Contention on SQL Server]:https://www.microsoft.com/en-us/download/details.aspx?id=26665
+[Parallel Execution Plans – Branches and Threads]:http://sqlperformance.com/2013/10/sql-plan/parallel-plans-branches-threads
+[Nasty Fast PERCENT_RANK]:http://www.sqlservercentral.com/articles/PERCENT_RANK/141532/
+[Looking at VIEWs, Close Up]:https://www.simple-talk.com/sql/t-sql-programming/looking-at-views,-close-up/
+[SQL Server 2016: It Just Runs Faster]:http://thomaslarock.com/2016/06/sql-server-2016-just-runs-faster/
+[TSQL JOIN Types Poster]:http://stevestedman.com/2015/05/tsql-join-types-poster-version-4-1/
+[It is Hard To Destroy Data]:http://michaeljswart.com/2015/05/its-hard-to-destroy-data/
+[How to transfer logins and passwords between instances of SQL Server]:https://support.microsoft.com/en-us/kb/918992
+[Finding File Growths with Extended Events]:http://nebraskasql.blogspot.ru/2016/06/finding-file-growths-with-extended.html
+[Questions You Should Ask About the Databases You Manage]:https://www.brentozar.com/archive/2016/06/questions-ask-databases-manage/
+[Clustered Indexes in SQL Server]:http://www.sqlhammer.com/clustered-indexes-sql-server/
+[Triage Quiz: Is Your SQL Server Safe?]:https://www.brentozar.com/archive/2016/06/triage-quiz-sql-server-safe/
+[Why Not Just Create Statistics?]:https://www.brentozar.com/archive/2016/07/not-just-create-statistics/
+[Understanding the SQL Server NOLOCK hint]:https://www.mssqltips.com/sqlservertip/2470/understanding-the-sql-server-nolock-hint/
+[Recover access to a SQL Server instance]:https://www.mssqltips.com/sqlservertip/2682/recover-access-to-a-sql-server-instance/
+[SQL Server 2016 Upgrade Planning]:http://sqlmag.com/sql-server/sql-server-2016-upgrade-planning-0
+[Graphs and Graph Algorithms in T-SQL]:http://www.hansolav.net/sql/graphs.html
+[Episode 4: SQL Server R Services makes you a smarter T-SQL Developer]:https://blogs.msdn.microsoft.com/sqlcat/2016/07/12/sqlsweet16-episode-4-sql-server-r-services-makes-you-a-smarter-t-sql-developer/
+[How to Set Max Degree of Parallelism in SQL Server]:http://www.littlekendra.com/2016/07/14/max-degree-of-parallelism-cost-threshold-for-parallelism/
+[Undocumented Query Plans: Equality Comparisons]:http://sqlblog.com/blogs/paul_white/archive/2011/06/22/undocumented-query-plans-equality-comparisons.aspx
+[Simplified Order Of Operations]:http://michaeljswart.com/2016/07/simplified-order-of-operations/
+[SQL Server Statistics Basics]:https://www.simple-talk.com/sql/performance/sql-server-statistics-basics/
+[Learn to Use sp_Blitz, sp_BlitzCache, sp_BlitzFirst, and sp_BlitzIndex with These Tutorial Videos]:https://www.brentozar.com/archive/2016/09/learn-use-sp_blitz-sp_blitzcache-sp_blitzfirst-sp_blitzindex-tutorial-videos/
+[Where is a record really located?]:https://blogs.msdn.microsoft.com/sql_pfe_blog/2016/09/15/where-is-a-record-really-located/
+[Instant File Initialization (IFI)]:http://stevestedman.com/2016/09/instant-file-initialization-ifi/
+[How to Query the StackExchange Databases]:https://www.brentozar.com/archive/2014/01/how-to-query-the-stackexchange-databases/
+[How to Troubleshoot Performance in SQL Server (Dear SQL DBA)]:http://www.littlekendra.com/2016/06/02/dear-sql-dba-lost-in-performance-troubleshooting/
+[How to Log Activity Using sp_whoisactive in a Loop]:https://www.brentozar.com/responder/log-sp_whoisactive-to-a-table/
+[Logging Activity Using sp_WhoIsActive – Take 2]:https://www.brentozar.com/archive/2016/07/logging-activity-using-sp_whoisactive-take-2/
+[How To Fix Forwarded Records]:https://www.brentozar.com/archive/2016/07/fix-forwarded-records/
+[Should I Automate my Windows Updates for SQL Server?]:http://www.littlekendra.com/2016/07/28/should-i-automate-my-windows-updates-for-sql-server-dear-sql-dba-episode-10/
+[Finding the Right Path]:http://jasonbrimhall.info/2016/08/24/finding-the-right-path/
+[#BackToBasics : An Updated "Kitchen Sink" Example]:https://blogs.sqlsentry.com/aaronbertrand/backtobasics-updated-kitchen-sink-example/
+[Locking and Blocking in SQL Server]:https://www.brentozar.com/sql/locking-and-blocking-in-sql-server/
+[Nested Loops Prefetching]:http://sqlblog.com/blogs/paul_white/archive/2013/08/31/sql-server-internals-nested-loops-prefetching.aspx
+[Performance tuning backup and restore operations]:http://www.sqlhammer.com/performance-tuning-backup-restore-operations/
+[Execution Plan Analysis: The Mystery Work Table]:http://sqlblog.com/blogs/paul_white/archive/2013/03/08/execution-plan-analysis-the-mystery-work-table.aspx
+[How to move data between File Groups in SQL Server]:http://www.sqlpassion.at/archive/2016/09/26/how-to-move-data-between-file-groups-in-sql-server/
+[Optimizing Your Query Plans with the SQL Server 2014 Cardinality Estimator]:https://msdn.microsoft.com/en-us/library/dn673537.aspx
+[Parallelism in SQL Server Query Tuning]:http://sqlmag.com/sql-server/parallelism-sql-server-query-tuning
+[What You Need to Know about the Batch Mode Window Aggregate Operator in SQL Server 2016: Part 1]:http://sqlmag.com/sql-server/what-you-need-know-about-batch-mode-window-aggregate-operator-sql-server-2016-part-1
+[What To Do If sp_BlitzFirst Warns About High Compilations]:https://www.brentozar.com/archive/2016/09/what-to-do-if-sp_blitzfirst-warns-about-high-compilations/
+[Questions You Should Be Asking About Your Backups]:https://www.brentozar.com/archive/2016/10/questions-asking-backups/
+[Evolutionary Database Design]:http://martinfowler.com/articles/evodb.html
+[Implementing a custom sort]:https://sqlperformance.com/2016/10/sql-plan/implementing-custom-sort
+[Deletes that Split Pages and Forwarded Ghosts]:http://sqlblog.com/blogs/paul_white/archive/2012/08/31/deletes-that-split-pages-and-forwarded-ghosts.aspx
+[Query Optimizer Deep Dive - Part 1]:http://sqlblog.com/blogs/paul_white/archive/2012/04/28/query-optimizer-deep-dive-part-1.aspx
+[Query Optimizer Deep Dive - Part 2]:http://sqlblog.com/blogs/paul_white/archive/2012/04/28/query-optimizer-deep-dive-part-2.aspx
+[Query Optimizer Deep Dive - Part 3]:http://sqlblog.com/blogs/paul_white/archive/2012/04/29/query-optimizer-deep-dive-part-3.aspx
+[Query Optimizer Deep Dive - Part 4]:http://sqlblog.com/blogs/paul_white/archive/2012/05/01/query-optimizer-deep-dive-part-4.aspx
+[Should You Rebuild or Reorganize Indexes on Large Tables?]:https://www.littlekendra.com/2016/10/13/should-you-rebuild-or-reorganize-indexes-on-large-tables-dear-sql-dba-episode-19/
+[Retrieving SQL Server Query Execution Plans]:https://www.simple-talk.com/sql/database-administration/retrieving-sql-server-query-execution-plans/
+[Introduction to Latches in SQL Server]:http://www.sqlpassion.at/archive/2014/06/23/introduction-to-latches-in-sql-server/
+[Latch Coupling in SQL Server]:https://www.sqlpassion.at/archive/2016/10/24/latch-coupling-in-sql-server/
+[Partitioned Views? A How-To Guide]:https://www.brentozar.com/archive/2016/09/partitioned-views-guide/
+[How to Choose Between RCSI and Snapshot Isolation Levels]:https://www.littlekendra.com/2016/02/18/how-to-choose-rcsi-snapshot-isolation-levels/
+[TroubleShooting SQL Server Memory Consumption]:http://www.sql-server-performance.com/2016/trouble-shooting-sql-server-ra-memory-consumption/
+[Time Series Algorithms in SQL Server]:http://www.sql-server-performance.com/2015/time-series-algorithms-sql-server/
+[Heap Tables in SQL Server]:http://www.sqlpassion.at/archive/2015/10/19/heap-tables-in-sql-server/
+[Internals of the Seven SQL Server Sorts – Part 1]:https://sqlperformance.com/2015/04/sql-plan/internals-of-the-seven-sql-server-sorts-part-1
+[Internals of the Seven SQL Server Sorts – Part 2]:https://sqlperformance.com/2015/05/sql-plan/internals-of-the-seven-sql-server-sorts-part-2
+[The 9 Letters That Get DBAs Fired]:https://www.brentozar.com/archive/2011/12/letters-that-get-dbas-fired/
+[Restarting SQL Server – always a good idea?]:https://www.sqlpassion.at/archive/2016/08/08/restarting-sql-server-always-a-good-idea/
+[Don’t believe everything you read: Reconfigure flushes the plan cache]:https://mattsql.wordpress.com/2012/06/25/dont-believe-everything-you-read-reconfigure-flushes-the-plan-cache/
+[How-to load data fast into SQL Server 2016]:http://henkvandervalk.com/how-to-load-data-fast-into-sql-server-2016
+[Database Design Matters, RTO and Filegroups]:http://www.sqldoubleg.com/2016/10/28/database-design-matters-rto-and-filegroups/
+[Automate Alerting for SQL Server Suspect Database Pages]:https://www.mssqltips.com/sqlservertip/4166/automate-alerting-for-sql-server-suspect-database-pages/
+[Successful Anti-Patterns, Storage Requirements]:http://www.sqldoubleg.com/2016/10/19/successful-anti-patterns-storage-requirements/
+[SQL Server table columns under the hood]:http://rusanu.com/2011/10/20/sql-server-table-columns-under-the-hood/
+[How to analyse SQL Server performance]:http://rusanu.com/2014/02/24/how-to-analyse-sql-server-performance/
+[To BLOB or Not To BLOB: Large Object Storage in a Database or a Filesystem?]:https://www.microsoft.com/en-us/research/publication/to-blob-or-not-to-blob-large-object-storage-in-a-database-or-a-filesystem/
+[Asynchronous procedure execution]:http://rusanu.com/2009/08/05/asynchronous-procedure-execution/
+[What is the CXPACKET Wait Type, and How Do You Reduce It?]:https://www.brentozar.com/archive/2013/08/what-is-the-cxpacket-wait-type-and-how-do-you-reduce-it/
+[New indexes, hypothetically]:https://sqlstudies.com/2016/11/02/new-indexes-hypothetically/
+[Indexing Wide Keys in SQL Server]:https://www.brentozar.com/archive/2013/05/indexing-wide-keys-in-sql-server/
+[The Anatomy and (In)Security of Microsoft SQL Server Transparent Data Encryption (TDE), or How to Break TDE]:http://simonmcauliffe.com/technology/tde/
+[Correctly adding data files to tempdb]:http://www.sqlskills.com/blogs/paul/correctly-adding-data-files-tempdb/
+[Why You Should Test Your Queries Against Bigger Data]:https://www.brentozar.com/archive/2016/11/why-you-should-test-your-queries-against-bigger-data/
+[Tally OH! An Improved SQL 8K “CSV Splitter” Function]:http://www.sqlservercentral.com/articles/Tally+Table/72993/
+[Set Statistics… Profile?]:https://www.brentozar.com/archive/2016/10/set-statistics-profile/
+[Hierarchies on Steroids #1: Convert an Adjacency List to Nested Sets]:http://www.sqlservercentral.com/articles/Hierarchy/94040/
+[Optimizing T-SQL queries that change data]:http://sqlblog.com/blogs/paul_white/archive/2013/01/26/optimizing-t-sql-queries-that-change-data.aspx
+[Measuring Query Duration: SSMS vs SQL Sentry Plan Explorer]:https://www.littlekendra.com/2016/09/27/measuring-query-duration-ssms-vs-sql-sentry-plan-explorer/
+[Inside the Statistics Histogram & Density Vector]:http://www.sqlpassion.at/archive/2014/01/28/inside-the-statistics-histogram-density-vector/
+[Misconceptions on parameter sniffing]:http://sqlblog.com/blogs/hugo_kornelis/archive/2016/11/03/misconceptions-on-parameter-sniffing.aspx
+[CAST vs. CONVERT]:https://blogs.sentryone.com/aaronbertrand/backtobasics-cast-vs-convert/
+[What Every Accidental DBA Needs to Know Now: Basics of SQL Security]:http://sqlmag.com/database-security/what-every-accidental-dba-needs-know-now-basics-sql-security
+[SQL Server Perfmon (Performance Monitor) Best Practices]:https://www.brentozar.com/archive/2006/12/dba-101-using-perfmon-for-sql-performance-tuning/
+[Top 5 Overlooked Index Features]:https://www.brentozar.com/archive/2016/11/top-5-overlooked-index-features/
+[A Sysadmin’s Guide to Microsoft SQL Server Memory]:https://www.brentozar.com/archive/2011/09/sysadmins-guide-microsoft-sql-server-memory/
+[Searching Strings in SQL Server is Expensive]:https://www.brentozar.com/archive/2016/10/searching-strings-sql-server-expensive/
+[Altering an INT Column to a BIGINT]:https://www.littlekendra.com/2016/08/04/altering-an-int-column-to-a-bigint-dear-sql-dba-episode-11/
+[Query tuning 101: Problems with IN ()]:http://www.sqlservercentral.com/blogs/confessions-of-a-microsoft-addict/2016/11/10/query-tuning-101-problems-with-in-/
+[Admin: Bulkadmin vs ADMINISTER BULK OPERATIONS]:http://richbrownesq-sqlserver.blogspot.ru/2012/01/admin-bulkadmin-vs-administer-bulk.html
+[Can Indexes My Query Doesn’t Use Help My Query?]:https://www.brentozar.com/archive/2016/11/can-indexes-query-doesnt-use-help-query/
+[SQL Server Audit Walkthrough]:http://www.sql-server-performance.com/2016/walkthrough-sql-server-audit/
+[The SQL Server 2016 Query Store: Overview and Architecture]:https://www.simple-talk.com/sql/database-administration/the-sql-server-2016-query-store-overview-and-architecture/
+[Reading, Writing, and Creating SQL Server Extended Properties]:https://www.simple-talk.com/sql/database-delivery/reading-writing-creating-sql-server-extended-properties/
+[Questions About SQL Server Security and Access Control You Were Too Shy to Ask]:https://www.simple-talk.com/sql/database-delivery/questions-sql-server-security-access-control-shy-ask/
+[The Ten Commandments of SQL Server Monitoring]:https://www.simple-talk.com/sql/database-administration/the-ten-commandments-of-sql-server-monitoring/
+[Should I use NOT IN, OUTER APPLY, LEFT OUTER JOIN, EXCEPT, or NOT EXISTS?]:https://sqlperformance.com/2012/12/t-sql-queries/left-anti-semi-join
+[Parameter Sniffing, Embedding, and the RECOMPILE Options]:https://sqlperformance.com/2013/08/t-sql-queries/parameter-sniffing-embedding-and-the-recompile-options
+[Can comments hamper stored procedure performance?]:https://sqlperformance.com/2016/11/sql-performance/comments-hamper-performance
+[SQL Server Temporary Table Caching]:https://www.mssqltips.com/sqlservertip/4406/sql-server-temporary-table-caching/
+[Techniques to Monitor SQL Server memory usage]:http://www.sql-server-performance.com/2016/monitor-sql-server-memory-usage/
+[Troubleshooting Query Regressions Caused By The New Cardinality Estimator]:https://sqlserverscotsman.wordpress.com/2016/11/24/troubleshooting-query-regressions-caused-by-the-new-cardinality-estimator/
+[Migrating Databases to Azure SQL Database]:https://sqlperformance.com/2016/10/sql-performance/migrating-to-azure-sql-database
+[Solve Common SQL Server Restore Issues]:https://www.mssqltips.com/sqlservertip/4110/solve-common-sql-server-restore-issues/
+[Spills SQL Server Doesn’t Warn You About]:https://www.brentozar.com/archive/2016/11/spills-sql-server-doesnt-warn/
+[How often should I run DBCC CHECKDB?]:https://www.brentozar.com/archive/2016/02/how-often-should-i-run-dbcc-checkdb/
+[Why is My Query Faster the Second Time it Runs?]:https://www.littlekendra.com/2016/11/25/why-is-my-query-faster-the-second-time-it-runs-dear-sql-dba-episode-23/
+[Downgrading the SQL Server Edition of a Dev Environment]:https://www.littlekendra.com/2016/11/15/downgrading-the-sql-server-edition-of-a-dev-environment/
+[Date Math In The WHERE Clause]:https://www.brentozar.com/archive/2016/12/date-math-clause/
+[Why is This Partitioned Query Slower?]:https://www.brentozar.com/archive/2015/09/why-is-this-partitioned-query-slower/
+[A Beginner’s Guide to the True Order of SQL Operations]:https://blog.jooq.org/2016/12/09/a-beginners-guide-to-the-true-order-of-sql-operations/
+[Logical Query Processing: What It Is And What It Means to You]:http://sqlmag.com/sql-server/logical-query-processing-what-it-and-what-it-means-you
+[Forcing a Parallel Query Execution Plan]:http://sqlblog.com/blogs/paul_white/archive/2011/12/23/forcing-a-parallel-query-execution-plan.aspx
+[Join Containment Assumption and CE Model Variation]:http://www.queryprocessor.com/ce_join_base_containment_assumption/
+[Table Variable Tip]:http://sqlmag.com/t-sql/table-variable-tip
+[Heap tables in SQL Server]:http://www.sqlhammer.com/heaps-in-microsoft-sql-server/
+[The ‘B’ in B-Tree – Indexing in SQL Server]:http://www.sqlhammer.com/the-b-in-b-tree-indexing-sql-server/
+[How to read the SQL Server Database Transaction Log]:https://www.mssqltips.com/sqlservertip/3076/how-to-read-the-sql-server-database-transaction-log/
+[Filtered Statistics Follow-up]:https://www.brentozar.com/archive/2016/12/filtered-statistics-follow/
+[SQL Server Query Optimization: No Unknown Unknowns]:http://sqlmag.com/sql-server/sql-server-query-optimization-no-unknown-unknowns
+[Sync Vs Async Statistics: The Old Debate]:https://sqlserverscotsman.wordpress.com/2016/12/10/sync-vs-async-statistics-the-old-debate/
+[Recommended updates and configuration options for SQL Server 2012 and SQL Server 2014 with high-performance workloads]:https://support.microsoft.com/en-gb/kb/2964518
+[Troubleshooting SQL Server backup and restore operations]:https://support.microsoft.com/en-us/kb/224071
+[SQL Server 2016: Getting tempdb a little more right]:https://blogs.sentryone.com/aaronbertrand/sql-server-2016-tempdb-fixes/
+[Practical uses of binary types]:https://sqlsunday.com/2017/01/09/binary-types/
+[Backing Up SQL Server Databases is Easier in PowerShell than T-SQL]:http://www.sqlservercentral.com/articles/PowerShell/151510/
+[Creating, detaching, re-attaching, and fixing a SUSPECT database]:http://www.sqlskills.com/blogs/paul/creating-detaching-re-attaching-and-fixing-a-suspect-database/
+[Modifying Tables Online – Part 1: Migration Strategy]:http://michaeljswart.com/2012/04/modifying-tables-online-part-1-migration-strategy/
+[Modifying Tables Online – Part 2: Implementation Example]:http://michaeljswart.com/2012/04/modifying-tables-online-part-2-implementation-example/
+[Modifying Tables Online – Part 3: Example With Error Handling]:http://michaeljswart.com/2012/04/modifying-tables-online-part-3-example-with-error-handling/
+[Modifying Tables Online – Part 4: Testing]:http://michaeljswart.com/2012/04/modifying-tables-online-part-4-testing/
+[Modifying Tables Online – Part 5: Just One More Thing]:http://michaeljswart.com/2012/04/modifying-tables-online-part-5-just-one-more-thing/
+[DATEDIFF vs. DATEADD]:http://www.madeiradata.com/datediff-vs-dateadd/
+[Disaster recovery 101: hack-attach a damaged database]:http://www.sqlskills.com/blogs/paul/disaster-recovery-101-hack-attach-a-damaged-database/
+[Bones of SQL - The Calendar Table]:http://www.sqlservercentral.com/articles/calendar/145206/
+[SQL Server 2016, Double or Nothing, Always Encrypted with temporal tables]:http://www.sqldoubleg.com/2016/07/27/sql-server-2016-double-or-nothing-always-encrypted-with-temporal-tables/
+[Reclaiming Space After Column Data Type Change]:http://www.sqlservercentral.com/articles/data+type/144308/
+[Packing Intervals with Priorities]:http://sqlmag.com/sql-server/packing-intervals-priorities
+[Avoid Unnecessary Lookups when Using ROW_NUMBER for Paging]:http://sqlmag.com/t-sql/avoid-unnecessary-lookups-when-using-rownumber-paging
+[Migrating a Disk-Based Table to a Memory-Optimized Table in SQL Server]:https://www.simple-talk.com/sql/database-administration/migrating-disk-based-table-memory-optimized-table-sql-server/
+[SQL Server Hardware Optimization]:http://www.sql-server-performance.com/2016/sql-server-hardware-optimization/
+[Index Types Heaps, Primary Keys, Clustered and Nonclustered Indexes]:https://www.littlekendra.com/2017/02/02/index-types-heaps-primary-keys-clustered-and-nonclustered-indexes-dear-sql-dba-episode-28/
+[Identifying Existence of Intersections in Intervals]:http://sqlmag.com/sql-server/identifying-existence-intersections-intervals
+[Cheat Sheet How to Configure TempDB for Microsoft SQL Server]:https://www.brentozar.com/archive/2016/01/cheat-sheet-how-to-configure-tempdb-for-microsoft-sql-server/
+[A Tourist’s Guide to the sp_Blitz Source Code, Part 1: The Big Picture]:https://www.brentozar.com/archive/2017/02/tourists-guide-sp_blitz-source-code-part-1-big-picture/
+[SQL Server Default Configurations That You Should Change]:https://www.pythian.com/blog/sql-server-default-configurations-change/
+[Decoding Key and Page WaitResource for Deadlocks and Blocking]:https://www.littlekendra.com/2016/10/17/decoding-key-and-page-waitresource-for-deadlocks-and-blocking/
+[Security in the CLR World Inside SQL Server]:http://www.codemag.com/article/0603031
+[On the Advantages of DateTime2(n) over DateTime]:http://www.sqltact.com/2012/12/on-advantages-of-datetime2n-over.html
+[Build Your Own Tools]:http://michaeljswart.com/2016/09/build-your-own-tools/
+[Enhanced T-SQL Error Handling With Extended Events]:http://itsalljustelectrons.blogspot.ru/2016/09/Enhanced-TSQL-Error-Handling-With-Extended-Events.html
+[Compression and its Effects on Performance]:https://sqlperformance.com/2017/01/sql-performance/compression-effect-on-performance
+[Does Truncate Table Reset Statistics]:https://www.littlekendra.com/2016/12/08/does-truncate-table-reset-statistics/
+[SQL Server Database Decommissioning Check List]:https://www.mssqltips.com/sqlservertip/4333/sql-server-database-decommissioning-check-list/
+[New SQL Server Database Request Questionnaire and Checklist]:https://www.mssqltips.com/sqlservertip/3523/new-sql-server-database-request-questionnaire-and-checklist/
+[Adding Partitions to the Lower End of a Left Based Partition Function]:https://www.littlekendra.com/2017/02/21/adding-partitions-to-the-lower-end-of-a-left-based-partition-function/
+[Don't Panic Busting a File Space Myth]:http://sqlmag.com/database-administration/dont-panic-busting-file-space-myth
+[#BackToBasics : Dating Responsibly]:https://blogs.sentryone.com/aaronbertrand/backtobasics-dating-responsibly/
+[#BackToBasics : Common Table Expressions (CTEs)]:https://blogs.sentryone.com/aaronbertrand/backtobasics-ctes/
+[How to Establish Dedicated Admin Connection (DAC) to SQL Server]:https://www.codeproject.com/tips/1136361/how-to-establish-dedicated-admin-connection-dac-to
+[SQL and SQL only Best Practice]:http://strictlysql.blogspot.ru/search/label/Best%20Practices
+[There Is No Difference Between Table Variables, Temporary Tables, and Common Table Expressions]:https://dzone.com/articles/there-is-no-difference-between-table-variables-tem
+[Availability Group on SQL Server 2016]:http://www.madeiradata.com/availability-group-sql-server-2016/
+[Using SQL Server and R Services for analyzing DBA Tasks]:http://www.sqlservercentral.com/articles/R+Language/151405/
+[SQLskills SQL101: Dealing with SQL Server corruption]:https://www.sqlskills.com/blogs/paul/sqlskills-sql101-dealing-with-sql-server-corruption/
+[Advanced Analytics with R & SQL: Part I - R Distributions]:http://www.sqlservercentral.com/articles/Data+Science/146555/
+[T-SQL Tuesday #85 STOP! Restore Time!]:http://www.sqlhammer.com/t-sql-tuesday-85-stop-restore-time
+[Filtered Indexes: Rowstore vs Nonclustered Columnstore]:https://www.littlekendra.com/2016/11/10/filtered-indexes-rowstore-vs-nonclustered-columnstore/
+[ALTER SCHEMA TRANSFER for Zero Downtime Database Upgrades]:http://www.davewentzel.com/content/alter-schema-transfer-zero-downtime-database-upgrades
+[Delayed Durability in SQL Server 2014]:https://sqlperformance.com/2014/04/io-subsystem/delayed-durability-in-sql-server-2014
+[Daylight Savings end affects not only you, but your SQL Server too]:http://www.sqldoubleg.com/2015/10/28/daylight-savings-end-affects-not-only-you-but-your-sql-server-too/
+[Searching Strings in SQL Server is Expensive]:https://www.brentozar.com/archive/2016/10/searching-strings-sql-server-expensive/
+[Let’s Corrupt a SQL Server Database Together, Part 1: Clustered Indexes]:https://www.brentozar.com/archive/2017/02/lets-corrupt-sql-server-database-together/
+[Let’s Corrupt a Database Together, Part 2: Nonclustered Indexes]:https://www.brentozar.com/archive/2017/02/lets-corrupt-database-together-part-2-nonclustered-indexes/
+[The Guide SQL Server Installation Checklist (settings that increase SQL Server Performance)]:https://red9.com/blog/sql-server-installation-checklist/
+[SQL Browser, what is it good for? Absolutely something!]:http://www.cjsommer.com/2017-03-01-sql-browser-what-is-it-good-for-absolutely-something/
+[PowerShell Getting More From Generic Error Messages]:https://nocolumnname.wordpress.com/2017/03/02/powershell-getting-more-from-generic-error-messages/
+[SQL VNext sp_configure on Windows and Linux with dbatools]:https://sqldbawithabeard.com/2017/02/27/sql-vnext-sp_configure-on-windows-and-linux-with-dbatools/
+[Adding a T-SQL Job Step to a SQL Agent Job with PowerShell]:https://sqldbawithabeard.com/2017/02/20/adding-a-t-sql-job-step-to-a-sql-agent-job-with-powershell/
+[Setting up Database Mail to use my Gmail account]:https://mathaywardhill.com/2017/03/01/setting-up-database-mail-to-use-my-gmail-account/
+[Using DBCC CLONEDATABASE and Query Store for Testing]:https://sqlperformance.com/2017/02/sql-performance/clonedatabase-query-store-testing
+[Getting Started with Natural Earth — A SQL Server Shapefile Alternative (Geospatial Resource)]:http://blog.jpries.com/2017/02/17/getting-started-with-natural-earth-sql-server/
+[SQL Server Temporal Tables: How-To Recipes]:https://www.simple-talk.com/sql/sql-training/sql-server-temporal-tables-recipes/
+[The Migration Checklist]:http://www.sqlservercentral.com/articles/Editorial/154033/
+[Upgrading to SQL Server 2014: A Dozen Things to Check]:https://thomaslarock.com/2014/06/upgrading-to-sql-server-2014-a-dozen-things-to-check/
+[Number of Rows Read / Actual Rows Read warnings in Plan Explorer]:https://sqlperformance.com/2016/06/sql-indexes/actual-rows-read-warnings-plan-explorer
+[Introducing the Set-based Loop]:http://www.sqlservercentral.com/articles/set-based+loop/127670/
+[Representing Hierarchical Data for Mere Mortals]:https://www.simple-talk.com/sql/database-administration/representing-hierarchical-data-for-mere-mortals/
+[KPIs For DBAs to Show Their CIOs]:https://thomaslarock.com/2017/03/kpis-dbas-show-cios/
+[How To Forecast Database Disk Capacity If You Don’t Have A Monitoring Tool]:http://www.edwinmsarmiento.com/how-to-forecast-database-disk-capacity-if-you-dont-have-a-monitoring-tool/
+[Statistical Sampling for Verifying Database Backups]:https://www.simple-talk.com/sql/database-administration/statistical-sampling-for-verifying-database-backups/
+[Using dbatools for automated restore and CHECKDB]:http://www.centinosystems.com/blog/sql/using-dbatools-for-automated-restore-and-checkdb/
+[Bad Habits Revival]:https://blogs.sentryone.com/aaronbertrand/bad-habits-revival/
+[Deploying Multiple SSIS Projects via PowerShell]:https://www.simple-talk.com/sql/ssis/deploying-multiple-ssis-projects-via-powershell/
+[Determining the Cost Threshold for Parallelism]:http://www.scarydba.com/2017/02/28/determining-the-cost-threshold-for-parallelism/
+[Identifying a row’s physical location]:http://blog.waynesheffield.com/wayne/archive/2017/03/identifying-rows-physical-location/
+[Split a file group into multiple data files]:https://blogs.msdn.microsoft.com/sql_pfe_blog/2017/03/03/split-a-file-group-into-multiple-data-files/
+[Why PFS pages cannot be repaired]:https://www.sqlskills.com/blogs/paul/why-pfs-pages-cannot-be-repaired/
+[ERRORLOG records max out at 2049 characters]:https://www.codykonior.com/2017/03/02/errorlog-records-max-out-at-2047-characters/
+[How to Build a SQL Server Disaster Recovery Plan with Google Compute Engine]:https://www.brentozar.com/archive/2017/03/new-white-paper-build-sql-server-disaster-recovery-plan-google-compute-engine/
+[SQL Server Performance Tuning in Google Compute Engine]:https://www.brentozar.com/archive/2017/03/new-white-paper-sql-server-performance-tuning-google-compute-engine/
+[Configuring R on SQL Server 2016]:http://sqlmag.com/sql-server/configuring-r-sql-server-2016
+[Knee-Jerk PerfMon Counters: Page Life Expectancy]:https://sqlperformance.com/2014/10/sql-performance/knee-jerk-page-life-expectancy
+[Change Management Template for SQL Server DBAs and Developers]:https://www.littlekendra.com/2016/04/12/change-management-template-for-sql-server-dbas-and-deveopers/
+[Performance Myths: Clustered vs. Non-Clustered Indexes]:https://sqlperformance.com/2017/03/sql-indexes/performance-myths-clustered-vs-non-clustered
+[Bad habits: Counting rows the hard way]:https://sqlperformance.com/2014/10/t-sql-queries/bad-habits-count-the-hard-way
+[Why Cost Threshold For Parallelism Shouldn’t Be Set To 5]:https://www.brentozar.com/archive/2017/03/why-cost-threshold-for-parallelism-shouldnt-be-set-to-5/
+[Join Performance, Implicit Conversions, and Residuals]:http://sqlblog.com/blogs/paul_white/archive/2011/07/19/join-performance-implicit-conversions-and-residuals.aspx
+[Implicit Conversions that cause Index Scans]:https://www.sqlskills.com/blogs/jonathan/implicit-conversions-that-cause-index-scans/
+[When Is It Appropriate To Store JSON in SQL Server?]:https://blog.bertwagner.com/when-is-it-appropriate-to-store-json-in-sql-server-8ed1eed1520d#.s7ntvsyd0?utm_source=DBW&utm_medium=pubemail
+[The Performance Penalty of Bookmark Lookups in SQL Server]:http://www.sqlpassion.at/archive/2017/03/13/the-performance-penalty-of-bookmark-lookups-in-sql-server/
+[Why You Should Change the Cost Threshold for Parallelism]:http://www.scarydba.com/2017/03/13/change-the-cost-threshold-for-parallelism/
+[Why Update Statistics can cause an IO storm]:https://www.brentozar.com/archive/2014/01/update-statistics-the-secret-io-explosion/
+[SQLskills SQL101 Temporary table misuse]:https://www.sqlskills.com/blogs/paul/sqlskills-sql101-temporary-table-misuse/
+[SQL Server sp_execute_external_script Stored Procedure Examples]:https://www.mssqltips.com/sqlservertip/4747/sql-server-spexecuteexternalscript-stored-procedure-examples/
+[Transparent Data Encryption and Replication]:http://port1433.com/2017/03/15/transparent-data-encryption-and-replication-sql-servers-rear-window/
+[SQL Server Installation Checklist]:https://www.sqlskills.com/blogs/jonathan/sql-server-installation-checklist/
+[Indexed Views And Data Modifications]:https://www.brentozar.com/archive/2017/03/indexed-views-data-modifications/
+[Deployment Automation for SQL Server Integration Services (SSIS)]:https://www.simple-talk.com/sql/ssis/deployment-automation-for-sql-server-integration-services-ssis/
+[Why Developers Should Consider Microsoft SQL Server]:https://www.brentozar.com/archive/2017/03/developers-consider-microsoft-sql-server/
+[SQLskills SQL101: Indexes on Foreign Keys]:https://www.sqlskills.com/blogs/kimberly/sqlskills-sql101-indexes-foreign-keys/
+[SQLskills SQL101: Updating SQL Server Statistics Part I – Automatic Updates]:https://www.sqlskills.com/blogs/erin/sqlskills-sql101-updating-sql-server-statistics-part-i-automatic-updates/
+[Processing Loops in SQL Server]:https://www.codeproject.com/Articles/1177788/Processing-Loops-in-SQL-Server
+[The Mysterious Case of the Missing Default Value]:http://www.sqlservercentral.com/articles/SQL+Server+internal+storage/132990/
+[Plan Caching]:https://www.sqlpassion.at/archive/2017/03/20/plan-caching/
+[sp_executesql Is Not Faster Than an Ad Hoc Query]:http://www.sqlservercentral.com/blogs/scarydba/2016/11/07/sp_executesql-is-not-faster-than-an-ad-hoc-query/
+[Backing up SQL Server on Linux using Ola Hallengrens Maintenance Solution]:https://sqldbawithabeard.com/2017/03/22/backing-up-sql-server-on-linux-using-ola-hallengrens-maintenance-solution/
+[Delayed Durability in SQL Server 2014 Paul Randal]:http://www.sqlskills.com/blogs/paul/delayed-durability-sql-server-2014/
+[Why Is This Query Sometimes Fast and Sometimes Slow]:https://www.brentozar.com/archive/2016/11/query-sometimes-fast-sometimes-slow/
+[Using Plan Guides to Remove OPTIMIZE FOR UNKNOWN Hints]:https://www.brentozar.com/archive/2016/11/using-plan-guides-remove-optimize-unknown-hints/
+[ETL Best Practices]:https://www.timmitchell.net/etl-best-practices/
+[Resolving Key Lookup Deadlocks with Plan Explorer]:https://blogs.sentryone.com/greggonzalez/key-lookup-deadlocks-plan-explorer/
+[Why ROWLOCK Hints Can Make Queries Slower and Blocking Worse in SQL Server]:https://www.littlekendra.com/2016/02/04/why-rowlock-hints-can-make-queries-slower-and-blocking-worse-in-sql-server/
+[Does a Clustered Index really physically store the rows in key order]:http://www.sqlservercentral.com/blogs/discussionofsqlserver/2012/10/21/does-a-clustered-index-really-physically-store-the-rows-in-key-order/
+[Ugly Pragmatism For The Win]:http://michaeljswart.com/2016/02/ugly-pragmatism-for-the-win/
+[Architecting Microsoft SQL Server on VMware vSphere]:http://www.vmware.com/content/dam/digitalmarketing/vmware/en/pdf/solutions/sql-server-on-vmware-best-practices-guide.pdf
+[Hiding tables in SSMS Object Explorer]:https://sqlstudies.com/2017/04/03/hiding-tables-in-ssms-object-explorer-using-extended-properties/
+[Clustered columnstore: on-disk vs. in-mem]:http://nedotter.com/archive/2017/03/clustered-columnstore-on-disk-vs-in-mem/
+[Generating Plots Automatically From PowerShell and SQL Server Using Gnuplot]:https://www.simple-talk.com/sql/database-delivery/generating-plots-automatically-powershell-sql-server-using-gnuplot/
+[How to Benchmark Alternative SQL Queries to Find the Fastest Query]:https://blog.jooq.org/2017/03/29/how-to-benchmark-alternative-sql-queries-to-find-the-fastest-query/
+[Checking for Strange Client Settings with sys.dm_exec_sessions]:https://www.brentozar.com/archive/2017/03/checking-strange-client-settings-sys-dm_exec_sessions/
+[Decrypting Insert Query Plans]:https://www.brentozar.com/archive/2017/03/decrypting-insert-query-plans/
+[SQLskills SQL101: Partitioning]:https://www.sqlskills.com/blogs/kimberly/sqlskills-sql101-partitioning/
+[SQLskills SQL101: Switching recovery models]:https://www.sqlskills.com/blogs/paul/sqlskills-sql101-switching-recovery-models/
+[Using AT TIME ZONE to fix an old report]:https://sqlperformance.com/2017/02/t-sql-queries/using-at-time-zone-to-fix-an-old-report
+[What the heck is a DTU]:https://sqlperformance.com/2017/03/azure/what-the-heck-is-a-dtu
+[Hack-Attaching a SQL Server database with NORECOVERY]:http://sqlblog.com/blogs/argenis_fernandez/archive/2017/01/24/hack-attaching-a-sql-server-database-with-norecovery.aspx
+[Switch in Staging Tables Instead of sp_rename]:https://www.littlekendra.com/2017/01/19/why-you-should-switch-in-staging-tables-instead-of-renaming/
+[Performance Myths: Table variables are always in-memory]:https://sqlperformance.com/2017/04/performance-myths/table-variables-in-memory
+[Questions About SQL Server Collations You Were Too Shy to Ask]:https://www.simple-talk.com/sql/sql-development/questions-sql-server-collations-shy-ask/
+[NULL - The database's black hole]:http://sqlblog.com/blogs/hugo_kornelis/archive/2007/07/06/null-ndash-the-database-rsquo-s-black-hole.aspx
+[Inside the Storage Engine: Using DBCC PAGE and DBCC IND to find out if page splits ever roll back]:http://www.sqlskills.com/blogs/paul/inside-the-storage-engine-using-dbcc-page-and-dbcc-ind-to-find-out-if-page-splits-ever-roll-back/
+[Inside the Storage Engine: Anatomy of a page]:http://www.sqlskills.com/blogs/paul/inside-the-storage-engine-anatomy-of-a-page/
+[For The Better Developer: SQL Server Indexes]:http://sqlblog.com/blogs/davide_mauri/archive/2017/04/02/for-the-better-developer-sql-server-indexes.aspx
+[#EntryLevel: Compression & Data Types]:https://blogs.sentryone.com/melissaconnors/entry-level-compression/
+[Cardinality Estimation for a Predicate on a COUNT Expression]:https://sqlperformance.com/2017/04/sql-optimizer/cardinality-count
+[Changing SQL Server Collation After Installation]:https://www.mssqltips.com/sqlservertip/3519/changing-sql-server-collation-after-installation/
+[Does a TempDB spill mean statistics are out of date?]:https://www.brentozar.com/archive/2017/04/tempdb-spill-mean-statistics-date/
+[Transaction log growth during BACKUP]:https://www.am2.co/2017/04/transaction-log-growth-backup/
+[When is a SQL function not a function?]:http://sqlblog.com/blogs/rob_farley/archive/2011/11/08/when-is-a-sql-function-not-a-function.aspx
+[Introducing Batch Mode Adaptive Joins]:https://blogs.msdn.microsoft.com/sqlserverstorageengine/2017/04/19/introducing-batch-mode-adaptive-joins/
+[Investigating the proportional fill algorithm]:https://www.sqlskills.com/blogs/paul/investigating-the-proportional-fill-algorithm/
+[Understanding Logging and Recovery in SQL Server]:https://technet.microsoft.com/en-us/library/2009.02.logging.aspx
+[Bad Habits to Kick: Using shorthand with date/time operations]:http://sqlblog.com/blogs/aaron_bertrand/archive/2011/09/20/bad-habits-to-kick-using-shorthand-with-date-time-operations.aspx
+[Generating Charts and Drawings in SQL Server Management Studio]:http://sqlmag.com/t-sql/generating-charts-and-drawings-sql-server-management-studio
+[How expensive are column-side Implicit Conversions?]:https://sqlperformance.com/2013/04/t-sql-queries/implicit-conversion-costs
+[Execution Plan Basics]:https://www.simple-talk.com/sql/performance/execution-plan-basics/
+[Disabling ROW and PAGE Level Locks in SQL Server]:http://www.sqlpassion.at/archive/2016/10/31/disabling-row-and-page-level-locks-in-sql-server/
+[Fixing Cardinality Estimation Errors with Filtered Statistics]:https://www.sqlpassion.at/archive/2013/10/29/fixing-cardinality-estimation-errors-with-filtered-statistics/
+[Cardinality Estimation for Multiple Predicates]:https://sqlperformance.com/2014/01/sql-plan/cardinality-estimation-for-multiple-predicates
+[Weaning yourself off of SQL Profiler (Part 1)]:http://blog.waynesheffield.com/wayne/archive/2017/04/weaning-yourself-off-sql-profiler/
+[Properly Persisted Computed Columns]:https://sqlperformance.com/2017/05/sql-plan/properly-persisted-computed-columns
+[A SQL Server DBA myth a day: (17/30) page checksums]:https://www.sqlskills.com/blogs/paul/a-sql-server-dba-myth-a-day-1730-page-checksums/
+[What are different ways to replace ISNULL() in a WHERE clause that uses only literal values?]:https://dba.stackexchange.com/questions/168276/what-are-different-ways-to-replace-isnull-in-a-where-clause-that-uses-only-lit
+[Weaning yourself off of SQL Profiler (Part 1)]:http://blog.waynesheffield.com/wayne/archive/2017/04/weaning-yourself-off-sql-profiler/
+[SQL Server 2016 enhancements – Truncate Table and Table Partitioning]:https://www.sqlshack.com/sql-server-2016-enhancements-truncate-table-table-partitioning
+[SQL Server Mysteries: The Case of the Not 100% RESTORE…]:https://blogs.msdn.microsoft.com/sql_server_team/sql-server-mysteries-the-case-of-the-not-100-restore/
+[Transactional Replication and Stored Procedure Execution: Silver Bullet or Poison Pill?]:http://port1433.com/2017/04/11/transactional-replication-and-stored-procedure-execution-silver-bullet-or-poison-pill/
+[STOPAT And Date Formats]:https://itsalljustelectrons.blogspot.ru/2017/07/STOPAT-And-Date-Formats.html
+[Row-count Estimates when there are no Statistics]:http://www.sqlservercentral.com/blogs/matthew-mcgiffen-dba/2017/06/28/row-count-estimates-when-there-are-no-statistics/
+[SQL Server DBA On-Boarding Checklist]:https://www.mssqltips.com/sqlservertip/4871/sql-server-dba-onboarding-checklist/
+[Be Wary of Date Formatting in T-SQL]:https://bornsql.ca/2017/07/wary-date-formatting-t-sql/
+[The ultimate guide to the datetime datatypes]:http://www.karaszi.com/SQLServer/info_datetime.asp
+[Statistics and Cardinality Estimation]:http://www.sqlservercentral.com/blogs/matthew-mcgiffen-dba/2017/06/20/statistics-and-cardinality-estimation/
+[Message queues for the DBA: sending data out into the world]:http://port1433.com/2017/07/21/messaging-queuing-for-the-dba-sending-data-out-into-the-world/
+[Schema-Based Access Control for SQL Server Databases]:https://www.red-gate.com/simple-talk/sql/sql-training/schema-based-access-control-for-sql-server-databases/
+[SQL Server: large RAM and DB Checkpointing]:https://blogs.msdn.microsoft.com/psssql/2017/06/29/sql-server-large-ram-and-db-checkpointing/
+[Handling SQL Server Deadlocks With Event Notifications]:https://itsalljustelectrons.blogspot.ru/2017/06/Handling-SQL-Server-Deadlocks-With-Event-Notifications.html
+[SQL Server R Services: Digging into the R Language]:https://www.red-gate.com/simple-talk/sql/bi/sql-server-r-services-digging-r-language/
+[Investigating the Cause of SQL Server High CPU Load Conditions When They Happen]:https://www.red-gate.com/simple-talk/sql/database-administration/investigating-cause-sql-server-high-cpu-load-conditions-happen/
+[In-Memory Engine DURABILITY = SCHEMA_ONLY And Transaction Rollback]:https://chrisadkin.io/2017/07/17/in-memory-engine-durability-schema_only-and-transaction-rollback/
+[Builder Day: Doing a Point-in-Time Restore in Azure SQL DB]:https://www.brentozar.com/archive/2017/06/builder-day-point-time-restore-azure-sql-db/
+[Creating Continuous Integration Build Pipelines With Jenkins, Docker and SQL Server]:https://chrisadkin.io/2017/07/18/creating-continuous-integration-build-pipelines-with-jenkins-docker-and-sql-server/
+[Scale-able Windows Aggregate Functions With Row Store Object]:https://chrisadkin.io/2017/07/24/scale-able-windows-aggregate-functions-with-row-store-objects/
+[Azure DWH part 11: Data Warehouse Migration Utility]:http://www.sqlservercentral.com/articles/Azure+SQL+Data+Warehouse+(ASDW)/158311/
+[Representing a simple hierarchical list in SQL Server with JSON, YAML, XML and HTML]:https://www.red-gate.com/simple-talk/blogs/71858/
+[Advanced Analytics with R and SQL Part II - Data Science Scenarios]:http://www.sqlservercentral.com/articles/Data+Science/158498/
+[Think twice before using table variables]:http://www.sqlservercentral.com/blogs/matthew-mcgiffen-dba/2017/07/11/think-twice-before-using-table-variables/
+[ColumnStore Indexes And Recursive CTEs]:https://www.brentozar.com/archive/2017/07/columnstore-indexes-recursive-ctes/
+[CCIs and String Aggregation]:https://orderbyselectnull.com/2017/07/03/ccis-and-string-aggregation/
+[Brad’s Sure DBA Checklist]:https://www.red-gate.com/simple-talk/sql/database-administration/brads-sure-dba-checklist/
+[Query Store and Parameterization Problems]:https://www.red-gate.com/simple-talk/sql/database-administration/query-store-parameterization-problems/
+[SQL Server Event Handling: Event Notifications]:https://itsalljustelectrons.blogspot.ru/2016/11/SQL-Server-Event-Handling-Event-Notifications.html
+[Identifying Deprecated Feature Usage (Part 1)]:https://itsalljustelectrons.blogspot.ru/2017/07/Identifying-Deprecated-Feature-Usage-pt1.html
+[Let’s Corrupt a Database Together, Part 3: Detecting Corruption]:https://www.brentozar.com/archive/2017/07/lets-corrupt-database-together-part-3-detecting-corruption/
+[XML vs JSON Shootout: Which is Superior in SQL Server 2016?]:https://blog.bertwagner.com/xml-vs-json-shootout-which-is-superior-in-sql-server-2016-b97bf7766ef2
+[One SQL Cheat Code For Amazingly Fast JSON Queries]:https://blog.bertwagner.com/one-sql-cheat-code-for-amazingly-fast-json-queries-1c2402b4b0d2
+[The Ultimate SQL Server JSON Cheat Sheet]:https://blog.bertwagner.com/the-ultimate-sql-server-json-cheat-sheet-2fbb98049a37
+[Are your indexes being thwarted by mismatched datatypes?]:https://blog.bertwagner.com/are-your-indexes-being-thwarted-by-mismatched-datatypes-d3985375e528
+[Why Missing Index Recommendations Aren’t Perfect]:https://www.brentozar.com/archive/2017/08/missing-index-recommendations-arent-perfect/
+[Top 5 Misleading SQL Server Performance Counters]:https://sqlworkbooks.com/2017/06/top-5-misleading-sql-server-performance-counters/
+[The Case of the Space at the End]:http://www.sqlservercentral.com/articles/ANSI_PADDING/157467/
+[SELECT…INTO in SQL Server 2017]:https://dbafromthecold.com/2017/08/02/select-into-in-sql-server-2017/
+[Your Service Level Agreement is a Disaster]:http://minionware.net/service-level-agreement-disaster/
+[SQLskills SQL101: REBUILD vs. REORGANIZE]:https://www.sqlskills.com/blogs/paul/sqlskills-sql101-rebuild-vs-reorganize/
+[Where do the Books Online index fragmentation thresholds come from?]:https://www.sqlskills.com/blogs/paul/where-do-the-books-online-index-fragmentation-thresholds-come-from/
+[The SQL Hall of Shame]:http://sqlblog.com/blogs/adam_machanic/archive/2017/06/14/the-sql-hall-of-shame.aspx
+[A Better Way To Select Star]:https://www.brentozar.com/archive/2017/07/better-way-select-star/
+[UDP vs TCP]:https://sqlstudies.com/2017/06/07/udp-vs-tcp/
+[When a Nonclustered Index and Statistics Make a Query Slower]:https://sqlworkbooks.com/2017/05/when-a-nonclustered-index-and-statistics-make-a-query-slower/
+[Lipoaspiration in your SQL Server Database]:https://www.red-gate.com/simple-talk/sql/performance/lipoaspiration-in-your-sql-server-database/
+[13 Things You Should Know About Statistics and the Query Optimizer]:https://www.red-gate.com/simple-talk/sql/t-sql-programming/13-things-you-should-know-about-statistics-and-the-query-optimizer/
+[Creating R Stored Procedures in SQL Server 2016 Using sqlrutils]:http://www.nielsberglund.com/2017/06/25/creating-r-stored-procedures-in-sql-server-2016-using-sqlrutils/
+[A Quick start Guide to Managing SQL Server 2017 on CentOS/RHEL Using the SSH Protocol]:https://www.sqlshack.com/quick-start-guide-managing-sql-server-2017-centosrhel-using-ssh-protocol/
+[SQL Server v.Next : STRING_AGG Performance, Part 2]:https://sqlperformance.com/2017/01/sql-performance/sql-server-v-next-string_agg-performance-part-2
+[Why Parameter Sniffing Is Making Your Queries Receive Sub-Optimal Execution Plans]:https://blog.bertwagner.com/why-parameter-sniffing-isnt-always-a-bad-thing-but-usually-is-ba6a62a97b68
+[Persisting statistics sampling rate]:https://blogs.msdn.microsoft.com/sql_server_team/persisting-statistics-sampling-rate/
+[All about locking in SQL Server]:https://www.sqlshack.com/locking-sql-server/
+[All about Latches in SQL Server]:https://www.sqlshack.com/all-about-latches-in-sql-server/
+[All about SQL Server spinlocks]:https://www.sqlshack.com/sql-server-spinlocks/
+[How to monitor object space growth in SQL Server]:https://www.sqlshack.com/monitor-object-space-growth-sql-server/
+[How to Read a Transaction Log Backup]:http://www.databasejournal.com/features/mssql/how-to-read-a-transaction-log-backup.html
+[How to Find Out Which Database Object Got Deleted]:http://www.databasejournal.com/tips/how-to-find-out-which-database-object-got-deleted.html
+[In-Memory OLTP Enhancements in SQL Server 2016]:https://www.sqlshack.com/memory-oltp-enhancements-sql-server-2016/
+[Sync SQL Logins and Jobs]:https://blogs.msdn.microsoft.com/sql_pfe_blog/2017/08/21/sync-sql-logins-and-jobs/
+[The Trillion Row Table]:https://orderbyselectnull.com/2017/08/16/the-trillion-row-table/
+[Dynamic Data Unmasking]:https://orderbyselectnull.com/2017/08/25/dynamic-data-unmasking/
+[Why is My Database Application so Slow?]:https://www.red-gate.com/simple-talk/dotnet/net-performance/database-application-slow/
+[Generating Concurrent Activity]:http://michaeljswart.com/2014/01/generating-concurrent-activity/
+[Required Testing for Installing SQL Server Cumulative Updates and Service Packs]:http://littlekendra.com/2016/04/28/required-testing-for-installing-sql-server-cumulative-updates-and-service-packs/
+[Microsoft SQL Server R Services - Internals X]:http://www.nielsberglund.com/2017/08/29/microsoft-sql-server-r-services-internals-x/
+[Clustered columnstore: on-disk vs. in-mem]:http://nedotter.com/archive/2017/03/clustered-columnstore-on-disk-vs-in-mem/
+[Hands on Full-Text Search in SQL Server]:https://www.sqlshack.com/hands-full-text-search-sql-server/
+[SQL Code Smells]:https://www.red-gate.com/simple-talk/sql/t-sql-programming/sql-code-smells/
+[Corruption demo databases and scripts]:https://www.sqlskills.com/blogs/paul/corruption-demo-databases-and-scripts/
+[Understanding Cross-Database Transactions in SQL Server]:https://www.red-gate.com/simple-talk/sql/database-administration/understanding-cross-database-transactions-in-sql-server/
+[Optional Parameters and Missing Index Requests]:https://www.brentozar.com/archive/2017/09/optional-parameters-missing-index-requests/
+[Uniquifier is a rather unique word isn’t it?]:https://sqlstudies.com/2017/09/18/uniquifier-is-a-rather-unique-word-isnt-it/
+[Importance of proper transaction log size management]:https://www.sqlskills.com/blogs/paul/importance-of-proper-transaction-log-size-management/
+[#TSQL2sDay – Starting Out with PowerShell]:https://sqldbawithabeard.com/2017/09/12/tsql2sday-starting-out-with-powershell/
+[Using native compilation to insert parent/child tables]:http://nedotter.com/archive/2017/09/using-native-compilation-to-insert-parentchild-tables/
+[Questions About RDS SQL Server You Were Too Shy to Ask]:https://www.red-gate.com/simple-talk/cloud/cloud-data/questions-rds-sql-server-shy-ask/
+[Active Directory Authentication with SQL Server on Ubuntu]:http://port1433.com/2017/09/19/active-directory-authentication-with-sql-server-on-ubuntu/
+[Temporary Tables in Stored Procedures]:http://sqlblog.com/blogs/paul_white/archive/2012/08/15/temporary-tables-in-stored-procedures.aspx
+[SQLCLR in Practice: Creating a Better Way of Sending Email from SQL Server]:https://www.red-gate.com/simple-talk/sql/sql-development/sqlclr-practice-creating-better-way-sending-email-sql-server/
+[T-SQL commands performance comparison – NOT IN vs NOT EXISTS vs LEFT JOIN vs EXCEPT]:https://www.sqlshack.com/t-sql-commands-performance-comparison-not-vs-not-exists-vs-left-join-vs-except/
+[Clustered vs Nonclustered: Index Fundamentals You Need To Know]:https://bertwagner.com/2017/09/26/clustered-vs-nonclustered-index-fundamentals-you-need-to-know/
+[How to Write Efficient TOP N Queries in SQL]:https://blog.jooq.org/2017/09/22/how-to-write-efficient-top-n-queries-in-sql/
+[Checklist: DR Plan Sanity Check]:http://sqlsoldier.net/wp/sqlserver/checklistdrplansanitycheck
+[Table level recovery for selected SQL Server tables]:https://www.mssqltips.com/sqlservertip/2814/table-level-recovery-for-selected-sql-server-tables/
+[SQL Mirroring, Preserving the Log Chain During Database Migrations]:https://sqlundercover.com/2017/01/21/sql-mirroring-preserving-the-log-chain-during-database-migrations/
+[How NOLOCK Will Block Your Queries]:https://bertwagner.com/2017/10/10/how-nolock-will-block-your-queries/
+[8 Ways to Export SQL Results To a Text File]:http://www.sqlservercentral.com/articles/Export/147145/
+[SQL Server Installation Failed Due to Pending Restart of Server?]:https://thelonedba.wordpress.com/2017/09/18/sql-server-installation-failed-due-to-pending-restart-of-server/
+[Six Scary SQL Surprises]:https://www.red-gate.com/simple-talk/sql/database-administration/six-scary-sql-surprises/
+[How the rowversion datatype works when adding and deleting columns]:http://sqlblog.com/blogs/louis_davidson/archive/2017/09/26/how-the-rowversion-datatype-works-when-adding-and-deleting-columns.aspx
+[Quick! What's the difference between RANK, DENSE_RANK, and ROW_NUMBER?]:http://douglaskline.blogspot.ru/2017/10/quick-whats-difference-between-rank.html
+[A Serial Parallel Query]:https://orderbyselectnull.com/2017/09/26/a-serial-parallel-query/
+[Add or Remove IDENTITY Property From an Existing Column Efficiently]:http://www.dbdelta.com/add-or-remove-identity-property-from-an-existing-column-efficiently/
+[How Do I Analyze a SQL Server Execution Plan?]:https://littlekendra.com/2017/09/22/how-do-i-analyze-a-sql-server-execution-plan/
+[A Subtle Difference Between COALESCE and ISNULL]:https://nocolumnname.wordpress.com/2017/10/09/a-subtle-difference-between-coalesce-and-isnull/
+[Puzzle Challenge: Graph Matching with T-SQL Part 1-Concepts]:http://sqlmag.com/software-development/puzzle-challenge-graph-matching-t-sql-part-1-concepts
+[Graph Matching with T-SQL Part 3: Maximum Matching]:http://www.itprotoday.com/microsoft-sql-server/graph-matching-t-sql-part-3-maximum-matching
+[Running PowerShell in a SQL Agent Job]:https://www.sqlhammer.com/running-powershell-in-a-sql-agent-job/
+[Line-Continuation in T-SQL]:https://sqlquantumleap.com/2017/10/27/line-continuation-in-t-sql/
+[SQL Server 2017: Making Backups Great Again!]:https://johnsterrett.com/2017/10/31/sql-server-2017-backups/
+[Say NO to Venn Diagrams When Explaining JOINs]:https://blog.jooq.org/2016/07/05/say-no-to-venn-diagrams-when-explaining-joins/
+[Surprise Delta Stores]:https://orderbyselectnull.com/2017/11/07/delta-stores/
+[SQL 2014 Clustered Columnstore index rebuild and maintenance considerations]:https://blogs.msdn.microsoft.com/sqlcat/2015/07/08/sql-2014-clustered-columnstore-index-rebuild-and-maintenance-considerations/
+[The Case of the Weirdly Long COLUMNSTORE_BUILD_THROTTLE Wait]:https://sqlworkbooks.com/2017/11/the-case-of-the-weirdly-long-columnstore_build_throttle-wait/
+[Multiple Output Datasets With R and SQL Server]:https://itsalljustelectrons.blogspot.ru/2017/11/Multiple-Output-Datasets-with-R-and-SQL-Server.html
+[How to Avoid Excessive Sorts in Window Functions]:https://blog.jooq.org/2017/11/06/how-to-avoid-excessive-sorts-in-window-functions/
+[Extracting a DAX Query Plan With Analysis Services 2016 Extended Events]:https://www.mssqltips.com/sqlservertip/5106/extracting-a-dax-query-plan-with-analysis-services-2016-extended-events/
+[What impact can different cursor options have?]:https://sqlperformance.com/2012/09/t-sql-queries/cursor-options
+[SQL Smackdown!!! Cursors VS Loops]:https://sqlundercover.com/2017/11/16/sql-smackdown-cursors-vs-loops/
+[Using the OPTION (RECOMPILE) option for a statement]:https://www.sqlskills.com/blogs/kimberly/using-the-option-recompile-option-for-a-statement/
+[Execution Plan Caching and Reuse]:https://msdn.microsoft.com/en-us/library/ms181055.aspx
+[Buffer Management]:https://msdn.microsoft.com/en-us/library/aa337525.aspx
+[RECOMPILE Hints and Execution Plan Caching]:https://www.brentozar.com/archive/2013/12/recompile-hints-and-execution-plan-caching/
+[Improving query performance with OPTION (RECOMPILE), Constant Folding and avoiding Parameter Sniffing issues]:https://blogs.msdn.microsoft.com/robinlester/2016/08/10/improving-query-performance-with-option-recompile-constant-folding-and-avoiding-parameter-sniffing-issues/
+[Eight Different Ways to Clear the SQL Server Plan Cache]:https://www.sqlskills.com/blogs/glenn/eight-different-ways-to-clear-the-sql-server-plan-cache/
+[Introduction and FAQs about Microsoft Azure technologies]:https://www.sqlshack.com/introduction-faqs-microsoft-azure-technologies/
+[Inside the XEvent Profiler]:https://www.sqlhammer.com/inside-xevent-profiler/
+[Does The Join Order of My Tables Matter?]:https://blog.bertwagner.com/does-the-join-order-of-my-tables-matter-e091afb2e385
+[Encrypting SQL Server connections with Let’s Encrypt certificates]:https://sqlsunday.com/2017/11/22/encrypting-tds-with-letsencrypt/
+[Start SQL Server without tempdb]:https://sqlstudies.com/2016/01/20/start-sql-server-without-tempdb/
+[How to configure database mail in SQL Server]:https://www.sqlshack.com/configure-database-mail-sql-server/
+[Understanding SQL server memory grant]:https://blogs.msdn.microsoft.com/sqlqueryprocessing/2010/02/16/understanding-sql-server-memory-grant/
+[Cleanly Uninstalling Stubborn SQL Server Components]:https://www.mssqltips.com/sqlservertip/4050/cleanly-uninstalling-stubborn-sql-server-components/
+[Hey! What's the deal with SQL Server NOCOUNT and T-SQL WHILE loops?]:http://sql-sasquatch.blogspot.ru/2017/11/hey-whats-deal-with-nocount-and-t-sql.html
+[Query Store Settings]:https://www.sqlskills.com/blogs/erin/query-store-settings/
+[Using Plan Explorer with Entity Framework]:https://blogs.sentryone.com/jasonhall/using-plan-explorer-entity-framework/
+[Overview of Encryption Tools in SQL Server]:https://matthewmcgiffen.com/2017/12/05/overview-of-encryption-tools-in-sql-server/
+[Clustered Index Uniquifier Existence and Size]:https://sqlquantumleap.com/2017/09/18/clustered-index-uniquifier-existence-and-size/
+[Understanding Logging and Recovery in SQL Server]:https://technet.microsoft.com/en-us/library/2009.02.logging.aspx
+[Understanding SQL Server Backups]:https://technet.microsoft.com/en-us/library/2009.07.sqlbackup.aspx
+[Recovering from Disasters Using Backups]:https://technet.microsoft.com/en-us/library/ee677581.aspx
+[Simple SQL: Handling Location Datatypes]:https://www.red-gate.com/simple-talk/sql/t-sql-programming/simple-sql-handling-location-datatypes/
+[Improve SQL Server Performance by Looking at Plan Cache (Part 1)]:https://logicalread.com/sql-server-minimize-single-use-plans-tl01/
+[Improve SQL Server Performance by Looking at Plan Cache (Part 2)]:https://logicalread.com/sql-server-identifying-plans-that-need-tuning-tl01/
+[Improve SQL Server Performance by Looking at Plan Cache (Part 3)]:https://logicalread.com/sql-server-identify-similar-plans-tl01/
+[Take Care When Scripting Batches]:http://michaeljswart.com/2014/09/take-care-when-scripting-batches/
+[When Measuring Timespans, try DATEADD instead of DATEDIFF]:http://michaeljswart.com/2017/12/when-measuring-timespans-try-dateadd-instead-of-datediff/
+[Which user function do I use?]:https://sqlstudies.com/2015/06/24/which-user-function-do-i-use/
+[What’s So Bad About Shrinking Databases with DBCC SHRINKDATABASE?]:https://www.brentozar.com/archive/2017/12/whats-bad-shrinking-databases-dbcc-shrinkdatabase/
+[Which Collation is Used to Convert NVARCHAR to VARCHAR in a WHERE Condition? (Part A of 2: “Duck”)]:https://sqlquantumleap.com/2017/12/08/which-collation-is-used-to-convert-nvarchar-to-varchar-in-a-where-condition-part-a-of-2-duck/
+[Which Collation is Used to Convert NVARCHAR to VARCHAR in a WHERE Condition? (Part B of 2: “Rabbit”)]:https://sqlquantumleap.com/2017/12/11/which-collation-is-used-to-convert-nvarchar-to-varchar-in-a-where-condition-part-b-of-2-rabbit/#comments
+[Current State of the NewSQL/NoSQL Cloud Arena]:https://www.red-gate.com/simple-talk/cloud/cloud-data/current-state-newsqlnosql-cloud-arena/
+[SQL Server 2017: JSON]:http://db-devs.com/blog/archive/sql-server-2017-json/
+[Simulating Bad Networks to Test SQL Server Replication]:https://www.red-gate.com/simple-talk/blogs/simulating-bad-networks-test-sql-server-replication/
+[How to Turn on Instant File Initialization]:https://www.databasejournal.com/tips/how-to-turn-on-instant-file-initialization.html
+[Bad Idea Jeans: Finding Undocumented Trace Flags]:https://rebrand.ly/brent-finding-undocumented-trace-flags
+[A Method to Find Trace Flags]:https://rebrand.ly/joe-finding-undocumented-trace-flags
+[Using Windows stored credentials to connect to SQL in containers]:https://dbafromthecold.com/2018/01/17/using-windows-stored-credentials-to-connect-to-sql-in-containers/
+[Step by Step Guide to Migrate SQL Server Data to SQL Server 2017]:https://www.databasejournal.com/features/mssql/step-by-step-guide-to-migrate-sql-server-data-to-sql-server-2017.html
+[Nasty Fast PERCENT_RANK]:http://www.sqlservercentral.com/articles/PERCENT_RANK/141532/
+[Administrative Logins and Users]:https://sqlstudies.com/2015/11/02/administrative-logins-and-users/
+[Parallelism in Hekaton (In-Memory OLTP)]:http://www.nikoport.com/2018/01/20/parallelism-in-hekaton-in-memory-oltp/
+[Troubleshooting THREADPOOL Waits]:https://www.sqlpassion.at/archive/2011/10/25/troubleshooting-threadpool-waits/
+[Andy’s Excellent SSIS-in-the-Cloud Adventure, Part 1 – Build an ADFv2 IR Instance]:https://andyleonard.blog/2018/01/andys-excellent-ssis-in-the-cloud-adventure-part-1/
+[PRINT vs. RAISERROR]:http://sqlity.net/en/984/print-vs-raiserror/
+[Does a Clustered Index Give a Default Ordering?]:https://sqlworkbooks.com/2018/02/does-a-clustered-index-give-a-default-ordering/
+[Without ORDER BY, You Can’t Depend On the Order of Results]:http://michaeljswart.com/2013/09/without-order-by-you-cant-depend-on-the-order-of-results/
+[Query Store and “in memory”]:https://www.sqlskills.com/blogs/erin/query-store-and-in-memory/
+[Setting and Identifying Row Goals in Execution Plans]:https://sqlperformance.com/2018/02/sql-plan/setting-and-identifying-row-goals
+[Azure and Windows PowerShell: The Basics]:https://www.red-gate.com/simple-talk/sysadmin/powershell/azure-windows-powershell-basics/
+[Auditing Linked Servers]:https://thomaslarock.com/2018/02/auditing-linked-servers/
+[An alternative to data masking]:https://sqlsunday.com/2018/02/05/an-alternative-to-data-masking/
+[Safely and Easily Use High-Level Permissions Without Granting Them to Anyone: Server-level]:https://sqlquantumleap.com/2018/02/15/safely-and-easily-use-high-level-permissions-without-granting-them-to-anyone-server-level/
+[PLEASE, Please, please Stop Using Impersonation, TRUSTWORTHY, and Cross-DB Ownership Chaining]:https://sqlquantumleap.com/2017/12/30/please-please-please-stop-using-impersonation-execute-as/
+[Indexing and Partitioning]:https://dbafromthecold.com/2018/02/21/indexing-and-partitioning/
+[Schema Compare for SQL Server]:https://thomaslarock.com/2018/02/schema-compare-for-sql-server/
+[How to change SQL Server ERRORLOG location]:https://red9.com/sql-server-error-log-location/
+[What’s in a Name?: Inside the Wacky World of T-SQL Identifiers]:https://sqlquantumleap.com/2018/04/09/whats-in-a-name-inside-the-wacky-world-of-t-sql-identifiers/
+[The Uni-Code: The Search for the True List of Valid Characters for T-SQL Regular Identifiers, Part 1]:https://sqlquantumleap.com/2018/04/02/the-uni-code-the-search-for-the-true-list-of-valid-characters-for-t-sql-regular-identifiers-part-1/
+[The Uni-Code: The Search for the True List of Valid Characters for T-SQL Regular Identifiers, Part 2]:https://sqlquantumleap.com/2018/04/04/the-uni-code-the-search-for-the-true-list-of-valid-characters-for-t-sql-regular-identifiers-part-2/
+[Programming SQL Server with SQL Server Management Objects Framework]:https://www.red-gate.com/simple-talk/dotnet/c-programming/programming-sql-server-sql-server-management-objects-framework/
+[Interval Queries in SQL Server]:http://www.itprotoday.com/software-development/interval-queries-sql-server
+[Dealing with date and time instead of datetime]:https://sqlperformance.com/2018/03/sql-optimizer/dealing-with-date-and-time
+[Insight into the SQL Server buffer cache]:https://www.sqlshack.com/insight-into-the-sql-server-buffer-cache/
+[A concrete example of migration between an Oracle Database and SQL Server using Microsoft Data Migration Assistant]:https://www.sqlshack.com/a-concrete-example-of-migration-between-an-oracle-database-and-sql-server-using-microsoft-data-migration-assistant/
+[Audit SQL Server stop, start, restart]:https://blogs.msdn.microsoft.com/skeeler/2018/03/audit-sql-server-stop-start-restart/
+[Query tuning: Apply yourself]:https://sqltechblog.com/2018/04/06/query-tuning-apply-yourself/
+[How to identify and monitor unused indexes in SQL Server]:https://www.sqlshack.com/how-to-identify-and-monitor-unused-indexes-in-sql-server/
+[Benchmarking: 1-TB table population (part 1: the baseline)]:https://www.sqlskills.com/blogs/paul/benchmarking-1-tb-table-population-part-1-the-baseline/
+[Benchmarking: 1-TB table population (part 2: optimizing log block IO size and how log IO works)]:https://www.sqlskills.com/blogs/paul/benchmarking-1-tb-table-population-part-2-optimizing-log-block-io-size-and-how-log-io-works/
+[An overview of SQL Server database migration tools provided by Microsoft]:https://www.sqlshack.com/an-overview-of-sql-server-database-migration-tools-provided-by-microsoft/
+[Calling Http endpoints in T-SQL using CURL extension]:https://blogs.msdn.microsoft.com/sqlserverstorageengine/2018/04/17/calling-http-endpoints-in-t-sql-using-curl-extension/
+[Why Table Join Orders In Relational Databases]:https://hackernoon.com/why-table-join-orders-in-relational-databases-dont-matter-6de3a35f2959
+[Finding overlapping ranges of data]:https://www.red-gate.com/simple-talk/blogs/finding-overlapping-ranges-data/
+[Avoid use of the MONEY and SMALLMONEY datatypes]:https://www.red-gate.com/hub/product-learning/sql-prompt/avoid-use-money-smallmoney-datatypes
+[Provisioning SQL Server Instances with Docker]:https://www.red-gate.com/simple-talk/sysadmin/containerization/provisioning-sql-server-instances-docker/
+[Understanding the graphical representation of the SQL Server Deadlock Graph]:https://www.sqlshack.com/understanding-graphical-representation-sql-server-deadlock-graph/
+[Digitally Signing a Stored Procedure To Allow It To Run With Elevated Permissions]:https://sqlundercover.com/2018/05/02/digitally-signing-a-stored-procedure-to-allow-it-to-run-with-elevated-permissions/
+[NOLOCK and Top Optimization]:https://www.sqlshack.com/nolock-and-top-optimization/
+[Operator Precedence versus the Confusing Constraint Translation]:https://www.red-gate.com/simple-talk/blogs/operator-precedence-versus-confusing-constraint-translation/
+[Interval Queries in SQL Server]:http://www.itprotoday.com/software-development/interval-queries-sql-server
+[Query Trace Column Values]:https://www.sqlshack.com/query-trace-column-values/
+[Concurrency Week: How to Delete Just Some Rows from a Really Big Table]:https://www.brentozar.com/archive/2018/04/how-to-delete-just-some-rows-from-a-really-big-table/
+[Break large delete operations into chunks]:https://sqlperformance.com/2013/03/io-subsystem/chunk-deletes
+[How to perform a page level restore in SQL Server]:https://www.sqlshack.com/how-to-perform-a-page-level-restore-in-sql-server/
+[Grouping dates without blocking operators]:https://sqlsunday.com/2018/05/14/grouping-dates-without-blocking-operators/
+[What’s CHECKDB doing in my database restore?]:http://www.mikefal.net/2018/04/10/whats-checkdb-doing-in-my-database-restore/
+[How To Hide An Instance Of SQL Server]:https://thomaslarock.com/2018/04/how-to-hide-an-instance-of-sql-server/
+[Troubleshooting Parameter Sniffing Issues the Right Way: Part 1]:https://www.brentozar.com/archive/2018/03/troubleshooting-parameter-sniffing-issues-the-right-way-part-1/
+[Troubleshooting Parameter Sniffing Issues the Right Way: Part 2]:https://www.brentozar.com/archive/2018/03/troubleshooting-parameter-sniffing-issues-right-way-part-2/
+[Troubleshooting Parameter Sniffing Issues the Right Way: Part 3]:https://www.brentozar.com/archive/2018/03/troubleshooting-parameter-sniffing-issues-the-right-way-part-3/
+[When to use the SELECT…INTO statement]:https://www.red-gate.com/hub/product-learning/sql-prompt/use-selectinto-statement
+[Temp Tables In SSIS]:https://www.timmitchell.net/post/2018/05/29/temp-tables-in-ssis/
+[Changing the Collation of the Instance, the Databases, and All Columns in All User Databases]:https://sqlquantumleap.com/2018/06/11/changing-the-collation-of-the-instance-and-all-columns-across-all-user-databases-what-could-possibly-go-wrong/
+[10 Cool SQL Optimisations That do not Depend on the Cost Model]:https://blog.jooq.org/2017/09/28/10-cool-sql-optimisations-that-do-not-depend-on-the-cost-model/
+[Scheduling powershell tasks with sql agent]:https://dbatools.io/agent/
+[Three ways to track logins using dbatools]:https://dbatools.io/track-logins/
+[Impact of Fragmentation on Execution Plans]:https://sqlperformance.com/2017/12/sql-indexes/impact-fragmentation-plans
+[How to “debug” a Linked Server from SQL Server to an Oracle Database instance]:https://www.sqlshack.com/how-to-debug-a-linked-server-from-sql-server-to-an-oracle-database-instance/
+[How to implement error handling in SQL Server]:https://www.sqlshack.com/how-to-implement-error-handling-in-sql-server/
+[SQL Server Closure Tables]:https://www.red-gate.com/simple-talk/sql/t-sql-programming/sql-server-closure-tables/
+[Deadlock victim choice in SQL Server - an exception?]:http://joshthecoder.com/2018/05/10/deadlock-victim-choice-an-exception.html
+[Azure and Windows PowerShell: The Basics]:https://www.red-gate.com/simple-talk/sysadmin/powershell/azure-windows-powershell-basics/
+[Azure and Windows PowerShell: Getting Information]:https://www.red-gate.com/simple-talk/sysadmin/powershell/azure-and-windows-powershell-getting-information/
+[Be our guest, be our guest, put our database to the test]:https://sqlstudies.com/2018/06/25/be-our-guest-be-our-guest-put-our-database-to-the-test/
+[Finding code smells using SQL Prompt: the SET NOCOUNT problem (PE008 and PE009)]:https://www.red-gate.com/hub/product-learning/sql-prompt/finding-code-smells-using-sql-prompt-set-nocount-problem-pe008-pe009
+[DATABASES 101 guide for the non-technical professional]:https://thomaslarock.com/2018/07/databases-101/
+[Understanding your Azure EA Billing Data and Building a Centralized Data Storage Solution]:https://www.red-gate.com/simple-talk/cloud/cloud-data/understanding-your-azure-ea-billing-data-and-building-a-centralized-data-storage-solution/
+[READ COMMITTED SNAPSHOT ISOLATION and High version_ghost_record_count]:https://www.red-gate.com/simple-talk/sql/performance/read-committed-snapshot-isolation-high-version_ghost_record_count/
+[In-Memory OLTP Indexes – Part 1: Recommendations.]:https://blogs.msdn.microsoft.com/sqlserverstorageengine/2017/11/02/in-memory-oltp-indexes-part-1-recommendations/
+[In-Memory OLTP Indexes – Part 2: Performance Troubleshooting Guide.]:https://blogs.msdn.microsoft.com/sqlserverstorageengine/2017/11/14/in-memory-oltp-indexes-part-2-performance-troubleshooting-guide/
+[Optimization Thresholds – Grouping and Aggregating Data, Part 1]:https://sqlperformance.com/2018/04/sql-plan/grouping-and-aggregating-part-1
+[Optimization Thresholds – Grouping and Aggregating Data, Part 2]:https://sqlperformance.com/2018/05/sql-plan/grouping-and-aggregating-part-2
+[Optimization Thresholds – Grouping and Aggregating Data, Part 3]:https://sqlperformance.com/2018/06/sql-plan/grouping-and-aggregating-part-3
+[Optimization Thresholds – Grouping and Aggregating Data, Part 4]:https://sqlperformance.com/2018/07/sql-performance/grouping-and-aggregating-part-4
+[Optimization Thresholds – Grouping and Aggregating Data, Part 5]:https://sqlperformance.com/2018/08/sql-performance/grouping-and-aggregating-part-5
+[When DBCC OpenTran doesn’t list all open transactions]:https://blogs.msdn.microsoft.com/mosharaf/2013/02/17/when-dbcc-opentran-doesnt-list-all-open-transactions/
+[How I spot not-yet-documented features in SQL Server CTPs]:https://blogs.sentryone.com/aaronbertrand/fishing-for-features-in-ctps/
+[More ways to discover changes in new versions of SQL Server]:https://blogs.sentryone.com/aaronbertrand/more-changes-sql-server/
+[Tail-Log Backup and Restore in SQL Server]:https://www.sqlshack.com/tail-log-backup-and-restore-in-sql-server/
+[Database Filegroup(s) and Piecemeal restores in SQL Server]:https://www.sqlshack.com/database-filegroups-and-piecemeal-restores-in-sql-server/
+[Updating Statistics with Ola Hallengren’s Script]:https://www.sqlskills.com/blogs/erin/updating-statistics-with-ola-hallengrens-script/
+[Interview questions on SQL Server database backups, restores and recovery – Part I]:https://www.sqlshack.com/interview-questions-on-sql-server-database-backups-restores-and-recovery-part-i/
+[Interview questions on SQL Server database backups, restores and recovery – Part II]:https://www.sqlshack.com/interview-questions-on-sql-server-database-backups-restores-and-recovery-part-ii/
+[Interview questions on SQL Server database backups, restores and recovery – Part III]:https://www.sqlshack.com/interview-questions-on-sql-server-database-backups-restores-and-recovery-part-iii/
+[Can Rowstore Compression Beat Columnstore Compression?]:https://orderbyselectnull.com/2018/06/28/can-rowstore-compression-beat-columnstore-compression/
+[Inside the Storage Engine: Anatomy of a record]:https://www.sqlskills.com/blogs/paul/inside-the-storage-engine-anatomy-of-a-record/
+[Inside the Storage Engine: Anatomy of an extent]:https://www.sqlskills.com/blogs/paul/inside-the-storage-engine-anatomy-of-an-extent/
+[Inside the Storage Engine: Anatomy of a page]:https://www.sqlskills.com/blogs/paul/inside-the-storage-engine-anatomy-of-a-page/
+[Inside the Storage Engine: IAM pages, IAM chains, and allocation units]:https://www.sqlskills.com/blogs/paul/inside-the-storage-engine-iam-pages-iam-chains-and-allocation-units/
+[Inside The Storage Engine: GAM, SGAM, PFS and other allocation maps]:https://www.sqlskills.com/blogs/paul/inside-the-storage-engine-gam-sgam-pfs-and-other-allocation-maps/
+[Disaster recovery 101: fixing a broken boot page]:https://www.sqlskills.com/blogs/paul/disaster-recovery-101-fixing-a-broken-boot-page/
+[How to download a sqlservr.pdb symbol file]:https://www.sqlskills.com/blogs/paul/how-to-download-a-sqlservr-pdb-symbol-file/
+[A cause of high-duration ASYNC_IO_COMPLETION waits]:https://www.sqlskills.com/blogs/paul/cause-high-duration-async_io_completion-waits/
+[How to solve the Identity Crisis in SQL Server]:https://www.sqlshack.com/solve-identity-crisis-sql-server/
+[Azure SQL Database Performance and Service Tiers Explained]:https://sqlperformance.com/2018/08/sql-performance/azure-sql-database-tiers
+[What To Do When Wait Stats Don’t Help]:https://orderbyselectnull.com/2018/07/20/what-to-do-when-wait-stats-dont-help/
+[SQL Server Brute Force Attack Detection: Part 1]:https://www.codeproject.com/Articles/1231882/SQL-Server-Brute-Force-Attack-Detection
+[SQL Server Brute Force Attack Detection: Part 2]:https://www.codeproject.com/Articles/1236461/SQL-Server-Brute-Force-Attack-Detection-Part-2
+[SQL Server Brute Force Attack Detection: Part 3]:https://www.codeproject.com/Articles/1232491/SQL-Server-Brute-Force-Attack-Detection-Part-2
+[SQLCLR vs SQL Server 2017, Part 8: Is SQLCLR Deprecated in Favor of Python or R (sp_execute_external_script)?]:https://sqlquantumleap.com/2018/08/09/sqlclr-vs-sql-server-2017-part-8-is-sqlclr-deprecated-in-favor-of-python-or-r-sp_execute_external_script/
+[Sql Server Agent For Azure Sql Database, Azure Elastic Database Pools & Azure Managed Instance]:https://swyssql.wordpress.com/2018/07/20/sql-server-agent-for-azure-sql-database-azure-elastic-database-pools-azure-managed-instance/
+[Storage performance best practices and considerations for Azure SQL DB Managed Instance (General Purpose)]:https://blogs.msdn.microsoft.com/sqlcat/2018/07/20/storage-performance-best-practices-and-considerations-for-azure-sql-db-managed-instance-general-purpose/
+[T-SQL Tuesday #017: APPLY: It Slices! It Dices! It Does It All!]:http://bradsruminations.blogspot.com/2011/04/t-sql-tuesday-017-it-slices-it-dices-it.html
+[SQL Server Encryption, What’s The Key Hierarchy All About?]:https://sqlundercover.com/2018/08/09/sql-server-encryption-whats-the-key-hierarchy-all-about/
+[Overview of the SQLCMD utility in SQL Server]:https://www.sqlshack.com/overview-of-the-sqlcmd-utility-in-sql-server/
+[The BCP (Bulk Copy Program) command in action]:https://www.sqlshack.com/bcp-bulk-copy-program-command-in-action/
+[Measuring Query Execution Time]:https://www.scarydba.com/2018/08/13/measuring-query-execution-time/
+[How to Check Performance on a New SQL Server]:https://www.brentozar.com/archive/2018/08/how-to-check-performance-on-a-new-sql-server/
+[Questions About Kerberos and SQL Server That You Were Too Shy to Ask]:https://www.red-gate.com/simple-talk/sql/database-administration/questions-about-kerberos-and-sql-server-that-you-were-too-shy-to-ask/
+[SQL Server Execution Plans overview]:https://www.sqlshack.com/sql-server-execution-plans-overview/
+[SQL Server Execution Plans types]:https://www.sqlshack.com/sql-server-execution-plans-types/
+[How to Analyze SQL Execution Plan Graphical Components]:https://www.sqlshack.com/how-to-analyze-sql-execution-plan-graphical-components/
+[Query optimization techniques in SQL Server: the basics]:https://www.sqlshack.com/query-optimization-techniques-in-sql-server-the-basics/
+[Query optimization techniques in SQL Server: tips and tricks]:https://www.sqlshack.com/query-optimization-techniques-in-sql-server-tips-and-tricks/
+[Query optimization techniques in SQL Server: Database Design and Architecture]:https://www.sqlshack.com/query-optimization-techniques-in-sql-server-database-design-and-architecture/
+[SQL Query Optimization Techniques in SQL Server: Parameter Sniffing]:https://www.sqlshack.com/query-optimization-techniques-in-sql-server-parameter-sniffing/
+[Similarities and Differences among RANK, DENSE_RANK and ROW_NUMBER Functions]:https://codingsight.com/similarities-and-differences-among-rank-dense_rank-and-row_number-functions/
+[Temporal Tables Under The Covers]:https://bornsql.ca/blog/temporal-tables-under-the-covers/
+[Faking Temporal Tables with Triggers]:https://bertwagner.com/2018/09/11/faking-temporal-tables-with-triggers/
+[SQL queries to manage hierarchical or parent-child relational rows in SQL Server]:https://www.codeproject.com/Articles/818694/SQL-queries-to-manage-hierarchical-or-parent-child
+[Choosing Between Table Variables and Temporary Tables]:https://www.red-gate.com/hub/product-learning/sql-prompt/choosing-table-variables-temporary-tables
+[What's New in the First Public CTP of SQL Server 2019]:https://www.mssqltips.com/sqlservertip/5710/whats-new-in-the-first-public-ctp-of-sql-server-2019/
+[SQL Server support for TLS 1.2 – Read This First!]:https://blogs.sentryone.com/aaronbertrand/tls-1-2-support-read-first/
+[Misconceptions in SQL Server: A Trio of table variables]:https://sqlinthewild.co.za/index.php/2010/10/12/a-trio-of-table-variables/
+[Using the Same Column Twice in a SQL UPDATE Statement]:https://www.sqltheater.com/blog/using-the-same-column-twice-in-an-update-statement/
+[How to perform a performance test against a SQL Server instance]:https://www.sqlshack.com/how-to-perform-a-performance-test-against-a-sql-server-instance/
+[The Black Art Of Spatial Index Tuning In SQL Server]:http://boomphisto.blogspot.com/2011/04/black-art-of-spatial-index-tuning-in.html
+[Patching SQL Server on Windows notes from the field]:https://www.kevinrchant.com/2019/01/10/patching-sql-server-on-windows-notes-from-the-field/
+[Availability Group Readable Secondaries – Just Say No]:https://www.sqlskills.com/blogs/jonathan/availability-group-readable-secondaries-just-say-no/
+[Finding the Slowest Query in a Stored Procedure]:https://www.sqlskills.com/blogs/erin/slowest-query-in-a-stored-procedure/
+[A Monumental Migration to SQL Server 2016 – Part 1]:https://flxsql.com/monumental-migration-sql-server-2016-part-1/
+[A Monumental Migration to SQL Server 2016 – Part 2]:https://flxsql.com/monumental-migration-sql-server-2016-part-2/
+[A unique review of SQL Server index types]:https://www.kevinrchant.com/2018/10/18/a-unique-review-of-sql-server-index-types/
+[Don’t Just Rely on Query Execution Stats for T-SQL Execution]:https://matthewmcgiffen.com/2018/09/18/dont-just-rely-on-query-execution-stats-for-t-sql-execution/
+[Posting SQL Server notifications to Slack]:https://alessandroalpi.blog/2018/09/19/posting-sql-server-notifications-to-slack/
+[How to create DACPAC file?]:https://sqlplayer.net/2018/10/how-to-create-dacpac-file/
+[Find the Next Non-NULL Row in a Series With SQL]:https://blog.jooq.org/2018/09/03/find-the-next-non-null-row-in-a-series-with-sql/
+[Calculate Percentiles to Learn About Data Set Skew in SQL]:https://blog.jooq.org/2019/01/22/calculate-percentiles-to-learn-about-data-set-skew-in-sql/
+[Comparing multiple rows insert vs single row insert with three data load methods]:https://www.red-gate.com/simple-talk/sql/performance/comparing-multiple-rows-insert-vs-single-row-insert-with-three-data-load-methods/
+[The Cause of Every Deadlock in SQL Server]:https://thomaslarock.com/2018/09/the-cause-of-every-deadlock-in-sql-server/
+[Deadlock Troubleshooting, Part 1]:https://blogs.msdn.microsoft.com/bartd/2006/09/08/deadlock-troubleshooting-part-1/
+[Deadlock Troubleshooting, Part 2]:https://blogs.msdn.microsoft.com/bartd/2006/09/12/deadlock-troubleshooting-part-2/
+[Deadlock Troubleshooting, Part 3]:https://blogs.msdn.microsoft.com/bartd/2006/09/25/deadlock-troubleshooting-part-3/
+[The Good, the Bad and the Ugly of Table Variable Deferred Compilation – Part 1]:https://milossql.wordpress.com/2018/10/04/the-good-the-bad-and-the-ugly-of-table-variable-deferred-compilation-part-1/
+[The Good, the Bad and the Ugly of Table Variable Deferred Compilation – Part 2]:https://milossql.wordpress.com/2018/10/05/the-good-the-bad-and-the-ugly-of-table-variable-deferred-compilation-part-2/
+[The Good, the Bad and the Ugly of Table Variable Deferred Compilation – Part 3]:https://milossql.wordpress.com/2018/10/08/the-good-the-bad-and-the-ugly-of-table-variable-deferred-compilation-part-3/
+[Creating a SQL Server 2019 Demo Environment in a Docker Container]:https://www.cathrinewilhelmsen.net/2018/12/02/sql-server-2019-docker-container/
+[Overview of Data Compression in SQL Server]:https://codingsight.com/overview-of-data-compression-in-sql-server/
+[SQL Server Hash Match Operator]:https://sqlserverfast.com/epr/hash-match/
+[How to use Microsoft Assessment and Planning (MAP) Toolkit for SQL Server]:https://www.sqlshack.com/how-to-use-microsoft-assessment-and-planning-map-toolkit-for-sql-server/
+[Improve the Performance of Your Azure SQL Database (and Save Money!) with Automatic Tuning]:https://www.red-gate.com/simple-talk/sql/azure-sql-database/improve-the-performance-of-your-azure-sql-database-and-save-money-with-automatic-tuning/
+[The Importance of Database Compatibility Level in SQL Server]:https://www.sqlskills.com/blogs/glenn/the-importance-of-database-compatibility-level-in-sql-server/
+[Azure Managed vs Unmanaged disks : The choice]:https://buildwindows.wordpress.com/2017/05/31/azure-managed-vs-unmanaged-disks-the-choice/
+[Storage options for SQL Server database files in Azure]:https://www.jamesserra.com/archive/2019/01/storage-options-for-sql-server-database-files-in-azure/
+[The Performance of Window Aggregates Revisited with SQL Server 2019]:https://www.red-gate.com/simple-talk/sql/t-sql-programming/the-performance-of-window-aggregates-revisited-with-sql-server-2019/
+[Super Scaling Singleton Inserts]:https://chrisadkin.io/2015/02/19/super-scaling-singleton-inserts/
+[Preparation for SQL Server Installation]:https://sqlplayer.net/2018/12/preparation-for-sql-server-installation/
+[Executing xp_cmdshell with Non SysAdmin Account]:http://www.lucasnotes.com/2019/01/executing-xpcmdshell-with-non-sysadmin.html
+[Generating SQL using Biml (T-SQL Tuesday #110)]:https://www.cathrinewilhelmsen.net/2019/01/08/generating-sql-using-biml/
+[Avoiding SQL Server Upgrade Performance Issues]:https://www.sqlskills.com/blogs/glenn/avoiding-sql-server-upgrade-performance-issues/
diff --git a/Articles/Slow in the Application, Fast in SSMS.htm b/Articles/Slow in the Application, Fast in SSMS.htm
deleted file mode 100644
index cff3c823..00000000
--- a/Articles/Slow in the Application, Fast in SSMS.htm
+++ /dev/null
@@ -1,2428 +0,0 @@
-
-
-
-
-
-Slow in the Application, Fast in SSMS?
-
-
-
Slow in the Application, Fast in SSMS? Understanding Performance Mysteries
-
An SQL text by Erland Sommarskog, SQL Server MVP. Last revision: 2013-08-30.
-This article is also available in Russian, translated by Dima Piliugin.
When I read various forums about SQL Server, I frequently see questions from
-deeply mystified
-posters. They have identified a slow query or stored procedure
-in their application. They cull the SQL batch from the application and run it in SQL Server
-Management Studio (SSMS) to analyse it, only to find that the
-response is instantaneous. At this point
-they are inclined to think that SQL Server is all about
-magic. A similar mystery is when a developer has extracted a query in his stored
-procedure to run it stand-alone only to find that it runs much faster – or much
-slower – than inside the procedure.
-
No, SQL Server is not about magic. But if you don't have a good understanding
-of how SQL Server compiles queries and maintains its plan cache, it may seem so.
-Furthermore there are some unfortunate combinations of different defaults in
-different environments. In this article, I will try to straighten out why you get this seemingly inconsistent behaviour.
-I explain how SQL Server compiles a stored procedure, what parameter sniffing
-is and why it is part of the equation in the vast majority of these confusing
-situations. I explain how SQL Server uses the cache, and why there may be
-multiple entries for a procedure in the cache. Once you have come this far, you
-will understand how come the query runs so much faster in SSMS.
-
To understand how to address that performance problem in your application, you
-need to read on. I first make a short break from the theme of parameter sniffing
-to discuss a few situations where there are other reasons for the difference in
-performance. This is followed by two chapters how to deal with
-performance problems where parameter sniffing is involved. The first is about
-gathering information. In the second chapter I discuss some scenarios
-– both real-world situations and more generic ones – and possible solutions. In the last chapter I discuss how dynamic SQL
-is compiled and interacts with the plan cache and why there are more reasons you
-may experience differences in performance between SSMS and the application with
-dynamic SQL. At the end there is a
-section with links to Microsoft white papers and similar documents in this area.
The essence of this article applies to all versions of SQL Server, but the focus is on SQL 2005 and later versions.
-The article includes several queries to inspect the plan cache; these queries run only on SQL 2005 and later. SQL 2000 and earlier versions had far less instrumentation in this regard.
-Beware that to run these queries you need to have the server-level permission
-VIEW SERVER STATE.
-
For the examples in this article I use the Northwind sample database. This
-database shipped with SQL 2000. For later versions of SQL Server you can
-download it from
-
- Microsoft's web site.
-
This is not a beginner-level article, but I assume that the reader has a
-working experience of SQL programming. You don't need to have any prior experience of
-performance tuning, but it certainly helps if you helps if you have looked a
-little at query plans and if you have some basic knowledge of indexes. I will
-not explain the basics in depth, as my focus a little beyond that point. This article will not
-teach you everything about performance
-tuning, but at least it will be a start.
-
Caveat: In some places I give links to the online version of Books Online. Beware that the URL may lead to Books Online for a
-different version of SQL
-Server than you are using. On the topic pages, there is a link Other versions, so that you easily can go to
-the page that matches the version of SQL Server
-you are using. (Or at least that was how Books Online on MSDN was organised when I wrote this article.)
In this chapter we will look at how SQL Server compiles a stored procedure
-and uses the plan cache. If your application does not use stored procedures, but
-submits SQL statements directly, most of what I say this chapter is still applicable. But there are further
-complications with dynamic SQL, and since the facts about stored procedures are confusing enough I have deferred the discussion on dynamic
-SQL to the last chapter.
That may seem like a silly question, but the question I am getting at is What objects
-have query plans on their own? SQL
-Server builds query plans for these types of objects:
-
-
Stored procedures.
-
Scalar user-defined functions.
-
Multi-step table-valued functions.
-
Triggers.
-
-
With a more general and stringent terminology I should talk about modules,
-but since stored procedures is by far the most widely used type of module, I prefer to
-talk about stored procedures to keep it simple.
-
For other types of objects than the four listed above, SQL Server does not build query plans.
-Specifically, SQL Server does not create query plans for views and inline-table
-functions. Queries like:
-
SELECT abc, def FROM myview
-SELECT a, b, c FROM mytablefunc(9)
-
are no different from ad-hoc queries that access the tables directly. When
-compiling the query, SQL Server expands the view/function into the query, and
-the optimizer works with the expanded query text.
-
There is one more thing we need to understand about what constitutes a stored
-procedure. Say that you have two procedures, where the
-outer calls the inner one:
-
CREATE PROCECURE Outer_sp AS
-...
-EXEC Inner_sp
-...
-
I would guess most people think of Inner_sp as being independent from Outer_sp,
-and indeed it is. The execution plan for Outer_sp does not include the
-query plan for Inner_sp, only the invocation of it. However, there is a very similar situation where
-I've noticed that posters on SQL forums often have a
-different mental image, to wit dynamic SQL:
It is important to understand that this is no different from nested stored procedures. The generated
-SQL string is not
-part of Some_sp, nor does it appear anywhere in the query plan for Some_sp, but it has a
-query plan and a cache entry of its own. This applies, no matter if the dynamic
-SQL is executed through EXEC() or sp_executesql.
When you enter a stored procedure with CREATE PROCEDURE (or CREATE FUNCTION
-for a function or CREATE TRIGGER for a trigger), SQL Server verifies that the
-code is syntactically correct, and also checks that you do not refer to
-non-existing columns. (But if you refer to non-existing tables, it lets get you
-away with it, due to a misfeature known as deferred named resolution.) However,
-at this point SQL Server does not build any query plan, but merely stores
-the query text in the database.
-
It is not until a user executes the procedure, that SQL Server creates the
-plan. For each query, SQL Server looks at the distribution statistics it
-has collected about the data in the tables in the query. From
-this, it makes an estimate what is best way to execute the query. This
-phase is known as optimisation. While the procedure is compiled in one go,
-each query is optimised on its own, and there is no attempt to analyse the flow
-of execution. This has a very important ramification: the optimizer has no idea
-about the run-time values of variables. However, it does know what values
-the user specified for the parameters to the procedure.
-
Parameters and Variables
-
Consider the Orders
-table in the Northwind database, and these three procedures:
-
CREATE PROCEDURE List_orders_1 AS
- SELECT * FROM Orders WHERE OrderDate > '20000101'
-go
-CREATE PROCEDURE List_orders_2 @fromdate datetime AS
- SELECT * FROM Orders WHERE OrderDate > @fromdate
-go
-CREATE PROCEDURE List_orders_3 @fromdate datetime AS
- DECLARE @fromdate_copy datetime
- SELECT @fromdate_copy = @fromdate
- SELECT * FROM Orders WHERE OrderDate > @fromdate_copy
-go
-
Note: Using SELECT * in production code is bad practice.
-I use it in this article to keep the examples concise.
-Before you run the procedures, enable Include Actual Execution Plan under
-the Query menu. (There is also a toolbar button for it, as well as a
-keyboard shortcut: Ctrl-M for the "Standard" keyboard, or Ctrl-K if you
-are like me and use
-the SQL 2000 keyboard.)
-If you look at the query plans for the procedures, you will see the
-first two procedures have identical plans:
-
-
-
-That is, SQL Server seeks the index on OrderDate, and uses a key lookup to
-get the other data. The plan for the third execution is different:
-
-
-In this case, SQL Server scans the table. (Keep in mind that in a
-clustered index the leaf pages contains the data, so a clustered index scan and
-a table scan is the same the thing.) Why this difference? To understand why the optimizer makes certain decisions, it is always a good idea to look at what
-estimates it is working with. If you hover with the mouse over of the two Seek operators and the Scan operator, you will see the pop-ups below.
-
-
-
-
-
-
-
-
-
-
-
-
List_orders_1
-
-
List_orders_2
-
-
-
-
-
-
-
List_orders_3
-
-
-
The interesting element is Estimated Number of Rows. For the first two procedures, SQL Server estimates that one row will be returned, but for
-List_orders_3, the estimate is 249 rows. This difference in estimates explains the different choice of plans. Index Seek + Key Lookup is a good strategy to return a
-smaller amount of rows from a table. But as more rows that match the seek
-criteria, the cost increases, and there is a increased likelihood that SQL
-Server will need to access the same data page more than once. In the extreme case where all rows
-are returned, a table scan is much more efficient than seek and lookup. With a
-scan,
-SQL Server has to read every data page exactly once, whereas with
-seek + key lookup, every page will be visited once for each row on the page. The Orders table in Northwind has 830 rows, and when SQL Server estimates that as many
-as 249 rows will be returned, it (rightly) concludes that the scan is the best choice.
-
Where Do These Estimates Come From?
-
Now we know why the optimizer arrives at different execution plans: because the estimates are different. But that only leads to the next question: why
-are the estimates different? That is the key topic of this article.
-
In the first procedure, the date is a constant, which means that the SQL Server only needs to consider exactly this case. It interrogates the statistics for the
-Orders table, which indicates that there are no rows with an OrderDate in the
-third millennium. (All orders in the Northwind database are from 1996 to 1998.)
-Since statistics are statistics, SQL Server cannot be sure that
-the query will return no rows at all, why it makes an estimate of one single row.
-
In case of List_orders_2, the query is against a variable, or more precisely a parameter. When performing the optimisation, SQL Server knows that the
-procedure was invoked with the value 2000-01-01. Since it does not any perform flow analysis, it can't say
-for sure whether the parameter will have this value when the query is executed.
-Nevertheless, it uses the input value to come up
-with an estimate, which is the same as for List_orders_1: one single row. This strategy of looking at the values of the input
-parameters when optimising a stored procedure is known as parameter sniffing.
-
-In the last procedure, it's all different. The input value is copied to a
-local variable, but when SQL Server builds the plan, it has no understanding of
-this and says to itself I don't know what the value this variable will
-be.
-Because of this, it applies a standard assumption, which for an inequality
-operation such as > is a 30 % hit-rate. 30 % of 830 is indeed 249.
-
Here is a variation of the theme:
-
CREATE PROCEDURE List_orders_4 @fromdate datetime = NULL AS
- IF @fromdate IS NULL
- SELECT @fromdate = '19900101'
- SELECT * FROM Orders WHERE OrderDate > @fromdate
-
In this procedure, the parameter is optional, and if the user does not fill
-in the parameter, all orders are listed. Say that the user invokes the procedure
-as:
-
EXEC List_orders_4
-
The execution plan is identical to the plan for List_orders_1 and List_orders_2. That is, Index Seek + Key Lookup, despite
-that all orders are returned. If you
-look at the pop-up for the Index Seek operator, you will see that it is identical to the pop-up for List_orders_2 but in one regard, the actual number of rows.
-When compiling the procedure, SQL Server
-does not know that the value of @fromdate changes, but compiles the procedure
-under the assumption that @fromdate has the value NULL. Since all comparisons with NULL yield
-UNKNOWN, the query cannot return any rows at all, if @fromdate still
-has this value at run-time. If SQL Server would take the input value as the final
-truth, it could construct a plan with only a Constant Scan that does not access the table at all (run the query SELECT * FROM Orders WHERE OrderDate >
-NULL to see an example of this). But SQL Server must generate a plan which
-returns the correct result no matter what value @fromdate has at run-time. On
-the other hand, there is no obligation to build a plan which is the best for all
-values. Thus, since the assumption is that
-no rows will be returned, SQL Server settles for the Index Seek. (The estimate is still that one row will be returned. This is
-because SQL Server never uses an estimate of 0 rows.)
-
This is an example of when parameter sniffing backfires, and in this
-particular case it may be better to write the procedure in this way:
-
CREATE PROCEDURE List_orders_5 @fromdate datetime = NULL AS
- DECLARE @fromdate_copy datetime
- SELECT @fromdate_copy = coalesce(@fromdate, '19900101')
- SELECT * FROM Orders WHERE OrderDate > @fromdate_copy
-
With List_orders_5 you always get a Clustered Index
-Scan.
-
Key Points
-
In this section, we have learned three very important things:
-
-
A constant is a constant, and when a query includes a constant, SQL
- Server can use the value of the constant with full trust, and even take such
- shortcuts to not access a table at all, if it can infer from constraints that
- no rows will be returned.
-
For a parameter, SQL Server does not know the run-time value, but it "sniffs" the input value when compiling the query.
-
For a local variable, SQL Server has no idea at all of the run-time value, and applies standard assumptions. (Which the assumptions are depends on the
- operator and what can be deduced from the presence of unique indexes.)
-
-
And there is a corollary of this: if you take out a query from a stored
-procedure and replace variables and parameters with constants,
-you now have quite a different query. More about this later.
If SQL Server would compile a stored procedure – that is optimise and build a query plan – every time the procedure is executed, there is a big risk that SQL Server would
-crumble from all the CPU resources it would take. I immediately need to qualify
-this, because it is not true for all systems. In a big data warehouse where a
-handful of business analysts runs complicated queries that take a minute on
-average to
-execute, there would be no damage if there was compilation every time – rather it
-could be beneficial. But in an OLTP database where plenty of users run stored
-procedures with short and simple queries, this concern is very much for real.
-
For this reason, SQL Server caches the query plan for a stored procedure, so
-when the next user runs the procedure, the compilation phase can be skipped, and
-execution can commence directly. The plan will stay in the cache, until some
-event forces the plan out of the cache. Examples of such events are:
-
-
SQL Server's buffer cache is fully utilised, and SQL Server needs to age
- out buffers that have not been used for some time from the cache. The buffer
- cache includes table data as well as query plans.
-
Someone runs ALTER PROCEDURE on the procedure.
-
Someone runs sp_recompile on the procedure.
-
Someone runs the command DBCC FREEPROCCACHE which clears the entire plan cache.
-
SQL Server is restarted. Since the cache is memory-only,
- the cache is not preserved over restarts.
-
Changing of certain configuration parameters (with sp_configure or
- through the Server Properties pages in SSMS) evict
- the entire plan cache.
-
-
If such an event occurs, a new query plan will be created the next time the
-procedure is executed. SQL Server will anew "sniff" the input parameters, and
-if the parameter values are different this time, the query plan may be
-different from the previous plan.
-
There are other events that do not cause the entire procedure plan to be
-evicted from the cache, but which trigger recompilation of one or more individual
-statements in the procedure. The recompilation occurs the next time the
-statement is executed. This applies even if the event occurred after the procedure started executing.
-Here are examples of such events:
-
-
Changing the definition of a table that appears in the statement.
-
Dropping or adding an index for a table appearing in the statement. This includes rebuilding an index with ALTER INDEX or DBCC DBREINDEX.
-
New or updated statistics for a table in the statement.
- Statistics can be created and updated by SQL Server automatically. The DBA
- can also create and update statistics with the commands CREATE STATISTICS and
- UPDATE STATISTICS.
-
Someone runs sp_recompile on a table referred to in the statement.
-
-
Note: In SQL Server 2000, there is no statement recompilation, but the
-entire procedure is always recompiled.
-
These lists are by no means exhaustive, but you should observe one thing which is
-not there: executing the procedure with different values for the input
-parameters from the original execution. That is, if the second invocation of
-List_orders_2 is:
-
EXEC List_orders_2 '19900101'
-
The execution will still use the index on OrderDate, despite the query now
-retrieves all orders. This leads to a very important observation: the parameter
-values of the first execution of the procedure have a huge impact for
-subsequent executions. If this first set of values for some reason is atypical,
-the cached plan may not be optimal for future executions. This is why parameter sniffing is such a big deal.
-
Note: for a complete list of what can cause plans to be
-flushed or statements to be recompiled, see the white paper on Plan Caching listed in
-the Further Reading section.
There is a plan for the procedure in the cache. That means that everyone can use it, or? No, in this section we will learn that there can be multiple
-plans for the same procedure in the cache. To understand this, let's consider this contrived example:
-
CREATE PROCEDURE List_orders_6 AS
- SELECT *
- FROM Orders
- WHERE OrderDate > '12/01/1998'
-go
-SET DATEFORMAT dmy
-go
-EXEC List_orders_6
-go
-SET DATEFORMAT mdy
-go
-EXEC List_orders_6
-go
-
If you run this, you will notice that the first execution returns many
-orders, whereas the second execution returns no orders. And if you look at the execution
-plans, you will see that they are different as well. For the first execution, the plan is a
-Clustered Index Scan (which is the best choice with so many rows returned), whereas the second execution plan uses Index Seek with Key Lookup (which is the
-best when no rows are returned).
-
How could this happen? Did SET
-DATEFORMAT cause recompilation? No, that would not be smart. In this example, the executions come one after each other, but they could just as well be submitted
-in parallel by different users with different settings for the date format. Keep in mind that the entry
-for a stored procedure in the plan cache is not tied to a certain session or
-user, but it is global to all connected users.
-
Instead the answer is that SQL Server creates a second cache entry for the second
-execution of the procedure.
-We can see this if we peek into the plan cache with this query:
-
SELECT qs.plan_handle, a.attrlist
-FROM sys.dm_exec_query_stats qs
-CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) est
-CROSS APPLY (SELECT epa.attribute + '=' + convert(nvarchar(127), epa.value) + ' '
- FROM sys.dm_exec_plan_attributes(qs.plan_handle) epa
- WHERE epa.is_cache_key = 1
- ORDER BY epa.attribute
- FOR XML PATH('')) AS a(attrlist)
-WHERE est.objectid = object_id ('dbo.List_orders_6')
- AND est.dbid = db_id('Northwind')
-
Note: You need the
-server-level permission VIEW SERVER STATE to run queries
-against the plan cache.
-
Note: The queries against the plan cache
-in this article do not run on SQL 2000.
-
The DMV (Dynamic Management View)
-sys.dm_exec_query_stats has one entry for each query currently in the plan
-cache. If a procedure has multiple statements, there is one row per statement.
-Of interest here is sql_handle and plan_handle. I use
-sql_handle to determine which procedure the cache entry relates to (later we
-will see examples where we also retrieve the query text) so that we can filter
-out
-all other entries in the cache. Most often you use plan_handle to
-retrieve the query plan itself, and we will see an example of this later, but in this query I access a DMV that returns
-the attributes of the query plan. More specifically, I return the attributes that
-are cache keys. When there is more than entry in the cache for the same procedure, the entries have at least one difference in the cache keys. A cache key is a run-time setting, which for one reason
-or another calls for a different query plan. Most of these settings are controlled
-with a SET command, but not all.
-
The query above returns two rows, indicating that there are two entries for the
-procedure in the cache. The output may look like this:
To save space, I have deleted many of the values in the attrlist column
-and I have also folded the column into two lines. If you run the query yourself, you can see the complete list
-of cache keys, and they are quite a few. If you look up the topic for
-
-sys.dm_exec_plan_attributes in Books Online, you will see description
-for many of the plan attributes, but you will also note that far from all cache
-keys are documented. In this article I will not dive into all cache keys, not
-even the documented ones, but focus on the most important ones.
-
As I said, the example is contrived, but it gives a good illustration to
-why the query plans must be different: different date formats may yield
-different results. A somewhat more normal example is this:
(The initial sp_recompile is to make sure that the plan from the
-previous example is flushed.) This example yields the same results and the same
-plans as with List_orders_6 above. That is, the two query plans uses the actual parameter value
-when the respective plan is built. The first query uses 12 Jan 1998, and the
-second 1 Dec 1998.
-
A very important cache key is set_options. This is a bit mask that gives the setting of a number of SET options that can be ON or OFF. If
-you look further in the topic of sys.dm_exec_plan_attributes, you find a
-listing that details which SET option each bit describes. (You
-will also see that there are a few more items that are not controlled by the SET
-command.) Thus, if two
-connections have any of these options set differently, the connections will
-use different cache entries for the same procedure – and therefore they could be using different query plans, with possibly big difference in performance.
-
One way to translate the set_options attribute is to run this query:
-
SELECT convert(binary(4), 4347)
-
This tells us that the hex value for 4347 is 0x10FB. Then we can look in Books
-Online and follow the table to find out that the following SET options are in
-force: ANSI_PADDING, Parallel Plan, CONCAT_NULL_YIELDS_NULL, ANSI_WARNINGS, ANSI_NULLS,
-QUOTED_IDENTIFIER, ANSI_NULL_DFLT_ON and ARITHABORT.
SELECT Set_option FROM setoptions (4347) ORDER BY Set_option
-
Note: You may be wondering what Parallel Plan is doing here, not the least since the plan in the example is not parallel. When SQL
-Server builds a parallel plan for a query, it may later also build a non-parallel plan if the CPU load in the server is such that it is not defensible to run a
-parallel plan. It seems that for a plan that is always serial that the bit for parallel plan is nevertheless
-set in set_options.
-
To simplify the discussion, we can say that each of these SET options – ANSI_PADDING, ANSI_NULLS etc –
-is a cache key on its own. The fact that they are
-added together in a singular numeric value is just a matter of packaging.
About all of the SET ON/OFF options that are cache keys exist because of legacy reasons. Originally, in the
-dim and distant past, SQL Server included a number of behaviours that violated
-the ANSI standard for SQL. With SQL Server 6.5, Microsoft introduced all these SET options
-(save for ARITHABORT, which was in the product already in 4.x), to permit users to use
-SQL Server in an ANSI-compliant way. In SQL 6.5, you had to use the
-SET options explicitly to get ANSI-compliant behaviour, but with SQL 7, Microsoft changed
-the defaults for clients that used the new versions of the ODBC and OLE DB APIs.
-The SET options still remained to provide backwards compatibility for older
-clients.
-
Note: In case what you are curious what is the impact of these SET options, I refer
-you to Books Online. Some of them are fairly straight-forward to explain,
-whereas others are just too confusing. To understand this article, you only
-need to understand that they exist, and what impact they have on the plan cache.
-
Alas, Microsoft did not change the defaults with full consistency, and
-even today the defaults depend on how you connect, as detailed in the table
-below.
-
-
-
Applications using ADO .Net, ODBC or OLE DB
SSMS,
- Query Analyzer
SQLCMD,
- OSQL, BCP, SQL Server Agent
-
ISQL, DB-Library
-
ANSI_NULL_DFLT_ON
ON
ON
-
ON
OFF
-
ANSI_NULLS
ON
ON
-
ON
OFF
-
ANSI_PADDING
ON
ON
-
ON
OFF
-
ANSI_WARNINGS
ON
ON
-
ON
OFF
-
CONACT_NULLS_YIELD_NULL
ON
ON
-
ON
OFF
-
QUOTED_IDENTIFIER
ON
ON
- OFF
OFF
-
ARITHABORT
OFF
ON
-
OFF
OFF
-
-
You might see where this is getting at. Your application connects with
-ARITHABORT OFF, but when you run the query in SSMS, ARITHABORT is ON and thus
-you will not reuse the cache entry that the application uses, but SQL Server
-will compile the procedure anew, sniffing your current parameter values, and you may get a different plan than from the application.
-So there you have a likely answer to the initial question of this article. There
-are a few more possibilities that we will look into in the next chapter, but the
-by far most common reason for slow in the application, fast in SSMS in
-SQL 2005 and later is parameter sniffing and the different defaults for
-ARITHABORT. (If that was all you wanted to know, you can stop reading. If you
-want to fix your performance problem – hang on!)
-
Beside the SET command and the defaults above, ALTER DATABASE permits you to
- say that a certain SET option always should be ON in a database and thus
- override the default set by the API. However, while the syntax may indicate so,
- you cannot specify than an option should be OFF this way. Also, beware that if
- you test these options from Management Studio, they may not seem to work, since
- SSMS submits explicit SET commands. There is also a
- server-level setting for the same purpose, the configuration option user
- options which is a bit mask. You can set the individual bits in the
- mask from the Connection pages of the Server
- Properties in Management Studio. Overall, I recommend against controlling
- the defaults this way, as in my opinion they mainly serve to increase the
-confusion.
-
It is not always the run-time setting of an option that applies. When you create a procedure, view, table etc, the settings
-for ANSI_NULLS
-and QUOTED_IDENTIFIER, are saved with the object. That is, if you run this:
-
SET ANSI_NULLS, QUOTED_IDENTIFIER OFF
-go
-CREATE PROCEDURE stupid @x int AS
-IF @x = NULL PRINT "@x is NULL"
-go
-SET ANSI_NULLS, QUOTED_IDENTIFIER ON
-go
-EXEC stupid NULL
-
It will print
-
@x is NULL
-
(When QUOTED_IDENTIFIER is OFF, double quote(") is a string delimiter on equal basis with single quote('). When the
-setting is ON, double quotes delimit identifiers in the same way that square
-brackets ([]) do and the PRINT statement would yield a compilation
-error.)
-
In addition, the setting for ANSI_PADDING is saved per table column
-where it is applicable (The data types varchar, nvarchar and varbinary).
-
All these options and different defaults are certainly confusing, but here
-are some pieces of advice. First, remember that the first six of these seven
-options exist only to
-supply backwards compatibility, so there is little reason why you should ever
-have any of them OFF. Yes, there are situations when some of them may seem to buy a little more
-convenience if they are OFF, but don't fall for that temptation. One complication here, though,
-is that the SQL Server tools spew out SET commands for some of these options
-when you script objects. Thankfully, they mainly produce SET ON commands that
-are harmless. (But I think that when you script a table, scripts may still in
-some situations have a SET ANSI_PADDING OFF at the end.)
-
Next, when it comes to ARITHABORT, you should know that in SQL 2005 and later
-versions, this setting has zero impact as long as ANSI_WARNINGS is ON.
-Thus, there is no reason to turn it on for the sake of the matter. And when it comes to SQL Server
-Management Studio, you might want do yourself a favour, and open this dialog and
-uncheck SET ARITHABORT as highlighted:
-
-
-
This will change your default setting for ARITHABORT when you connect with
-SSMS. It will not help you to make your application to run faster, but you will not
-at least have to be perplexed by getting different performance in SQL Server
-Management Studio.
-
For reference, below is how the ANSI page should look
-like. A very strong recommendation: never change anything on this page!
-
-
-
When it comes to SQLCMD and OSQL, make the habit to always use the
--I option, which causes these tools to run with QUOTED_IDENTIFIER
-ON. The corresponding option for BCP is -q. It's a little more difficult in Agent, since there is no way to change the default for Agent – at least I have not found any. Then again, if you only run stored procedures from your job steps, this is not an issue, since the saved setting for stored procedures takes precedence. But if you would run loose batchs of SQL from Agent jobs, you could face the problem with different query plans in the job and SSMS because of the different defaults for QUOTED_IDENTIFER. For such jobs, you should always include the the command SET QUOTED_IDENTIFIER ON as the first command in the job step.
-
We have already looked at SET DATEFORMAT, and there are two more options in
- that group: LANGUAGE and DATEFIRST. The default language is configured per user, and there is a
- server-wide configuration option which controls what is the default language for
- new users. The default language controls the default for the other two. Since
- they are cache keys, this means that two users with different default languages
-will have different cache entries, and may thus have different query plans.
-
My
-recommendation is that you should try avoid to be dependent on language and date settings in SQL Server
-altogether. For instance, in as far as you use date literals at all, use a format that
-is always interpreted the same, such as YYYYMMDD. (For more details about
-date formats, see the article
-The ultimate guide
-to the datetime datatypes by SQL Server MVP Tibor Karaszi.) If you want
-to produce localised output from a stored procedure depending on the user's
-preferred language, it may be better to roll your own than rely on the language
-setting in SQL Server.
To get a complete picture how SQL Server builds the query plan, we need to
-study what happens when
-
-individual statements are recompiled. Above, I mentioned
-a few situations where it can happen, but at that point I did not go into
-details.
-
The procedure below is certainly contrived, but it serves well to demonstrate
-what happens.
-
CREATE PROCEDURE List_orders_7 @fromdate datetime,
- @ix bit AS
- SELECT @fromdate = dateadd(YEAR, 2, @fromdate)
- SELECT * FROM Orders WHERE OrderDate > @fromdate
- IF @ix = 1 CREATE INDEX test ON Orders(ShipVia)
- SELECT * FROM Orders WHERE OrderDate > @fromdate
-go
-EXEC List_orders_7 '19980101', 1
-
When you run this and look at the actual execution plan, you will see that
-the plan for the first SELECT is a Clustered Index Scan, which agrees with what we have learnt this far. SQL Server sniffs the value 1998-01-01 and estimates
-that the query will return 267 rows which is too many to read with seek + key lookup. What SQL Server does not know is
-that the value of @fromdate changes before the
-queries are executed. Nevertheless, the plan for the second, identical, query is precisely seek + key lookup and the estimate is that one row is returned. This is because the CREATE INDEX
-statement sets a mark that the schema of the Orders table has changed, which
-triggers a recompile of the second SELECT statement. When the recompiling the
-statement, SQL Server sniffs the value of the parameter which is current at this
-point, and thus finds the better plan.
-
Run the procedure again, but with different parameters (note that the date is two years earlier in time):
-
EXEC List_orders_7 '19960101', 0
-
The plans are the same as in the first execution, which is a little more exciting than it may seem at first glance. On this second execution, the first query is
-recompiled because of the added index, but this time
-the scan is the "correct" plan, since we retrieve about on third of
-the orders. However, since the second query is not recompiled now, the second query runs
-with the Index Seek from the previous execution, although it is not an efficient
-plan this time.
-
Before you continue, clean up:
-
DROP INDEX test ON Orders
-DROP PROCEDURE List_orders_7
-
As I said, this example is contrived. I made it that way, because I wanted a
-compact example that is simple to run. In a real-life situation, you may have a procedure
-that uses the same parameter in two queries against different tables. The DBA
-creates a new index on one of the tables, which causes the query against that
-table to be recompiled, whereas the other query is not. The key takeaway here is
-that the plans for two statements in a
-procedure may have been compiled for different "sniffed" parameter values.
-
When we have seen this, it seems logical that this could be extended to local
-variables as well. But this is not the case:
-
CREATE PROCEDURE List_orders_8 AS
- DECLARE @fromdate datetime
- SELECT @fromdate = '20000101'
- SELECT * FROM Orders WHERE OrderDate > @fromdate
- CREATE INDEX test ON Orders(ShipVia)
- SELECT * FROM Orders WHERE OrderDate > @fromdate
- DROP INDEX test ON Orders
-go
-EXEC List_orders_8
-go
-DROP PROCEDURE List_orders_8
-
In this example, we get a Clustered Index Scan for both SELECT statements,
-despite that the second SELECT is recompiled during execution and the value of
-@fromdate is known at this point.
-
However, there is one exception, and that is table variables. Normally SQL
-Server estimates that a table variable has a single row, but when there are
-recompiles in sway, the estimate may be different:
-
CREATE PROCEDURE List_orders_9 AS
- DECLARE @ids TABLE (a int NOT NULL PRIMARY KEY)
- INSERT @ids (a)
- SELECT OrderID FROM Orders
- SELECT COUNT(*)
- FROM Orders O
- WHERE EXISTS (SELECT *
- FROM @ids i
- WHERE O.OrderID = i.a)
- CREATE INDEX test ON Orders(ShipVia)
- SELECT COUNT(*)
- FROM Orders O
- WHERE EXISTS (SELECT *
- FROM @ids i
- WHERE O.OrderID = i.a)
-DROP INDEX test ON Orders
-go
-EXEC List_orders_9
-go
-DROP PROCEDURE List_orders_9
-
When you run this you will get in total four execution plans. The two of
-interest are the second and fourth plans that come from the two identical SELECT COUNT(*) queries. I have
-included the interesting parts of the plans here, together with the pop-up for the Clustered Index Scan operator over the table variable.
-
-
-
In the first plan there is a Nested Loops Join operator together with an
-Clustered Index Seek on the Orders table, which is congruent with the estimate
-of the number of rows in the table variable: one single row, the standard assumption. In the second query, the
-join is carried out with a Merge Join together with a table scan of Orders. As you can see, the estimate for the table variable is now 830 rows, because when recompiling a query, SQL Server
-"sniffs" the cardinality of the table variable, even if it is not a parameter.
-
And with some amount of bad luck this can cause issues similar to those with
-parameter sniffing. I once ran into a situation where a key procedure in our
-system suddenly was slow, and I tracked it down to a statement with a
-table variable where the estimated number of rows was 41. Unfortunately, when this
-procedure runs in the daily processing it's normally called on one-by-one basis,
-so one row was a much better estimate in that case.
-
Speaking of table variables, you may be curious about table-valued
-parameters, introduced in SQL 2008. They are handled very similar to table
-variables, but since the parameter is populated before the procedure is invoked,
-it is now a common situation that SQL Server will use an estimate of more than one row. Here is an example:
-
CREATE TYPE temptype AS TABLE (a int NOT NULL PRIMARY KEY)
-go
-CREATE PROCEDURE List_orders_10 @ids temptype READONLY AS
- SELECT COUNT(*)
- FROM Orders O
- WHERE EXISTS (SELECT *
- FROM @ids i
- WHERE O.OrderID = i.a)
-go
-DECLARE @ids temptype
-INSERT @ids (a)
- SELECT OrderID FROM Orders
-EXEC List_orders_10 @ids
-go
-DROP PROCEDURE List_orders_10
-DROP TYPE temptype
-
The query plan for this procedure is the same as for the second SELECT query in List_orders_9, that is Merge Join + Clustered Index
-Scan of Orders, since SQL Server sees the 830 rows in @ids when the query is
-compiled.
In this chapter we have looked at how SQL Server compiles a stored procedure and what significance the actual parameter values have
-for compilation. We have
-seen that SQL Server puts the plan for the procedure into cache, so that the plan can be reused later. We have also seen that there can be more than one entry
-for the same stored procedure in the cache. We have seen that there is a large number of different cache keys, so potentially there can be very many plans for a single
-stored procedure. But we have also learnt that many of the SET options that are cache keys are legacy options
-that you should never change.
-
In practice, the most important SET option is ARITHABORT, because the default for this option is different in an application and in SQL Server Management
-Studio. This explains why you can spot a slow query in your application, and then run it at good speed in SSMS. The application uses a plan which was compiled
-for
-a different set of sniffed parameter values than the actual values, whereas when you run the query in SSMS, it is likely that there is no plan for ARITHABORT
-ON
-in the cache, so SQL Server will build a plan that fits with your current parameter values.
-
You have also understood that you can verify that this is the case by running
-this command in your query window:
-
SET ARITHABORT OFF
-
and with great likelihood, you will now get the slow behaviour of the application
-also in SSMS. If this happens, you know that you have a performance problem related to
-parameter sniffing. What you may not know yet is how to address this performance problem, and
-in the following chapters I will discussion possible solutions,
-before I return to the theme of compilation, this time for ad-hoc queries, a.k.a. dynamic SQL.
-
Note: There are always these funny variations. The application I mainly work with actually issues SET ARITHABORT ON when it connects, so we should never see this confusing behaviour in SSMS. Except that we do. Some parts of the application also issues the command SET NO_BROWSETABLE ON on connection. I have never been able to understand the impact of this undocumented SET command, but I seem to recall that it is related to early versions of "classic" ADO. And, yes, this setting is a cache key.
Before we delve into how address performance problems related to parameter
-sniffing, which is quite a broad topic, I first like to give some coverage to a
-couple of cases where parameter sniffing is not involved, but where you
-nevertheless may experience different performance in the application and SSMS.
I have already touched at this, but it is worth expanding on a bit.
-
Occasionally, I see people in the forums or the newsgroups that tell me that
-their stored procedure is slow, but when they run the same query outside the
-procedure it's fast. After a few posts in the thread, the truth is revealed: the
-query they are struggling with refer to variables, be that local variables or
-parameters. To troubleshoot the query on its own, they have replaced the
-variables with constants. But as we have seen, the
-resulting stand-alone query is quite different,
-and SQL Server can make more accurate estimates with constants instead of
-variables, and therefore arrive at a better plan. Furthermore, SQL Server does not have to consider that the constant may
-have a different value next time the query is run.
-
A similar mistake is to make the parameters into variables. Say that you have:
-
CREATE PROCEDURE some_sp @par1 int AS
- ...
- -- Some query that refers to @par1
-
You want to troubleshoot this query on its own, so you do:
-
DECLARE @par1 int
-SELECT @par1 = 4711
--- query goes here
-
From what you have learnt here, you know that this is very different from when @par1 really is a parameter. SQL Server has no idea about the value for
-@par1 when you declare it as a local variable and will make standard assumptions.
-
But if you have a 1000-line stored procedure, and one query is slow, how do
-you run it stand-alone with great fidelity, so
-that you have the same presumptions as in the stored procedure?
-
One very simple option, but which also is limited, is to add OPTION (RECOMPILE) at the end of the query. This only works on SQL 2005, where this hint causes
-the query to be recompiled with the values of all variables – parameters or locally declared
-– sniffed and the plan will be compiled under the assumption
-that the values could be different next time. That is, the method is only good if the query refers
-solely to parameters, and
-not to local variables in the procedure. (Because the values of local variables are normally not
-sniffed.) Furthermore, the method does not work on SQL 2008 and later,
-where the implementation of OPTION (RECOMPILE) is more resaonble: SQL Server compiles the query as if
-all variable
-values are constants. (Confusingly, this does not apply to all builds
-of SQL 2008; for a while Microsoft had to revert back to the old
-behaviour because of a critical bug.)
-
What always works is to embed the query in sp_executesql:
-
EXEC sp_executesql N'-- Some query that refers to @par1', N'@par1 int', 4711
-
You will need to double any single quotes in the query to be able to put it in a character literal. If the query refers to local variables, you should assign
-them in the block of dynamic SQL.
-
Yet an option is of course to create dummy procedure with the problematic
-statement; this saves from doubling any quotes. To avoid litter in the database, you could create a temporary stored
-procedure:
-
CREATE PROCEDURE #test @par1 int AS
- -- query goes here.
-
As with
-dynamic SQL, make sure that local variables are locally declared also in your
-dummy. I will need to add the caveat I have not investigated whether SQL Server have special tweaks
-or limitations when optimising temporary stored procedures. Not that I see why there should be any, but I have been burnt before...
You should not forget that one possible reason that the procedure ran slow in the application was simply a matter of blocking. When you tested the query three hours
-later in SSMS, the blocker had completed its work. If you find that no matter how you run the procedure in SSMS, with or without ARITHABORT, the procedure is
-always fast, blocking is starting to seem a likely explanation. Next time you are alarmed that the procedure is slow, you should start your investigation with some
-blocking analysis. That is a topic which is completely outside the scope for this article, but for a good tool to investigate locking, see my
-beta_lockinfo.
This is a problem which is far more common on SQL 2000 than on later versions.
-
For SQL Server 2005 or later to consider indexed views and indexes on computed columns (as well as filtered
-indexes added in SQL 2008) when compiling a query, these settings must be ON: QUOTED_IDENTIFIER, ANSI_NULLS, ANSI_WARNINGS, ANSI_PADDING, CONCAT_NULL_YIELDS_NULL. Furthermore,
-NUMERIC_ROUNDABORT must be OFF. But on SQL 2000, there is one more option that must be ON, and, yes, you guessed it: ARITHABORT. To be precise, this also
-applies on SQL 2005 and SQL 2008 if the database compatibility level is 80. (The reason for this is that on SQL 2000 there is one type of error
-– domain errors, e.g.
-sqrt(-1) – that is covered by ARITHABORT, but not by ANSI_WARNINGS.)
-
Thus, on SQL 2000, an application using the default SET options will not be
-able to take benefit of an index on a computed column or an indexed view, even
-if that would be the optimal query plan. But when you run the query in SSMS or Query
-Analyzer, performance will be a lot better, even if no parameter sniffing is
-involved, because they have ARITHABORT ON by default.
-
If you are stuck on SQL 2000, you could change the client to always submit
-SET ARITHABORT ON (this is not possible through the connection string; it has to
-be submitted separately). You can also use ALTER DATABASE to turn on ARITHABORT
-on database level. (But as I noted above, I find this setting more confusing
-than helpful.)
-
There is a second phenomenon you can run into with indexed computed columns and indexed views. It's not unique to SQL 2000, but it happens a lot more there.
-You have a stored procedure that is slow. You take out the statement and run it on its own, and now it's lightning fast, even if you package it nice and cleanly
-in a temporary stored procedure as above. Why? Run this statement:
Most likely it will return 0 it at least one of the two columns. As I noted
-previously, these two settings, QUOTED_IDENTIFIER and ANSI_NULLS are saved with the procedure, and thus
-the saved settings apply when the procedure runs, not the settings of the connection.
-
But why would these options be OFF? In SQL 2000, you can create stored procedures from Enterprise Manager, and Enterprise Manager always submits SET
-QUOTED_IDENTIFIER OFF and SET ANSI_NULLS OFF prior to creating the object. It does not tell you, and there is no option to turn this madness off.
-A much better deal is to use Query Analyzer: not only does it have the appropriate
-defaults for the SET options, it also offers a far better editing experience. Yet, during the hey days of SQL 2000, it was apparent on the newsgroups that many developers were unaware of Query Analyzer, and used Enterprise Manager
-exclusively.
-
For the most of us SQL 2000 is behind us, but you can still run into this issue for two reasons:
-
-
The database was upgraded from SQL 2000.
-
The procedure was created in a script that was executed with SQLCMD and OSQL, both which run with QUOTED_IDENTIFIER OFF by default. (Always run these
- tools with the -I option to override.)
-
-
To find all bad modules in a database on SQL 2005 or later, you can use this SELECT:
-
SELECT o.name
-FROM sys.sql_modules m
-JOIN sys.objects o ON m.object_id = o.object_id
-WHERE (m.uses_quoted_identifier = 0 or
- m.uses_ansi_nulls = 0)
- AND o.type NOT IN ('R', 'D')
-
An Issue With Linked Servers
-
This section concerns an issue with linked servers when the remote server is earlier than SQL 2012 SP1. Consider this query:
-
SELECT C.*
-FROM SOME_SERVER.Northwind.dbo.Orders O
-JOIN Customers C ON O.CustomerID = C.CustomerID
-WHERE O.OrderID > 20000
-
I ran this query twice, logged in as two different users. The first user is sysadmin on both servers, whereas the second user is a plain user with only SELECT permissions. To ensure that I would get different cache entries, I used different settings for ARITHABORT.
-
When I ran the query as sysadmin I got this plan:
-
-
When I ran the query as the plain user, the plan was different:
-
-
How come the plans are different? It's certainly not parameter sniffing because there are no parameters. As always when a query plan has an unexpected shape or operator, it is a good idea to look at the estimates. Here are the pop-ups for the Remote Query operators in the two plans, with the pop-up for the first plan to the left:
-
-
-
-
-
-
-
-
You can see that the estimates are different. When I ran as sysadmin, the estimate was 1 row, which is a correct number, since there are no Orders in Northwind where the order ID exceeds 20000. But when I ran as a plain user, the estimate was 249 rows. We recognize this particular number as 30 % of 830 orders, or the estimate for an inequality operation when the optimizer has no information. Previously, this was due to an unknown variable value, but in this case there is no variable that can be unknown. No, it is the statistics themselves that are missing.
-
As long as a query accesses only tables in the local server, the optimizer can always access the statistics for all tables in the query; there are no extra permission checks. But this is different with tables on a linked server. When SQL Server accesses a linked server, there is no secret protocol that is only used for inter-server communication. No, instead SQL Server uses the standard OLE DB interface for linked servers, be that other SQL Server instances, Oracle, text files or your home-brewed data source, and connects just like any other user. Exactly how statistics is retrieved depends on the data source and the OLE DB provider in question. In this case, the provider is SQL Server Native Client which retrieves the statistics in two steps. (You can see this by running Profiler against the remote server). First the provider runs the procedure sp_table_statistics2_rowset which returns information about which column statistics there are, as well as their cardinality and their density information. In the second step, the provider runs DBCC SHOW_STATISTICS, a command that returns the full distribution statistics. (We will look closer at this command later in this article.) Here is the catch: up to the RTM version of SQL Server 2012, to have permission to run DBCC SHOW_STATISTICS, you had to be a member of the server role sysadmin or any of the database roles db_owner or db_ddladmin.
-
And this is why I got different results. When running as sysadmin I got the full distribution statistics which indicated that there are no rows with order ID > 20000, and the estimate was one row. (Recall that the optimizer never assumes zero rows from statistics.) But when running as the plain user, DBCC SHOW_STATISTICS failed with a permission error. This error was not propagated, but instead the optimizer accepted that there were no statistics and used default assumptions. Since it did get cardinality information, it learnt that the remote table has 830 rows, whence the estimate of 249 rows.
-
Whenever you encounter a performance problem where a query that includes access to a linked server is slow in the application, but it runs fast when you test it from SSMS, you should always investigate if insufficient permissions on the remote database could be the cause. (Keep in mind that the access to the linked server may not be overt in the query, but could be hidden in a view.) If you determine that permissions on the remote database is the problem, what actions could you take?
-
-
You can add the users to the role db_ddladmin on the remote database, but since this gives them right to add and drop tables, this is not recommendable.
-
By default, when a users connect to a remote server they connect as themselves, but you can set up a login mapping with sp_addlinkedsrvlogin, so that users map to a proxy account that has membership in db_ddladmin. Note that this proxy account must be an SQL login, so this is not an option if the remote server does not have SQL authentication enabled. This solution too is somewhat dubious from a security perspective, although it's better the previous suggestion.
-
In some cases you can rewrite the query with OPENQUERY to force evaluation on the remote server. This can be particularly useful, if the query includes several remote tables. (But it can also backfire, because the optimizer now gets even less statistics information from the remote server.)
-
You could of course use the full battery of hints and plan guides to get the plan you want.
-
Finally, you should ask yourself whether that linked-server access is needed. Maybe the databases could be on the same server? Could data be replicated? Some other solution?
-
-
To repeat: what matters is the permissions on the remote server, not the local server where the query runs. Furthermore, the issue exists only when the SQL Server version of the remote server is the RTM version of SQL Server 2012 or any earlier versions of SQL Server. Starting with service pack 1 of SQL 2012, the permission requirement for DBCC SHOW_STATISTICS has been relaxed, so that it is sufficient to have SELECT permission on the table, making this gotcha null and void. (To be precise, the change came with one of the cumulative updates to the RTM version of SQL 2012, exactly which I don't recall.)
-
Note also that this section has no relevance to what may happen with other remote data sources such as Oracle, MySQL or Access as they have a different permission system. However, if you would run a query from, say, an Oracle server against a remote SQL Server 2008 instance, it is likely that this issue could affect your performance.
We have learnt how it may come that you have a stored
-procedure that runs slow in the application, and the very same call runs fast
-when you try it in SQL Server Management Studio: Because of different settings of
-ARITHABORT you get different cache entries, and since SQL Server employs
-parameter sniffing, you may get different execution plans.
-
While the secret behind the mystery now has been unveiled, the main problem
-still remains: how do you address the performance problem? From what you read
-this far, you already know of a quick
-fix. If you have never seen the problem before and/or the situation is urgent, you
-can always do:
-
EXEC sp_recompile problem_sp
-
As we have seen, this will flush the procedure from the plan cache, and next
-time it is invoked, there will be a new query plan. And if the problems never
-comes back, consider case closed.
-
But if the problem keeps reoccurring – and unfortunately, this is the more
-likely outcome – you need to perform a deeper analysis,
-and in this situation you should not use sp_recompile, or in some
-other way
-alter the procedure. You should keep that slow plan around, so that you can
-examine it, and not the least find what parameter values the bad
-plan was built for. This is the topic for this
-chapter.
-
Before I go on, a small note: above I recommended that you should change
-your preferences in SSMS, so that you by default connect with ARITHABORT
-OFF to
-avoid this kind of confusion. But there is actually a small disadvantage with
-having the same settings as the application: you may not observe that the
-performance problem is related to parameter sniffing. But if you make it a habit
-when investigating performance issue to run your problem procedure with ARITHABORT both ON and
-OFF, you can easily conclude whether parameter sniffing is involved.
All performance troubleshooting requires facts. If you don't have facts you will be in
-the situation that Bryan Ferry describes so well in the song Sea Breezes
-from the first Roxy Music album:
-
- We've been running round in our present state Hoping help will come from
- above But even angels there make the same mistakes
-
-
If you don't have facts, not even the angels will be able to help you. The
-base facts you need to troubleshoot performance issues related to parameter
-sniffing are:
-
-
Which is the slow statement?
-
What are the different query plans?
-
What parameter values did SQL Server sniff?
-
What are the table and index definitions?
-
How does the distribution statistics look like? Is it up to date?
-
-
Almost all of these points apply to about any query-tuning effort. Only
-the third point is unique to parameter-sniffing issues. That, and the plural in
-the second point: you want to look at two plans, the good plan and the bad plan.
-In the following sections, we will look at these points one by one.
First on the list is to find the slow statement – in most cases, the problem
-lies with a single statement. If the procedure has only one statement, this is
-trivial. Else, you can use Profiler to find out; the Duration column will tell
-you. Either just trace the procedure
-from the application, or run the procedure from Management Studio (with
-ARITHABORT OFF!) and filter for your own spid.
-
Yet an option is to use the stored procedure
-sqltrace, written by Lee Tudor and which I am glad to host on my web site.
-sqltrace takes an SQL batch as parameter, starts a server-side trace,
-runs the batch, stops the trace and then summarises the result. There are a
-number of input parameters to control the procedure, for instance how to sort
-the output.
In many cases you can easily find the query plans by running the procedure in
-Management Studio, after first enabling Include Actual Execution Plan (you find
-it under the Query menu). This works well, as long as the procedure does not
-include a multitude of queries, in which case the Execution Plan tab gets too
-littered to work with. We will look at alternative strategies in the next
-section.
-
Typically you would run the procedure like this:
-
SET ARITHABORT ON
-go
-EXEC that_very_sp 4711, 123, 1
-go
-SET ARITHABORT OFF
-go
-EXEC that_very_sp 4711, 123, 1
-
The assumption here is that the application runs with the default options, in
-which case the first call will give the good plan – because the plan is sniffed
-for the parameters you provide – and the second call will run with the bad plan
-which already is in the plan cache.
-To determine the cache keys in sway, you can use the query in the section
-Different Plans for Different Settingsto see the cache-key values for the plan(s) in the cache. (If you already have tried the
-procedure in Management Studio, you may have two entries. The column
-execution_count in sys.dm_exec_query_stats can help you to discern the entries
-from each other; the one with the low count is probably your attempt from SSMS.)
-
Once you have the plans, you can easily find the sniffed parameter values.
-Right-click the left-most operator in the plan – the one that reads SELECT,
-INSERT, etc – select Properties, which will open a pane to the right. (That is
-the default position; the pane is detachable.) Here is an example how it can
-look like:
-
-
The first Parameter Compiled Value is the sniffed value which is
-causing you trouble one way or another. If you know your application and the
-pattern how it is used, you may get an immediate revelation when you see the
-value. Maybe you do not, but at least you know now that there is a situation where the application calls the procedure with this possibly odd
-value.
-
Note also that you can see the
-settings of some of the SET options that are cache keys. However, beware that
-there is a
-
-bug in SQL 2005, so that that the SET options will be always be reported as
-False. This is an engine bug, and thus your version of SSMS does not matter.
-
While Management Studio provides a very good interface to examine query
-plans, I still want to put in a plug for a more versatile alternative, to wit
-SQL
-Sentry Plan Explorer, a free tool from SQL Sentry, a tool vendor in the SQL
-Server space. Their Plan Explorer permits you view the plan in different ways, and it is
-also easier to navigate among the queries if your batch has a lot of them.
-
When you look at a query plan, it is far from always apparent what part of the plan that is really costly. But the
-thickness of the arrows is a good lead. The thicker the arrow, the more rows are passed to the next operator. And if you are looking at an actual execution
-plan, the thickness is based on the actual number of rows. On the other hand, I usually don't give any attention to the percentages at all. They are always
-estimates, and they can be way off, particular it there is a gross misestimate somewhere in the plan.
It is not always feasible to use SSMS to get the query plans and the sniffed parameter values. The bad query maybe runs for more minutes than your patience
-can accept, or the procedure includes too many statements that you only get a mess in SSMS. Not the least this can be an issue if the procedure includes a loop
-that is executed many times, in which case not even SQL Sentry Plan Explorer may be workable.
-
One option to get hold of the query plan and the sniffed parameters is to retrieve it directly from the plan cache. This is quite convenient
-with help of the query below, but there is an obvious limitation with this method: you only get the estimates.
-The actual number of rows and actual number of executions, two values that are
-very important to understand why a plan is bad, are missing.
-
The Query
-
This query will return the statements, the sniffed parameter values and the
-query plans for a stored procedure:
-
DECLARE @dbname nvarchar(256),
- @procname nvarchar(256)
-SELECT @dbname = 'Northwind',
- @procname = 'dbo.List_orders_11'
-
-; WITH basedata AS (
- SELECT qs.statement_start_offset/2 AS stmt_start,
- qs.statement_end_offset/2 AS stmt_end,
- est.encrypted AS isencrypted, est.text AS sqltext,
- epa.value AS set_options, qp.query_plan,
- charindex('<ParameterList>', qp.query_plan) + len('<ParameterList>')
- AS paramstart,
- charindex('</ParameterList>', qp.query_plan) AS paramend
- FROM sys.dm_exec_query_stats qs
- CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) est
- CROSS APPLY sys.dm_exec_text_query_plan(qs.plan_handle,
- qs.statement_start_offset,
- qs.statement_end_offset) qp
- CROSS APPLY sys.dm_exec_plan_attributes(qs.plan_handle) epa
- WHERE est.objectid = object_id (@procname)
- AND est.dbid = db_id(@dbname)
- AND epa.attribute = 'set_options'
-), next_level AS (
- SELECT stmt_start, set_options, query_plan,
- CASE WHEN isencrypted = 1 THEN '-- ENCRYPTED'
- WHEN stmt_start >= 0
- THEN substring(sqltext, stmt_start + 1,
- CASE stmt_end
- WHEN 0 THEN datalength(sqltext)
- ELSE stmt_end - stmt_start + 1
- END)
- END AS Statement,
- CASE WHEN paramend > paramstart
- THEN CAST (substring(query_plan, paramstart,
- paramend - paramstart) AS xml)
- END AS params
- FROM basedata
-)
-SELECT set_options AS [SET], n.stmt_start AS Pos, n.Statement,
- CR.c.value('@Column', 'nvarchar(128)') AS Parameter,
- CR.c.value('@ParameterCompiledValue', 'nvarchar(128)') AS [Sniffed Value],
- CAST (query_plan AS xml) AS [Query plan]
-FROM next_level n
-CROSS APPLY n.params.nodes('ColumnReference') AS CR(c)
-ORDER BY n.set_options, n.stmt_start, Parameter
-
If you have never worked with these DMVs before, I appreciate if this is
-mainly mumbo-jumbo to you. To
-keep the focus on the main subject of this article, I will
-defer to a later section to explain this query. The only thing I like to give
-attention to here and now is that you specify the database and the procedure
-you want to work with in the beginning. You may think this would better be a
-stored procedure, but it is quite likely that you want to add or remove columns, depending on
-what you are looking for.
-
The Output
-
To see the query in this action, you can use this test batch (and, yes, the
-examples get more and more contrived as we move on):
-
CREATE PROCEDURE List_orders_11 @fromdate datetime,
- @custid nchar(5) AS
-SELECT @fromdate = dateadd(YEAR, 2, @fromdate)
-SELECT *
-FROM Orders
-WHERE OrderDate > @fromdate
- AND CustomerID = @custid
-IF @custid = 'ALFKI' CREATE INDEX test ON Orders(ShipVia)
-SELECT *
-FROM Orders
-WHERE CustomerID = @custid
- AND OrderDate > @fromdate
-IF @custid = 'ALFKI' DROP INDEX test ON Orders
-go
-SET ARITHABORT ON
-EXEC List_orders_11 '19980101', 'ALFKI'
-go
-SET ARITHABORT OFF
-EXEC List_orders_11 '19970101', 'BERGS'
-
When you have executed this batch, you can run the query above. When I do
-this I see this result in SSMS:
-
-
-
These are the columns:
-
-SET – The set_options attribute for the plan. As I discussed earlier, this is a bit mask.
-In this picture, you see the two most likely values. 251 is
-the default settings and 4347 is the default settings + ARITHABORT ON. If you see other values, you can use the function
-setoptions to translate the bit mask.
-
-Pos – This is the position for the query in the procedure, counted in
-characters from the start of the batch that created the procedure,
-including any comments preceding CREATE PROCEDURE. Not terribly useful in
-itself, but serves to sort the statements in the order they appear in the
-procedure.
-
-Statement – The SQL statement. Note that the statements are repeated once for
-each parameter in the query.
-
-Parameter – The name of the parameter. Only parameters that
-appear in this statement are listed. As a consequence of this, statements that do not refer to any parameters are not included in the output
-at all.
-
-Sniffed Value – The compile-time value for the parameter, that is, the value
-that the optimizer sniffed when it built the plan. In difference to the Properties pane for the
-plan, you don't see any actual parameter value here. As I discussed previously, the sniffed value for a parameter can be different for different
-statements in the procedure, and you see an example of this in the picture above.
-
-Query Plan – The query plan. If you have SQL Server Management
-Studio 2008 or later, you can click on the XML document, and you will see the graphical
-plan directly. If you have SSMS 2005, you will only see the XML document. You
-can save it with the extension .sqlplan, and then re-open it to see the graphics. As I noted
-above, this is only the estimated plan. You cannot get any actual values from the cache.
-
The Query Explained
-
This query refers to some DMVs which not all readers may be acquainted with. It also uses some query techniques that you
-may not be very familiar with, for instance
-XQuery. It would take up too much space and distract you from the main topic to
-dive into the query in full, so I will explain it only briefly. If the query and the explanation goes over
-your head, don't feel too bad about it. As long you understand the output, you
-can still have use for the query.
-
The query uses two CTEs (Common Table Expression). The first CTE,
-basedata, includes all access to DMVs.
-We have already seen of all of
-them but sys.dm_exec_text_query_plan. There are two more columns we
-retrieve from sys.dm_exec_query_stats, to wit statement_start_offset
-and statement_end_offset. They delimit the statement for this row, and we
-pass them to sys.dm_exec_text_query_plan to get the plan for this
-statement only. (Recall that the procedure is a single cache entry with a
-single plan_handle.) sys.dm_exec_text_query_plan returns the column query_plan
-which contrary to what you may expect is nvarchar(MAX).
-The reason for this is that the XML for a query plan may be so deeply
-nested, that it cannot be represented with SQL Server's built-in xml
-data type. The CTE returns the query plan as such, but it also extracts the
-positions for the part in the document where the parameter values appear.
-
In the next CTE, next_level, I go on and use the values
-obtained in basedata. The CASE
-expression extracts the statement from the text returned by sys.dm_exec_sql_text.
-The way to do this is fairly clunky, not the least with those long column names.
-Since there is little reason to modify that part of the query, I say no more but
-refer you to Books Online. Or just believe me when I say it works. :-) The next
-column in the CTE, params, performs the actual extraction of the parameter
-values from the query-plan document and converts that element to the xml
-data type.
-
In the final SELECT, I shred the params document, so that we get one row
-per parameter. It can certainly be argued that it is better to have all
-parameters on a single row, since in this case each statement will only appear
-once, and you could easily modify the final SELECT to achieve that. In the final
-SELECT, I also convert the query-plan column to XML, but as noted above, this
-could fail because of limitations with the xml data type. If you get such
-an error, just comment out that column.
-
Beside the alterations I have already mentioned, there are several ways you
-could modify the query to get information you find interesting. For instance,
-you could add more columns
-from sys.dm_exec_query_stats or more plan
-attributes. I opted to include the set_options attribute only, since this
-is the cache key which is most likely to vary. If you would like to include all statements in the procedure, including those that do not refer to any of the
-input parameters, just change CROSS APPLY on the next-to-last line to OUTER APPLY.
Yet an alternative to get hold of the query plans is to run a trace against the application or against your connection in SSMS. There are several Showplan
-events you can include in a trace. The most versatile is Showplan XML Statistics Profile which gives you the same information as you see in SSMS when you enable
-Include Actual Execution Plan.
-
However, for several reasons a trace is rarely a very good alternative. To start with, enabling query-plan information in a trace induces quite some load on the
-server. And observe that this applies even if you narrow your filter to a single spid. The way the trace engine works, all processes still have to
-generate the event. I know. By mistake I once left a trace with Showplan XML Statistics Profile, filtered for my own spid,
-running on a production
-server. It wasn't fun.
-
Next, if you run the trace in Profiler, you are likely to find it very difficult to set up a good filter that captures what you want to see but hides all
-the noise. One possibility, once the trace has completed, is to save the trace
-to a table in the database, which permits you to find the interesting
-information through queries. (But don't ask Profiler to save to a table
-while the trace is running. The overhead for that is awful.) The plan is in the
-TextData column. Cast it to xml and then you can view it as I described
-in the previous section.
-
In SQL 2008 you can also use Extended Events to get hold of the query plan, but this does not appear to be any simple work. I have not worked with
-Extended Events myself, so I cannot give any examples.
I assume that you are already acquainted with ways to find out how a table is
-defined, either with sp_help or through scripting, so I jump directly to the topic of indexes. They too can be scripted or you can use sp_helpindex.
-But scripting is bulky in my opinion, and sp_helpindex does not support features
-added in SQL 2005 or later. This query can be helpful:
-
DECLARE @tbl nvarchar(265)
-SELECT @tbl = 'Orders'
-
-SELECT o.name, i.index_id, i.name, i.type_desc,
- substring(ikey.cols, 3, len(ikey.cols)) AS key_cols,
- substring(inc.cols, 3, len(inc.cols)) AS included_cols,
- stats_date(o.object_id, i.index_id) AS stats_date,
- i.filter_definition
-FROM sys.objects o
-JOIN sys.indexes i ON i.object_id = o.object_id
-CROSS APPLY (SELECT ', ' + c.name +
- CASE ic.is_descending_key
- WHEN 1 THEN ' DESC'
- ELSE ''
- END
- FROM sys.index_columns ic
- JOIN sys.columns c ON ic.object_id = c.object_id
- AND ic.column_id = c.column_id
- WHERE ic.object_id = i.object_id
- AND ic.index_id = i.index_id
- AND ic.is_included_column = 0
- ORDER BY ic.key_ordinal
- FOR XML PATH('')) AS ikey(cols)
-OUTER APPLY (SELECT ', ' + c.name
- FROM sys.index_columns ic
- JOIN sys.columns c ON ic.object_id = c.object_id
- AND ic.column_id = c.column_id
- WHERE ic.object_id = i.object_id
- AND ic.index_id = i.index_id
- AND ic.is_included_column = 1
- ORDER BY ic.index_column_id
- FOR XML PATH('')) AS inc(cols)
-WHERE o.name = @tbl
- AND i.type IN (1, 2)
-ORDER BY o.name, i.index_id
-
As listed, the query will not run on SQL 2005, but just remove the final
-column, filter_definition, from the result set. This column applies to
-filtered indexes, a feature added in SQL 2008. As for the column stats_date,
-see the next section.
-
The query only lists regular relational indexes, not XML indexes or spatial indexes. Problems related to searches in XML documents or spatial columns are
-beyond the scope for this article anyway.
To view all statistics for a table, you can use this query:
-
DECLARE @tbl nvarchar(265)
-SELECT @tbl = 'Orders'
-
-SELECT o.name, s.stats_id, s.name, s.auto_created, s.user_created,
- substring(scols.cols, 3, len(scols.cols)) AS stat_cols,
- stats_date(o.object_id, s.stats_id) AS stats_date,
- s.filter_definition
-FROM sys.objects o
-JOIN sys.stats s ON s.object_id = o.object_id
-CROSS APPLY (SELECT ', ' + c.name
- FROM sys.stats_columns sc
- JOIN sys.columns c ON sc.object_id = c.object_id
- AND sc.column_id = c.column_id
- WHERE sc.object_id = s.object_id
- AND sc.stats_id = s.stats_id
- ORDER BY sc.stats_column_id
- FOR XML PATH('')) AS scols(cols)
-WHERE o.name = @tbl
-ORDER BY o.name, s.stats_id
-
As with the query for indexes, the query does not run for SQL 2005 as listed, but just remove filter_definition from the result set. auto_created
-refers to statistics that SQL Server creates automatically when it gets the occasion, while user_created refers to indexes created explicitly with CREATE
-STATISTICS. If both are 0, the statistics exists because of an index.
-
The column stats_date returns when the statistics most recently was
-updated. If the date is way back in the past, the statistics may be out of date.
-The root cause to parameter-sniffing-related problems is usually something else
-than outdated statistics, but it is always a good idea to look out for this. One
-thing to keep in mind is that statistics for columns with monotonically
-increasing data – e.g. id and date columns – quickly go out of date, because
-queries are often for the most recently inserted data, which is always beyond
-the last slot in the histogram (more about histograms later).
-
If you believe statistics are out of date, you can use this command:
-
UPDATE STATISTICS tbl WITH FULLSCAN, INDEX
-
This updates all statistics related to indexes on the table by scanning them
-in full. FULLSCAN is not necessary, but I have been burned too often by
-inaccurate statistics to be really comfortable with sampled statistics (which is
-the default). Restricting the statistics update to indexes only reduces execution
-time considerably, because SQL Server scans the table once for each non-index
-statistics.
-
You can also update statistics for a single index. The syntax for this is not
-what you may expect:
-
UPDATE STATISTICS tbl indexname WITH FULLSCAN
-
Note: there is no period between the table name and the index name, just space.
-
Note that after updating statistics, you may see an immediate performance
-improvement in the application. This does necessarily prove that outdated
-statistics was the problem. Since updated statistics causes recompilation, the
-parameters may be re-sniffed and you get a better plan.
-
To see the distribution statistics for an index use DBCC SHOW_STATISTICS.
-This command takes two parameters. The first is the table name, whereas the
-second can be the name of an index or statistics, but you can also specify a
-column name. For instance:
-
DBCC SHOW_STATISTICS (Orders, OrderDate)
-
This displays three result sets. I will not cover all of them here, but only say that the
-last result set is the actual histogram for the statistics. The histogram
-reflects the distribution that SQL Server has recorded about the data in the
-table. Here is how the first few lines look in the example:
-
-
-
This tells us that according to the statistics there is exactly one row with
-OrderDate = 1996-07-04. Then there is one row in the range from
-1996-07-05 to 1996-07-07 and two rows with OrderDate = 1996-07-08. (Because
-RANGE_ROWS is 1 and EQ_ROWS is 2.) The histogram then continues, and there is in
-total 188 steps for this particular statistics. There are never more than 200
-steps in a histogram. For full details on the output, please see the topic for DBCC
-SHOW_STATISTICS in Books
-Online. One of the white papers listed in the section
-Further Reading has more valuable information
-about statistics and the histogram.
-
Note: In SQL 2005 there is a bug, so if there is a step for
-NULL values, DBCC SHOW_STATISTICS fails to show
-this row. This is a display error, and the value is still there in the
-histogram.
-
You do typically not run DBCC SHOW_STATISTICS for all statistics to have the information
-just in case, but only when you think that the information may be useful to you.
-We will look such an example in the next chapter.
It is important to understand that parameter sniffing in itself is not a problem; au contraire, it is a feature, since without it SQL Server would have to
-rely on blind assumptions, which in most cases would lead to less optimal query plans. But sometimes parameter sniffing works against you.
-We can identify three typical situations:
-
-
The query usage is such that parameter sniffing is entirely inappropriate.
- That is, a plan which is good for a certain execution may be
- inappropriate for the next.
-
There is a specific pattern in the application where one group of calls is
- very different from the main bulk. Often this is a call the
- application performs on start-up or at the beginning of a new day.
-
The index structure for one or more tables is such that there is no perfect
- index for the query, but there are several half-good indexes, and it is
- haphazard which index the optimizer chooses.
-
-
It can be difficult to say beforehand which applies to your situation, and
-that is why you need to make a careful analysis. In the previous section I
-discussed what information you need, although I did not always make it clear
-what for. In addition, there is one more thing I did not list but which be
-immensely helpful: intimate knowledge about how the application works and its
-usage pattern.
-
Since there are several possible reasons why parameter sniffing gives you a
-headache, this means that there is no single solution that you can apply. Rather
-there is a host of them, depending on where the root cause lies. In the following I will give some examples of parameter-sniffing related
-issues and how to address them. Some are real-life examples, others are more
-generic in nature. Some of the examples focus more on the analysis, others take
-a straight look at the solution.
Before I go into the real solutions, let me first point out that adding SET
-ARITHABORT ON to your procedure is not a solution. It will seem to work
-when you try it. But that is
-only because you recreated the procedure which forced a new compilation and then the next invocation sniffed the current set of parameters. SET ARITHABORT ON is
-only a placebo, and not even a good one. The problem will most likely come back. It will not even help you avoid the confusion with
-different performance in the application and SSMS, because the overall cache
-entry will still have ARITHABORT OFF as its plan attribute.
-
So, don't put SET ARITHABORT ON in your stored procedures. Overall, I
-strongly discourage from you using any of the SET commands that are cache keys in
-your code.
CREATE PROCEDURE List_orders_12 @custid nchar(5),
- @fromdate datetime,
- @todate datetime AS
- SELECT *
- FROM Orders
- WHERE CustomerID = @custid
- AND OrderDate BETWEEN @fromdate AND @todate
-
There is a non-clustered index on CustomerID and another one on OrderDate.
-Assume that the order activity among customers varies vividly. Many
-customers make just a handful a orders per year. But some customers are more
-active, and some real big guys may place several orders per day.
-
In the Northwind database, the most active customer is SAVEA with 31 orders,
-whereas CENTC has only one order. Run the below:
That is, for SAVEA we only look at the orders for a single day, but for CENTC
-we look at the orders for an entire year. As you may sense, these two
-invocations are best served by different indexes. Here is the plan for the first invocation:
-
-
SQL Server here uses the index for OrderDate which is the most selective. The plan for the second invocation is different:
-
-
Here CustomerID is the most selective column, and SQL Server uses the index on CustomerID.
-
One solution to address this is to force recompilation every time with the
-RECOMPILE query hint:
-
CREATE PROCEDURE List_orders_12 @custid nchar(5),
- @fromdate datetime,
- @todate datetime AS
-SELECT *
-FROM Orders
-WHERE CustomerID = @custid
- AND OrderDate BETWEEN @fromdate AND @todate
-OPTION (RECOMPILE)
-
With this hint, SQL Server will compile the query every time. Rather than
-using the query hint, you can tell SQL Server to recompile the entire procedure
-on each invocation:
-
CREATE PROCEDURE List_orders_12 @custid nchar(5),
- @fromdate datetime,
- @todate datetime WITH RECOMPILE AS
-
For the example at hand, it has no importance which you use, since the
-procedure consists of a single statement. But for a long procedure with many statements
-of which only one is problematic, WITH RECOMPILE
-is clearly an inferior choice, due to the increase in compilation overhead. An
-interesting effect of WITH RECOMPILE, though, is that the plan is never put into
-the cache at all, whereas this happens when you use OPTION (RECOMPILE).
-
In many cases, forcing recompilation every time is quite alright, but there are a few situations where it
-is not:
-
-
The procedure is called with a very high frequency, and the compilation overhead
- hurts the system.
-
The query is very complex and the compilation time has a noticeable
- negative impact on the response time.
-
-
More to the point, while forcing recompilation is a solution that is
-almost always feasible, it is not always the best solution. As a matter of fact,
-the example we have looked at in this section is probably not very typical for
-the situation "fast in SSMS, slow in the application". Because, if you have
-varying usage pattern, you will be alerted of varying performance within the
-application itself. So there is all reason to read on, and see if the situation
-you are facing fits with the other examples I present.
It is very common to have forms where users can select from a number of
-search conditions. For instance they can select to see orders on a certain date,
-by a certain customer, for a certain product etc, including combinations of the
-parameters. Such procedures are sometimes implemented with a WHERE clauses that
-goes:
-
WHERE (CustomerID = @custid OR @custid IS NULL)
- AND (OrderDate = @orderdate OR @orderdate IS NULL)
- ...
-
As you may imagine, parameter sniffing is not beneficial for such procedures.
-I am not going to take up much space on this problem here, for two
-reasons: 1) As I've already said, problem with such procedures usually manifests
-itself with varying performance within the application. 2) I have a
-separate article devoted to this topic, entitled Dynamic
-Search Conditions in T‑SQL.
Some time ago, one of my clients contacted me because one of their customers
-experienced a severe performance problem with a function in their system. My
-client said that the same code ran well at other sites, and there had been no
-change recently to the application. (But you know, clients always say that, it seems.) They had been able to isolate the
-problematic procedure, which included a query which looked something like this:
-
SELECT DISTINCT c.*
-FROM Table_C c
-JOIN Table_B b ON c.Col1 = b.Col2
-JOIN Table_A a ON a.Col4 = b.Col1
-WHERE a.Col1 = @p1
- AND a.Col2 = @p2
- AND a.Col3 = @p3
-
When executed from the application, the query took 10-15 minutes. When they
-ran the procedure from SSMS, they found that response time was instant. That was then they called me.
-
An account was set up for me to make it possible to log in to the site in question. I found
-that all three tables were of some size, at least a million rows in each. I looked
-at the indexes for Table_A, and I found that it had some 7-8 indexes. Of interest
-for this query was:
-
-
One non-clustered, non-unique index Combo_ix on (Col1, Col2, Col5, Col4) and
- maybe some more columns.
-
One non-clustered, non-unique index Col2_ix on (Col2).
-
One non-clustered, non-unique index Col3_ix on (Col3).
-
-
Thus, where was no index that covered all conditions in the WHERE clause.
-
When I ran the procedure in SSMS with default settings, the optimizer choose
-the first index to get data from Table_A. When I changed the setting of ARITHABORT
-to OFF to match the application, I saw a plan that used the index on Col3.
-
At this point I ran
-
DBCC SHOW_STATISTICS (Table_A, Col3_ix)
-
The output looked like something like this:
-
-
-
-
-
-
-
RANGE_HI_KEY
-
RANGE_ROWS
-
EQ_ROWS
-
DISTINCT_RANGE_ROWS
-
AVG_RANGE_ROWS
-
-
-
APRICOT
-
0
-
17
-
0
-
1
-
-
-
BANANA
-
0
-
123462
-
0
-
1
-
-
-
BLUEBERRY
-
0
-
46
-
0
-
1
-
-
-
CHERRY
-
0
-
92541
-
0
-
1
-
-
-
FIG
-
0
-
1351
-
0
-
1
-
-
-
KIWI
-
0
-
421121
-
0
-
1
-
-
-
LEMON
-
0
-
6543
-
0
-
1
-
-
-
LIME
-
0
-
122131
-
0
-
1
-
-
-
MANGO
-
0
-
95824
-
0
-
1
-
-
-
ORANGE
-
0
-
10410
-
0
-
1
-
-
-
PEAR
-
0
-
46512
-
0
-
1
-
-
-
PINEAPPLE
-
0
-
21102
-
0
-
1
-
-
-
PLUM
-
0
-
13
-
0
-
1
-
-
-
RASPBERRY
-
0
-
95
-
0
-
1
-
-
-
RHUBARB
-
0
-
7416
-
0
-
1
-
-
-
STRAWBERRY
-
0
-
24611
-
0
-
1
-
-
-
-
That is, there were only 17 distinct values for this column and with a very
-uneven distribution among these values. I also confirmed this fact by
-running the query:
-
SELECT Col3, COUNT(*) FROM Table_A GROUP BY Col3 ORDER BY Col3
-
I proceeded to look at the bad query plan to see what value that the optimizer
-had sniffed
-for @p3. I found that it was – APPLE, a value not present
-in the table at all! That is, the first time the procedure was executed, SQL
-Server had estimated that the query would return a single row (recall that it
-never estimates zero rows), and that the index on Col3 would be the most
-efficient index to find that single row.
-
Now, you may ask how it could be that unfortunate that the procedure was
-first executed for APPLE? Was that just bad luck? Since I don't know this
-system, I can't tell for sure, but apparently this had happened more than
-once. I got the impression that this procedure was
-executed many times as part of some bigger operation. Say that the operation would always start with APPLE. Remember that reindexing a table triggers recompilation, and it is
-very common to run maintenance jobs at night to keep fragmentation in check.
-That is, the first call in the morning can be very decisive for your
-performance. (Why would the operation start with a value that is not in the
-database? Who knows, but maybe APPLE is an unusual condition that needs to be
-handled first if it exists. Or maybe it is just the alphabet.)
-
For this particular query, there is a whole slew of possible measures to
-address the performance issue.
-
-
OPTION (RECOMPILE) / WITH RECOMPILE
-
Add the "optimal" index on (Col1, Col2, Col3) INCLUDE (Col4).
-
Make the index on Col3 filtered or drop it entirely.
-
Use an index hint to force use of any of the other indexes.
-
The query hint OPTIMIZE FOR.
-
Copy @p3 to a local variable.
-
Change the application behaviour.
-
-
We have already looked at forcing recompilation, and while it most probably would have solved the problem, it is not likely that it would have been
-the best solution. Below, I will look into the other options in more detail.
-
Add a New Index
-
My primary recommendation to the customer was the second on the list: add an index that
-matches the query perfectly. That is, an index where all columns in the WHERE
-clauses are index keys, with the least selective column Col3 last among the
-keys. On top of that, add Col4 as an included column, so that the query can be
-resolved from the new index alone, without any need to access the data pages.
-
However, adding a new index is not always a good solution. If you have a table
-which is accessed in a multitude of ways, it may not be feasible to add indexes
-that matches all WHERE and JOIN conditions, even less to add covering indexes
-for each and every query. Particularly, this applies to tables with a heavy
-update rate, like an Orders table. The more indexes you add to a table, the
-higher the cost to insert, update and delete rows in the table.
-
Change / Drop the Index on Col3
-
How useful is the index on Col3 really? Since I don't know this system
-it is difficult to tell. But generally, indexes on columns with only a small
-set of values are not very selective and thus not that useful. So an option could be to drop
-the
-index on Col3 altogether and thereby save the optimiser from this trap. Maybe
-the index was added at some point in time
-by mistake, or it was added without understanding of how the database would look like after a
-couple of years. (Having worked a little more with this client, it
-seems that they add indexes on all FK columns a matter of routine. Which may or
-may not be a good idea.)
-
It cannot be denied, that you have to be a very brave person to drop
-an index entirely. You can consult sys.dm_dbindex_usage_stats
-to see how much the index is used. Just keep in mind that this DMV is cleared
-when SQL Server is restarted or the database is taken offline.
-
Since the distribution in Col3 is so uneven, it is not unlikely that there are queries that look for these rare values specifically. Maybe FIG is "New
-unprocessed rows". Maybe RASPBERRY means "errors". In this case, it could be
-beneficial to make Col3_ix a filtered index, a new feature added in SQL 2008. For instance, the index definition could read:
-
CREATE INDEX col3_ix ON Table_A(col3) WHERE col3 IN ('FIG', 'RASPBERRY', 'APPLE', 'APRICOT')
-
This has two benefits:
-
-
The size of the index is reduced with more than 99%.
-
The index is no longer eligible for the problem query. Recall that SQL
- Server must select a plan which is correct for all input values, so even if
- the sniffed parameter value is APPLE, SQL Server cannot use the index, because
- the plan would yield incorrect result for KIWI.
-
-
Force a Different Index
-
If you know that the index on Col1, Col2 will always be the best index, but
-you don't want to add or drop any index, you can force the index with:
-
SELECT c.*
-FROM Table_C c
-JOIN Table_B b ON c.Col1 = b.Ccol2
-JOIN Table_A a WITH (INDEX = Combo_ix) ON a.Col4 = b.Col1
-WHERE a.Col1 = @p1
- AND a.Col2 = @p2
- AND a.Col3 = @p3
-
You can even say:
-
WITH (INDEX (combo_ix, col2_ix))
-
to give the optimizer the choice between the two "good" indexes.
-
Index hints are very popular, too popular one might say. You should think
-twice before you add an index hint, because tomorrow your data distribution may
-be different, and another index would serve the query better. A second problem
-is that if you later decide to rearrange the indexes, the query will fail with
-an error because of the missing index.
-
OPTIMIZE FOR
-
OPTIMIZE FOR is a query hint that permits you to control parameter sniffing.
-For the example query, it could look like this:
-
SELECT c.*
-FROM Table_C c
-JOIN Table_B b ON c.col1 = b.col2
-JOIN Table_A a ON a.col4 = b.col1
-WHERE a.col1 = @p1
- AND a.col2 = @p2
- AND a.col3 = @p3
-OPTION (OPTIMIZE FOR (@p3 = 'KIWI'))
-
The hint tells SQL Server to ignore the input value, but instead compile the
-query as if the input value of @p3 is KIWI, the most common value in
-Col3. This will surely dissuade SQL Server from using the index.
-
A second option, available only in SQL 2008 and later, is:
-
OPTION (OPTIMIZE FOR (@p3 UNKNOWN))
-
Rather than hard-coding any particular value, we can tell SQL Server to make
-a blind assumption to completely kill parameter sniffing for @p3.
-
It is worth adding that you can use OPTIMIZE FOR also with locally declared
-variables, and not only with parameters.
-
Copy @p3 to a Local Variable
-
Rather than using @p3 directly in the query, you can copy it to a local
-variable, and then use the variable in the query. This has the same effect as
-OPTIMIZE FOR UNKNOWN. And it works on any version of SQL Server.
-
Change the Application
-
Yet an option is to change the processing in the application so that it starts
-with the one of the more common values. It's not really a solution I recommend,
-because it creates an extra dependency between the application and the database.
-There is risk that the application two years later is rewritten to
-accommodate new requirements that PEACH rows must be handled, and this handling
-is added first...
-
Then again, there may be a general flaw in the process. Is the application
-asking for values for one fruit at a time, when it should be getting values for
-all fruits at once? I helped this client with another query. We had a
-query-tuning session in a conference room, and I was never able to get really
-good performance from the query we were working with. But towards the end of the day, the responsible
-developer said that he knew how to continue, and his solution was to rearchitect
-the entire process the problematic query was part of.
-
Summing it Up
-
As you have seen in this example, there are a lot of options to choose from – too
-many, you may think. But performance tuning often requires you to have a
-well-stuffed bag of tricks, because different problems call for different
-solutions.
In
-the system I work with most of my time, there is a kind of application cache that keeps data in a main-memory database, let's call it MemDb. It is used for
-several purposes, but the main purpose is to serve as a cache from which the
-customer's web server can retrieve data rather than querying the database.
-Typically, in the morning there is a total refresh of the data. When data in a
-database table is updated, there is a signalling mechanism which triggers MemDb to run a
-stored procedure to get the delta. In order to
-find what has changed, MemDb relies on timestamp columns. (A timestamp column
-holds an 8-byte value that is unique to the database and which grows
-monotonically. It is
-automatically updated when the row is inserted or updated.) A typical stored procedure
-to retrieve changes looks like this:
-
CREATE PROCEDURE memdb_get_updated_customers @tstamp timestamp AS
- SELECT CustomerID, CustomerName, Address, ..., tstamp
- FROM Customers
- WHERE tstamp > @tstamp
-
When MemDb calls these procedures, it passes the highest value in the tstamp
-column for the table in question from the previous call. When the procedure is invoked for a refresh, the main-memory database passes 0x as the parameter to get
-all rows.
-
Side note: The actual scheme is more complicated than the
-above; I have simplified it to focus on what is important for this article. If you are
-considering something similar,
-be warned that as shown, this example has lots of issues with concurrent updates,
-not the least if you use any form of snapshot isolation. SQL 2008 introduced Change Tracking which is a more solid
-solution, particularly designed for this purpose. I also like to add that MemDb was not my idea, nor was I involved in the design of it.
-
At one occasion when I monitored the performance for a customer that just
-had went live with our system, I noticed that the MemDb procedures had quite
-long execution times. Since they run very often to read deltas, they have to
-be very quick. After all, one idea with MemDb is to take load off from the
-database – not add to it.
-
For a query like the above to be fast there has to be an index on tstamp,
-but will this index be used? From what I said above, the first thing in the
-morning, MemDb would run:
It is not uncommon that during the night that query plans fall out of
-the cache because of nightly batches that consume a lot of memory. Or there is a
-maintenance job to rebuild indexes which triggers recompiles. So typically,
-when the morning refresh runs, there is not any plan in the cache, and the
-value sniffed is 0x. Given this value, will the optimizer use the index on
-tstamp? Yes, if it is the clustered index. But since a timestamp column is
-updated every time a row is updated, it is not a very good choice for the
-clustered index, and all our indexes on timestamp columns are non-clustered. (And
-for tables with a high update frequency, also a non-clustered index on a
-timestamp column may be questionable.) Thus, since the optimizer sees that the
-parameter indicates that all rows in the table will be retrieved, it settles for
-a table scan. This plan is put into cache, and subsequent calls also scan the table,
-even if they are only looking for the most recent rows. And it was this poor
-performance that I saw.
-
When you have a situation like this, there are, just like in the previous
-example, several ways to skin the cat. But before we look at the possibilities,
-we need to make one important observation: there is no query plan that is good
-for both cases. We want to use the index to read the deltas, but when making the
-refresh we want the scan. Thus, only solutions that can yield different plans
-for the two cases need to apply.
-
OPTION (RECOMPILE)
-
While this solution meets the requirement, it is not a good solution. This
-means that every time we retrieve a delta, there is compilation. And while the
-above procedure is simple, some of the MemDb procedures are decently complex with
-a non-trivial cost for compilation.
-
EXECUTE WITH RECOMPILE
-
Rather than requesting recompilation inside the procedure, it is better to do
-it in the special case: the refresh. The refresh only happens once a day normally. And furthermore, the refresh is fairly costly in itself, so the cost of
-recompilation is marginal in this case. That is, when MemDb wants to make a refresh, it should call the procedure in this way:
-
EXECUTE memdb_get_updated_customers WITH RECOMPILE
-
As I noted previously, it is likely that there is no plan in the cache early
-in the morning, so you may ask what's the point? The point is that when you use WITH
-RECOMPILE with EXECUTE, the plan is not put into cache. Thus, the refresh can
-run with the scan, but the plan in the cache will be built from the first delta
-retrieval. (And if the plan for reading the delta still is in the cache, that plan will remain in the cache.)
-
For the particular problem in our system, this was the solution I mandated. An extra advantage for us was that there was a single code path in MemDb that
-had to be changed.
-
There is however a slight problem with this solution. Normally, when you call
-a stored procedure from a client, you use a special command type where you
-specify only the name of the procedure. (For instance,
-CommandType.StoredProcedure in ADO .NET.) The client API then makes an RPC
-(remote procedure call) to SQL Server, and there is never an EXECUTE statement as such.
-Very few client APIs seem to expose any method to specify
-WITH RECOMPILE when you call a procedure through RPC. The workaround is to send
-the full EXECUTE command, using CommandType.Text or similar, for
-instance:
-
cmd.CommandType = CommandType.Text;
-cmd.Text = "EXECUTE memdb_get_updated_customers @tstamp WITH RECOMPILE";
-
Note: You should pass the parameters through the Parameters collection or
-corresponding mechanism in your API; don't inline the values in the string with
-the EXEC command, as this could open for
-SQL injection.
-
Using a Wrapper Procedure
-
If you have a situation where you realise that EXECUTE WITH RECOMPILE is the
-best solution, but it is not feasible to change the client, you can introduce a
-wrapper procedure. In our example the original procedure would be renamed to
-memdb_get_updated_customers_inner, and then you would write a wrapper that
-goes:
-
CREATE PROCEDURE memdb_get_updated_customers @tstamp timestamp AS
- IF @tstamp = 0x
- EXECUTE memdb_get_updated_customers_inner @tstamp WITH RECOMPILE
- ELSE
- EXECUTE memdb_get_updated_customers_inner @tstamp
-
In many cases this can be a plain and simple solution, particularly if you have a small number of such procedures. (We have many.)
-
Different Code Paths
-
Another approach would be to have different code paths for the two cases:
-
CREATE PROCEDURE memdb_get_updated_customers @tstamp timestamp AS
- IF @tstamp = 0x
- BEGIN
- SELECT CustomerID, CustomerName, Address, ..., tstamp
- FROM Customers
- END
- ELSE
- BEGIN
- SELECT CustomerID, CustomerName, Address, ..., tstamp
- FROM Customers WITH (INDEX = timestamp_ix)
- WHERE tstamp > @tstamp
- END
-
Note that it is important to force the index in the ELSE branch, or else this branch will scan the table if the first call to the procedure is for @tstamp =
-0x because of parameter sniffing. If your procedure is more complex and includes joins to other tables, it is
-not likely that this strategy will work out, even if you force the index on
-tstamp. The estimates for the joins would be grossly incorrect and the query plans would still be optimized to get all data, and not the delta.
-
Different Procedures
-
In the situation we had, there was one procedure that was particularly
-difficult. It retrieved account transactions (this is a system for stock
-trading). The refresh would not retrieve all transactions in the database, but
-only from the N most recent days, where N was a system parameter read from the
-database. In this database N was 20. The procedure did not read from a single
-table, but there was umpteen other tables in the query. Rather than having a
-timestamp parameter, the parameter was an id. This works since transactions are never
-updated, so MemDb only needs to look for new transactions.
-
I found that in this case EXECUTE WITH RECOMPILE alone would not save the
-show, because there were several other problems in the procedure. I found no
-choice but to have two procedures, one for the refresh and one for the delta. I replaced the
-original procedure with a wrapper:
-
CREATE PROCEDURE memdb_get_transactions @transid int AS
- IF coalesce(@transid, 0) = 0
- EXECUTE memdb_get_transactions_refresh
- ELSE
- BEGIN
- DECLARE @maxtransid int
- SELECT @maxtransid = MAX(transid) FROM transactions
- EXECUTE memdb_get_transactions_delta @transid, @maxtransid
- END
-
I had to add @maxtransid as a parameter to the delta procedure, because with an open condition like WHERE
-transid > @transid, SQL Server would tend to
-miss-estimate the number of rows it had to read. Making the interval
-closed addressed that issue, and by passing @maxtransid as a parameter, SQL
-Server could sniff the value.
-
From a maintainability perspective, this is by means not a pleasant step to
-take, not the least when the logic is as complicated as in this case. If you have
-to do this, it is
-important that you litter the code with comments to tell people that if they
-change one procedure, they need to change the other one as well.
-
Note: a few years later, a colleague rewrote
-memdb_get_transactions_refresh to become a second wrapper. As I mentioned, it
-reads some system parameters to determine which transactions to read. To get
-the refresh to perform decently, he found that he had to pass the values of these system
-parameters, as well as the interval of transactions ids to read as parameters to
-an inner procedure to get full benefit of parameter sniffing. (We were still on SQL 2000 at the time. In SQL 2005 or later OPTION (RECOMPILE) would have
-achieved the same thing.)
There may also be situations where the root cause to the problem is simply
-poorly written SQL. As just one example, consider this query:
-
SELECT ...
-FROM Orders
-WHERE (CustomerID = @custid OR @custid IS NULL)
- AND (EmployeeID = @empid OR @empid IS NULL)
- AND convert(varchar, OrderDate, 101) = convert(varchar, @orderdate, 101)
-
The idea is that users here are able to search orders for a given date, and
-optionally they can also specify other search parameters. The programmer here
-consdiders
-that OrderDate may include a time portion, and factors it out by using a format
-code to convert() that produces a string without time, and to be really sure he
-performs the same operation on the input parameter. (In Northwind, OrderDate is
-always without a time portion, but for the sake of the example, I'm assuming
-that this is not the case.)
-
For this query, the index on OrderDate would be the obvious choice, but the
-way the query is written, SQL Server cannot seek that index, because OrderDate is
-entangled in an expression. This is sometimes referred to that the expression is
-not sargable, where sarg is short for search argument, that is,
-something that can be used as a seek predicate in a query. (Personally, I don't think
-the term "sargable" is a very useful one, but since you see people drop it from
-time to time, I figured that I should mention this piece of jargon.)
-
Since the index on OrderDate has been disqualified, the optimizer may settle
-for any of the other indexes, depending on the input for the first parameter,
-causing poor performance for other types of searches. The remedy is to rewrite
-the query, for instance like:
-
SELECT ...
-FROM Orders
-WHERE (CustomerID = @custid OR @custid IS NULL)
- AND (EmployeeID = @empid OR @empid IS NULL)
- AND OrderDate >= @orderdate
- AND OrderDate < dateadd(DAY, 1, @orderdate)
-
(It seems reasonable to assume that an input parameter which is supposed to be a date
-does not have any time portion, so there is little reason to litter the code
-with any extra conversion.)
-
Poorly written SQL, often manifests itself in general performance problems –
-that is, the query always runs slow – and maybe not so often in situations where
-parameter sniffing matters. Nevertheless, when you battle your parameter-sniffing problem, there is all reason to investigate whether the query could be
-written in a way that avoids the dependency of the input parameter for a good
-plan. There are many ways to write bad SQL, and this is not the place the list
-them all. Hiding columns in an expression is just one example, albeit a common one. Sometimes the expression is hidden because it is due to implicit
-conversion. Examine the plan, and when an index is not used as you would expect, go back and look at the query again.
We leave the topic of parameter sniffing and to go back to the base topic for
-this article: why a query may run slow in the application, yet fast in SQL
-Server Management Studio. Hitherto we have only looked at stored procedures, and
-with stored procedures the reason is most often due to different settings for
-SET ARITHABORT. If you have an application that does not use stored procedures,
-but generates the queries in the client or the middle layer, there are a few more
-reasons why you may get a new cache entry when you run the query in SSMS and
-maybe also a different plan than in the application.
Dynamic SQL is any SQL which not part of a stored procedure (or any other
-type of module). This includes:
-
-
SQL statements executed with EXEC() and sp_executesql.
-
SQL statements sent directly from the client.
-
SQL statements submitted from modules written in the SQLCLR.
-
-
Dynamic SQL comes in two flavours, unparameterised and parameterised. In
-unparameterised SQL, the programmer composes the SQL string by concatenating the
-language elements with the parameter values. For instance, in T‑SQL:
-
SELECT @sql = 'SELECT mycol FROM tbl WHERE keycol = ' + convert(varchar, @value)
-EXEC(@sql)
-
Or in C#:
-
cmd.CommandText = "SELECT mycol FROM tbl WHERE keycol = " + value.ToString();
SQL Server compiles dynamic SQL very much in the same way as stored
-procedures. That is, if the batch consists of more than one query, the entire batch
-is nevertheless compiled as a whole, and SQL Server has no knowledge of the values
-of local variables in the batch. As with stored procedures, SQL
-Server sniffs the values of parameters, and uses these values when
-building the query plan.
-
There is however one initial step in compilation which is unique dynamic SQL,
-to wit parameterisation. That is, SQL Server may replace a constant in the query
-with a parameter. For example, if you have:
-
SELECT * FROM Orders WHERE OrderID = 11000
-
SQL Server will compile this as you had submitted
-
EXEC sp_executesql N'SELECT * FROM Orders WHERE OrderID = @p1', N'@p1 int', @p1 = 11000
-
There are two modes of parameterisation, simple and forced. With simple
-parameterisation, SQL Server only parameterises a fairly narrow class of simple
-queries. With forced parameterisation, SQL Server replaces about all constants
-with parameters, with some exceptions, as detailed in
-this topic
-in Books Online. The default mode is simple parameterisation, and you set the
-mode per database with ALTER DATABASE.
-
Forced parameterisation can be a big performance saver for an application
-that does not used parameterised statements, but there is little reason to use
-it with well-written applications.
Query plans for dynamic SQL are put into the plan cache, just like plans for
-stored procedures. (If you hear someone telling you something else, that person
-is either just confused or relying on very old information. Up to SQL Server 6.5, SQL Server did
-not cache plans for dynamic SQL.) As with stored procedures, plans
-for dynamic SQL may be flushed from the
-cache for a number of reasons, and individual statements may be recompiled.
-Furthermore, there may be more than one plan for the same query text
-because of difference in SET options.
-
However, there are two complications with dynamic SQL which do not apply to
-stored procedures.
-
The Query Text as Hash Key
-
When SQL Server looks up a stored procedure in the cache, it uses the name of
-the procedure. But that is not possible with dynamic SQL, as there is no
-name. Instead, SQL Server computes a hash from the query text – including any
-parameter list – and uses this hash as a key in the plan cache. And here is
-something very important: this hash value is computed without any normalisation
-whatsoever of the batch text. Comments are not stripped. White space is not
-trimmed or collapsed. Case is not forced to upper or lowercase, even if
-the database has a case-insensitive collation. The hash is computed from the
-text exactly as submitted, and any small difference will yield a different hash
-and a different cache entry.
-
Run this with Include Actual Execution Plan enabled:
-
EXEC sp_executesql N'SELECT * FROM Orders WHERE OrderDate > @orderdate',
- N'@orderdate datetime', '20000101'
-EXEC sp_executesql N'SELECT * FROM Orders WHERE OrderDate > @orderdate',
- N'@orderdate datetime', '19980101'
-EXEC sp_executesql N'select * from Orders where OrderDate > @orderdate',
- N'@orderdate datetime', '19980101'
-
You will find that the first two calls use the same plan, Index Seek + Key
-Lookup, whereas the third query uses a Clustered Index Scan. That is, the second
-call reuses the plan created for the first call. But in the third call, the SQL
-keywords are in lowercase, why there is no cache hit, and a new plan is created. Just to
-enforce this fact, here is a second example with the same result.
-
DBCC FREEPROCCACHE
-go
-EXEC sp_executesql N'SELECT * FROM Orders WHERE OrderDate > @orderdate',
- N'@orderdate datetime', '20000101'
-EXEC sp_executesql N'SELECT * FROM Orders WHERE OrderDate > @orderdate',
- N'@orderdate datetime', '19980101'
-EXEC sp_executesql N'SELECT * FROM Orders WHERE OrderDate > @orderdate ',
- N'@orderdate datetime', '19980101'
-
The difference is that there is a single trailing space in the third statement.
-
The Significance of the Default Schema
-
The other difference to stored procedures is less obvious, and is best shown
-with an example. Run this and look at the execution plans:
-
DBCC FREEPROCCACHE
-go
-CREATE SCHEMA Schema2
-go
-CREATE USER User1 WITHOUT LOGIN WITH DEFAULT_SCHEMA = dbo
-CREATE USER User2 WITHOUT LOGIN WITH DEFAULT_SCHEMA = Schema2
-GRANT SELECT ON Orders TO User1, User2
-GRANT SHOWPLAN TO User1, User2
-go
-EXEC sp_executesql N'SELECT * FROM Orders WHERE OrderDate > @orderdate',
- N'@orderdate datetime', '20000101'
-go
-EXECUTE AS USER = 'User1'
-EXEC sp_executesql N'SELECT * FROM Orders WHERE OrderDate > @orderdate',
- N'@orderdate datetime', '19980101'
-REVERT
-go
-EXECUTE AS USER = 'User2'
-EXEC sp_executesql N'SELECT * FROM Orders WHERE OrderDate > @orderdate',
- N'@orderdate datetime', '19980101'
-REVERT
-go
-DROP USER User1
-DROP USER User2
-DROP SCHEMA Schema2
-go
-
The first two executions use Index Seek + Key Lookup, whereas the third uses
-Clustered Index Scan, despite the query and the parameter being identical to the
-second query. What is going on?
-
First something about the setup. The script creates two database users and
-grants them the permissions to run the queries. We run the query three times.
-First as ourselves (presumably we are dbo), and then we impersonate the two
-newly created users. (If you are not acquainted with impersonation, look up the topic for
-EXECUTE AS
-in Books Online; I also cover it in my article
-Granting Permissions through Stored Procedures.) The users are
-login-less, but that is only because we don't need any logins for this
-example. What is important is
-that they have different default schemas. User1 has dbo as its default schema,
-but not User2. Why does this matter?
-
Keep in mind that when SQL Server looks up an object, it first looks in the
-default schema of the user, and if the object is not found, it looks in
-the dbo schema. For dbo and User1, the query is unambiguous, since dbo
-is their default schema and this is the schema for the Orders table. But
-for User2 this is different. Currently there is only dbo.Orders, but what if Schema2.Orders is added later?
-Per the rules, User2 should now get data from that table and not from dbo.Orders. But
-if User2 would use the same cache entry as dbo
-and User1, that would not happen. Therefore, User2
-needs a cache entry of its own. If Schema2.Orders is added, that cache entry can
-be invalidated without affecting other users.
-
We can see this is the plan attributes. Here is a variation of the query we
-ran for stored procedures:
-
SELECT qs.plan_handle, a.attrlist
-FROM sys.dm_exec_query_stats qs
-CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) est
-CROSS APPLY (SELECT epa.attribute + '=' + convert(nvarchar(127), epa.value) + ' '
- FROM sys.dm_exec_plan_attributes(qs.plan_handle) epa
- WHERE epa.is_cache_key = 1
- ORDER BY epa.attribute
- FOR XML PATH('')) AS a(attrlist)
-WHERE est.text LIKE '%WHERE OrderDate > @orderdate%'
- AND est.text NOT LIKE '%sys.dm_exec_plan_attributes%'
-
There are three differences to the query for stored procedures:
-
-
There is no condition on db_id(), since this column is only populated for
- sql_handles from stored procedures.
-
As there is no procedure name to match on, we have to use part of the
- query text.
-
We need an extra condition to filter out the query against
- sys.dm_exec_plan_attributes itself.
-
-
When I ran this query, I saw this (partial) list of attributes:
First look at objectid. As you see, this value is identical for the
-two entries. This object id is the hash value that I described above. Next, look at the attribute which is
-distinctive: user_id. The name as such is a misnomer; the value is the
-default schema for the users using this plan. The dbo schema always has schema_id = 1. In my
-Northwind database, Schema2 got schema_id = 5 when I ran the query, but you may
-see a different value.
-
Now run this query:
-
EXEC sp_executesql N'SELECT * FROM dbo.Orders WHERE OrderDate > @orderdate',
- N'@orderdate datetime', '20000101'
-
And then run the query against sys.dm_exec_plan_attributes again.
-A third row in the output appears:
objectid is different from above, since the query text is different.
-user_id is now
--2. What does this mean? If you look closer at the query, you see now that we
-now specify the schema explicitly when we access the Orders table. That is, the query is
-now unambiguous, and all users can use this cache entry. And that is
-exactly what user_id = -2 means: there are no ambiguous object references in the
-query. The corollary of this is that it is very much best practice to always use
-two-part notation in dynamic SQL, no matter whether you create the dynamic SQL
-in a client program or in a stored procedure.
-
You may think that "we don't use schemas in our app, so this is not an issue
-for us", but not so fast! When you use CREATE USER, the default schema for the
-new user is indeed dbo, unless you specify something else. However, if the DBA
-is of the old school, he may create users with any of the legacy procedures
-sp_adduser and sp_grantdbaccess, and they work differently. They not
-only create a user, but they also create a schema with the same name as the
-user and set this schema as the default schema for the newly created user and
-make this use the owner of the schema. Does it sound corny? Yes, but up to SQL 2000, schema and users
-were unified in SQL Server. Since you may not have control over how users are
-created, you should not rely on that users have dbo as their default schema.
-
Finally, you may wonder why this issue does not apply to the caching of plans for
-stored procedures. The answer is that in a stored procedure, the name resolution
-is always performed from the procedure owner, not the current user. That is, in
-a procedure owned by dbo, Orders can only refer to dbo.Orders never to
-any Orders table in some other schema. (But keep in mind that this applies only
-to the direct query text of the stored procedure. It does not apply to dynamic
-SQL invoked with EXEC() or sp_executesql inside the procedure.)
As you understand from the previous section, there are a few more pitfalls
-when you want to troubleshoot an application query from SSMS which may cause you
-to get a different cache entry, and potentially a different query plan.
-
As with stored procedures, you need to keep ARITHABORT and other SET options
-in mind. But you also need to make sure that you have exactly the same query
-text, and that your default schema agrees with the user running the application.
-
The latter is the easiest to deal with. In most cases this will do:
-
EXECUTE AS USER = 'appuser'
-go
--- Run SQL here
-go
-REVERT
-
appuser is here the database user that the application uses – either a private user for the application, or the user name for the actual person using
-the database. However, this fails if the query access resources outside the current database. In this case you can use EXECUTE AS LOGIN instead.
-Note that this requires a server-level permission.
-
Retrieving the exact SQL text can be more difficult. The best is use a trace to capture the SQL; you can run the trace either in Profiler or
-as a
-server-side trace. If the SQL statement is unparameterised, you need to be careful that you copy the full text, and then select exactly that text in SSMS. That
-is, do not drop or add any leading or trailing blanks. Don't add line breaks to
-make the query more readable, and don't delete any comments. Keep it exactly as
-the application runs it. You can use the query against sys.dm_exec_plan_attributes in this article to verify that you did
-not add a second entry to the cache.
-
Another alternative is to get the text from sys.dm_exec_query_stats
-and sys.dm_exec_sql_text. Here is a query you can use:
-
SELECT '<' + est.text + '>'
-FROM sys.dm_exec_query_stats qs
-CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) est
-WHERE est.text LIKE '%some significant SQL text here%'
-
It is important that you run the query in text mode. In grid mode, SSMS
-will replace line breaks with space. The angle brackets in the output is there
-as delimiters, so that you can select the exact query text including any leading
-or trailing blanks.
-
Parameterised SQL is easier to deal with, since the SQL statement is packaged in a character literal. That is, if you see
-this in Profiler
-
EXEC sp_executesql N'SELECT * FROM Orders WHERE OrderDate > @orderdate',
- N'@orderdate datetime', '20000101'
-
It's no issue if you happen to change it to, say:
-
EXEC sp_executesql
-N'SELECT * FROM Orders WHERE OrderDate > @orderdate',
-N'@orderdate datetime', '20000101'
-
What is important is that you must not change anything of what is between the quotes of the two first parameters to sp_executesql, since this is what
-the hash is computed from.
-
If you don't have any server-level permission – ALTER TRACE to run a trace, or VIEW SERVER STATE to query sys.dm_exec_query_stats and
-sys.dm_exec_sql_text – it's starting to get difficult. If the dynamic SQL is produced in a stored procedure which you can edit, you can add a PRINT statement to get the text. (Actually, stored procedures
-that produce dynamic SQL should
-always have a @debug parameter and include the line: IF @debug = 1 PRINT @sql.)
-You still have to be careful to get the exact text, and not add or drop any spaces. If there is a parameter list, you need to make sure
-that you
-copy the parameter
-list exactly as well. If the SQL is produced by the application or by a .Net stored procedure, getting the SQL statement may be possible if you can run the application in a
-debugger, but the exact text of the parameter list may be difficult to get at. The best bet may be try application against a database on a SQL
-Server instance where you have all the required permissions, for instance on
-your local workstation and get the query text this way.
[@1] reveals that the query has been auto-parameterised.
-
Occasionally, the fact that SQL Server auto-parameterises a query, works against you.
-Say that you have a query that goes:
-
SELECT ... FROM dbo.Orders WHERE Status = 'Delayed'
-
There is a filtered index on Status, which includes the value Delayed,
-because Orders are generally not delayed. (There is no Status column in
-Northwind; I had to make one up for the example.) But if SQL Server decides to
-parameterise the query, the index cannot be used, because the plan must
-accommodate for all possible values of the parameter.
-
There is not really any foolproof way to turn off any of the modes of
-parameterisation, but there are some hacks. If the database is in simple
-parameterisation, parameterisation only happens with very simple queries, for
-instance only for one-table queries. The full list of conditions is not included
-in Books Online, but one of the white papers listed in the section
-Further Reading
-includes a list. According to that list, it seems to sufficient to add a
-condition like:
-
AND 1 = 1
-
to stop simple parameterisation from happening. But the anxious person asks
-how we can trust that this does not change in a future release.
-
If the database is in forced parameterisation, there are two alternatives.
-There is a list in Books Online in the
-topic for forced
-parameterisation which specifies when forced parameterisation is not
-employed. One solution according to the list is to use OPTION (RECOMPILE), which
-is OK as long as you can take the cost of compilation every time. Another
-solution is to add a variable to the query:
-
DECLARE @x int
-SELECT ... FROM dbo.Orders WHERE Status = 'Delayed' AND @x IS NULL
-
Again, you may ask what could happen in a future version of SQL Server. It's
-certainly an ugly hack.
-
Note: If you read the Query Hints topic in Books
-Online, you will find that there is a hint to control parameterisation, but this
-hint is only permitted in plan guides, which is the topic for the next section.
Sometimes you may find that you want to modify a query to resolve a
-performance issue by adding a hint of some sort. For a stored procedure, it is
-not unlikely that you can edit the procedure and deploy the change fairly
-immediately. But if the query is generated inside an application, it may be more
-difficult. The entire executable has to be built and maybe be deployed to
-all user machines. It is also likely that there is a mandatory QA step involved.
-And if the application is a third-party application, changing it is out of the
-question.
-
However, SQL Server provides a solution for these situations, to wit plan guides. There are two ways to set up plan guides, a general way, and a shortcut which is also known as plan freezing. General plan guides were introduced in SQL 2005, whereas plan freezing was added in SQL 2008.
-
Note: this feature is not available on the low-end editions of SQL Server –
- Express, Web and Workgroup Edition.
-
Here is an example of a setting up plan guide. This particular example runs on SQL 2008 only:
In this example, I create a plan to ensure that a query against OrderDate always uses an Index Seek (maybe because I expect all queries to be for the last
-few days or so). I specify a name for the guide. Next, I specify the exact statement for which the guide applies. As when you run a query in SSMS to investigate
-it, you need to make sure that you do not add or lose any leading or trailing space,
-nor must you make any other alteration. The parameter @type specifies that the guide is for
-dynamic SQL and not for a stored procedure. Had the SELECT statement been part of a larger batch, I would have to specify the text of that batch
-in the parameter @module_or_batch, again exactly as submitted from the
-application. When I specify NULL for @module_or_batch, @stmt is assumed to be
-the entire batch text. @params is the parameter list for the batch, and again
-there must be an exact match character-by-character with what the application
-submits.
-
Finally, @hints is where the fun is. In this example I specify that the query should always use the index on OrderDate, no matter the sniffed value for
-@orderdate. This particular query hint, OPTION (TABLE HINT) is not available in
-SQL 2005, and that is why the example does not run on that version.
-
In the script, the initial DBCC FREEPROCCACHE is only there to give us a clean slate. Also, for the purpose of the demo, I run the query with a parameter value that gives the "bad" plan, the Clustered Index Scan. Once the plan has been entered, it takes effect directly. That is, any current entry for the query is evicted from the cache.
-
On SQL 2008, you can specify the parameters to sp_create_plan_guide in any order as long as you name them, and you can leave out the N before the string literals. However, SQL 2005
-is far less forgiving. The parameters must be entered in the given order, even
-if you name them, and you must specify the N before all the string literals.
-
In this example I used a plan guide to force an index, but you can use other hints as well, including the USE PLAN hint that permits you to specify the
-complete query plan to use. Certainly not for the faint of heart!
-
...although that is exactly the idea with plan freezing. Say that you have a query that sways between two plans, one good and one bad, due to parameter sniffing, and there is not really any civilised way to get the bad plan out of the equation. Rather than battling with the complex parameters of sp_create_plan_guide, you can extract plan handle from the cache and feed it to the stored procedure sp_create_plan_guide_from_handle to force the plan you know is good. Here is a demo and example.
-
DBCC FREEPROCCACHE
-SET ARITHABORT ON
-go
-EXEC sp_executesql N'SELECT * FROM dbo.Orders WHERE OrderDate > @orderdate',
- N'@orderdate datetime', @orderdate = '19990101'
-go
-DECLARE @plan_handle varbinary(64),
- @rowc int
-
-SELECT @plan_handle = plan_handle
-FROM sys.dm_exec_query_stats qs
-CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) est
-WHERE est.text LIKE '%Orders WHERE OrderDate%'
- AND est.text NOT LIKE '%dm_exec_query_stats%'
-SELECT @rowc = @@rowcount
-
-IF @rowc = 1
- EXEC sp_create_plan_guide_from_handle 'MyFrozenPlan', @plan_handle
-ELSE
- RAISERROR('%d plans found in plan cache. Canno create plan guide', 16, 1, @rowc)
-go
--- Test it out!
-SET ARITHABORT OFF
-go
-EXEC sp_executesql N'SELECT * FROM dbo.Orders WHERE OrderDate > @orderdate',
- N'@orderdate datetime', @orderdate = '19960101'
-go
-SET ARITHABORT ON
-EXEC sp_control_plan_guide 'DROP', 'MyFrozenPlan'
-
-
For the purpose of the demo, I first clear the plan cache and set ARITHABORT to a known state. Then I run my query with a parameter that I know will give me the good plan. The next batch demonstrates how to use sp_create_plan_guide_from_handle. I first run a query against sys.dm_exec_query_stats and sys.dm_exec_sql_text to find the entry for my batch. Next I capture @@rowcount into a local variable (since @@rowcount is set after each statement, I prefer to copy it to a local variable in a SELECT that is directly attached to the query to avoid accidents). This is a safety precaution in case I get multiple matches or no matches in the cache. If I get exactly one match, I call sp_create_plan_guide_from_handle which takes two parameters: the name of the plan guide and the plan handle. And that's it!
-
The next part tests the guide. To make sure that I don't use the same cache entry, I use a different setting of ARITHABORT. If you run the demo with display of execution plan enabled, you will see that the second execution of the query uses the same plan with Index Seek + Key Lookup as the first, alhough the normal plan for the given parameter would be a Clustered Index Scan. That is, the plan guide is not dependent on certain SET options.
-
When you use this for real, you would run the query you want the plan guide for, only if the desired plan is not in the cache already. The query against the cache will require some craftmanship so that you get exactly one hit and the correct hit. An alternative may be to look at the matches in the query output in SSMS and copy and paste the plan handle.
-
A cool thing is that you don't have to set this up on the production server, but you can experiement on a lab server. The guide is stored in sys.plan_guides, so once you have the guide right, you can use the content there to craft a call to sp_create_plan_guide that you run the production server. You can also script the plan guide through Object Explorer in SSMS.
-
If you have a multi-statement batch or a stored procedure, you may not want to set up a guide for the entire batch, but only for a statement. For this reason sp_create_plan_guide_from_handle accepts a third parameter @statement_start_offset, a value you also can get from sys.dm_exec_query_stats.
-
This was just an introduction to plan guides and plan freezing. Plan guides is certainly an advanced feature,
-and rather than making this article even longer I refer you to the
- sections on plan guides in Books Online, or
-to the white paper
-listed in the section Further Reading below.
-
Overall, I see plan guides as a last resort. As I have said, they are fairly complex and there is a bit of a learning curve. Furthermore, a hint within a
- query is easy to see and will stand out like a sore thumb the day it has become obsolete. But a plan guide may lie around, and one day
- when reality has changed, the guide induces a bad query plan. But since you have
-forgotten about the guide, you cannot understand why you get this bad plan. Plan freezing is easier to use, but keep in mind that with the smallest change in the query, the plan guide will no longer be matched by SQL Server.
You have now learnt why a query may perform differently in the application
-and in SSMS. You have also seen several ways to address issues with parameter
-sniffing.
-
Did I include all reasons why there could be a performance difference between
-the application and SSMS? Not all, there are certainly a few more reasons. For
-instance, if the application runs on a remote machine, and you run SSMS directly
-on the server, a slow network can make quite a difference. But I believe I have
-captured the most likely reasons that are due to circumstances within SQL
-Server.
-
Did I include all possible reasons why parameter sniffing may give you a bad
-plan, and how you should address it? Probably not. There is room for more
-variation there, and particularly I can't know what your applicaton is doing.
-But hopefully some of the methods I have presented you can help you to find a
-solution.
-
If you think that you have stumbled on something which is not
-covered in the article, but you think I should have included, please drop me a
-line at esquel@sommarskog.se. And the
-same applies if you see any errors, not the least spelling or grammar errors. On the other
-hand, if you have a question how to solve a particular problem, I recommend you
-to post a question to an SQL Server forum, because a lot more people will see
-your question. If you absolutely want me to see the question, post to Microsoft's
-Transact-SQL
-forum, and mail me the link (because there is too much traffic for me to read it
-all).
Plan Caching in SQL Server 2008 – A white paper written by SQL
-Server MVP Greg Low. Appendix A in this paper details the rules for simple
-parameterisation. There is an older
-
-version for SQL 2005, written by Arum Marathe.
2013-08-30 – Corrected an error in the function setoptions that Alex Valen was kind to point out.
-
2013-04-14 – Updated the section An Issue with Linked Servers to reflect that this gotcha has been removed with SQL 2012 SP1. Also added a note on SET NO_BROWSETABLE ON to the section The Story so Far.
-
2011-12-31 – Added some text about SQL Server Agent which runs with QUOTED_IDENTIFER OFF by default. Extended the section on Plan Guides to also gover plan freezing.
-
2011-11-27 – Several of the links in the section Further Reading were broken. This has been fixed.
-
2011-07-02 – There is now a Russian translation available. Kudos to Dima Piliugin for this work!
-
2011-06-25 – Added a section An Issue with Linked Servers to discuss a special problem that may cause the situation Slow in the application, fast in SSMS.
-
2011-02-20 – First version.
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Articles/Slow in the Application, Fast in SSMS_files/SSMS.jpg b/Articles/Slow in the Application, Fast in SSMS_files/SSMS.jpg
deleted file mode 100644
index a2d56421..00000000
Binary files a/Articles/Slow in the Application, Fast in SSMS_files/SSMS.jpg and /dev/null differ
diff --git a/Articles/Slow in the Application, Fast in SSMS_files/SSMS2.jpg b/Articles/Slow in the Application, Fast in SSMS_files/SSMS2.jpg
deleted file mode 100644
index 4e6c686f..00000000
Binary files a/Articles/Slow in the Application, Fast in SSMS_files/SSMS2.jpg and /dev/null differ
diff --git a/Articles/Slow in the Application, Fast in SSMS_files/linked-popup1.jpg b/Articles/Slow in the Application, Fast in SSMS_files/linked-popup1.jpg
deleted file mode 100644
index eb60b443..00000000
Binary files a/Articles/Slow in the Application, Fast in SSMS_files/linked-popup1.jpg and /dev/null differ
diff --git a/Articles/Slow in the Application, Fast in SSMS_files/linked-popup2.jpg b/Articles/Slow in the Application, Fast in SSMS_files/linked-popup2.jpg
deleted file mode 100644
index bbcbb91d..00000000
Binary files a/Articles/Slow in the Application, Fast in SSMS_files/linked-popup2.jpg and /dev/null differ
diff --git a/Articles/Slow in the Application, Fast in SSMS_files/linked-query1.jpg b/Articles/Slow in the Application, Fast in SSMS_files/linked-query1.jpg
deleted file mode 100644
index ac7e3559..00000000
Binary files a/Articles/Slow in the Application, Fast in SSMS_files/linked-query1.jpg and /dev/null differ
diff --git a/Articles/Slow in the Application, Fast in SSMS_files/linked-query2.jpg b/Articles/Slow in the Application, Fast in SSMS_files/linked-query2.jpg
deleted file mode 100644
index 9f67f022..00000000
Binary files a/Articles/Slow in the Application, Fast in SSMS_files/linked-query2.jpg and /dev/null differ
diff --git a/Articles/Slow in the Application, Fast in SSMS_files/list_orders2.jpg b/Articles/Slow in the Application, Fast in SSMS_files/list_orders2.jpg
deleted file mode 100644
index 645efb91..00000000
Binary files a/Articles/Slow in the Application, Fast in SSMS_files/list_orders2.jpg and /dev/null differ
diff --git a/Articles/Slow in the Application, Fast in SSMS_files/list_orders3.jpg b/Articles/Slow in the Application, Fast in SSMS_files/list_orders3.jpg
deleted file mode 100644
index cc32a3c2..00000000
Binary files a/Articles/Slow in the Application, Fast in SSMS_files/list_orders3.jpg and /dev/null differ
diff --git a/Articles/Slow in the Application, Fast in SSMS_files/list_orders_11a.jpg b/Articles/Slow in the Application, Fast in SSMS_files/list_orders_11a.jpg
deleted file mode 100644
index 4ee621b9..00000000
Binary files a/Articles/Slow in the Application, Fast in SSMS_files/list_orders_11a.jpg and /dev/null differ
diff --git a/Articles/Slow in the Application, Fast in SSMS_files/list_orders_11b.jpg b/Articles/Slow in the Application, Fast in SSMS_files/list_orders_11b.jpg
deleted file mode 100644
index 39bf758c..00000000
Binary files a/Articles/Slow in the Application, Fast in SSMS_files/list_orders_11b.jpg and /dev/null differ
diff --git a/Articles/Slow in the Application, Fast in SSMS_files/mergejoin.jpg b/Articles/Slow in the Application, Fast in SSMS_files/mergejoin.jpg
deleted file mode 100644
index c3a78a13..00000000
Binary files a/Articles/Slow in the Application, Fast in SSMS_files/mergejoin.jpg and /dev/null differ
diff --git a/Articles/Slow in the Application, Fast in SSMS_files/nestedloops.jpg b/Articles/Slow in the Application, Fast in SSMS_files/nestedloops.jpg
deleted file mode 100644
index b6000f12..00000000
Binary files a/Articles/Slow in the Application, Fast in SSMS_files/nestedloops.jpg and /dev/null differ
diff --git a/Articles/Slow in the Application, Fast in SSMS_files/paramvalues.jpg b/Articles/Slow in the Application, Fast in SSMS_files/paramvalues.jpg
deleted file mode 100644
index 1e5be82f..00000000
Binary files a/Articles/Slow in the Application, Fast in SSMS_files/paramvalues.jpg and /dev/null differ
diff --git a/Articles/Slow in the Application, Fast in SSMS_files/planinfo.jpg b/Articles/Slow in the Application, Fast in SSMS_files/planinfo.jpg
deleted file mode 100644
index 43b63715..00000000
Binary files a/Articles/Slow in the Application, Fast in SSMS_files/planinfo.jpg and /dev/null differ
diff --git a/Articles/Slow in the Application, Fast in SSMS_files/popup1.jpg b/Articles/Slow in the Application, Fast in SSMS_files/popup1.jpg
deleted file mode 100644
index 91107666..00000000
Binary files a/Articles/Slow in the Application, Fast in SSMS_files/popup1.jpg and /dev/null differ
diff --git a/Articles/Slow in the Application, Fast in SSMS_files/popup2.jpg b/Articles/Slow in the Application, Fast in SSMS_files/popup2.jpg
deleted file mode 100644
index 9036d459..00000000
Binary files a/Articles/Slow in the Application, Fast in SSMS_files/popup2.jpg and /dev/null differ
diff --git a/Articles/Slow in the Application, Fast in SSMS_files/popup3.jpg b/Articles/Slow in the Application, Fast in SSMS_files/popup3.jpg
deleted file mode 100644
index 19dc808f..00000000
Binary files a/Articles/Slow in the Application, Fast in SSMS_files/popup3.jpg and /dev/null differ
diff --git a/Articles/Slow in the Application, Fast in SSMS_files/showstats.jpg b/Articles/Slow in the Application, Fast in SSMS_files/showstats.jpg
deleted file mode 100644
index d54f1cd5..00000000
Binary files a/Articles/Slow in the Application, Fast in SSMS_files/showstats.jpg and /dev/null differ
diff --git a/CLR/README.md b/CLR/README.md
new file mode 100644
index 00000000..9363be84
--- /dev/null
+++ b/CLR/README.md
@@ -0,0 +1,21 @@
+# Microsoft SQL Server CLR
+
+Useful links:
+ - [Introduction to SQL Server CLR Integration](https://msdn.microsoft.com/en-us/library/ms254498(v=vs.110).aspx)
+ - [CLR User-Defined Functions](https://msdn.microsoft.com/library/ms131077.aspx)
+ - [CLR User-Defined Types](https://msdn.microsoft.com/en-us/library/ms131120(SQL.100).aspx)
+ - [CLR Stored Procedures](https://msdn.microsoft.com/en-us/library/ms131094(SQL.100).aspx)
+ - [CLR Triggers](https://msdn.microsoft.com/en-us/library/ms131093(SQL.100).aspx)
+ - [SQL# CLR functions](https://SQLsharp.com/) (by Sql Quantum Lift)
+
+The common language runtime (CLR) is the heart of the Microsoft .NET Framework and provides the execution environment for all .NET Framework code. Code that runs within the CLR is referred to as managed code. The CLR provides various functions and services required for program execution, including just-in-time (JIT) compilation, allocating and managing memory, enforcing type safety, exception handling, thread management, and security.
+
+With the CLR hosted in Microsoft SQL Server (called CLR integration), you can author stored procedures, triggers, user-defined functions, user-defined types, and user-defined aggregates in managed code. Because managed code compiles to native code prior to execution, you can achieve significant performance increases in some scenarios.
+
+Enabling CLR Integration:
+
+```tsql
+EXEC sp_configure 'clr enabled', 1;
+RECONFIGURE;
+GO
+```
diff --git a/CLR/SQLsharp_SETUP.sql b/CLR/SQLsharp_SETUP.sql
deleted file mode 100644
index 18e41c25..00000000
--- a/CLR/SQLsharp_SETUP.sql
+++ /dev/null
@@ -1,690 +0,0 @@
-
-/*
- ********************************************************************
- *
- * SQL# (SQLsharp)
- * Copyright (c) 2006-2014 Sql Quantum Leap, LLC
- * All Rights Reserved.
- *
- * JsonFx code:
- * Copyright (c) 2006-2009 Stephen M. McKamey
- * All rights reserved.
- *
- * SgmlReader code:
- * Copyright (c) 2002 Microsoft Corporation. All rights reserved. (Chris Lovett)
- * Copyright (c) 2007-2008 MindTouch. All rights reserved.
- *
- * Twitterizer code:
- * Copyright (c) 2008, Patrick "Ricky" Smith . All rights reserved.
- * Copyright (c) 2011-2014, Sql Quantum Leap, LLC. All rights reserved.
- *
- * http://www.SQLsharp.com/
- *
- * Version: 3.3.83 (Free)
- *
- ********************************************************************
-*/
-SET ANSI_NULLS ON;
-SET QUOTED_IDENTIFIER ON;
-GO
-
-/******************************************************************
- ******************************************************************
- ***
- *** INSTRUCTIONS:
- ***
- *** 1) Replace {replace_with_DB_name} in the USE statement with
- *** the name of the Database where SQL# should be installed (line 44)
- ***
- *** 2) Change any of the default settings (lines 61 - 71)
- ***
- ******************************************************************
- ******************************************************************/
-
-USE [{replace_with_DB_name}]; /* replace the DB name and remove this comment starting with the "/*" at the left
-GO
-
-
-DECLARE @SQLsharpSchema sysname,
- @SQLsharpLogin sysname,
- @AllowExternalAccess BIT,
- @AllowUnrestrictedAccess BIT;
-
-DECLARE @InstallSQL#DB BIT,
- @InstallSQL#JsonFx BIT,
- @InstallSQL#Network BIT,
- @InstallSQL#OS BIT,
- @InstallSQL#SgmlReader BIT,
- @InstallSQL#Twitterizer BIT,
- @InstallSQL#TypesAndAggregates BIT;
-
-SET @SQLsharpSchema = N'SQL#'; -- Change this value to install SQL# into a different Schema
-SET @SQLsharpLogin = N'SQL#';
-SET @AllowExternalAccess = 1;
-SET @AllowUnrestrictedAccess = 1; -- If 1 then @AllowExternalAccess will = 1 even if set to 0 above
-SET @InstallSQL#DB = 1;
-SET @InstallSQL#JsonFx = 1; -- Required by SQL#.Twitterizer
-SET @InstallSQL#Network = 1; -- Required by SQL#.DB
-SET @InstallSQL#OS = 1;
-SET @InstallSQL#SgmlReader = 1;
-SET @InstallSQL#Twitterizer = 1;
-SET @InstallSQL#TypesAndAggregates = 1; -- Required by SQL#.Twitterizer and SQL#.Network
-
------------------------------------
-DECLARE @IsSQLServer2005 NVARCHAR(50);
-SET @IsSQLServer2005 = CASE WHEN @@VERSION LIKE N'Microsoft SQL Server 2005%' THEN N'UN' ELSE '' END;
-
-IF (OBJECT_ID(N'tempdb..#SQLsharpOptions') IS NULL)
-BEGIN
- CREATE TABLE #SQLsharpOptions ([Option] NVARCHAR(50) COLLATE database_default, [Value] VARCHAR(50));
-END;
-
-RAISERROR(N'Capturing current Assembly permissions...', 0, 0) WITH NOWAIT;
-INSERT INTO #SQLsharpOptions ([Option], [Value])
- SELECT sa.name, CASE sa.permission_set_desc
- WHEN N'SAFE_ACCESS' THEN 'SAFE'
- WHEN N'UNSAFE_ACCESS' THEN 'UNSAFE'
- ELSE sa.permission_set_desc
- END
- FROM sys.assemblies sa
- LEFT JOIN #SQLsharpOptions sso
- ON sso.[Option] = sa.name --COLLATE database_default
- WHERE sa.name LIKE N'SQL#%'
- AND sso.[Value] IS NULL
- --AND sa.permission_set_desc <> N'SAFE_ACCESS'
- ;
-RAISERROR('', 0, 0) WITH NOWAIT;
------------------------------------
-
-
-BEGIN TRY
-
- ---
- --- CLR must be enabled
- ---
- IF EXISTS (
- SELECT 1
- FROM sys.configurations conf
- WHERE conf.configuration_id = 1562 -- "clr enabled"
- AND conf.value_in_use = 0
- )
- BEGIN
- PRINT 'Enabling the CLR ...';
- PRINT '';
-
- EXEC(N'EXEC sp_configure ''clr enabled'', 1;');
-
- -- Uncomment the WITH OVERRIDE if you get the "ad hoc changes are not allowed" error
- EXEC(N'RECONFIGURE --WITH OVERRIDE');
- END;
- ELSE
- BEGIN
- PRINT 'CLR already enabled; skipping';
- PRINT '';
- END;
-
-
- ---
- --- Make sure that the Login desired to own SQL# exists
- ---
- IF (NOT EXISTS (
- SELECT *
- FROM [master].sys.server_principals sp
- WHERE sp.name = @SQLsharpLogin
- )
- )
- BEGIN
- PRINT '';
- PRINT 'Login [' + @SQLsharpLogin + '] does not exist ...';
-
- IF (NOT EXISTS(
- SELECT *
- FROM [master].sys.assemblies sa
- WHERE sa.name = N'SQL#.Certificate'
- )
- )
- BEGIN
- PRINT 'Creating temporary Assembly ...';
- EXEC(N'USE [master];
- CREATE ASSEMBLY [SQL#.Certificate]
- AUTHORIZATION [dbo]
- FROM 0x4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000504500004C0103002E2E1B510000000000000000E00002210B0108000008000000060000000000004E2600000020000000400000000040000020000000020000040000000000000004000000000000000080000000020000400C0100030040850000100000100000000010000010000000000000100000000000000000000000FC2500004F00000000400000C003000000000000000000000000000000000000006000000C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000080000000000000000000000082000004800000000000000000000002E7465787400000054060000002000000008000000020000000000000000000000000000200000602E72737263000000C00300000040000000040000000A0000000000000000000000000000400000402E72656C6F6300000C0000000060000000020000000E0000000000000000000000000000400000420000000000000000000000000000000030260000000000004800000002000500D02000002C05000009000000000000000000000000000000502000008000000000000000000000000000000000000000000000000000000000000000000000000E501388F31E59F9E2E94D47CBC27113E604275D501FA1C25E99FBF8E834C00B3DE41563BE47436B0EB0CFF962B68A1BDFCEED9F16CB76D1D52B27BA26420517DD6E6592E0ADD61B052309EE27A03BC0D396ACF73904E427F23A9BD35F034D244801CB7571AAF1CBDE742C4B491DE408E6FB96825FDE5BB5D16618C95DB0F02642534A4201000100000000000C00000076322E302E35303732370000000005006C00000058010000237E0000C4010000EC01000023537472696E677300000000B00300000800000023555300B8030000100000002347554944000000C80300006401000023426C6F620000000000000002000001071400000900000000FA013300160000010000000D000000010000000D0000000B000000010000000100000000000A0001000000000006003A0028000600570028000600740028000600930028000600AC0028000600C50028000600E00028000600FB00280006003301140106004701280006006001280006009D017D010600BD017D010000000001000000000001000100090051000A00110051000A00190051000A00210051000A00290051000A00310051000A00390051000A00410051000A00490051000F00510051000A00590051000A006100510014006900510019002E000B00BF002E001300D5002E001B00EB002E002300F1002E002B0005012E0033000F012E003B00EB002E004B00EB002E005B002E012E0063003A012E006B004301048000000300000047000000010000001D00DB01000002000000000000000000000001001F000000000000000000003C4D6F64756C653E0053514C232E43657274696669636174652E646C6C006D73636F726C69620053797374656D2E5265666C656374696F6E00417373656D626C795469746C65417474726962757465002E63746F7200417373656D626C794465736372697074696F6E41747472696275746500417373656D626C79436F6E66696775726174696F6E41747472696275746500417373656D626C79436F6D70616E7941747472696275746500417373656D626C7950726F6475637441747472696275746500417373656D626C79436F7079726967687441747472696275746500417373656D626C7954726164656D61726B41747472696275746500417373656D626C7943756C747572654174747269627574650053797374656D2E52756E74696D652E496E7465726F70536572766963657300436F6D56697369626C6541747472696275746500417373656D626C7956657273696F6E41747472696275746500417373656D626C7946696C6556657273696F6E4174747269627574650053797374656D2E52756E74696D652E436F6D70696C6572536572766963657300436F6D70696C6174696F6E52656C61786174696F6E734174747269627574650052756E74696D65436F6D7061746962696C6974794174747269627574650053514C232E4365727469666963617465000003200000000000212658D412A4D0408864020FB94258620008B77A5C561934E089042001010E042001010204200101080320000180A0002400000480000094000000060200000024000052534131000400000100010033237E60D1AF2429EE4E6DABE42A2C8A8893EBD630506BA491C63FBFC5D6D0416C540D47A1244C1689482BC752CBAA4E0B95552751626957D1C0BD356D2C5E728A3EA0244C7AC9CC3D4CFB363802B0401245A79C4C7038E7E3901F3C727EC901AF72DAC23D4C6E2CAF8802EDDC1388C628430979DAC9AF0D307CD9527F1FDDC61501001053514C232E43657274696669636174650000150100107777772E53514C73686172702E636F6D00000501000000001301000E536F6C6F6D6F6E205275747A6B7900000901000453514C2300001E010019436F7079726967687420C2A9202032303036202D203230313300000B010006332E302E373100000801000800000000001E01000100540216577261704E6F6E457863657074696F6E5468726F77730100002426000000000000000000003E26000000200000000000000000000000000000000000000000000030260000000000000000000000005F436F72446C6C4D61696E006D73636F7265652E646C6C0000000000FF2500204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100100000001800008000000000000000000000000000000100010000003000008000000000000000000000000000000100000000004800000058400000680300000000000000000000680334000000560053005F00560045005200530049004F004E005F0049004E0046004F0000000000BD04EFFE00000100000003000000470000000300000047003F000000000000000400000002000000000000000000000000000000440000000100560061007200460069006C00650049006E0066006F00000000002400040000005400720061006E0073006C006100740069006F006E00000000000000B004C8020000010053007400720069006E006700460069006C00650049006E0066006F000000A402000001003000300030003000300034006200300000003C001100010043006F006D006D0065006E007400730000007700770077002E00530051004C00730068006100720070002E0063006F006D000000000040000F00010043006F006D00700061006E0079004E0061006D0065000000000053006F006C006F006D006F006E0020005200750074007A006B007900000000004C0011000100460069006C0065004400650073006300720069007000740069006F006E0000000000530051004C0023002E004300650072007400690066006900630061007400650000000000300007000100460069006C006500560065007200730069006F006E000000000033002E0030002E0037003100000000004C001500010049006E007400650072006E0061006C004E0061006D0065000000530051004C0023002E00430065007200740069006600690063006100740065002E0064006C006C00000000005800190001004C006500670061006C0043006F007000790072006900670068007400000043006F0070007900720069006700680074002000A90020002000320030003000360020002D0020003200300031003300000000005400150001004F0072006900670069006E0061006C00460069006C0065006E0061006D0065000000530051004C0023002E00430065007200740069006600690063006100740065002E0064006C006C00000000002C0005000100500072006F0064007500630074004E0061006D00650000000000530051004C00230000000000340007000100500072006F006400750063007400560065007200730069006F006E00000033002E0030002E0037003100000000003C000900010041007300730065006D0062006C0079002000560065007200730069006F006E00000033002E0030002E00370031002E0030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000C000000503600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
- WITH PERMISSION_SET = SAFE;');
- END;
-
-
- IF (NOT EXISTS(
- SELECT *
- FROM [master].sys.asymmetric_keys ak
- WHERE ak.name = N'SQL#Key'
- )
- )
- BEGIN
- PRINT 'Creating Asymmetric Key: [SQL#Key] ...';
- EXEC(N'USE [master];
- CREATE ASYMMETRIC KEY [SQL#Key] FROM ASSEMBLY [SQL#.Certificate];');
- END;
-
-
- IF (NOT EXISTS(
- SELECT *
- FROM [master].sys.server_principals sp
- WHERE sp.name = @SQLsharpLogin
- AND sp.[type] = N'K' -- ASYMMETRIC_KEY_MAPPED_LOGIN
- )
- )
- BEGIN
- PRINT 'Creating Login: [' + @SQLsharpLogin + '] ...';
- EXEC(N'USE [master];
- CREATE LOGIN [' + @SQLsharpLogin + N'] FROM ASYMMETRIC KEY [SQL#Key];');
- END;
-
-
- IF (@AllowExternalAccess = 1 OR @AllowUnrestrictedAccess = 1)
- BEGIN
- PRINT 'Granting ExternalAccess ...';
- EXEC(N'USE [master];
- GRANT EXTERNAL ACCESS ASSEMBLY TO [' + @SQLsharpLogin + N'];');
- END;
-
-
- IF (@AllowUnrestrictedAccess = 1)
- BEGIN
- PRINT 'Granting UnrestrictedAccess ...';
- EXEC(N'USE [master];
- GRANT UNSAFE ASSEMBLY TO [' + @SQLsharpLogin + N'];');
- END;
-
-
- PRINT 'Dropping temporary Assembly ...';
- EXEC(N'USE [master];
- DROP ASSEMBLY [SQL#.Certificate];');
-
- PRINT 'Login Created.';
- PRINT '';
- END;
- ELSE
- BEGIN
- PRINT N'Login [' + @SQLsharpLogin + N'] already exists; skipping';
- PRINT '';
- END;
-
-
- ---
- --- Make sure that the database where SQL# will be installed has a User based on the Login
- ---
- IF (NOT EXISTS (
- SELECT *
- FROM sys.database_principals dp
- WHERE dp.name = @SQLsharpLogin
- )
- )
- BEGIN
- PRINT '';
- PRINT N'Creating User: [' + @SQLsharpLogin + N'] ...';
-
- EXEC(N'CREATE USER [' + @SQLsharpLogin + N'] FOR LOGIN [' + @SQLsharpLogin + N'];');
- END;
- ELSE
- BEGIN
- IF (NOT EXISTS(
- SELECT *
- FROM [master].sys.server_principals sp
- INNER JOIN sys.database_principals dp
- ON dp.[sid] = sp.[sid]
- WHERE sp.[type] = N'K' -- ASYMMETRIC_KEY_MAPPED_LOGIN
- AND sp.name = @SQLsharpLogin
- )
- )
- BEGIN
- RAISERROR(N'User [%s] exists but does not match the system Login of the same name. Please fix.', 16, 1, @SQLsharpLogin);
- END;
-
- PRINT N'User [' + @SQLsharpLogin + N'] already exists in [' + DB_NAME() + N']; skipping';
- PRINT '';
- END;
-
-
-
- -- Make sure we either complete successfully or nothing is changed
- BEGIN TRAN;
-
- ---
- --- If SQL# already exists, uninstall it
- ---
- DECLARE @CurrentSQLsharpSchema sysname;
-
- SELECT @CurrentSQLsharpSchema = routine.ROUTINE_SCHEMA
- FROM INFORMATION_SCHEMA.ROUTINES routine
- WHERE routine.SPECIFIC_NAME = N'SQLsharp_Uninstall';
-
- IF (@CurrentSQLsharpSchema IS NOT NULL)
- BEGIN
- EXEC(N'
- INSERT INTO #SQLsharpOptions ([Option], [Value])
- SELECT N''PriorVersion'' AS [Option], [' + @CurrentSQLsharpSchema + N'].[SQLsharp_Version]() AS [Value]
- WHERE NOT EXISTS (SELECT * FROM #SQLsharpOptions WHERE [Option] = N''PriorVersion'');
- ');
- EXEC(N'PRINT N''Uninstalling previous install of SQL#: '' + [' + @CurrentSQLsharpSchema + N'].[SQLsharp_Version]() + N'' . . .'';');
- EXEC(N'EXEC [' + @CurrentSQLsharpSchema + N'].[SQLsharp_Uninstall];');
- PRINT 'SQL# Uninstalled';
- PRINT '';
- END;
-
- ---
- --- Make sure that the Schema desired to hold SQL# exists
- ---
- IF NOT EXISTS (
- SELECT *
- FROM INFORMATION_SCHEMA.SCHEMATA schemas
- WHERE schemas.SCHEMA_NAME = @SQLsharpSchema
- )
- BEGIN
- PRINT '';
- PRINT N'Creating Schema: [' + @SQLsharpSchema + N'] ...';
-
- EXEC(N'CREATE SCHEMA [' + @SQLsharpSchema + N'] AUTHORIZATION [' + @SQLsharpLogin + N'];');
-
- PRINT 'Schema Created';
- PRINT '';
- END;
- ELSE
- BEGIN
- PRINT N'Schema [' + @SQLsharpSchema + N'] already exists; skipping';
- PRINT '';
- END;
-
- ---
- --- Create the main SQL# Assembly
- ---
- PRINT 'Creating SQL# Assembly ...';
-
- EXEC(N'
- CREATE ASSEMBLY [SQL#]
- AUTHORIZATION [' + @SQLsharpLogin + N']
-FROM 0x4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000504500004C010300762168540000000000000000E00002210B010B0000DA08000006000000000000EEF8080000200000000009000000001000200000000200000400000000000000040000000000000000400900000200001B1209000300408500001000001000000000100000100000000000001000000000000000000000009CF808004F00000000000900C803000000000000000000000000000000000000002009000C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000080000000000000000000000082000004800000000000000000000002E74657874000000F4D808000020000000DA080000020000000000000000000000000000200000602E72737263000000C8030000000009000004000000DC0800000000000000000000000000400000402E72656C6F6300000C000000002009000002000000E008000000000000000000000000004000004200000000000000000000000000000000D0F808000000000048000000020005000438010098C0070009000000000000000000000000000000502000008000000000000000000000000000000000000000000000000000000000000000000000001AEECF889EE17D2DD8837EE5D6CD842F58F9594A06CE684A82860C4BE95309660846798A2933941F2155116C1960B50833397D1CA70F78776E491348A35C0A2F595332CC2575D4B611C9F1467B8948659C47455A671B2947AC3CF63CCE62589620470FD0D3E0B4503B2908F9D99D996A6D422A75CB188D91D7C2C40D004C2D32133006004200000001000011028E69185B8D2B0000010A160B2B2906070207185A938C2C0000010207185A1758938C2C000001281100000A1F10281200000A9C0717580B07028E69185B32CF062A00001330030039000000020000117201000070731300000A0A020C160D2B1B0809910B0612017207000070281400000A6F1500000A260917580D09088E6932DF066F1600000A2A7602163113720D0000701F6602731700000A281800000A2A72110000702A3E020304168D2C00000128050000062A00133005002E0100000300001172110000700A721100007004731900000A0B160C160D161304188D2C00000113081108161F0A9D1108171F0D9D11081306058E692D1D188D2C00000113091109161F209D1109171F099D1109130738D100000005130738C900000016130504076F1A00000A59130408110458028E693107028E690859130407020811046F1B00000A26081104580C076F1A00000A04320608028E693311281C00000A076F1600000A6F1D00000A2A076F1600000A0A0611066F1E00000A0D09162F24032C090611076F1E00000A0D09162F36281C00000A066F1D00000A07166F1F00000A2B440916311B06091759186F2000000A7213000070282100000A2C051813052B03171305281C00000A06160917581105596F2000000A6F1D00000A07160917586F2200000A2608028E693F2EFFFFFF2A1E02282300000A2A000013300400C101000004000011721100007020C8000000731900000A0A06027B020000046F2500000A6F1500000A26027B02000004250B398B010000FE137E540000043A940000001F0B732700000A25721900007016282800000A25722700007017282800000A25723B00007018282800000A25724500007019282800000A2572550000701A282800000A2572610000701B282800000A2572730000701C282800000A2572830000701D282800000A2572930000701E282800000A25729D0000701F09282800000A2572B10000701F0A282800000AFE138054000004FE137E54000004071202282900000A39D700000008450B000000050000000500000005000000050000000500000005000000400000004000000080000000800000008000000038A00000000672CF0000706F1500000A2606027B060000042D0D027C04000004282A00000A2B0572D30000706F1500000A260672DB0000706F1500000A262B650672CF0000706F1500000A2606027B070000046F2B00000A260672DF0000706F1500000A2606027B080000046F2B00000A260672DB0000706F1500000A262B250672CF0000706F1500000A2606027B080000046F2B00000A260672DB0000706F1500000A26066F1600000A2A1E02282300000A2A5202282300000A020203280A0000067D130000042A00001B300300E703000005000011732C00000A0A036F2D00000A6F2E00000A0D38AD030000096F2F00000A74380000010C73080000060B070872E30000706F3000000A742D0000017D01000004070872F90000706F3000000A742D0000017D020000040872130100706F3000000AA53400000120FFFFFF7F330E07283100000A697D040000042B16070872130100706F3000000AA5340000017D040000040872F90000706F3000000A742D0000017261000070282100000A2D1C0872F90000706F3000000A742D0000017255000070282100000A2C170872130100706F3000000AA53400000120A00F0000311C0872F90000706F3000000A742D0000017229010070282100000A2C1A070872130100706F3000000AA534000001185A7D050000042B16070872130100706F3000000AA5340000017D05000004070872350100706F3000000AA5390000017D030000040708724D0100706F3000000AA5390000017D0600000408725B0100706F3000000AA53A00000120FF000000330907167D070000042B160708725B0100706F3000000AA53A0000017D0700000408727D0100706F3000000AA53A00000120FF000000330907167D080000042B160708727D0100706F3000000AA53A0000017D080000040872970100706F3000000A7E3200000A330907167D090000042B16070872970100706F3000000AA5390000017D090000040872AB0100706F3000000A7E3200000A330907167D0A0000042B16070872AB0100706F3000000AA5390000017D0A0000040872C50100706F3000000A7E3200000A330907167D0B0000042B16070872C50100706F3000000AA5390000017D0B0000040872DB0100706F3000000A7E3200000A330907167D0C0000042B16070872DB0100706F3000000AA5390000017D0C0000040872E70100706F3000000A7E3200000A330907167D0D0000042B16070872E70100706F3000000AA5390000017D0D0000040872FD0100706F3000000A7E3200000A330907167D0E0000042B16070872FD0100706F3000000AA5390000017D0E00000408720F0200706F3000000A7E3200000A330D07722F0200707D0F0000042B160708720F0200706F3000000A742D0000017D0F00000408723D0200706F3000000A7E3200000A330D07722F0200707D100000042B160708723D0200706F3000000A742D0000017D1000000408725B0200706F3000000A7E3200000A330D07722F0200707D110000042B160708725B0200706F3000000A742D0000017D110000040872770200706F3000000A7E3200000A330D07722F0200707D120000042B16070872770200706F3000000A742D0000017D1200000406076F3300000A096F3400000A3A48FCFFFFDE1409753C000001130411042C0711046F3500000ADC062A00411C00000200000012000000BF030000D10300001400000000000000133005004A00000006000011027B130000046F3600000A8D2D0000010A160B2B1F060704027B13000004076F3700000A7B0100000405283800000AA20717580B07027B130000046F3600000A32D30306283900000A2A00001B300400CE00000007000011027B130000046F3600000A8D2D0000010A721100007020C8000000731900000A0B160C027B130000046F3A00000A13042B781204283B00000A0D07166F1F00000A07046F1500000A097B010000046F1500000A056F1500000A72950200706F1500000A2607096F070000066F1500000A260772950200706F1500000A26097B030000042D0C0772990200706F1500000A260772A30200706F1500000A2606082517580C076F1600000AA21204283C00000A3A7CFFFFFFDE0E1204FE160300001B6F3500000ADC0306283900000A2A0000011000000200300088B8000E00000000AA027B13000004036F3700000A7B0100000404027B13000004036F3700000A7B040000046A733D00000A2AF2027B13000004036F3700000A7B0100000404027B13000004036F3700000A7B07000004D2027B13000004036F3700000A7B08000004D2733E00000A2A133004003205000008000011140A027B13000004036F3700000A7B020000046F3F00000A250B39E6040000FE137E550000043A8B0100001F1E732700000A2572AD02007016282800000A25721900007017282800000A2572BB02007018282800000A25723B00007019282800000A2572C30200701A282800000A2572CD0200701B282800000A25729D0000701C282800000A2572B10000701D282800000A2572730000701E282800000A2572DF0200701F09282800000A2572EB0200701F0A282800000A2572F70200701F0B282800000A2572FF0200701F0C282800000A2572550000701F0D282800000A2572290100701F0E282800000A2572610000701F0F282800000A25720B0300701F10282800000A2572150300701F11282800000A2572310300701F12282800000A2572430300701F13282800000A2572590300701F14282800000A2572930000701F15282800000A2572630300701F16282800000A2572770300701F17282800000A2572870300701F18282800000A2572270000701F19282800000A2572450000701F1A282800000A2572A90300701F1B282800000A2572C10300701F1C282800000A2572C90300701F1D282800000AFE138055000004FE137E55000004071202282900000A393B03000008451E0000000500000022000000300000004D0000005B0000007900000096000000A5000000B4000000C2000000DF000000FC000000190100003701000046010000640100007301000091010000AF010000CD010000EB010000090200001802000036020000540200006F0200007B02000087020000A2020000BD02000038B8020000027B13000004036F3700000A7B0100000416734000000A0A38C6020000020317280D0000060A38B8020000027B13000004036F3700000A7B0100000418734000000A0A389B020000020319280D0000060A388D020000027B13000004036F3700000A7B010000041F1F734000000A0A386F020000027B13000004036F3700000A7B010000041A734000000A0A385202000002031F21280E0000060A384302000002031F22280E0000060A383402000002031B280E0000060A3826020000027B13000004036F3700000A7B010000041C734000000A0A3809020000027B13000004036F3700000A7B010000041D734000000A0A38EC010000027B13000004036F3700000A7B010000041E734000000A0A38CF010000027B13000004036F3700000A7B010000041F09734000000A0A38B101000002031F0A280D0000060A38A2010000027B13000004036F3700000A7B010000041F0B734000000A0A388401000002031F0C280D0000060A3875010000027B13000004036F3700000A7B010000041F0D734000000A0A3857010000027B13000004036F3700000A7B010000041F0F734000000A0A3839010000027B13000004036F3700000A7B010000041F10734000000A0A381B010000027B13000004036F3700000A7B010000041F11734000000A0A38FD000000027B13000004036F3700000A7B010000041F12734000000A0A38DF00000002031F20280E0000060A38D0000000027B13000004036F3700000A7B010000041F13734000000A0A38B2000000027B13000004036F3700000A7B010000041F14734000000A0A3894000000027B13000004036F3700000A7B010000041F0E734000000A0A2B7902031F15280D0000060A2B6D02031F16280D0000060A2B61027B13000004036F3700000A7B010000041F17734000000A0A2B46027B13000004036F3700000A7B010000041F19734000000A0A2B2B72D1030070027B13000004036F3700000A7B020000046F3F00000A72DB030070283800000A734100000A7A062A0000133004003800000009000011027B130000046F3600000A8D060000010A160B2B0E06070207280F000006A20717580B07027B130000046F3600000A32E406734200000A2A133003008E0000000A000011026F4400000A2C06284500000A2A0F01284600000A2C0B72E1030070734700000A7A0F01284800000A6F4900000A6F4A00000A250B2C2407722F040070282100000A2D0F077251040070282100000A2D062B08170A2B20160A2B1C725B0400700F01284800000A729D040070283800000A734700000A7A026F4B00000A06284C00000A6F4D00000A734E00000A2AA2026F4F00000A2C06285000000A2A026F5100000A16026F5100000A8E69285200000A735300000A2A0013300400770000000B000011026F4F00000A2C06284500000A2A026F5100000A0A160B160C2B4F060893285400000A0B071F413205071F4D310A071F613213071F6D300E0608071F0D58285500000A9D2B20071F4E3205071F5A310A071F6E3211071F7A300C0608071F0D59285500000A9D0817580C08068E6932AB06734E00000A2A00133005008D0200000C000011026F4400000A2C06284500000A2A026F4B00000A8E690A062D06735600000A2A7211000070731300000A0B160C160D1F2D130438B9000000077E140000041104916F5700000A26091104581308388B000000026F4B00000A082517580C911305026F4B00000A082517580C911306026F4B00000A082517580C911307077E14000004110518631F3F5F916F5700000A26077E1400000411061A631F0F5F11051A621F3F5F60916F5700000A26077E1400000411071C63195F110618621F3F5F60916F5700000A26077E1400000411071F3F5F916F5700000A260919580D0911083F6DFFFFFF07285800000A6F1500000A2609110458063F3DFFFFFF077E14000004060959916F5700000A26388B000000026F4B00000A082517580C911305026F4B00000A082517580C911306026F4B00000A082517580C911307077E14000004110518631F3F5F916F5700000A26077E1400000411061A631F0F5F11051A621F3F5F60916F5700000A26077E1400000411071C63195F110618621F3F5F60916F5700000A26077E1400000411071F3F5F916F5700000A260919580D091858063F6CFFFFFF090617592F70026F4B00000A082517580C911305026F4B00000A082517580C911306077E14000004110518631F3F5F916F5700000A26077E1400000411061A631F0F5F11051A621F3F5F60916F5700000A26077E14000004110618621F3F5F916F5700000A26077E1400000416916F5700000A262B5609062F52026F4B00000A082517580C911305077E14000004110518631F3F5F916F5700000A26077E1400000411051A621F3F5F916F5700000A26077E1400000416916F5700000A26077E1400000416916F5700000A2607285800000A6F1500000A26076F1600000A6F4D00000A734E00000A2A00000013300400660200000D000011026F4F00000A2C06285000000A2A026F5100000A8E696A0A06166A3306735900000A2A735A00000A0B166A0C166A0D161304161305161306161307026F5100000A0925176A580DD493130A3808020000110A285B00000A1F20591F3F5F13080811086A5813091109186A3EF100000038E1000000026F5100000A0925176A580DD493285C00000A130411041F2059D2130411041F3F5FD21304026F5100000A0925176A580DD493285C00000A130511051F2059D2130511051F3F5FD21305026F5100000A0925176A580DD493285C00000A130611061F2059D2130611061F3F5FD21306026F5100000A0925176A580DD493285C00000A130711071F2059D2130711071F3F5FD21307071104186220FF0000005F11051A63195F60D26F5D00000A0711051A6220FF0000005F110618631F0F5F60D26F5D00000A0711061C6220FF0000005F11071F3F5F60D26F5D00000A08196A580C081109186A593F14FFFFFF0811092F67026F5100000A0925176A580DD493285C00000A130411041F2059D2130411041F3F5FD21304026F5100000A0925176A580DD493285C00000A130511051F2059D2130511051F3F5FD21305071104186220FF0000005F11051A63195F60D26F5D00000A08176A580C0811092F61026F5100000A0925176A580DD493285C00000A130611061F2059D2130611061F3F5FD213060711051A6220FF0000005F110618631F0F5F60D26F5D00000A08176A580C2B1C026F5100000A0925176A580DD493130A110A1F0A2E28110A1F0D2E22090632E02B1C026F5100000A0925176A580DD493130A110A1F0A2E06110A1F0D3304090632E009063FF1FDFFFF07735E00000A2A000013300200310000000E000011026F4F00000A2C06285000000A2A026F5F00000A186A5BD48D2B0000010A026F5100000A28010000060A06735300000A2A000000133003005A00000002000011026F4400000A2C06284500000A2A026F6000000A69185A736100000A0A026F4B00000A0C160D2B1B0809910B0612017207000070281400000A6F1500000A260917580D09088E6932DF066F1600000A6F4D00000A734E00000A2A0000133002001B0000000F0000117E150000040A12000F00286200000A6C286300000A286400000A2A001330020022000000100000110F00286500000A0A12007E15000004286600000A0B1201286700000A286800000A2A000000000000602122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5FA61F408D2B00000125D056000004286900000A8014000004206C0700001717736A00000A80150000042A1E02282300000A2A000013300400C60700001100001103176A5F176A330C0F00286B00000A1C3302162A03186A5F186A330B0F00286B00000A2D02162A031A6A5F1A6A330C0F00286C00000A173302162A031E6A5F1E6A33220F00286D00000A1F1F33170F00286E00000A1F0C330C0F00286B00000A1B3302162A031F106A5F1F106A33200F00286D00000A1833160F00286E00000A17330C0F00286B00000A173302162A031F206A5F1F206A332C0F00286D00000A1F0F32210F00286D00000A1F1530160F00286E00000A17330C0F00286B00000A173302162A031F406A5F1F406A33320F00230000000000001C40286300000A132A122A286E00000A1C33160F00286E00000A1B330C0F00286B00000A173302162A0320800000006A5F20800000006A33160F00286D00000A1A330C0F00286E00000A1D3302162A0320000100006A5F20000100006A33200F00286D00000A1933160F00286E00000A1D330C0F00286B00000A1B3302162A0320000200006A5F20000200006A33200F00286D00000A1B33160F00286E00000A1D330C0F00286B00000A173302162A0320000400006A5F20000400006A33330F00230000000000001CC0286300000A132B122B286E00000A1E33170F00286E00000A1F09330C0F00286B00000A173302162A0320000800006A5F20000800006A332D0F00286D00000A1F1632220F00286D00000A1F1C30170F00286E00000A1F0B330C0F00286B00000A1A3302162A0320001000006A5F20001000006A332D0F00286D00000A1F1732220F00286D00000A1F1D30170F00286E00000A1F0B330C0F00286B00000A1B3302162A0320002000006A5F20002000006A33180F00286D00000A1F19330D0F00286E00000A1F0C3302162A0320004000006A5F20004000006A33220F00286D00000A1F1833170F00286E00000A1F0C330C0F00286B00000A1B3302162A0320008000006A5F20008000006A33220F00286D00000A1F1A33170F00286E00000A1F0C330C0F00286B00000A173302162A0320000001006A5F20000001006A330C0F00286B00000A1B3302162A0320000002006A5F20000002006A40E40000000F00286B00000A1B40D70000000F00286F00000A1F135D0A0F00286F00000A1F645B0B0F00286F00000A1F645D0C071A5B0D071A5D1304071E581F195B1305071105591758195B13061F13065A075809591106591F0F581F1E5D1307081A5B1308081A5D13091F201811045A581811085A581107591109591D5D130A061F0B11075A581F16110A5A5820C30100005B130B1107110A581D110B5A591F72581F1F5B130C1107110A581D110B5A591F72581F1F5D1758130D0F000F00286F00000A110C110D736A00000A132C122C2300000000000000C0286300000A287000000A2C02162A0320000004006A5F20000004006A40DC0000000F00286B00000A3AD00000000F00286F00000A1F135D130E0F00286F00000A1F645B130F0F00286F00000A1F645D1310110F1A5B1311110F1A5D1312110F1E581F195B1313110F1113591758195B13141F13110E5A110F581111591114591F0F581F1E5D131511101A5B131611101A5D13171F201811125A581811165A581115591117591D5D1318110E1F0B11155A581F1611185A5820C30100005B131911151118581D11195A591F72581F1F5B131A11151118581D11195A591F72581F1F5D1758131B0F00286D00000A111B330D0F00286E00000A111A3302162A0320000008006A5F20000008006A40980000000F00286B00000A1B408B0000000F00286F00000A1A5D131C0F00286F00000A1D5B131D0F00286F00000A1F135D131E1F13111E5A1F0F581F1E5D131F18111C5A1A111D5A58111F591F22581D5D1320111F1120581F72581F1F5B1321111F1120581F72581F1F5D175813220F000F00286F00000A11211122736A00000A132D122D2300000000000000C0286300000A287000000A2C02162A0320000010006A5F20000010006A337F0F00286B00000A2D760F00286F00000A1A5D13230F00286F00000A1D5B13240F00286F00000A1F135D13251F1311255A1F0F581F1E5D13261811235A1A11245A581126591F22581D5D132711261127581F72581F1F5B132811261127581F72581F1F5D175813290F00286D00000A1129330D0F00286E00000A11283302162A0320000020006A5F20000020006A332C0F00286D00000A1E32220F00286D00000A1F0E30170F00286E00000A1F0A330C0F00286B00000A173302162A0320000040006A5F20000040006A332C0F00286D00000A1B32220F00286D00000A1F0B30170F00286E00000A1F0A330C0F00286B00000A1B3302162A0320000080006A5F20000080006A332C0F00286D00000A1F0F32210F00286D00000A1F1530160F00286E00000A18330C0F00286B00000A173302162A0320000000016A5F20000000016A33180F00286D00000A1F0C330D0F00286E00000A1F0A3302162A0320000000026A5F20000000026A33180F00286D00000A1F0B330D0F00286E00000A1F0B3302162A0320000000046A5F20000000046A33220F00286D00000A1F0A33170F00286E00000A1F0B330C0F00286B00000A1B3302162A0320000000086A5F20000000086A33220F00286D00000A1F0C33170F00286E00000A1F0B330C0F00286B00000A173302162A0320000000106A5F20000000106A33180F00286D00000A1F18330D0F00286E00000A1F0C3302162A0320000000206A5F20000000206A33180F00286D00000A1F1F330D0F00286E00000A1F0C3302162A172A000013300700A30100001200001172110000700A140B170C03720D00007072110000706F7100000A287200000A0D09176A3D0701000009166A3FFF00000009694502000000050000007C00000038EB00000002179A72FB040070287300000A0B076F7400000A7E7500000A287600000A2C4E076F7700000A176F7800000A6F7400000A7E7500000A287600000A2C17076F7700000A176F7800000A6F7400000A287900000A0C021702179A076F7400000A03081F306F7A00000A6F7100000AA202179A0A38E600000002189A72FB040070287300000A0B076F7400000A7E7500000A287600000A2C4E076F7700000A176F7800000A6F7400000A7E7500000A287600000A2C17076F7700000A176F7800000A6F7400000A287900000A0C021802189A076F7400000A03081F306F7A00000A6F7100000AA202189A0A2B7202199A72FB040070287300000A0B076F7400000A7E7500000A287600000A2C4E076F7700000A176F7800000A6F7400000A7E7500000A287600000A2C17076F7700000A176F7800000A6F7400000A287900000A0C021902199A076F7400000A03081F306F7A00000A6F7100000AA202199A0A062A001330070046000000130000110F00286500000A0A1200286F00000A0F00286500000A0B1201286E00000A170F01286200000A0F02286200000A0F03286200000A0F04286200000A287B00000A737C00000A2A00001330070068000000140000110F00286500000A0A1200286F00000A0F00286500000A0B1201286E00000A0F00286500000A0C1202286F00000A0F00286500000A0D1203286E00000A287D00000A0F01286200000A0F02286200000A0F03286200000A0F04286200000A287B00000A737C00000A2A660F00286200000A0F01286200000A287D00000A286800000A2A0000133002003700000015000011206D0100000F00286500000A0B1201286C00000A590A0F00286500000A0C1202286F00000A287E00000A2C040617580A06286800000A2A4A0F00286200000A287E00000A287F00000A2A000013300100150000000F0000110F00286500000A0A1200288000000A288100000A2A00000013300100150000000F0000110F00286500000A0A1200288200000A288100000A2A00000013300200B3000000160000110F01286500000A13051205288300000A0F00286500000A13061206288300000A288400000A1632260F00286500000A13071207288300000A0A0F01286500000A13081208288300000A0B170C2B240F01286500000A13091209288300000A0A0F00286500000A130A120A288300000A0B150C160D0613042B2611040F02288500000A281C0000062C040917580D120423000000000000F03F286300000A1304110407288400000A1732CF09085A286800000A2A0013300200210000000F0000110F00286500000A0A1200288300000A0F01288500000A281C000006287F00000A2A000000133008005A030000170000110F02284800000A0A0F00286500000A13111211288600000A20102700006A5B0B0F01286500000A13121212288600000A20102700006A5B0C0807590D0920E80300006A5D13040920E80300006A5B0D091F3C6A5D1305091F3C6A5B1F3C6A5D13060920100E00006A5B1F186A5D13070920E087E1016A5B13080920E087E1016A11085A590D0920802128006A5B13090920802128006A11095A590D0920803A09006A5B130A0920803A09006A110A5A590D0920805101006A5B130B06720B050070166F8700000A130C7211000070130E1A8D2D000001130F178D2D00000113131113167211050070A2111313103859020000061F7D110C6F8800000A130D06110C1858110D110C5918596F2000000A130E110E1110166F8900000A130F06110C1858110D110C5918596F8A00000A0A110F169A6F4A00000A25\
-131439EC010000FE137E570000042D7A1F09732700000A25721705007016282800000A25721D05007017282800000A25722305007018282800000A25722905007019282800000A25722F0500701A282800000A2572350500701B282800000A25723B0500701C282800000A2572410500701D282800000A2572470500701E282800000AFE138057000004FE137E5700000411141215282900000A395401000011154509000000050000003D0000005C0000007B0000009A000000B9000000D5000000F10000000D010000382401000006724D050070110F1205288B00000A720D0000701204288B00000A191F306F7A00000A283800000A281D0000066F7100000A0A38FD00000006724D050070110F1204288B00000A281D0000066F7100000A0A38DE00000006724D050070110F1205288B00000A281D0000066F7100000A0A38BF00000006724D050070110F1206288B00000A281D0000066F7100000A0A38A000000006724D050070110F1207288B00000A281D0000066F7100000A0A388100000006724D050070110F120B288B00000A281D0000066F7100000A0A2B6506724D050070110F120A288B00000A281D0000066F7100000A0A2B4906724D050070110F1209288B00000A281D0000066F7100000A0A2B2D06724D050070110F1208288B00000A281D0000066F7100000A0A2B1106724D05007072550500706F7100000A0A06720B050070166F8700000A130C110C163C9FFDFFFF06288100000A2A000013300600240000000F00001120B20700001717161616738C00000A0A12000F00288D00000A288E00000A286400000A2A133007003000000018000011120020B20700001717161616288C00000A0F00286500000A0C120206286600000A0B1201288F00000A6C289000000A2A13300700B7010000190000112300000000000000000A0F00286500000A13061206286E00000A0D0F00286500000A13071207286D00000A13041613050F02284800000A725D0500706F9100000A2D300F02284800000A6F4A00000A72630500706F9100000A2D180F02284800000A6F4A00000A72670500706F9100000A2C031713050F01286500000A13081208286F00000A0F00286500000A13091209286F00000A596C0A0F01286500000A130A120A286F00000A287E00000A2D190918331511041F1D330F11052C061F1C13042B05190D1713040F01286500000A130B120B286E00000A0932270F01286500000A130C120C286E00000A0933730F01286500000A130D120D286D00000A11042F5F0623000000000000F03F590A0F01286500000A130E120E286F00000A1759287E00000A2D190918331511041F1D330F11052C061F1C13042B05190D17130412010F01286500000A130F120F286F00000A1759091104161616288C00000A2B1D12010F01286500000A13101210286F00000A091104161616288C00000A0F03289200000A2C270F01286500000A1311121107286600000A0C061202286700000A6C230000000000408F405B580A066C289000000A2A0013300400850600001A0000110F01289300000A2C067E9400000A2A0F00284800000A6F4900000A6F4A00000A2513093946060000FE137E580000043AFC0000001F13732700000A25726F05007016282800000A25728505007017282800000A25729505007018282800000A2572A305007019282800000A2572B30500701A282800000A2572BD0500701B282800000A2572D10500701C282800000A2572E10500701D282800000A2572ED0500701E282800000A2572F70500701F09282800000A2572070600701F0A282800000A2572190600701F0B282800000A2572270600701F0C282800000A25723D0600701F0D282800000A25724D0600701F0E282800000A2572550600701F0F282800000A25725F0600701F10282800000A25726D0600701F11282800000A25727B0600701F12282800000AFE138058000004FE137E580000041109120A282900000A3929050000110A451300000005000000300000005B00000086000000060200001C020000320200006202000078020000CB020000CB020000210400002104000050040000680400007E04000094040000AA040000C004000038D10400000F01286500000A130B120B286F00000A6C230000000000408F405B289500000A289600000A286800000A2A0F01286500000A130C120C286F00000A6C2300000000000059405B289500000A289600000A286800000A2A0F01286500000A130D120D286F00000A6C2300000000000024405B289500000A289600000A286800000A2A0F01286500000A130E120E286E00000A1832140F01286500000A130F120F286E00000A1F0B314E0F01286500000A13101210286E00000A1733130F01286500000A13111211286D00000A1A2F280F01286500000A13121212286E00000A1F0C332A0F01286500000A13131213286D00000A1F1C30160F01286500000A13141214286F00000A286800000A2A0F01286500000A13151215286B00000A0B072D021D0B0F01286500000A13161216286E00000A1733580F01286500000A13171217286F00000A171A736A00000A13181218286B00000A0A062D021D0A07062F160F01286500000A13191219286F00000A286800000A2A0F01286500000A131A121A286F00000A1759286800000A2A0F01286500000A131B121B286E00000A1F0C335A0F01286500000A131C121C286F00000A1758171A736A00000A131D121D286B00000A0A062D021D0A07062F180F01286500000A131E121E286F00000A1758286800000A2A0F01286500000A131F121F286F00000A286800000A2A7E9400000A2A0F01286500000A13201220286F00000A286800000A2A0F01286500000A13211221286C00000A286800000A2A0F01286500000A13221222286E00000A289700000A19739800000A289900000A289A00000A289B00000A286800000A2A0F01286500000A13231223286E00000A286800000A2A0F01286500000A13241224286F00000A1717736A00000A13251225286B00000A0C0F01286500000A13261226286C00000A0858289700000A1D739800000A289900000A289A00000A289B00000A286800000A2A0F01286500000A13271227286F00000A1717736A00000A13281228286B00000A130411042D031D13040F01286500000A13291229286B00000A130511052D031D13051613060F01286500000A132A122A286C00000A1E110459303611041A31310F01286500000A132B122B286F00000A17590D11041B2E0D11041C330E09287E00000A2C061F3513062B171F3413062B110F01286500000A132C122C286F00000A0D090F01286500000A132D122D286F00000A40960000000F01286500000A132E122E286F00000A287E00000A2C09206E01000013072B07206D010000130711070F01286500000A132F122F286C00000A591A1105592F160F01286500000A13301230286F00000A17580D171306090F01286500000A13311231286F00000A332D0F01286500000A13321232286C00000A1D110559581104175958130811081D5B130611041A31061106175913061106286800000A2A0F01286500000A13331233286B00000A2D071D286800000A2A0F01286500000A13341234286B00000A286800000A2A0F01286500000A13351235286B00000A1758286800000A2A0F01286500000A13361236286D00000A286800000A2A0F01286500000A13371237289C00000A286800000A2A0F01286500000A13381238289D00000A286800000A2A0F01286500000A13391239289E00000A286800000A2A0F01286500000A133A123A289F00000A286800000A2A72930600700F00284800000A281800000A734700000A7A000000133008002B0300001B0000110F01289300000A2C067EA000000A2A0F01286500000A13091209286F00000A0A0F01286500000A130A120A286E00000A0B0F01286500000A130B120B286D00000A0C0F01286500000A130C120C289C00000A0D0F01286500000A130D120D289D00000A13040F01286500000A130E120E289E00000A13050F00284800000A6F4900000A6F4A00000A25130F397C020000FE137E590000043A940000001F0B732700000A25726F05007016282800000A25728505007017282800000A25729505007018282800000A2572B305007019282800000A2572D10500701A282800000A2572E10500701B282800000A2572ED0500701C282800000A25724D0600701D282800000A2572550600701E282800000A25725F0600701F09282800000A25726D0600701F0A282800000AFE138059000004FE137E59000004110F1210282900000A39C70100001110450B0000000500000037000000690000009B000000AE000000F30000000601000051010000610100007101000082010000388F0100001206066C230000000000408F405B289500000A230000000000408F405A289600000A17171616161628A100000A38740100001206066C2300000000000059405B289500000A2300000000000059405A289600000A17171616161628A100000A38420100001206066C2300000000000024405B289500000A2300000000000024405A289600000A17171616161628A100000A381001000012060617171616161628A100000A38FD0000000717320807193004170B2B26071A3208071C30041A0B2B1A071D3209071F0930041D0B2B0D071F0A3208071F0C30031F0A0B12060607171616161628A100000A38B800000012060607171616161628A100000A38A50000000F01286500000A13111211286B00000A13070F01286500000A131212121107155A6C286300000A130812061208286F00000A1208286E00000A1208286D00000A1616161628A100000A2B5A12060607081616161628A100000A2B4A12060607080916161628A100000A2B3A1206060708091104161628A100000A2B29120606070809110411051628A100000A2B1772930600700F00284800000A281800000A734700000A7A1106286400000A2A0013300400900100001C0000110F0028A200000A2D0A0F0028A300000A172F0B72C506007073A400000A7A0F01284600000A2D180F01284800000A6F4900000A7E7500000A282100000A2C0B721707007073A400000A7A0F02289300000A2C0B725707007073A400000A7A0F02286500000A0A0F01284800000A6F4900000A6F4A00000A250C39BB000000FE137E5A0000042D611D732700000A25728907007016282800000A25729707007017282800000A2572A507007018282800000A2572B507007019282800000A2572C90700701A282800000A2572DB0700701B282800000A2572E90700701C282800000AFE13805A000004FE137E5A000004081203282900000A2C4009450700000002000000060000000A0000000E00000012000000160000001A0000002B1C160B2B40170B2B3C180B2B38190B2B341A0B2B301B0B2B2C1C0B2B2872FB0700700F01284800000A281800000A73A400000A7A120023000000000000F03F286300000A0A1200286B00000A0733E50F0028A300000A17311412000F0028A300000A17591D5A6C286300000A0A06286400000A2A13300900A40000001D0000110F00286200000A16320A0F01286200000A162F0B722B08007073A400000A7A0F00286200000A0D1203282A00000A0B0F01286200000A13041204282A00000A1C1F306F7A00000A0C120007161A6F2000000A287900000A071A186F2000000A287900000A071C186F2000000A287900000A0816186F2000000A287900000A0818186F2000000A287900000A081A186F2000000A287900000A288C00000A06286400000A2A133003004F0000001E0000110F00289300000A2C067E9400000A2A0F00286500000A0B1201286F00000A20102700005A0F00286500000A0C1202286E00000A1F645A580F00286500000A0D1203286D00000A580A06286800000A2A00133003004F0000001E0000110F00289300000A2C067E9400000A2A0F00286500000A0B1201289C00000A20102700005A0F00286500000A0C1202289D00000A1F645A580F00286500000A0D1203289E00000A580A06286800000A2AF20F00286200000A0F01286200000A0F02286200000A0F03286200000A0F04286200000A0F05286200000A0F06286200000A73A100000A286400000A2A13300300560000001F0000110F02284800000A7E7500000A282100000A2C190F00286500000A0B12010F01284800000A28A500000A0A2B230F00286500000A0C12020F01284800000A0F02284800000A28A600000A28A700000A0A06288100000A2A00001330020029000000130000110F00286500000A0A1200286F00000A0F00286500000A0B1201286E00000A287D00000A286800000A2A1E02282300000A2A00000013300500F52300002000001173A800000A0A7285080070728D0800707293080070729B08007072B3080070733E0000060B06076FA900000A72740E0070727C0E007072820E0070728A0E007072A60E0070733E0000060B06076FA900000A723F1200707247120070724D12007072551200707265120070733E0000060B06076FA900000A72BE18007072C618007072CC18007072D418007072E4180070733E0000060B06076FA900000A72F11E007072F91E007072FF1E007072071F007072251F0070733E0000060B06076FA900000A7216260070721E2600707224260070722C260070723C260070733E0000060B06076FA900000A72212C007072292C0070722F2C007072372C007072452C0070733E0000060B06076FA900000A72F231007072FA31007072003200707208320070721A320070733E0000060B06076FA900000A723B3A007072433A007072493A007072513A007072673A0070733E0000060B06076FA900000A72DC41007072E441007072EA41007072F2410070721A420070733E0000060B06076FA900000A72F34A007072FB4A007072014B007072094B0070721D4B0070733E0000060B06076FA900000A728A4E007072924E007072984E007072A04E007072B04E0070733E0000060B06076FA900000A72BD50007072C550007072CB50007072D350007072DF500070733E0000060B06076FA900000A7294540070729C54007072A254007072AA54007072BE540070733E0000060B06076FA900000A72FF5C007072075D0070720D5D007072155D007072255D0070733E0000060B06076FA900000A72F25E007072FA5E007072005F007072085F0070721E5F0070733E0000060B06076FA900000A7257620070725F6200707265620070726D620070727D620070733E0000060B06076FA900000A72F265007072FA650070720066007072086600707218660070733E0000060B06076FA900000A72696A007072716A007072776A0070727F6A007072956A0070733E0000060B06076FA900000A72026F0070720A6F007072106F007072186F0070722A6F0070733E0000060B06076FA900000A724B7400707253740070725974007072617400707271740070733E0000060B06076FA900000A722A7800707232780070723878007072407800707250780070733E0000060B06076FA900000A724D7A007072557A0070725B7A007072637A007072717A0070733E0000060B06076FA900000A723E8400707246840070724C84007072548400707260840070733E0000060B06076FA900000A72A586007072AD86007072B386007072BB86007072CB860070733E0000060B06076FA900000A72148F0070721C8F007072228F0070722A8F007072388F0070733E0000060B06076FA900000A7265980070726D9800707273980070727B980070728B980070733E0000060B06076FA900000A72709A007072789A0070727E9A007072869A007072B49A0070733E0000060B06076FA900000A7289A000707291A000707297A00070729FA0007072B1A00070733E0000060B06076FA900000A72FAA200707202A300707208A300707210A30070733D0000060B06076FA900000A722CA300707234A30070723AA300707242A300707250A30070733E0000060B06076FA900000A7255AD0070725DAD00707263AD0070726BAD007072A9AD0070733E0000060B06076FA900000A7232BC0070723ABC00707240BC00707248BC0070726CBC0070733E0000060B06076FA900000A72A1C4007072A9C4007072AFC4007072B7C4007072C9C40070733E0000060B06076FA900000A72D6C6007072DEC6007072E4C6007072ECC600707206C70070733E0000060B06076FA900000A72B7CA007072BFCA007072C5CA007072CDCA007072DDCA0070733E0000060B06076FA900000A727ED400707286D40070728CD400707294D4007072A6D40070733E0000060B06076FA900000A728FDA00707297DA0070729DDA007072A5DA007072B7DA0070733E0000060B06076FA900000A722CDE00707234DE0070723ADE00707242DE00707250DE0070733E0000060B06076FA900000A7285E20070728DE200707293E20070729BE2007072B1E20070733E0000060B06076FA900000A72FAE700707202E800707208E800707210E80070722EE80070733E0000060B06076FA900000A72C7F0007072CFF0007072D5F0007072DDF00070720FF10070733E0000060B06076FA900000A72B4F6007072BCF6007072C2F6007072CAF6007072D4F60070733E0000060B06076FA900000A72E5F8007072EDF8007072F3F8007072FBF800707207F90070733E0000060B06076FA900000A7280FC00707288FC0070728EFC00707296FC007072A2FC0070733E0000060B06076FA900000A724B0001707253000170725900017072610001707283000170733E0000060B06076FA900000A725808017072600801707266080170726E080170733D0000060B06076FA900000A729E08017072A608017072AC08017072B408017072C6080170733E0000060B06076FA900000A72EF0A017072F70A017072FD0A017072050B017072150B0170733E0000060B06076FA900000A724A120170725212017072581201707260120170726C120170733E0000060B06076FA900000A721D1901707225190170722B19017072331901707277190170733E0000060B06076FA900000A72A022017072A822017072AE22017072B622017072D0220170733E0000060B06076FA900000A728D2C017072952C0170729B2C017072A32C017072B92C0170733E0000060B06076FA900000A720E2F017072162F0170721C2F017072242F017072402F0170733E0000060B06076FA900000A72413101707249310170724F31017072573101707267310170733E0000060B06076FA900000A72DC36017072E436017072EA36017072F236017072FC360170733E0000060B06076FA900000A72D53B017072DD3B017072E33B017072EB3B017072F93B0170733E0000060B06076FA900000A7262410170726A410170727041017072784101707296410170733E0000060B06076FA900000A72BF47017072C747017072CD47017072D547017072E5470170733E0000060B06076FA900000A728A4A017072924A017072984A017072A04A017072B24A0170733E0000060B06076FA900000A7283500170728B5001707291500170729950017072AB500170733E0000060B06076FA900000A72705601707278560170727E560170728656017072AC560170733E0000060B06076FA900000A72CD5A017072D55A017072DB5A017072E35A017072F35A0170733E0000060B06076FA900000A720860017072106001707216600170721E600170722A600170733E0000060B06076FA900000A725B6301707263630170726963017072716301707289630170733E0000060B06076FA900000A72A666017072AE66017072B466017072BC66017072E0660170733E0000060B06076FA900000A725D6D017072656D0170726B6D017072736D017072836D0170733E0000060B06076FA900000A725873017072607301707266730170726E730170727E730170733E0000060B06076FA900000A7287750170728F7501707295750170729D75017072AF750170733E0000060B06076FA900000A72CC7A017072D47A017072DA7A017072E27A0170721A7B0170733E0000060B06076FA900000A7287830170728F8301707295830170729D83017072B9830170733E0000060B06076FA900000A7282860170728A8601707290860170729886017072A2860170733E0000060B06076FA900000A72278F0170722F8F017072358F0170723D8F0170724D8F0170733E0000060B06076FA900000A7286920170728E9201707294920170729C92017072AA920170733E0000060B06076FA900000A72A394017072AB94017072B194017072B9940170733D0000060B06076FA900000A72D594017072DD94017072E394017072EB940170720D950170733E0000060B06076FA900000A72329A0170723A9A017072409A017072489A0170733D0000060B06076FA900000A72809A017072889A0170728E9A017072969A017072A29A0170733E0000060B06076FA900000A72C79C017072CF9C017072D59C017072DD9C017072EB9C0170733E0000060B06076FA900000A72049F0170720C9F017072129F0170721A9F0170722A9F0170733E0000060B06076FA900000A720BA301707213A301707219A301707221A301707231A30170733E0000060B06076FA900000A7226A50170722EA501707234A50170723CA501707248A50170733E0000060B06076FA900000A72F1A8017072F9A8017072FFA801707207A90170721BA90170733E0000060B06076FA900000A7290AE01707298AE0170729EAE017072A6AE017072B4AE0170733E0000060B06076FA900000A726DB301707275B30170727BB301707283B301707297B30170733E0000060B06076FA900000A7288B901707290B901707296B90170729EB9017072AEB90170733E0000060B06076FA900000A72AFC2017072B7C2017072BDC2017072C5C20170733D0000060B06076FA900000A72DBC2017072E3C2017072E9C2017072F1C2017072FBC20170733E0000060B06076FA900000A72A8C7017072B0C7017072B6C7017072BEC7017072D2C70170733E0000060B06076FA900000A723BCC01707243CC01707249CC01707251CC01707263CC0170733E0000060B06076FA900000A72DCD1017072E4D1017072EAD1017072F2D101707200D20170733E0000060B06076FA900000A7211D401707219D40170721FD401707227D401707243D40170733E0000060B06076FA900000A72DCD7017072E4D7017072EAD7017072F2D701707200D80170733E0000060B06076FA900000A7289DF01707291DF01707297DF0170729FDF017072ABDF0170733E0000060B06076FA900000A72B8E3017072C0E3017072C6E3017072CEE30170733D0000060B06076FA900000A7212E40170721AE401707220E401707228E401707264E40170733E0000060B06076FA900000A7231EA01707239EA0170723FEA01707247EA01707259EA0170733E0000060B06076FA900000A728EED01707296ED0170729CED017072A4ED017072B8ED0170733E0000060B06076FA900000A7291F201707299F20170729FF2017072A7F2017072B7F20170733E0000060B06076FA900000A72C8F4017072D0F4017072D6F4017072DEF4017072EEF40170733E0000060B06076FA900000A7213F80170721BF801707221F801707229F801707235F80170733E0000060B06076FA900000A72FEFB01707206FC0170720CFC01707214FC01707228FC0170733E0000060B06076FA900000A7205FE0170720DFE01707213FE0170721BFE0170724FFE0170733E0000060B06076FA900000A724802027072500202707256020270725E0202707268020270733E0000060B06076FA900000A72410702707249070270724F07027072570702707267070270733E0000060B06076FA900000A7254090270725C0902707262090270726A0902707282090270733E0000060B06076FA900000A72BF0D027072C70D027072CD0D027072D50D027072E30D0270733E0000060B06076FA900000A721C1202707224120270722A1202707232120270723E120270733E0000060B06076FA900000A724F1402707257140270725D14027072651402707275140270733E0000060B06076FA900000A720A180270721218027072181802707220180270722C180270733E0000060B06076FA900000A72011D027072091D0270720F1D027072171D027072251D0270733E0000060B06076FA900000A7282230270728A2302707290230270729823027072A6230270733E0000060B06076FA900000A72AB27027072B327027072B927027072C127027072D7270270733E0000060B06076FA900000A72F82D027072002E027072062E0270720E2E0270721A2E0270733E0000060B06076FA900000A72BF33027072C733027072CD33027072D533027072E7330270733E0000060B06076FA900000A72283D027072303D027072363D0270723E3D0270728C3D0270733E0000060B06076FA900000A72B941027072C141027072C741027072CF41027072F5410270733E0000060B06076FA900000A72EA4B027072F24B027072F84B027072004C0270720E4C0270733E0000060B06076FA900000A72974F0270729F4F027072A54F027072AD4F027072C34F0270733E0000060B06076FA900000A72EC54027072F454027072FA54027072025502707244550270733E0000060B06076FA900000A721959027072215902707227590270722F590270723D590270733E0000060B06076FA900000A72365B0270723E5B027072445B0270724C5B0270725C5B0270733E0000060B06076FA900000A720D6102707215610270721B61027072236102707233610270733E0000060B06076FA900000A725865027072606502707266650270726E650270727E650270733E0000060B06076FA900000A72C36A027072CB6A027072D16A027072D96A027072076B0270733E0000060B06076FA900000A72A46C027072AC6C027072B26C027072BA6C027072D66C0270733E0000060B06076FA900000A723B7002707243700270724970027072517002707265700270733E0000060B06076FA900000A7272720270727A72027072807202707288720270729E720270733E0000060B06076FA900000A72B774027072BF74027072C574027072CD74027072D9740270733E0000060B06076FA900000A72127B0270721A7B027072207B027072287B0270727E7B0270733E0000060B06076FA900000A7243820270724B82027072518202707259820270726F820270733E0000060B06076FA900000A72A884027072B084027072B684027072BE84027072CC840270733E0000060B06076FA900000A72FD8802707205890270720B89027072138902707225890270733E0000060B06076FA900000A72C28E027072CA8E027072D08E027072D88E027072EA8E0270733E0000060B06076FA900000A723B930270724393027072499302707251930270725B930270733E0000060B06076FA900000A726C9502707274950270727A9502707282950270728E950270733E0000060B06076FA900000A72EF98027072F798027072FD98027072059902707227990270733E0000060B06076FA900000A72E4A2027072ECA2027072F2A2027072FAA20270733D0000060B06076FA900000A7210A302707218A30270721EA302707226A30270723CA30270733E0000060B06076FA900000A7205A90270720DA902707213A90270721BA90270722FA90270733E0000060B06076FA900000A7294AB0270729CAB027072A2AB027072AAAB0270733D0000060B06076FA900000A72BAAB027072C2AB027072C8AB027072D0AB027072DEAB0270733E0000060B06076FA900000A722BB002707233B002707239B00270\
-7241B002707281B00270733E0000060B06076FA900000A727EB402707286B40270728CB402707294B4027072BEB40270733E0000060B06076FA900000A7213B90270721BB902707221B902707229B902707237B90270733E0000060B06076FA900000A7204BB0270720CBB02707212BB0270721ABB0270722CBB0270733E0000060B06076FA900000A7259BF02707261BF02707267BF0270726FBF02707285BF0270733E0000060B06076FA900000A72B6C4027072BEC4027072C4C4027072CCC4027072E2C40270733E0000060B06076FA900000A72DBCC027072E3CC027072E9CC027072F1CC02707201CD0270733E0000060B06076FA900000A7296D00270729ED0027072A4D0027072ACD0027072C2D00270733E0000060B06076FA900000A72DBD7027072E3D7027072E9D7027072F1D702707201D80270733E0000060B06076FA900000A728EDC02707296DC0270729CDC027072A4DC027072B4DC0270733E0000060B06076FA900000A72A9E7027072B1E7027072B7E7027072BFE7027072CBE70270733E0000060B06076FA900000A7230EB02707238EB0270723EEB02707246EB02707252EB0270733E0000060B06076FA900000A7203F70270720BF702707211F702707219F702707231F70270733E0000060B06076FA900000A720AF902707212F902707218F902707220F90270724AF90270733E0000060B06076FA900000A72EFFC027072F7FC027072FDFC02707205FD0270733D0000060B06076FA900000A7221FD02707229FD0270722FFD02707237FD0270724FFD0270733E0000060B06076FA900000A7224050370722C0503707232050370723A050370724E050370733E0000060B06076FA900000A72EB08037072F308037072F90803707201090370720D090370733E0000060B06076FA900000A72E20C037072EA0C037072F00C037072F80C037072080D0370733E0000060B06076FA900000A72F90E037072010F037072070F0370720F0F037072190F0370733E0000060B06076FA900000A723E1503707246150370724C15037072541503707272150370733E0000060B06076FA900000A72F71A037072FF1A037072051B0370720D1B0370723F1B0370733E0000060B06076FA900000A72902303707298230370729E23037072A623037072B4230370733E0000060B06076FA900000A7255260370725D2603707263260370726B2603707275260370733E0000060B06076FA900000A72062A0370720E2A037072142A0370721C2A0370722E2A0370733E0000060B06076FA900000A7257300370725F3003707265300370726D3003707279300370733E0000060B06076FA900000A7296350370729E35037072A435037072AC35037072EC350370733E0000060B06076FA900000A725939037072613903707267390370726F390370727D390370733E0000060B06076FA900000A723A3E037072423E037072483E037072503E037072723E0370733E0000060B06076FA900000A72CF48037072D748037072DD48037072E548037072F7480370733E0000060B06076FA900000A72684C037072704C037072764C0370727E4C037072884C0370733E0000060B06076FA900000A72894E037072914E037072974E0370729F4E037072B74E0370733E0000060B06076FA900000A72B454037072BC54037072C254037072CA54037072DC540370733E0000060B06076FA900000A72655E0370726D5E037072735E0370727B5E037072895E0370733E0000060B06076FA900000A724A6003707252600370725860037072606003707272600370733E0000060B06076FA900000A72E366037072EB66037072F166037072F96603707211670370733E0000060B06076FA900000A72AA6D037072B26D037072B86D037072C06D037072CC6D0370733E0000060B06076FA900000A72A16F037072A96F037072AF6F037072B76F0370733D0000060B06076FA900000A72C76F037072CF6F037072D56F037072DD6F037072ED6F0370733E0000060B06076FA900000A72FE7103707206720370720C7203707214720370723A720370733E0000060B06076FA900000A720F7403707217740370721D74037072257403707233740370733E0000060B06076FA900000A72F478037072FC7803707202790370720A7903707224790370733E0000060B06076FA900000A72CD80037072D580037072DB80037072E3800370720F810370733E0000060B06076FA900000A72808B037072888B0370728E8B037072968B037072AE8B0370733E0000060B06076FA900000A726B900370727390037072799003707281900370733D0000060B06076FA900000A72B590037072BD90037072C390037072CB900370720D910370733E0000060B06076FA900000A7262950370726A950370727095037072789503707284950370733E0000060B06076FA900000A72519903707259990370725F9903707267990370727D990370733E0000060B06076FA900000A7202A00370720AA003707210A003707218A003707244A00370733E0000060B06076FA900000A72B5A4037072BDA4037072C3A4037072CBA4037072E5A40370733E0000060B06076FA900000A7252AB0370725AAB03707260AB03707268AB03707278AB0370733E0000060B06076FA900000A723DAF03707245AF0370724BAF03707253AF03707261AF0370733E0000060B06076FA900000A7232B50370723AB503707240B503707248B50370725EB50370733E0000060B06076FA900000A7227BB0370722FBB03707235BB0370723DBB03707257BB0370733E0000060B06076FA900000A7230BD03707238BD0370723EBD03707246BD0370725ABD0370733E0000060B06076FA900000A72EFC1037072F7C1037072FDC103707205C203707217C20370733E0000060B06076FA900000A7234C80370723CC803707242C80370724AC80370725CC80370733E0000060B06076FA900000A72E5CB037072EDCB037072F3CB037072FBCB0370721BCC0370733E0000060B06076FA900000A72FCD103707204D20370720AD203707212D203707222D20370733E0000060B06076FA900000A72B7D5037072BFD5037072C5D5037072CDD5037072E7D50370733E0000060B06076FA900000A7250DE03707258DE0370725EDE03707266DE037072C0DE0370733E0000060B06076FA900000A7205E80370720DE803707213E80370721BE803707227E80370733E0000060B06076FA900000A72F4EC037072FCEC03707202ED0370720AED0370721EED0370733E0000060B06076FA900000A7217F40370721FF403707225F40370722DF403707239F40370733E0000060B06076FA900000A725EF803707266F80370726CF803707274F803707286F80370733E0000060B06076FA900000A72D7FC037072DFFC037072E5FC037072EDFC0370733D0000060B06076FA900000A721BFD03707223FD03707229FD03707231FD03707245FD0370733E0000060B06076FA900000A725E0504707266050470726C05047072740504707282050470733E0000060B06076FA900000A72B708047072BF08047072C508047072CD08047072E5080470733E0000060B06076FA900000A72C20B047072CA0B047072D00B047072D80B047072020C0470733E0000060B06076FA900000A727B0F047072830F047072890F047072910F047072C50F0470733E0000060B06076FA900000A7242140470724A14047072501404707258140470726E140470733E0000060B06076FA900000A72F317047072FB170470720118047072091804707243180470733E0000060B06076FA900000A72E821047072F021047072F621047072FE2104707210220470733E0000060B06076FA900000A723924047072412404707247240470724F2404707267240470733E0000060B06076FA900000A72C029047072C829047072CE29047072D629047072E0290470733E0000060B06076FA900000A72152F0470721D2F047072232F0470722B2F0470733D0000060B06076FA900000A723B2F047072432F047072492F047072512F0470725D2F0470733E0000060B06076FA900000A721E3304707226330470722C3304707234330470725C330470733E0000060B06076FA900000A72A13C047072A93C047072AF3C047072B73C047072C73C0470733E0000060B06076FA900000A724C4204707254420470725A42047072624204707270420470733E0000060B06076FA900000A72DD47047072E547047072EB47047072F3470470720D480470733E0000060B06076FA900000A72DE4F047072E64F047072EC4F047072F44F04707226500470733E0000060B06076FA900000A72DB57047072E357047072E957047072F157047072FF570470733E0000060B06076FA900000A729C61047072A461047072AA61047072B261047072C0610470733E0000060B06076FA900000A723D6604707245660470724B66047072536604707263660470733E0000060B06076FA900000A723C6804707244680470724A6804707252680470727C680470733E0000060B06076FA900000A72116B047072196B0470721F6B047072276B047072456B0470733E0000060B06076FA900000A7226740470722E7404707234740470723C7404707258740470733E0000060B06076FA900000A72897A047072917A047072977A0470729F7A0470733D0000060B06076FA900000A72E97A047072F17A047072F77A047072FF7A0470720F7B0470733E0000060B06076FA900000A72B480047072BC80047072C280047072CA80047072E0800470733E0000060B06076FA900000A72B984047072C184047072C784047072CF84047072DF840470733E0000060B06076FA900000A72A88B047072B08B047072B68B047072BE8B047072D28B0470733E0000060B06076FA900000A72C38F047072CB8F047072D18F047072D98F047072EB8F0470733E0000060B06076FA900000A72309504707238950470723E95047072469504707276950470733E0000060B06076FA900000A72579E0470725F9E047072659E0470726D9E047072979E0470733E0000060B06076FA900000A7298AA047072A0AA047072A6AA047072AEAA0470733D0000060B06076FA900000A72D2AA047072DAAA047072E0AA047072E8AA04707206AB0470733E0000060B06076FA900000A72E3AF047072EBAF047072F1AF047072F9AF04707205B00470733E0000060B06076FA900000A72DEB1047072E6B1047072ECB1047072F4B104707202B20470733E0000060B06076FA900000A720BB604707213B604707219B604707221B604707233B60470733E0000060B06076FA900000A062A00000013300200600000002100001102A5090000020A0312007B1B000004288100000A810B0000010412007B1C000004288100000A810B0000010512007B1D000004288100000A810B0000010E0412007B1E000004288100000A810B0000010E0512007B1F000004735300000A512A1E02282300000A2A033002005300000000000000027C67000004284800000A6F2500000A037B170000046F9100000A2D34027C67000004284800000A6F2500000A037B180000046F9100000A2D17027C67000004284800000A037B160000046F9100000A2A172A00133002003C0000002200001128AF00000A6FB000000A027B6A0000043315027B690000041FFE330B02167D69000004020A2B071673AB0000060A06027B6C0000047D6B000004062A1E0228A40000062A1B3005004802000023000011027B690000040B074504000000050000001E0200002B01000017020000381902000002157D6900000402147D700000040273A20000067D71000004027B71000004027B6B0000047D67000004027C6D000004FE1509000002027B710000047C67000004284600000A2D24027B710000047C67000004284800000A6F4900000A7E7500000A282100000A39DC0000000228350000066FB100000A7D7200000402177D6900000438A500000002027C7200000428B200000A7D6E000004027C6D000004027B6E0000047B160000047D1B000004027C6D000004027B6E0000047B170000047D1C000004027C6D000004027B6E0000047B180000047D1D000004027C6D000004027B6E0000047B190000047D1E000004027C6D000004027B6E0000047B1A0000047D1F00000402027B6D0000048C090000027D6800000402187D69000004170ADDFE00000002177D69000004027C7200000428B300000A3A4BFFFFFF0228AC00000638D1000000022835000006027B700000042D1702027B71000004FE06A300000673B400000A7D70000004027B700000046FB500000A7D6F000004027B6F0000043991000000027C6D000004027B6F0000047B160000047D1B000004027C6D000004027B6F0000047B170000047D1C000004027C6D000004027B6F0000047B180000047D1D000004027C6D000004027B6F0000047B190000047D1E000004027C6D000004027B6F0000047B1A0000047D1F00000402027B6D0000048C090000027D6800000402197D69000004170ADE1202157D69000004160ADE070228A9000006DC062A411C000004000000000000003F0200003F02000007000000000000001E027B680000042A1A73B600000A7A001B3002002200000024000011027B690000040A061759450200000001000000010000002ADE070228AC000006DC2A00000110000002001800021A0007000000001E027B680000042A7A02282300000A02037D690000040228AF00000A6FB000000A7D6A0000042A6602157D69000004027C72000004FE160700001B6F3500000A2A0000001330020011000000220000111FFE73AB0000060A06027D6C000004062A000000133004009A0A00002500001173B700000A0A7248BB04707247120070724EBB0470722E74047073400000060B06076FB800000A725EBB04707264BB0470726ABB0470722E74047073400000060B06076FB800000A7278BB047072F91E007072071F0070721100007073400000060B06076FB800000A727EBB047072FA5E00707284BB0470722E74047073400000060B06076FB800000A7294BB047072FB4A0070729ABB0470722E74047073400000060B06076FB800000A72ACBB0470721100007072B2BB0470721100007073400000060B06076FB800000A72CCBB04707234DE007072D2BB0470722E74047073400000060B06076FB800000A72E8BB047072A608017072EEBB0470722E74047073400000060B06076FB800000A7200BC04707206BC0470720CBC0470722E74047073400000060B06076FB800000A7224BC04707213A30170722ABC0470722E74047073400000060B06076FB800000A723CBC04707242BC04707248BC0470722E74047073400000060B06076FB800000A7272BC04707278BC0470727EBC0470722E74047073400000060B06076FB800000A728EBC04707233B002707294BC0470721100007073400000060B06076FB800000A72D2BC047072889A0170721A9F0170722E74047073400000060B06076FB800000A72D8BC047072E3C2017072F1C20170721100007073400000060B06076FB800000A72DEBC047072E4BC047072EABC0470722E74047073400000060B06076FB800000A72F8BC0470721100007072FEBC0470721100007073400000060B06076FB800000A721CBD04707206FC01707222BD0470722E74047073400000060B06076FB800000A722EBD047072C70D02707234BD0470722E74047073400000060B06076FB800000A7246BD0470721BF80170724CBD0470722E74047073400000060B06076FB800000A725CBD04707262BD04707268BD0470722E74047073400000060B06076FB800000A7272BD047072110000707278BD0470721100007073400000060B06076FB800000A7294BD04707211000070729ABD0470721100007073400000060B06076FB800000A72B8BD047072BEBD047072C4BD0470722E74047073400000060B06076FB800000A72D2BD04707202E8007072D8BD0470722E74047073400000060B06076FB800000A72EABD0470721100007072F0BD0470721100007073400000060B06076FB800000A720ABE047072F45402707210BE0470722E74047073400000060B06076FB800000A7224BE04707261BF0270722ABE0470722E74047073400000060B06076FB800000A7236BE047072F79802707205990270721100007073400000060B06076FB800000A723CBE04707286B402707242BE0470722E74047073400000060B06076FB800000A7254BE047072E3CC0270725ABE0470722E74047073400000060B06076FB800000A7276BE0470727CBE04707282BE0470722E74047073400000060B06076FB800000A7294BE04707211000070729ABE0470721100007073400000060B06076FB800000A72B8BE0470720CBB027072BEBE0470722E74047073400000060B06076FB800000A725D05007072BEC4027072D2BE0470722E74047073400000060B06076FB800000A72EABE047072BF74027072F0BE0470722E74047073400000060B06076FB800000A7202BF047072749502707208BF0470722E74047073400000060B06076FB800000A7218BF04707211000070721EBF0470721100007073400000060B06076FB800000A723CBF047072F30803707242BF0470722E74047073400000060B06076FB800000A7254BF0470725ABF04707260BF0470722E74047073400000060B06076FB800000A726EBF04707274BF0470727ABF0470722E74047073400000060B06076FB800000A7296BF0470729CBF047072A2BF0470722E74047073400000060B06076FB800000A72B8BF047072BEBF047072C4BF0470722E74047073400000060B06076FB800000A72DABF047072E0BF047072E6BF0470722E74047073400000060B06076FB800000A72F8BF047072F7FC027072FEBF0470722E74047073400000060B06076FB800000A721CC004707222C004707228C00470722E74047073400000060B06076FB800000A7242C0047072FF1A0370720D1B0370721100007073400000060B06076FB800000A7248C00470724EC004707254C00470722E74047073400000060B06076FB800000A725EC004707264C00470726AC00470722E74047073400000060B06076FB800000A727CC004707282C004707288C00470722E74047073400000060B06076FB800000A7296C00470725F300370726D300370721100007073400000060B06076FB800000A729CC00470721100007072A2C00470721100007073400000060B06076FB800000A72BEC00470726139037072C4C00470722E74047073400000060B06076FB800000A72DEC0047072EB66037072F9660370721100007073400000060B06076FB800000A72E4C0047072EAC0047072F0C00470722E74047073400000060B06076FB800000A720AC10470723AB503707210C10470722E74047073400000060B06076FB800000A722EC10470721FF403707234C10470722E74047073400000060B06076FB800000A724EC1047072A93C04707254C10470722E74047073400000060B06076FB800000A7268C10470726EC104707274C10470722E74047073400000060B06076FB800000A7280C1047072917A04707286C10470721100007073400000060B06076FB800000A72BEC1047072C4C1047072CAC10470722E74047073400000060B06076FB800000A72D4C1047072DAC1047072E0C10470722E74047073400000060B06076FB800000A72F0C10470721AE4017072F6C10470722E74047073400000060B06076FB800000A7208C20470725F9E0470720EC20470721100007073400000060B06076FB800000A7244C204707211000070724AC20470721100007073400000060B06076FB800000A7262C204707268C20470726EC20470722E74047073400000060B06076FB800000A7284C20470728AC204707290C20470722E74047073400000060B06076FB800000A72ACC2047072B2C2047072B8C20470722E74047073400000060B06076FB800000A72CCC2047072D2C2047072D8C20470722E74047073400000060B06076FB800000A721100007072E8C2047072EEC204707234DE007073400000060B06076FB800000A721100007072FEC204707204C304707234DE007073400000060B06076FB800000A72110000707226C30470722CC304707234DE007073400000060B06076FB800000A7211000070723EC304707244C304707234DE007073400000060B06076FB800000A7211000070720BF702707260C304707234DE007073400000060B06076FB800000A72110000707294C30470729AC304707234DE007073400000060B06076FB800000A721100007072B2C3047072B8C304707234DE007073400000060B06076FB800000A721100007072010F037072E4C304707234DE007073400000060B06076FB800000A721100007072F4C3047072FAC304707234DE007073400000060B06076FB800000A721100007072704C0370720AC404707234DE007073400000060B06076FB800000A72110000707234C40470723AC404707234DE007073400000060B06076FB800000A721100007072F7C103707248C404707234DE007073400000060B06076FB800000A7211000070729CAB02707262C404707234DE007073400000060B06076FB800000A062A000013300200600000002600001102A50B0000020A0312007B25000004288100000A810B0000010412007B26000004288100000A810B0000010512007B27000004288100000A810B0000010E0412007B28000004735300000A510E0512007B29000004288100000A810B0000012A1E02282300000A2AEA027C74000004284800000A6F4900000A7E7500000A282100000A2D1C027C74000004284800000A6F2500000A037B240000046F9100000A2A172ADA027C73000004284800000A6F2500000A037B210000046F9100000A2D17027C73000004284800000A037B200000046F9100000A2A172A000013300200480000002700001128AF00000A6FB000000A027B770000043315027B760000041FFE330B02167D76000004020A2B071673B70000060A06027B790000047D7800000406027B7B0000047D7A000004062A1E0228B00000062A1B300500EC02000023000011027B760000040B07450400000005000000C202000084010000BB02000038BD02000002157D7600000402147D8000000402147D810000040273AD0000067D82000004027B82000004027B780000047D73000004027B82000004027B7A0000047D74000004027C7C000004FE150B000002027B820000047C73000004284600000A2D24027B820000047C73000004284800000A6F4900000A7E7500000A282100000A391D010000022838000006027B800000042D1702027B82000004FE06AE00000673B900000A7D80000004027B800000046FBA00000A7D7D000004027B7D00000439F901000002027B7D0000046FBB00000A7D8300000402177D7600000438A500000002027C8300000428BC00000A7D7E000004027C7C000004027B7E0000047B200000047D25000004027C7C000004027B7E0000047B210000047D26000004027C7C000004027B7E0000047B220000047D27000004027C7C000004027B7E0000047B230000047D28000004027C7C000004027B7E0000047B240000047D2900000402027B7C0000048C0B0000027D7500000402187D76000004170ADD4901000002177D76000004027C8300000428BD00000A3A4BFFFFFF0228B8000006381C010000022838000006027B810000042D1702027B82000004FE06AF00000673B900000A7D81000004027B810000046FBE00000A7D7F000004027B7F00000439DC000000027B820000047C74000004284800000A6F4900000A7E7500000A282100000A2D2A027B820000047C74000004284800000A6F2500000A027B7F0000047B240000046F9100000A3991000000027C7C000004027B7F0000047B200000047D25000004027C7C000004027B7F0000047B210000047D26000004027C7C000004027B7F0000047B220000047D27000004027C7C000004027B7F0000047B230000047D28000004027C7C000004027B7F0000047B240000047D2900000402027B7C0000048C0B0000027D7500000402197D76000004170ADE1202157D76000004160ADE070228B5000006DC062A411C00000400000000000000E3020000E302000007000000000000001E027B750000042A1A73B600000A7A001B3002002200000024000011027B760000040A061759450200000001000000010000002ADE070228B8000006DC2A00000110000002001800021A0007000000001E027B750000042A7A02282300000A02037D760000040228AF00000A6FB000000A7D770000042A6602157D76000004027C83000004FE160B00001B6F3500000A2A0000001330020018000000270000111FFE73B70000060A06027D7900000406037D7B000004062A1E02282300000A2A1E02282300000A2A36020304050E0414283E0000062A000013300500750000000100001102282300000A02037D1600000402047D1700000402057D18000004020E047D190000040E052C4D726EC404700E05281800000A10050E056FBF00000A185B8D2B0000010A160B2B1906070E0507185A186F2000000A1F10281200000A9C0717580B070E056FBF00000A185B32DB02067D1A0000042A1E02282300000A2A3602030405140E0428410000062A0013300500670000000100001102282300000A02037D2000000402047D2100000402057D22000004020E057D240000040E042C3F0E046FBF00000A185B8D2B0000010A160B2B1906070E0407185A186F2000000A1F10281200000A9C0717580B070E046FBF00000A185B32DB02067D230000042A00133002006F000000280000110F00286200000A2D0F23000000000000F03F289000000A2A0F00286200000A162F0B72BEC40470734700000A7A0F00286200000A20AA000000310B7208C50470734700000A7A23000000000000F03F0A170B2B0906076C5A0A0717580B070F00286200000A31ED066C289000000A2A001330040032040000290000110F00284800000A7E7500000A282100000A2C0B7256C50470734700000A7A0F00284800000A6F4A00000A0A06250B39F0030000FE137E5B0000043A8B0100001F1E732700000A257292C5047016282800000A2572ACC5047017282800000A2572BCC5047018282800000A2572F0C5047019282800000A25720AC604701A282800000A257220C604701B282800000A257238C604701C282800000A257256C604701D282800000A257274C604701E282800000A257282C604701F09282800000A257296C604701F0A282800000A2572C0C604701F0B282800000A2572EEC604701F0C282800000A25721EC704701F0D282800000A25723AC704701F0E282800000A257250C704701F0F282800000A257260C704701F10282800000A257278C704701F11282800000A257292C704701F12282800000A2572BCC704701F13282800000A2572DCC704701F14282800000A257202C804701F15282800000A25722AC804701F16282800000A25725EC804701F17282800000A25728EC804701F18282800000A2572B0C804701F19282800000A2572C2C804701F1A282800000A2572E0C804701F1B282800000A2572E8C804701F1C282800000A2572F8C804701F1D282800000AFE13805B000004FE137E5B000004071202282900000A394502000008451E0000000500000014000000230000003200000041000000500000005F0000006E0000007D0000008C0000009B000000AA000000B9000000C8000000D7000000E6000000F500000004010000130100002201000031010000400100004F0100005E0100006D0100007C0100008B0100009A010000A9010000B801000038C201000023000000\
-4A78DEB141289000000A2A23F2D318F46A57D23D289000000A2A2305A3923A019D2340289000000A2A23EE05D594DD79B239289000000A2A2367545D759A90603A289000000A2A235CF241D07296603A289000000A2A23CBEB3E35F871603A289000000A2A23FE535ED5DAA4073C289000000A2A239161D9520D860B39289000000A2A231B1CC9F6EDB0303B289000000A2A233C60970F3715B53E289000000A2A232E1148F17678A33D289000000A2A2372C50AB8BA61E93C289000000A2A23F126374DD4E37D3F289000000A2A23FCBC18F88117CD3D289000000A2A232B87167144EE6441289000000A2A238D18571B1AA0E23C289000000A2A23E4D80666566C263B289000000A2A236DE57C8CFE72263B289000000A2A23F34857F6A102793A289000000A2A23862B7BDA6476913A289000000A2A2333BC404841EC873A289000000A2A232C3180D29057853D289000000A2A23526EDE98EDCDD73C289000000A2A2371C375567D716E3E289000000A2A23C20EBE6184E1DF44289000000A2A234289E0C9B8F3963F289000000A2A23A987687407A12040289000000A2A23E7FBA9F1548EF740289000000A2A236A4DF38E3335D940289000000A2A230000000000000000289000000A2A000013300400420600002A0000112300000000000000000A72110000700B0F01284800000A7E7500000A282100000A2C0B7224C90470734700000A7A0F02284800000A7E7500000A282100000A2C0B7250C90470734700000A7A0F01284800000A6F4A00000A0F02284800000A6F4A00000A282100000A2C02022A7E530000040F01284800000A6F4A00000A7278C904700F02284800000A6F4A00000A283800000A12026FC100000A2C100F00288D00000A085A6C289000000A2A0F01284800000A6F4A00000A250D39E1020000FE137E5C0000043AC80000001F0F732700000A25727EC9047016282800000A25728AC9047017282800000A2572A0C9047018282800000A2572B6C9047019282800000A2572CAC904701A282800000A2572D4C904701B282800000A2572DEC904701C282800000A2572E8C904701D282800000A2572F2C904701E282800000A257208CA04701F09282800000A25721CCA04701F0A282800000A25722ACA04701F0B282800000A25723ACA04701F0C282800000A257250CA04701F0D282800000A257260CA04701F0E282800000AFE13805C000004FE137E5C000004091204282900000A39F90100001104450F000000050000001800000035000000520000006F0000008C000000A9000000C6000000E3000000000100001D010000300100004A010000780100009201000038B10100000F00288D00000A0A7270CA04700B38A90100000F00288D00000A237B14AE47E17A843F5A0A7270CA04700B388C0100000F00288D00000A23FCA9F1D24D62503F5A0A7270CA04700B386F0100000F00288D00000A230000000000408F405A0A7270CA04700B38520100000F00288D00000A23FD87F4DBD781D33F5A0A7270CA04700B38350100000F00288D00000A23A60A462575029A3F5A0A7270CA04700B38180100000F00288D00000A234C378941602599405A0A7270CA04700B38FB0000000F00288D00000A23FBCBEEC9C342ED3F5A0A7270CA04700B38DE0000000F00288D00000A238DEDB5A0F7C6B03E5A0A7270CA04700B38C10000000F00288D00000A2395D626E80B2E113E5A0A7270CA04700B38A40000000F00288D00000A0A7282CA04700B38910000000F00288D00000A236666666666127140580A7282CA04700B2B770F00288D00000A2300000000000040405923CDCCCCCCCCCCFC3F5B236666666666127140580A7282CA04700B2B490F00288D00000A23CDCCCCCCCCCCFC3F5B0A7282CA04700B2B2F0F00288D00000A23000000000000F43F5A236666666666127140580A7282CA04700B2B0B729ACA0470734700000A7A07251305398502000011057270CA0470282100000A2D1611057282CA0470282100000A3A9901000038610200000F02284800000A6F4A00000A2513063975010000FE137E5D0000043A870000001F0A732700000A25727EC9047016282800000A25728AC9047017282800000A2572A0C9047018282800000A2572B6C9047019282800000A2572CAC904701A282800000A2572D4C904701B282800000A2572DEC904701C282800000A2572E8C904701D282800000A2572F2C904701E282800000A257208CA04701F09282800000AFE13805D000004FE137E5D00000411061207282900000A39CD0000001107450A0000007601000005000000160000002700000038000000490000005A0000006B0000007C0000008D000000389900000006237B14AE47E17A843F5B0A38600100000623FCA9F1D24D62503F5B0A384F01000006230000000000408F405B0A383E0100000623FD87F4DBD781D33F5B0A382D0100000623A60A462575029A3F5B0A381C01000006234C378941602599405B0A380B0100000623FBCBEEC9C342ED3F5B0A38FA00000006238DEDB5A0F7C6B03E5B0A38E9000000062395D626E80B2E113E5B0A38D800000072CACA0470734700000A7A06230000000000000000340B7251CB0470734700000A7A0F02284800000A6F4A00000A25130839970000001108721CCA0470282100000A3A910000001108722ACA0470282100000A2D2C1108723ACA0470282100000A2D2C11087250CA0470282100000A2D4011087260CA0470282100000A2D402B4C06236666666666127140590A2B49062366666666661271405923CDCCCCCCCCCCFC3F5A230000000000004040580A2B2706236666666666127140590A2B1906236666666666127140590A2B0B72CACA0470734700000A7A066C289000000A2A0000133002007B0000002B0000110F00288500000A186A2F0716287F00000A2A0F00288500000A186A330717287F00000A2A0F00288500000A186A5D166A330716287F00000A2A0F00288500000A6C28C200000A23000000000000F03F580B196A0A2B190F00288500000A065D166A330716287F00000A2A06186A580A066C0731E217287F00000A2A000330030067000000000000000F01286200000A0F02286200000A310B72B5CB0470734700000A7A0F0028C300000A2C1E73C400000A0F01286200000A0F02286200000A6FC500000A286800000A2A0F00286200000A73C600000A0F01286200000A0F02286200000A6FC500000A286800000A2A0013300200050100002C00001102A50D0000020A0312007B2B000004286800000A810E0000010412007B2C000004286400000A810D0000010512007B2D0000046C289000000A81110000010E0412007B2E0000046C289000000A81110000010E0512007B2F0000046C289000000A81110000010E0612007B300000046C289000000A81110000010E0712007B310000046C289000000A81110000010E0812007B320000046C289000000A81110000010E0912007B330000046C289000000A81110000010E0A12007B340000046C289000000A81110000010E0B12007B350000046C289000000A81110000010E0C12007B36000004286800000A810E0000010E0D12007B37000004286800000A810E0000012A00000013300700820300002D0000110F02286200000A172F0B7211CC0470734700000A7A0F03286200000A172F0B7255CC0470734700000A7A0F05288D00000A230000000000000000340B72A1CC0470734700000A7A73C700000A0A20E80300008D0D0000020B0F03286200000A0F02286200000A5A0C0F04286500000A0D23000000000000000013050F00288D00000A1306230000000000000000130723000000000000000013082300000000000000001309230000000000000000130A230000000000000000130B2300000000000028400F03286200000A6C5B1628C800000A289600000A130C0F00288D00000A0F01288D00000A0F03286200000A6C2300000000000059405A5B23000000000000F03F23000000000000F03F0F01288D00000A0F03286200000A6C2300000000000059405A5B5823000000000000F0BF0F03286200000A6C5A0F02286200000A6C5A28C900000A595B5A13081108289500000A130D110D1108110D592300000000000059405A28CA00000A2300000000000059405B58130817130438B50100001106130511080F05288D00000A581105340E11080F05288D00000A5813072B041105130711050F01288D00000A2300000000000059405B0F03286200000A6C5B5A13091109289500000A130E1109110E59230000000000408F405A289500000A230000000000A88140330E110E233D0AD7A3703DE23F5813091109181728CB00000A1309110B110958130B11080F05288D00000A581105341A1107110959130A1105110A59130611061828C800000A13062B2011081105320B11051109581308110813071105130A230000000000000000130607110417598F0D00000211047D2B00000407110417598F0D00000212031104110C5A28CC00000A7D2C00000407110417598F0D00000211057D2D00000407110417598F0D00000211087D2E00000407110417598F0D0000020F05288D00000A7D2F00000407110417598F0D00000211077D3000000407110417598F0D00000211097D3200000407110417598F0D000002110A7D3100000407110417598F0D00000211067D3300000407110417598F0D000002110B7D3400000407110417598F0D000002087D3600000407110417598F0D000002081104597D37000004110417581304110408301011062300000000000000003D36FEFFFF16130F2B2807110F8F0D000002110B7D350000040607110F8F0D000002710D0000026FCD00000A110F1758130F110F1104175932D0062A4E0F00288D00000A28CE00000A6C289000000A2A4E0F00288D00000A28CF00000A6C289000000A2A4E0F00288D00000A28D000000A6C289000000A2A620F00288D00000A7E2A00000428C900000A6C289000000A2A00133002002E0000002E0000112300000000000024400F0128D100000A6C28C900000A0A0F00288D00000A065A289500000A065B6C289000000A2A000013300300560000002F0000110F02284800000A7E7500000A282100000A2C190F0028D200000A0B12010F01284800000A28D300000A0A2B230F0028D200000A0C12020F01284800000A0F02284800000A28A600000A28D400000A0A06288100000A2A3E23555555555555D53F802A0000042A1E02282300000A2A000013300400B901000030000011026F4900000A7E7500000A282100000A2C02162A160A160B160C160D16130416130516130616130716130802178D2C000001130A110A161F7C9D110A6FD500000A130B16130C3861010000110B110C9A130911096F4900000A6F4A00000A25130D3924010000FE137E5E0000042D6D1E732700000A257201CD047016282800000A257217CD047017282800000A257239CD047018282800000A257259CD047019282800000A257289CD04701A282800000A25729DCD04701B282800000A2572B5CD04701C282800000A2572CBCD04701D282800000AFE13805E000004FE137E5E000004110D120E282900000A3999000000110E45080000000200000012000000210000002C0000003A0000004700000055000000630000002B7011043A850000000617600A1713042B7C072D79062000020000600A170B2B6D092D6A061A600A170D2B6211052D5E061F20600A1713052B5411062D500618600A1713062B4711072D43061F40600A1713072B3911082D35061F10600A1713082B2B082D28062000010000600A170C2B1C72E1CD047011096F4900000A7205CE0470283800000A734100000A7A110C1758130C110C110B8E693F94FEFFFF062A000000133004006C00000031000011026F4F00000A2C0716287F00000A2A0F02286200000A172F0B7221CE0470734100000A7A026F5100000A73D600000A0A160B0F03284600000A2D0D0F03284800000A28510000060B0F01284800000A0773D700000A0C08060F02286200000A17596FD800000A287F00000A2A133004007000000031000011026F4F00000A2C067ED900000A2A0F02286200000A172F0B7221CE0470734100000A7A026F5100000A73D600000A0A160B0F03284600000A2D0D0F03284800000A28510000060B0F01284800000A0773D700000A0C08060F02286200000A17596FDA00000A6F7400000A288100000A2A133004007700000031000011026F4F00000A2C067ED900000A2A0F02286200000A172F0B7221CE0470734100000A7A026F5100000A73D600000A0A160B0F04284600000A2D0D0F04284800000A28510000060B0F01284800000A0773D700000A0C08060F02286200000A17590F03286200000A6FDB00000A6F7400000A288100000A2A0013300200650000003200001102A5100000020A0312007B3A000004286800000A810E0000010412007B3B000004288100000A73DC00000A510512007B3C000004286800000A810E0000010E0412007B3D000004286800000A810E0000010E0512007B3E000004286800000A810E0000012A00000013300400D900000033000011026F4F00000A2C0673DD00000A2A0F02286200000A172F0B7221CE0470734100000A7A026F5100000A73D600000A0A160B0F03284600000A2D0D0F03284800000A28510000060B73DD00000A0C1203FE15100000020F01284800000A0773D700000A13051105060F02286200000A17596FDA00000A130411046FDE00000A2D0673DD00000A2A1203177D3A000004120311046F7400000A7D3B000004120311046FDF00000A17587D3C000004120311046FDF00000A11046FE000000A587D3D000004120311046FE000000A7D3E00000408096FE100000A082A00000013300200600000003400001128AF00000A6FB000000A027B860000043315027B850000041FFE330B02167D85000004020A2B071673C00000060A06027B880000047D8700000406027B8A0000047D8900000406027B8C0000047D8B00000406027B8E0000047D8D000004062A1E0228B90000062A13300500CE01000024000011027B850000040A064502000000050000008C01000038B201000002157D85000004027C87000004284600000A3A9B010000027C8B000004286200000A172F0B7221CE0470734100000A7A02167D8F000004027C8D000004284600000A2D1602027C8D000004284800000A28510000067D8F00000473DD00000A26027C90000004FE151000000202027C89000004284800000A027B8F00000473D700000A7D9200000402027B92000004027C87000004284800000A027C8B000004286200000A17596FE200000A7D9100000402167D9300000438DF000000027C90000004027B9300000417587D3A000004027C90000004027B91000004027B930000046FE300000A6F7400000A7D3B000004027C90000004027B91000004027B930000046FE300000A6FDF00000A17587D3C000004027C90000004027B91000004027B930000046FE300000A6FDF00000A027B91000004027B930000046FE300000A6FE000000A587D3D000004027C90000004027B91000004027B930000046FE300000A6FE000000A7D3E00000402027B900000048C100000027D8400000402177D85000004172A02157D8500000402257B9300000417587D93000004027B93000004027B910000046FE400000A3F0BFFFFFF162A1E027B840000042A1A73B600000A7A062A1E027B840000042A7A02282300000A02037D850000040228AF00000A6FB000000A7D860000042A00001330020026000000340000111FFE73C00000060A06027D8800000406037D8A00000406047D8C00000406057D8E000004062A0000133006008000000035000011026F4F00000A2D090F01284600000A2C067ED900000A2A0F04286200000A172F0B7221CE0470734100000A7A160A0F05284600000A2D0D0F05284800000A28510000060A0F01284800000A0673D700000A0B07026F5100000A73D600000A0F02284800000A0F03286200000A0F04286200000A17596FE500000A288100000A2A133002006C0000003600001128AF00000A6FB000000A027B960000043315027B950000041FFE330B02167D95000004020A2B071673C80000060A06027B980000047D9700000406027B9A0000047D9900000406027B9C0000047D9B00000406027B9E0000047D9D00000406027BA00000047D9F000004062A1E0228C10000062A133005005403000024000011027B950000040A06450300000005000000FC01000032030000383403000002157D95000004027C97000004284600000A3A1D030000027C9D000004286200000A172F0B7221CE0470734100000A7A02167DA1000004027C9F000004284600000A2D1602027C9F000004284800000A28510000067DA1000004027CA2000004FE151000000202027C99000004284800000A027BA100000473D700000A7DA400000402027BA4000004027C97000004284800000A027C9D000004286200000A17596FE200000A7DA300000402167DA500000402027BA30000046FE400000A7DA7000004027C9B000004286200000A16312B027C9B000004286200000A027BA30000046FE400000A2F1302027C9B000004286200000A17597DA700000402167DA60000043837010000027CA2000004027BA600000417587D3A000004027CA2000004027C97000004284800000A027BA5000004027BA3000004027BA60000046FE300000A6FDF00000A027BA5000004596F2000000A7D3B000004027CA2000004027BA3000004027BA60000046FE300000A6FDF00000A027BA5000004597D3E000004027CA20000047B3E000004163136027CA2000004027BA500000417587D3C000004027CA2000004027BA3000004027BA60000046FE300000A6FDF00000A7D3D0000042B18027CA2000004157D3C000004027CA2000004157D3D00000402027BA20000048C100000027D9400000402177D95000004172A02157D9500000402027BA3000004027BA60000046FE300000A6FDF00000A027BA3000004027BA60000046FE300000A6FE000000A587DA500000402257BA600000417587DA6000004027BA6000004027BA70000043FB8FEFFFF027CA2000004027BA600000417587D3A000004027CA2000004027C97000004284800000A027BA5000004027C97000004284800000A6FBF00000A027BA5000004596F2000000A7D3B000004027CA2000004027C97000004284800000A6FBF00000A027BA5000004597D3E000004027CA20000047B3E000004163130027CA2000004027BA500000417587D3C000004027CA2000004027C97000004284800000A6FBF00000A7D3D0000042B18027CA2000004157D3C000004027CA2000004157D3D00000402027BA20000048C100000027D9400000402187D95000004172A02157D95000004162A1E027B940000042A1A73B600000A7A062A1E027B940000042A7A02282300000A02037D950000040228AF00000A6FB000000A7D960000042A133002002E000000360000111FFE73C80000060A06027D9800000406037D9A00000406047D9C00000406057D9E000004060E047DA0000004062A000013300400EE00000037000011026F4F00000A2C067ED900000A2A0F04286200000A172F0B7221CE0470734100000A7A160A0F06284600000A2D0D0F06284800000A28510000060A0F01284800000A0673D700000A0B0F05286200000A172F3307026F5100000A73D600000A0F04286200000A17596FDA00000A6F7700000A0F02286200000A6F7800000A6F7400000A0C2B3807026F5100000A73D600000A0F04286200000A17590F05286200000A6FDB00000A6F7700000A0F02286200000A6F7800000A6F7400000A0C087E7500000A287600000A2C0708288100000A2A0F03284600000A2C067ED900000A2A0F03284800000A288100000A2A4A0F00284800000A28E600000A288100000A2A4A0F00284800000A28E700000A288100000A2A13300400F9000000350000110F00284600000A2C067E9400000A2A0F02286200000A172F0B7221CE0470734100000A7A160A0F04284600000A2D0D0F04284800000A28510000060A0F01284800000A0673D700000A0B0F0328C300000A2D0A0F03286200000A172F47070F00284800000A0F02286200000A17596FDA00000A6FDE00000A2C23070F00284800000A0F02286200000A17596FDA00000A6FDF00000A1758286800000A2A16286800000A2A070F00284800000A0F02286200000A17590F03286200000A6FDB00000A6FDE00000A2C2A070F00284800000A0F02286200000A17590F03286200000A6FDB00000A6FDF00000A1758286800000A2A16286800000A2A00000013300600B1000000350000110F00284600000A2D090F01284600000A2C067ED900000A2A0F05286200000A172F0B7221CE0470734100000A7A160A0F06284600000A2D0D0F06284800000A28510000060A0F01284800000A0673D700000A0B070F00284800000A0F05286200000A17596FD800000A2C2A070F00284800000A0F02284800000A0F04286200000A0F05286200000A17596FE500000A288100000A2A0F03284600000A2C067ED900000A2A0F03284800000A288100000A2A1E02282300000A2A000000133003004E000000380000111B8D2D0000010A06167E3F0000040B1201282A00000AA20617720D000070A206187E400000040C1202282A00000AA20619720D000070A2061A7E410000040D1203282A00000AA20628E800000A2A0000033001004C0000000000000028E900000A6FEA00000A6FEB00000A6FEC00000A803F00000428E900000A6FEA00000A6FEB00000A6FED00000A804000000428E900000A6FEA00000A6FEB00000A6FEE00000A80410000042A1B300400D512000039000011725FCE04700A0F00284600000A2D1B0F00284800000A7E7500000A6F9100000A2D080F00284800000A0A7269CE04700B0F01284600000A2D200F01284800000A7E7500000A6F9100000A2D0D0F01284800000A6F4A00000A0B73F000000A0C7211000070731300000A0D097271CE04706FF100000A260972BDCE04706FF100000A260972110000706FF100000A26077269CE0470282100000A39F40900000872F1CE0470067217CF0470283800000A6FF200000A260872F1CE0470067214D00470283800000A6FF200000A260872F1CE04700672BBD00470283800000A6FF200000A260872F1CE047006723CD20470283800000A6FF200000A26087299D304700672BDD30470283800000A6FF200000A26087299D304700672B8D40470283800000A6FF200000A26087299D304700672A1D50470283800000A6FF200000A26087299D3047006728AD60470283800000A6FF200000A26087299D30470067213D90470283800000A6FF200000A26087299D304700672A6DB0470283800000A6FF200000A26087299D304700672FBDC0470283800000A6FF200000A26087299D304700672D2DE0470283800000A6FF200000A26087299D30470067293E00470283800000A6FF200000A26087299D3047006725CE20470283800000A6FF200000A26087299D30470067203E50470283800000A6FF200000A26087299D304700672B2E70470283800000A6FF200000A26087299D304700672B5E90470283800000A6FF200000A26087299D3047006729AEB0470283800000A6FF200000A26087299D30470067289ED0470283800000A6FF200000A26087299D304700672B8EF0470283800000A6FF200000A26087299D304700672F1F10470283800000A6FF200000A26087299D30470067290F40470283800000A6FF200000A26087299D3047006723BF70470283800000A6FF200000A26087299D304700672FEF90470283800000A6FF200000A26087299D3047006725FFB0470283800000A6FF200000A26087299D304700672A4FC0470283800000A6FF200000A26087299D30470067249FE0470283800000A6FF200000A26087299D304700672BEFF0470283800000A6FF200000A26087299D30470067231010570283800000A6FF200000A26087299D30470067270020570283800000A6FF200000A26087299D30470067205040570283800000A6FF200000A26087299D3047006721C050570283800000A6FF200000A26087299D30470067257060570283800000A6FF200000A26087299D304700672EA070570283800000A6FF200000A26087299D3047006728F090570283800000A6FF200000A26087299D304700672A20A0570283800000A6FF200000A26087299D304700672850C0570283800000A6FF200000A26087299D3047006723C0E0570283800000A6FF200000A26087299D304700672F70F0570283800000A6FF200000A26087299D304700672AE110570283800000A6FF200000A26087299D3047006727D130570283800000A6FF200000A26087299D30470067254150570283800000A6FF200000A26087299D304700672CF160570283800000A6FF200000A26087299D30470067212180570283800000A6FF200000A26087299D304700672DF190570283800000A6FF200000A26087299D304700672581B0570283800000A6FF200000A26087299D304700672531C0570283800000A6FF200000A26087299D304700672721D0570283800000A6FF200000A26087299D3047006729D1F0570283800000A6FF200000A26087299D304700672B4210570283800000A6FF200000A26087299D3047006726D230570283800000A6FF200000A26087299D30470067218250570283800000A6FF200000A26087299D304700672B1260570283800000A6FF200000A26087299D30470067240280570283800000A6FF200000A26087299D3047006722B290570283800000A6FF200000A26087299D304700672762A0570283800000A6FF200000A26087299D304700672CD2B0570283800000A6FF200000A26087299D304700672462D0570283800000A6FF200000A26087299D304700672D92E0570283800000A6FF200000A26087299D304700672FC2F0570283800000A6FF200000A26087299D30470067235310570283800000A6FF200000A26087299D30470067284320570283800000A6FF200000A26087299D30470067263340570283800000A6FF200000A26087299D304700672CA350570283800000A6FF200000A26087299D304700672C9360570283800000A6FF200000A26087299D304700672D0370570283800000A6FF200000A26087299D304700672113D0570283800000A6FF200000A26087299D304700672183E0570283800000A6FF200000A26087299D304700672993F0570283800000A6FF200000A26087299D3047006727A400570283800000A6FF200000A26087299D304700672A3410570283800000A6FF200000A26087299D304700672CC420570283800000A6FF200000A26087299D30470067267440570283800000A6FF200000A26087299D30470067252450570283800000A6FF200000A26087299D30470067287460570283800000A6FF200000A26087299D30470067268470570283800000A6FF200000A26087299D30470067249480570283800000A6FF200000A26087299D304700672A6490570283800000A6FF200000A26087299D304700672214B0570283800000A6FF200000A26087299D304700672AA4C0570283800000A6FF200000A26087299D304700672E74D0570283800000A6FF200000A26087299D304700672444F0570283800000A6FF200000A26087299D30470067281500570283800000A6FF200000A26087299D3047006729C510570283800000A6FF200000A26087299D30470067245530570283800000A6FF200000A26087299D304700672B6540570283800000A6FF200000A26087299D304\
-7006723F560570283800000A6FF200000A26087299D3047006727A570570283800000A6FF200000A26087299D304700672CD580570283800000A6FF200000A26087299D304700672205A0570283800000A6FF200000A26087299D3047006729D5B0570283800000A6FF200000A26087299D304700672925C0570283800000A6FF200000A26087299D304700672875D0570283800000A6FF200000A26087299D304700672B25E0570283800000A6FF200000A26087299D304700672CF5F0570283800000A6FF200000A26087299D304700672AC610570283800000A6FF200000A26087299D30470067289630570283800000A6FF200000A26087299D3047006721E650570283800000A6FF200000A26087299D3047006724F660570283800000A6FF200000A26087299D30470067278670570283800000A6FF200000A26087299D304700672BD680570283800000A6FF200000A26087299D3047006721C6A0570283800000A6FF200000A26087299D304700672476B0570283800000A6FF200000A26087299D304700672926C0570283800000A6FF200000A26087299D304700672F36D0570283800000A6FF200000A26087299D304700672026F0570283800000A6FF200000A26087299D3047006727D700570283800000A6FF200000A26087299D304700672A0710570283800000A6FF200000A26087299D304700672C7720570283800000A6FF200000A26087299D3047006722E750570283800000A6FF200000A2609725FCE047008286B0000066F1500000A26077269CE0470282100000A2D100772C3770570282100000A39D0000000086FF300000A0872F377057006720F780570283800000A6FF200000A260872F37705700672AC780570283800000A6FF200000A260872F3770570067245790570283800000A6FF200000A260872EE7905700672147A0570283800000A6FF200000A260872EE7905700672F77A0570283800000A6FF200000A260872EE7905700672DE7B0570283800000A6FF200000A260872EE7905700672A97C0570283800000A6FF200000A260872EE7905700672747D0570283800000A6FF200000A260972537E057008286B0000066F1500000A26077269CE0470282100000A2D100772837E0570282100000A39FE000000086FF300000A087299D3047006729D7E0570283800000A6FF200000A26087299D304700672CC7F0570283800000A6FF200000A26087299D304700672F7800570283800000A6FF200000A26087299D304700672A4820570283800000A6FF200000A26087299D304700672D1830570283800000A6FF200000A26087299D304700672FE840570283800000A6FF200000A26087299D30470067227860570283800000A6FF200000A26087299D30470067250870570283800000A6FF200000A26087299D30470067291880570283800000A6FF200000A26087299D304700672AA8E0570283800000A6FF200000A2609720D90057008286B0000066F1500000A26077269CE0470282100000A2D0D077227900570282100000A2C46086FF300000A0872F1CE0470067237900570283800000A6FF200000A26087299D304700672CA930570283800000A6FF200000A260972BB94057008286B0000066F1500000A26077269CE0470282100000A2D0D0772CB940570282100000A2C2F086FF300000A087299D304700672EB940570283800000A6FF200000A2609729C96057008286B0000066F1500000A26077269CE0470282100000A2D100772BC960570282100000A398B000000086FF300000A087299D304700672CC960570283800000A6FF200000A26087299D304700672CF9C0570283800000A6FF200000A26087299D304700672609F0570283800000A6FF200000A26087299D3047006728DA00570283800000A6FF200000A26087299D30470067274A10570283800000A6FF200000A26097231A2057008286B0000066F1500000A26077269CE0470282100000A2D10077241A20570282100000A398E030000086FF300000A087299D30470067263A20570283800000A6FF200000A26087299D304700672A2A80570283800000A6FF200000A26087299D304700672AFB00570283800000A6FF200000A26087299D30470067206B30570283800000A6FF200000A26087299D30470067217BB0570283800000A6FF200000A26087299D30470067252BD0570283800000A6FF200000A26087299D30470067295C30570283800000A6FF200000A26081B8D2D00000113051105167299D30470A211051706A2110518729CC90570A211051906A211051A72FDCA0570A2110528E800000A6FF200000A26087299D304700672CCD10570283800000A6FF200000A26087299D304700672E1D70570283800000A6FF200000A26081B8D2D00000113061106167299D30470A211061706A211061872ECDD0570A211061906A211061A7253DF0570A2110628E800000A6FF200000A26081B8D2D00000113071107167299D30470A211071706A2110718722AE60570A211071906A211071A7289E70570A2110728E800000A6FF200000A26081B8D2D00000113081108167299D30470A211081706A21108187256EE0570A211081906A211081A72B5EF0570A2110828E800000A6FF200000A26087299D30470067282F60570283800000A6FF200000A26081B8D2D00000113091109167299D30470A211091706A2110918721BFE0570A211091906A211091A72A2FF0570A2110928E800000A6FF200000A26081B8D2D000001130A110A167299D30470A2110A1706A2110A18726F060670A2110A1906A2110A1A72D6070670A2110A28E800000A6FF200000A26081B8D2D000001130B110B167299D30470A2110B1706A2110B1872AB0E0670A2110B1906A2110B1A7212100670A2110B28E800000A6FF200000A26087299D304700672E7160670283800000A6FF200000A26087299D304700672DE1E0670283800000A6FF200000A26081B8D2D000001130C110C167299D30470A2110C1706A2110C187225250670A2110C1906A2110C1A728C260670A2110C28E800000A6FF200000A26087299D304700672612D0670283800000A6FF200000A26087299D30470067250350670283800000A6FF200000A26087299D304700672CD370670283800000A6FF200000A26087299D304700672143E0670283800000A6FF200000A26087299D30470067283440670283800000A6FF200000A26087299D30470067226470670283800000A6FF200000A2609727549067008286B0000066F1500000A260F02289200000A2C1B096F1600000A6F4D00000A1720A00F000028040000063816010000281C00000A096F1600000A73F400000A6FF500000ADE62130411046FF600000A2D31091672974906706FF700000A260972D34906706F1500000A26096F1600000A6F4D00000A1720A00F000028040000062B24281C00000A720D4A067011046FF600000A130D120D282A00000A281800000A6F1D00000AFE1A281C00000A72110000706F1D00000A281C00000A72154A0670286000000672414A0670283800000A6F1D00000A281C00000A72110000706F1D00000A281C00000A726D4A06700672994A0670283800000A6F1D00000A281C00000A72110000706F1D00000A281C00000A72FF4A06706F1D00000A281C00000A728E4B06706F1D00000A281C00000A721B4C06700672414C0670283800000A6F1D00000A140C140D2A000000011000000000BA1117D11162660000011B300200F50200003A0000110F00284800000A6F4900000A72110000706F9100000A2C0B729F4C0670734700000A7A72110000700A0F01284600000A2D130F01284800000A6F4900000A6FBF00000A2D08725FCE04700A2B080F01284800000A0A72FB4C067073F800000A0B73F900000A0C076FFA00000A08722F4D06706FF100000A260872774D06706FF100000A260872B34D06706FF100000A260872ED4D06706FF100000A260872110000706FF100000A2608722F4E06706F1500000A26080F00284800000A6F1500000A260872514E06706FF100000A260872554E06706F1500000A2608066F1500000A260872514E06706FF100000A260872854E06706FF100000A260872D94E06706FF100000A2608722D4F06706FF100000A260872814F06706FF100000A260872110000706FF100000A260872D54F06706FF100000A2608722D5006706FF100000A2608725F5006706FF100000A260872A95006706FF100000A260872ED5006706FF100000A260872435106706FF100000A260872F25206706FF100000A260872285306706FF100000A2608726E5306706FF100000A260872B85306706FF100000A260872110000706FF100000A260872F15406706FF100000A260872110000706FF100000A260872135506706FF100000A260872295506706FF100000A2608724B5506706FF100000A260872110000706FF100000A260872875506706FF100000A260872BD5506706FF100000A260872C95506706FF100000A2608720D5606706FF100000A2608721B5606706FF100000A260872D05606706FF100000A260872DA5606706FF100000A2608720D5606706FF100000A260872E65606706FF100000A260872D05606706FF100000A260872110000706FF100000A260872995706706FF100000A260872B15706706FF100000A260872D55706706FF100000A260872135806706FF100000A260872110000706FF100000A2608721B5806706FF100000A2608723F5806706FF100000A26086F1600000A0773FB00000A0D096FFC00000A26076FFD00000ADE0A072C06076F3500000ADC2A000000411C000002000000600000008A020000EA0200000A000000000000001B300500660400003B000011140A140B72110000700C0F00286200000A16320A0F00286200000A19310B726D580670734100000A7A0F01284600000A2D130F01284800000A7E7500000A282100000A2C08725FCE04700C2B0D0F01284800000A6F4900000A0C72FB4C067073F800000A250A130773FE00000A0D73F900000A130472110000701305066FFA00000A09066FFF00000A0F00286200000A182E0D0F00286200000A194030020000110472BD5806706FF100000A26110472FB5806706FF100000A26110472255906706FF100000A26110472110000706FF100000A26110472555906706FF100000A26110472755906706FF100000A26110472225A06706FF100000A26110472585A06706FF100000A26110472AE5A06706FF100000A26110472065B06706FF100000A261104726A5B06706FF100000A26110472A85B06706FF100000A26110472105C06706FF100000A261104727C5C06706FF100000A26110472B45C06706FF100000A26110472FC5C06706FF100000A26110472485D06706FF100000A260F00286200000A18330D1104727C5D06706FF100000A26110472D65D06706FF100000A261104721C5E06706FF100000A26110472345E06706FF100000A261104723E5E06706FF100000A26110472BD5506706FF100000A26110472445E06706FF100000A26110472505E06706FF100000A261104728C5E06706FF100000A26110472BA5E06706FF100000A26110472EC5E06706FF100000A26110472FE5E06706FF100000A261104720D5606706FF100000A2604280001000A2C29110472065F06706FF100000A26110472895F06706FF100000A26110472A35F06706FF100000A262B0D110472FF5F06706FF100000A26110472D05606706FF100000A26110472DA5606706FF100000A261104720D5606706FF100000A26110472D26006706FF100000A26110472D05606706FF100000A26110472135806706FF100000A260911046F1600000A6F0101000A096FFC00000A261104166F1F00000A0F00286200000A3A8A000000110472246106706FF100000A26110472846106706FF100000A26110472B26106706FF100000A26110472EE6106706FF100000A261104722C6206706F1500000A261104086F1500000A26110472514E06706FF100000A260911046F1600000A6F0101000A096F0201000A250B1308281C00000A076F0301000ADDBF00000011082C0711086F3500000ADC110472546206706F1500000A261104086F1500000A26110472766206706F1500000A260F00286200000A130911091759450300000002000000180000002E0000002B40110472A86206706FF100000A2672B262067013052B2A110472C46206706FF100000A2672E462067013052B141104720C6306706FF100000A26721A63067013050911046F1600000A6F0101000A096FFC00000A26281C00000A723C6306700872746306701105280401000A6F1D00000ADE0C11072C0711076F3500000ADCDE0F130611066F0501000A734100000A7ADE23072C0E076F0601000A2D06076F0701000A062C0E066F0801000A2C06066FFD00000ADC2A000041640000020000005203000010000000620300000C000000000000000200000068000000BB030000230400000C0000000000000000000000040000002D040000310400000F0000003E00000102000000040000003E0400004204000023000000000000001B300400BB0C00003C00001172FB4C067073F800000A0A7269CE04700B0F00284600000A2D200F00284800000A7E7500000A6F9100000A2D0D0F00284800000A6F4A00000A0B73F900000A0C73FE00000A0D077269CE0470287600000A39B20100000872A06306706FF100000A260872F86306706FF100000A260872110000706FF100000A260872326406706F1500000A26080F00284800000A6F1500000A260872686406706FF100000A2608726E6406706FF100000A260872110000706FF100000A260872AC6406706FF100000A260872555906706FF100000A260872F06406706FF100000A260872086506706FF100000A2608723C6506706FF100000A260872866506706FF100000A260872BD5506706FF100000A260872906506706FF100000A260872086606706FF100000A2608721A6606706FF100000A260872110000706FF100000A260872246606706FF100000A2608726E6606706FF100000A260872696706706FF100000A260872AB6706706FF100000A260872E76706706FF100000A260872356806706FF100000A260872716806706FF100000A260872D56806706FF100000A2608721B6906706FF100000A260872110000706FF100000A260872416906706FF100000A260872BD5506706FF100000A260872816906706FF100000A260872086606706FF100000A2608721A6606706FF100000A260872110000706FF100000A260872110000706FF100000A2608728E6A06706FF100000A260872FE6A06706FF100000A260872386B06706FF100000A260872706B06706FF100000A260872110000706FF100000A2608729E6B06706FF100000A260872026C06706FF100000A2608728B6C06706FF100000A260872A95006706FF100000A260872C76C06706FF100000A26077269CE0470282100000A2C0E08721B6D06706FF100000A262B0C0872386F06706FF100000A260872F25206706FF100000A260872866F06706FF100000A260872CA6F06706FF100000A260872717006706FF100000A2608727F7006706FF100000A2608721C7106706FF100000A260872A95006706FF100000A260872547106706FF100000A26077269CE0470282100000A2C0E0872A87106706FF100000A262B0C0872386F06706FF100000A2608727B7206706FF100000A260872110000706FF100000A2608729D7206706FF100000A260872110000706FF100000A260872B17206706FF100000A260872110000706FF100000A260872135506706FF100000A260872295506706FF100000A260872D57206706FF100000A260872110000706FF100000A260872875506706FF100000A260872BD5506706FF100000A2608722D7306706FF100000A2608720D5606706FF100000A260872757306706FF100000A260872E57306706FF100000A260872657406706FF100000A2608728B7406706FF100000A260872110000706FF100000A260872977406706FF100000A2608720D5606706FF100000A260872CB7406706FF100000A2608723D7506706FF100000A260872657406706FF100000A2608728B7406706FF100000A260872110000706FF100000A260872C07506706FF100000A2608720D5606706FF100000A260872F47506706FF100000A260872647606706FF100000A260872E47606706FF100000A260872D05606706FF100000A260872110000706FF100000A260872087706706FF100000A2608720D5606706FF100000A260872407706706FF100000A260872A67706706FF100000A260872E47606706FF100000A260872D05606706FF100000A260872110000706FF100000A260872995706706FF100000A260872B15706706FF100000A2608721C7806706FF100000A260872135806706FF100000A260872110000706FF100000A2608721B5806706FF100000A2608723F5806706FF100000A260872110000706FF100000A260872747806706FF100000A260872847806706FF100000A260872110000706FF100000A2608729C7806706FF100000A2608720D5606706FF100000A260872FE7806706FF100000A260872267906706FF100000A260872D05606706FF100000A260872110000706FF100000A260872587906706FF100000A260872A27906706FF100000A2608725F7A06706FF100000A260872A17A06706FF100000A260872110000706FF100000A260872B17A06706FF100000A260872110000706FF100000A26077269CE0470282100000A39840000000872C57A06706FF100000A260872567B06706FF100000A260872D67B06706FF100000A260872110000706FF100000A2608724E7C06706FF100000A260872D77C06706FF100000A260872BD5506706FF100000A2608725C7D06706FF100000A260872B27D06706FF100000A260872E67D06706FF100000A260872135806706FF100000A26077269CE0470282100000A2D0D0772087E0670282100000A2C4808721E7E06706FF100000A260872BD5506706FF100000A260872A77E06706FF100000A260872017F06706FF100000A260872E67D06706FF100000A260872135806706FF100000A26077269CE0470282100000A2D0D0772397F0670282100000A2C4808724B7F06706FF100000A260872BD5506706FF100000A260872D07F06706FF100000A260872268006706FF100000A260872E67D06706FF100000A260872135806706FF100000A26077269CE0470282100000A2D0D07725A800670282100000A2C480872788006706FF100000A260872BD5506706FF100000A260872098106706FF100000A2608726B8106706FF100000A260872E67D06706FF100000A260872135806706FF100000A26077269CE0470282100000A2D0D0772CB940570282100000A2C480872AB8106706FF100000A260872BD5506706FF100000A2608723E8206706FF100000A260872A28206706FF100000A260872E67D06706FF100000A260872135806706FF100000A26077269CE0470282100000A2D0D077241A20570282100000A2C480872E48206706FF100000A260872BD5506706FF100000A260872798306706FF100000A260872DF8306706FF100000A260872E67D06706FF100000A260872135806706FF100000A26077269CE0470282100000A2D0D0772BC960570282100000A2C480872238406706FF100000A260872BD5506706FF100000A260872A68406706FF100000A260872FA8406706FF100000A260872E67D06706FF100000A260872135806706FF100000A26077269CE0470282100000A2D0D077227900570282100000A2C4808722C8506706FF100000A260872BD5506706FF100000A260872AF8506706FF100000A260872038606706FF100000A260872E67D06706FF100000A260872135806706FF100000A26077269CE0470282100000A2D0D077235860670282100000A2C480872558606706FF100000A260872BD5506706FF100000A260872E88606706FF100000A2608724C8706706FF100000A260872E67D06706FF100000A260872135806706FF100000A26077269CE0470282100000A2D0D0772837E0570282100000A2C4808728E8706706FF100000A260872BD5506706FF100000A2608721B8806706FF100000A260872798806706FF100000A260872E67D06706FF100000A260872135806706FF100000A26077269CE0470282100000A2D0D0772B5880670282100000A2C480872CD8806706FF100000A260872BD5506706FF100000A260872588906706FF100000A260872B48906706FF100000A260872E67D06706FF100000A260872135806706FF100000A26077269CE0470282100000A2D0D0772C3770570282100000A2C480872EE8906706FF100000A260872BD5506706FF100000A260872918A06706FF100000A260872078B06706FF100000A260872E47606706FF100000A260872135806706FF100000A26077269CE0470282100000A2D0D07725B8B0670282100000A2C480872938B06706FF100000A260872BD5506706FF100000A2608723E8C06706FF100000A260872BC8C06706FF100000A260872E47606706FF100000A260872135806706FF100000A26077269CE0470282100000A39CC0000000872188D06706FF100000A260872BD5506706FF100000A260872948D06706FF100000A260872E28D06706FF100000A260872E67D06706FF100000A260872135806706FF100000A260872110000706FF100000A2608720E8E06706FF100000A2608727A8E06706FF100000A260872D08E06706FF100000A260872FE5E06706FF100000A260872BD5506706FF100000A2608727D8F06706FF100000A260872E58F06706FF100000A260872E67D06706FF100000A260872135806706FF100000A260872110000706FF100000A2608723B9006706FF100000A2608724D9006706FF100000A26066FFA00000A09086F1600000A6F0101000A09066FFF00000A096F0901000A096FFC00000A26281C00000A72DC900670077269CE0470282100000A2D090F00284800000A2B0572E89006707208910670283800000A6F1D00000A066FFD00000ADE0A062C06066F3500000ADC2A00411C0000020000000B000000A50C0000B00C00000A00000000000000133004000C0100003D00001172110000700A160C723C910670280A01000A746E0000010D091A6F0B01000A091A6F0C01000A09166F0D01000A09280E01000A6F0F01000A096F1001000A7472000001130411046F1101000A13051105281201000A731301000A130611066F1401000A0A11046F1501000A11066F1601000A066F4900000A178D2C00000113071107161F2E9D11076FD500000A0B078E6919336607169A287900000A7E3F0000043104170C2B5E07169A287900000A7E3F000004331307179A287900000A7E400000043104170C2B3C07169A287900000A7E3F000004332D07179A287900000A7E40000004331E07189A287900000A7E41000004310F170C2B0B72AE910670731701000A7A08287F00000A2A13300500491500003E00001173F000000A0A0672249206706FF200000A260672110000706FF200000A260672829206706FF200000A260672DC9206706FF200000A260672E19306706FF200000A260672FB9306706FF200000A260672110000706FF200000A260672239406706FF200000A260672249506706FF200000A260672FB9306706FF200000A260672110000706FF200000A260672D99506706FF200000A260672249506706FF200000A260672FB9306706FF200000A260672110000706FF200000A260672DE9606706FF200000A260672039806706FF200000A260672FB9306706FF200000A260672110000706FF200000A260672319806706FF200000A260672039806706FF200000A260672FB9306706FF200000A260672110000706FF200000A2606723E9906706FF200000A260672039806706FF200000A260672FB9306706FF200000A260672110000706FF200000A260672919A06706FF200000A260672249506706FF200000A260672FB9306706FF200000A260672110000706FF200000A260672A89B06706FF200000A260672DA9B06706FF200000A260672E19306706FF200000A260672699C06706FF200000A260672110000706FF200000A260672959C06706FF200000A260672829D06706FF200000A2606729C9D06706FF200000A260672C49D06706FF200000A260672110000706FF200000A2606724B9E06706FF200000A260672039806706FF200000A260672FA9E06706FF200000A260672110000706FF200000A260672A59F06706FF200000A260672E19306706FF200000A260672C49D06706FF200000A260672110000706FF200000A2606725EA006706FF200000A260672E19306706FF200000A260672110000706FF200000A260672EBA006706FF200000A260672829D06706FF200000A260672C0A106706FF200000A260672C49D06706FF200000A260672110000706FF200000A260672EEA106706FF200000A260672039806706FF200000A260672110000706FF200000A26067242A206706FF200000A260672039806706FF200000A260672DBA206706FF200000A26067237A306706FF200000A260672110000706FF200000A260672CEA306706FF200000A260672829D06706FF200000A260672ABA406706FF200000A260672110000706FF200000A26067254A506706FF200000A260672D0A506706FF200000A260672110000706FF200000A26067287A606706FF200000A260672829D06706FF200000A260672C0A106706FF200000A260672C49D06706FF200000A260672110000706FF200000A26067298A706706FF200000A2606724BA806706FF200000A2606727BA806706FF200000A260672110000706FF200000A260672C9A806706FF200000A2606724BA806706FF200000A2606727BA806706FF200000A260672110000706FF200000A2606727EA906706FF200000A26067225AA06706FF200000A260672DBA206706FF200000A26067293AA06706FF200000A260672110000706FF200000A26067226AB06706FF200000A260672C1AB06706FF200000A260672110000706FF200000A26067292AC06706FF200000A260672E19306706FF200000A260672C49D06706FF200000A260672110000706FF200000A2606724FAD06706FF200000A260672039806706FF200000A260672110000706FF200000A2606729DAD06706FF200000A260672039806706FF200000A260672110000706FF200000A26067246AE06706FF200000A2606727AAE06706FF200000A260672C2AE06706FF200000A260672110000706FF200000A260672E2AE06706FF200000A2606723AAF06706FF200000A260672110000706FF200000A26067268AF06706FF200000A26067241B006706FF200000A260672AFB006706FF200000A260672110000706FF200000A26067276B106706FF200000A26067241B006706FF200000A26067243B206706FF200000A260672110000706FF200000A26067234B306706FF200000A260672B9B306706FF200000A26067215B406706FF200000A260672110000706FF200000A26067237B406706FF200000A260672B9B306706FF200000A260672B5B406706FF200000A260672110000706FF200000A260672F7B406706FF200000A2606726BB506706FF200000A26067215B406706FF200000A260672110000706FF200000A260672BBB506706FF200000A2606726BB506706FF200000A260672B5B406706FF200000A260672110000706FF200000A2606722DB606706FF200000A2606723AAF06706FF200000A260672110000706FF200000A26067287B606706FF200000A2606723AAF06706F\
-F200000A260672110000706FF200000A260672D9B606706FF200000A26067253B706706FF200000A2606724BA806706FF200000A260672110000706FF200000A260672C3B706706FF200000A2606723AAF06706FF200000A260672110000706FF200000A2606721FB806706FF200000A260672E19306706FF200000A2606729DB806706FF200000A260672110000706FF200000A26067209B906706FF200000A260672E19306706FF200000A260672110000706FF200000A26067283B906706FF200000A26067220BA06706FF200000A260672E19306706FF200000A260672110000706FF200000A260672D3BA06706FF200000A260672E19306706FF200000A260672110000706FF200000A2606721BBB06706FF200000A2606724BA806706FF200000A2606725DBB06706FF200000A260672110000706FF200000A260672D5BB06706FF200000A26067203BC06706FF200000A260672829D06706FF200000A26067241BC06706FF200000A260672110000706FF200000A26067289BC06706FF200000A260672DFBC06706FF200000A260672FDBC06706FF200000A260672110000706FF200000A26067259BD06706FF200000A260672DFBC06706FF200000A260672E8BD06706FF200000A260672110000706FF200000A26067244BE06706FF200000A260672DFBC06706FF200000A260672110000706FF200000A2606727CBE06706FF200000A260672E19306706FF200000A260672BCBE06706FF200000A260672110000706FF200000A2606720ABF06706FF200000A260672829D06706FF200000A26067280BF06706FF200000A260672110000706FF200000A260672B0BF06706FF200000A260672DFBC06706FF200000A260672110000706FF200000A260672E8BF06706FF200000A260672DFBC06706FF200000A260672110000706FF200000A26067220C006706FF200000A26067271C106706FF200000A260672110000706FF200000A260672A2C306706FF200000A260672D0C306706FF200000A260672DFBC06706FF200000A26067293C406706FF200000A260672A0C506706FF200000A260672110000706FF200000A2606729DC606706FF200000A260672829D06706FF200000A26067238C706706FF200000A26067270C706706FF200000A260672110000706FF200000A260672CAC706706FF200000A260672829D06706FF200000A260672110000706FF200000A26067218C806706FF200000A260672829D06706FF200000A260672110000706FF200000A26067266C806706FF200000A260672D0C806706FF200000A260672829D06706FF200000A260672110000706FF200000A26067285C906706FF200000A26067254CA06706FF200000A260672110000706FF200000A26067278CA06706FF200000A26067227CB06706FF200000A26067255CB06706FF200000A260672110000706FF200000A260672B7CB06706FF200000A26067254CA06706FF200000A260672110000706FF200000A260672FBCB06706FF200000A2606724BA806706FF200000A260672110000706FF200000A26067249CC06706FF200000A2606724BA806706FF200000A260672110000706FF200000A26067297CC06706FF200000A260672E19306706FF200000A26067270C706706FF200000A260672110000706FF200000A2606720BCD06706FF200000A260672E19306706FF200000A260672110000706FF200000A2606723FCD06706FF200000A26067254CA06706FF200000A260672110000706FF200000A2606720ACE06706FF200000A26067254CA06706FF200000A260672110000706FF200000A260672C1CE06706FF200000A260672DFBC06706FF200000A260672110000706FF200000A26067205CF06706FF200000A26067271CF06706FF200000A260672829D06706FF200000A260672110000706FF200000A26067250D006706FF200000A26067286D006706FF200000A260672C2AE06706FF200000A260672110000706FF200000A260672E4D006706FF200000A260672039806706FF200000A260672110000706FF200000A2606723AD106706FF200000A260672039806706FF200000A26067207D206706FF200000A260672110000706FF200000A2606727DD206706FF200000A260672E19306706FF200000A260672110000706FF200000A260672DDD206706FF200000A2606724BA806706FF200000A260672110000706FF200000A26067229D306706FF200000A2606724BA806706FF200000A260672110000706FF200000A2606727DD306706FF200000A2606724BA806706FF200000A260672110000706FF200000A260672D1D306706FF200000A2606724BA806706FF200000A260672110000706FF200000A26067235D406706FF200000A2606724BA806706FF200000A260672BAD406706FF200000A260672110000706FF200000A26067228D506706FF200000A26067270D506706FF200000A260672110000706FF200000A26067223D906706FF200000A26067259D906706FF200000A2606728EDB06706FF200000A260672110000706FF200000A260672F4DB06706FF200000A260672CBDE06706FF200000A26067215DF06706FF200000A260672110000706FF200000A26067285DF06706FF200000A2606727AE106706FF200000A260672110000706FF200000A2606723FE206706FF200000A260672039806706FF200000A260672110000706FF200000A26067270E606706FF200000A260672E19306706FF200000A260672110000706FF200000A260672B6E606706FF200000A260672EAE606706FF200000A260672039806706FF200000A260672110000706FF200000A26067256E706706FF200000A260672B4E706706FF200000A260672110000706FF200000A260672E4E706706FF200000A260672B4E706706FF200000A260672110000706FF200000A26067254E806706FF200000A260672039806706FF200000A260672110000706FF200000A26067215E906706FF200000A260672039806706FF200000A260672110000706FF200000A26067263E906706FF200000A260672039806706FF200000A26067212EA06706FF200000A260672110000706FF200000A26067284EA06706FF200000A260672B4E706706FF200000A260672110000706FF200000A260672DEEA06706FF200000A260672039806706FF200000A260672110000706FF200000A2606723EEB06706FF200000A26067270EB06706FF200000A260672D2EB06706FF200000A260672F1EC06706FF200000A2606720EEE06706FF200000A260672110000706FF200000A26067297EE06706FF200000A2606722EEF06706FF200000A26067245F006706FF200000A2606721CF106706FF200000A260672C9F106706FF200000A260672110000706FF200000A2606723DF206706FF200000A26067230F306706FF200000A260672EDF506706FF200000A260672E4F706706FF200000A260672110000706FF200000A2606727FF806706FF200000A2606724BA806706FF200000A260672E4F706706FF200000A260672110000706FF200000A2606722AFA06706FF200000A2606724BA806706FF200000A260672110000706FF200000A26067284FA06706FF200000A2606724BA806706FF200000A260672110000706FF200000A260672A6FA06706FF200000A260672829D06706FF200000A260672110000706FF200000A260672BEFA06706FF200000A260672F2FA06706FF200000A2606724BA806706FF200000A260672110000706FF200000A2606729FFB06706FF200000A2606723AFC06706FF200000A260672110000706FF200000A26067258FC06706FF200000A2606723AFC06706FF200000A260672110000706FF200000A260672E5FC06706FF200000A2606723AFC06706FF200000A260672110000706FF200000A2606727EFD06706FF200000A26067209FE06706FF200000A260672110000706FF200000A26067225FE06706FF200000A26067209FE06706FF200000A260672110000706FF200000A260672BAFE06706FF200000A2606723AFC06706FF200000A260672110000706FF200000A2606724FFF06706FF200000A260672829D06706FF200000A260672110000706FF200000A2606724A0007706FF200000A260672829D06706FF200000A260672110000706FF200000A260672290107706FF200000A260672570107706FF200000A260672750107706FF200000A260672110000706FF200000A260672C30107706FF200000A260672E19306706FF200000A260672F90107706FF200000A260672110000706FF200000A260672610207706FF200000A260672C50207706FF200000A260672660307706FF200000A2606724F0407706FF200000A260672110000706FF200000A260672C70407706FF200000A260672E30407706FF200000A260672110000706FF200000A260672760507706FF200000A260672090607706FF200000A260672920607706FF200000A260672110000706FF200000A260672410707706FF200000A260672670707706FF200000A260672110000706FF200000A2606720A0807706FF200000A2606724BA806706FF200000A260672110000706FF200000A260672300807706FF200000A2606724BA806706FF200000A260672110000706FF200000A260672560807706FF200000A260672960807706FF200000A260672DFBC06706FF200000A260672110000706FF200000A260672C60807706FF200000A260672EC0807706FF200000A260672110000706FF200000A260672100907706FF200000A260672DFBC06706FF200000A260672110000706FF200000A260672340907706FF200000A260672DFBC06706FF200000A260672110000706FF200000A260672580907706FF200000A260672DFBC06706FF200000A260672110000706FF200000A260672860907706FF200000A260672BC0907706FF200000A260672DC0907706FF200000A260672110000706FF200000A260672340A07706FF200000A260672520A07706FF200000A260672110000706FF200000A260672940A07706FF200000A260672BA0A07706FF200000A260672110000706FF200000A260672240B07706FF200000A26178D060000010B0716726E0B07701F0C20A00F00006A733D00000AA207734200000A0C281C00000A0D09086F1801000A1613042B2108160611046F1901000A742D0000016F1A01000A09086F1B01000A1104175813041104066F1C01000A32D5096F1D01000A2A00000013300100130000003F00001172110000700A286A0000060A06288100000A2A00133001000D0000003F00001172780B07700A06288100000A2A000000133003004E000000380000111B8D2D0000010A06167E3F0000040B1201282A00000AA20617720D000070A206187E400000040C1202282A00000AA20619720D000070A2061A7E410000040D1203282A00000AA20628E800000A2A00001330030090010000400000117211000070731300000A0A06729D7206706FF100000A260672AA0B07706FF100000A260672C40B07706FF100000A260672DE0B07706FF100000A2606720E0C07706F1500000A2606026F1500000A260672514E06706FF100000A260672866506706FF100000A2606720D5606706FF100000A2606723A0C07706F1500000A2606026F1500000A260672620C07706FF100000A26160B2B5D0672800C07706F1500000A26060717586F1E01000A260672AC0C07706FF100000A260672B00C07706FF100000A260603076F1901000A6F1600000A6F1500000A260672AC0C07706FF100000A260672C20C07706FF100000A260717580B07036F1C01000A329A0672CA0C07706FF100000A2606728B7406706FF100000A260672747806706FF100000A260672847806706FF100000A2606725D0D07706FF100000A260672E60D07706FF100000A2606728F0E07706F1500000A2606026F1500000A260672AB0E07706FF100000A260672086606706FF100000A260672FB0E07706FF100000A260672110000706FF100000A26066F1600000A2A1E02282300000A2A1B3004007300000041000011026F4900000A7E7500000A282100000A2C02162A160A0272110F07706F4D00000A176F1F01000A0C160D2B3F08099A0B06D018000001282001000A0717282101000AA518000001600ADE1C2672170F077007721B0F0770283800000A72750F0770732201000A7A0917580D09088E6932BB062A0001100000000030001B4B001C53000001133004009100000042000011026F4F00000A2D090F01284600000A2C067E9400000A2A0F02286200000A172F0B72A10F0770734700000A7A026F5100000A73D600000A0B0F03286200000A0C0817594502000000020000001C0000002B34070F01284800000A0F02286200000A1759166F2301000A0A2B1C070F01284800000A0F02286200000A1759176F2301000A0A2B02160A061758286800000A2A000000133004009100000042000011026F4F00000A2D090F01284600000A2C067E9400000A2A0F02286200000A172F0B72A10F0770734700000A7A026F5100000A73D600000A0B0F03286200000A0C0817594502000000020000001C0000002B34070F01284800000A0F02286200000A1759166F2401000A0A2B1C070F01284800000A0F02286200000A1759176F2401000A0A2B02160A061758286800000A2A000000133001001D0000003F000011026F5100000A73D600000A0A066F4900000A6F4D00000A734E00000A2A00000013300200370000003F000011026F4F00000A2D090F01284600000A2C0716287F00000A2A026F5100000A73D600000A0A060F01284800000A6F2501000A287F00000A2A00133003006700000043000011026F4F00000A2D090F01284600000A2C0716287F00000A2A026F5100000A73D600000A0A160B0F02286200000A0C081759450200000002000000130000002B20060F01284800000A166F2601000A0B2B0F060F01284800000A176F2601000A0B07287F00000A2A00133003006700000043000011026F4F00000A2D090F01284600000A2C0716287F00000A2A026F5100000A73D600000A0A160B0F02286200000A0C081759450200000002000000130000002B20060F01284800000A166F2701000A0B2B0F060F01284800000A176F2701000A0B07287F00000A2A001330030050000000440000110F01286200000A0F00284800000A6FBF00000A2F0B72E50F0770734700000A7A0F00284800000A0A0F02284800000A16176F2000000A282801000A0B060F01286200000A076F7A00000A288100000A2A1330030050000000440000110F01286200000A0F00284800000A6FBF00000A2F0B72E50F0770734700000A7A0F00284800000A0A0F02284800000A16176F2000000A282801000A0B060F01286200000A076F2901000A288100000A2A133002002C0000004500001102A5150000020A0312007B45000004286800000A810E0000010412007B46000004288100000A810B0000012A13300200540000004600001128AF00000A6FB000000A027BAA0000043315027BA90000041FFE330B02167DA9000004020A2B071673D00000060A06027BAC0000047DAB00000406027BAE0000047DAD00000406027BB00000047DAF000004062A1E0228C90000062A1B300400C601000047000011027BA90000040B07450300000005000000A001000072010000389B01000002157DA9000004027BAB0000046F4F00000A3A84010000027CAD000004284600000A3A74010000027CAD000004284800000A7E7500000A282100000A2C0B725B10077073A400000A7A027CAF000004286200000A172E19027CAF000004286200000A182E0B728F10077073A400000A7A027CB1000004FE151500000202167DB200000402178D2D0000010C0816027CAD000004284800000AA2087DB300000402027BAB0000046F5100000A73D600000A7DB400000402167DB5000004027CAF000004286200000A0D091759450200000009000000020000002B0702177DB500000402177DA900000402027BB4000004027BB3000004027BB50000046F8900000A7DB700000402167DB80000042B7402027BB7000004027BB80000049A7DB600000402257BB200000417587DB2000004027CB1000004027BB20000047D45000004027CB1000004027BB60000047D4600000402027BB10000048C150000027DA800000402187DA9000004170ADE3902177DA900000402027BB800000417587DB8000004027BB8000004027BB70000048E693F79FFFFFF0228D1000006160ADE070228CE000006DC062A0000411C00000400000000000000BD010000BD01000007000000000000001E027BA80000042A1A73B600000A7A00133002001F00000024000011027BA90000040A061759450200000001000000010000002A0228D10000062A1E027BA80000042A7A02282300000A02037DA90000040228AF00000A6FB000000A7DAA0000042A2202157DA90000042A00133002001F000000460000111FFE73D00000060A06027DAC00000406037DAE00000406047DB0000004062A001B3003004601000048000011026F5100000A73D600000A0A066F4900000A6FBF00000A2D0B72EF100770734700000A7A72110000700B73F900000A0C72FB4C067073F800000A130506110573FB00000A0D11056FFA00000A096F0201000A130411046F2A01000A39980000000F02286200000A13061106175945020000002E000000750000002B7C1104166F2B01000A2D22081104166F2C01000A6F1600000A6F1500000A26080F01284800000A6F1500000A2611046F2D01000A2DCB2B451104166F2B01000A2D321104166F2C01000A6F1600000A0B076F4900000A6FBF00000A16311608076F1500000A26080F01284800000A6F1500000A2611046F2D01000A2DBBDE0C11052C0711056F3500000ADC086F1A00000A16312608086F1A00000A0F01284800000A6FBF00000A590F01284800000A6FBF00000A6F2200000A26086F1600000A6F4D00000A734E00000A2A00000110000002003C00BEFA000C00000000133004004801000049000011026F4F00000A2D090F02284600000A2C06284500000A2A026F5100000A73D600000A0A7211000070066FBF00000A066FBF00000A0F01286200000A5B0F02284800000A6FBF00000A5A581F6458731900000A0B160C160D721100007013041613050F01286200000A173CBD0000007219110770734700000A7A090F01286200000A58066FBF00000A2F730F01286200000A1305060911056F2000000A13040609110558176F2000000A72950200706F9100000A2C120711046F1500000A260911055817580D2B5611041F206F2E01000A0C08152E1807110416086F2000000A6F1500000A2609085817580D2B300711046F1500000A26091105580D2B20066FBF00000A09591305060911056F2000000A13040711046F1500000A262B1A070F02284800000A6F1500000A2609066FBF00000A3F42FFFFFF076F1600000A6F4D00000A734E00000A2A13300500C70000004A000011026F4F00000A2C06284500000A2A026F5100000A73D600000A0A160B066F4A00000A0A2B63067295020070076F8700000A0B07153309066FBF00000A0B2B520717580B2B3A0607176F2000000A0C08086F2500000A6F9100000A2D1F0616076F2000000A086F2500000A060717586F2F01000A283800000A0A2B0D0717580B07066FBF00000A32BD07066FBF00000A3294066FBF00000A16311C0616176F2000000A0C086F2500000A06176F2F01000A281800000A0A066F1600000A6F4D00000A734E00000A2A00133003003D0000004B000011026F4F00000A2D08036F4F00000A2C0716287F00000A2A026F5100000A73D600000A0A036F5100000A73D600000A0B0607166F3001000A287F00000A2A00000013300500080100004C000011026F4F00000A2D08036F4F00000A2C067E9400000A2A026F5100000A73D600000A0A036F5100000A73D600000A0B077E7500000A282100000A2C0B725B110770734700000A7A0517286800000A283101000A25283201000A2D110518286800000A283101000A283301000A280001000A2C0B7289110770734700000A7A0F02286200000A172F0B72CD110770734700000A7A0F02286200000A066FBF00000A310B7209120770734700000A7A160C0F02286200000A17590D1613042B3B0607090F03286200000A172E03172B01166F2401000A13041104152E270817580C0E04280001000A2C07110417580D2B0A1104076FBF00000A580D09066FBF00000A32BC08286800000A2A13300400AB010000290000110F00284800000A6F4A00000A250B3975010000FE137E5F0000043AD50000001F10732700000A25727B12077016282800000A25728512077017282800000A25728D12077018282800000A25729D12077019282800000A2572A51207701A282800000A2572AF1207701B282800000A2572B51207701C282800000A2572BF1207701D282800000A2572C51207701E282800000A2572CD1207701F09282800000A2572D31207701F0A282800000A2572DB1207701F0B282800000A2572E31207701F0C282800000A2572F11207701F0D282800000A2572FF1207701F0E282800000A2572091307701F0F282800000AFE13805F000004FE137E5F000004071202282900000A398000000008451000000002000000020000000200000002000000020000000A0000000A00000012000000120000001A000000220000002200000022000000220000002A000000320000002B3872130000700A2B4C72151307700A2B4472191307700A2B3C721D1307700A2B3472211307700A2B2C72251307700A2B24722F1307700A2B1C723D1307700F00284800000A7257130770283800000A734700000A7A06288100000A2A00133005004C0100004C000011026F4F00000A2D08036F4F00000A2C067E9400000A2A026F4F00000A2C0716286800000A2A026F5100000A73D600000A0A036F5100000A73D600000A0B077E7500000A282100000A2C0B725B110770734700000A7A0E0417286800000A283101000A25283201000A2D120E0418286800000A283101000A283301000A280001000A2C0B7289110770734700000A7A0F02286200000A172F0B72CD110770734700000A7A0F02286200000A066FBF00000A310B7209120770734700000A7A0F03286200000A172F0B7273130770734700000A7A160C0F02286200000A17590D1613042B450607090F04286200000A172E03172B01166F2401000A13041104152E310817580C080F03286200000A2E230E05280001000A2C07110417580D2B0A1104076FBF00000A580D09066FBF00000A32B2080F03286200000A330A11041758286800000A2A16286800000A2A133004009F0100004D000011026F4F00000A2D090F01284600000A2C06284500000A2A026F5100000A73D600000A0A066F4900000A7E7500000A282100000A2C1072110000706F4D00000A734E00000A2A7211000070731300000A0B178D2D000001130B110B160F01284800000AA2110B0C0608166F8900000A0D0F02284800000A72DF0000706F4D00000A176F1F01000A13041713061104130C16130D38EC000000110C110D9A130714130511076F4900000A178D2C000001130E110E161F2D9D110E6FD500000A130511058E691733411105169A283401000A13081108163EA4000000098E6911083F9A00000011062D0E070F01284800000A6F1500000A260709110817599A6F1500000A261613062B761105169A7E7500000A282100000A2C051713082B0B1105169A283401000A13081105179A7E7500000A282100000A2C07098E6913092B0B1105179A283401000A13091108130A2B2811062D0E070F01284800000A6F1500000A260709110A17599A6F1500000A26161306110A1758130A110A110931D2110D1758130D110D110C8E693F09FFFFFF076F1600000A6F4D00000A734E00000A2A00133003003E0100004E0000110F00284600000A2C0716287F00000A2A0F01286200000A175F17332272B91307701E73D700000A0A060F00284800000A6F3501000A2C0717287F00000A2A0F01286200000A185F183322722F1407701E73D700000A0B070F00284800000A6F3501000A2C0717287F00000A2A72A51407701E73D700000A0C080F00284800000A72B21507706F3601000A0D0F01286200000A1A5F1A331E72B61507701E73D700000A13041104096F3501000A2C0717287F00000A2A0F01286200000A1E5F1E331E725D1607701E73D700000A13051105096F3501000A2C0717287F00000A2A0F01286200000A1F105F1F10331E72041707701E73D700000A13061106096F3501000A2C0717287F00000A2A0F01286200000A1F205F1F20331E72AB1707701E73D700000A13071107096F3501000A2C0717287F00000A2A16287F00000A2A820F00284800000A0F01284800000A0F02284800000A6F7100000A288100000A2A0013300400F60000004F000011160A166A0C0F02284800000A7E7500000A287600000A2C0F0F02284800000A733701000A0B2B06283801000A0B0F01284800000A6F4A00000A2513063995000000110672AD020070282100000A2D2C110672F7020070282100000A2D3211067231030070282100000A2D3B11067277030070282100000A2D452B5B0F00284800000A1F6F071202283901000A0A2B570F00284800000A1F6F071203283A01000A0A096A0C2B400F00284800000A1F6F071204283B01000A0A11046A0C2B280F00284800000A1F6F071205283C01000A0A11056E0C2B10725218077072EF180770732201000A7A062C0708283D01000A2A7E3E01000A2A1E02282300000A2A1E02282300000A2A0000133002002C0000005000001102A5180000020A0312007B47000004286800000A810E0000010412007B48000004286800000A810E0000012A13300200540000005100001128AF00000A6FB000000A027BBB0000043315027BBA0000041FFE330B02167DBA000004020A2B071673D90000060A06027BBD0000047DBC00000406027BBF0000047DBE00000406027BC10000047DC0000004062A1E0228D20000062A13300300F201000024000011027BBA0000040A0645030000000500000011010000A501000038D201000002157DBA000004027CC0000004286200000A2D0B720D190770734700000A7A027CBC000004286200000A027CBE000004286200000A2F19027CC0000004286200000A162F0B7235190770734700000A7A027CBC000004286200000A027CBE000004286200000A3119027CC0000004286200000A16310B72AF190770734700000A7A027CC2000004FE151800000202167DC3000004027CBC000004286200000A027CBE000004286200000A3C9400000002027CBC000004286200000A7DC40000042B6902257BC300000417587DC3000004027CC2000004027BC30000047D47000004027CC2000004027BC40000047D4800000402027BC20000048C180000027DB900000402177DBA000004172A02157DBA00000402257BC4000004027CC0000004286200000A587DC4000004027BC4000004027CBE000004286200000A3284388F00000002027CBC000004286200000A7DC50000042B6902257BC300000417587DC3000004027CC2000004027BC30000047D47000004027CC2000004027BC50000047D4800000402027BC20000048C180000027DB900000402187DBA000004172A02157DBA00000402257BC5000004027CC0000004286200000A587DC5000004027BC5000004027CBE000004286200000A3084162A1E027BB90000042A1A73B600000A7A062A1E027BB90000042A7A02282300000A02037DBA0000040228AF00000A6FB000000A7DBB0000042A0000133002001F\
-000000510000111FFE73D90000060A06027DBD00000406037DBF00000406047DC1000004062A0013300200540000005200001128AF00000A6FB000000A027BC80000043315027BC70000041FFE330B02167DC7000004020A2B071673E10000060A06027BCA0000047DC900000406027BCC0000047DCB00000406027BCE0000047DCD000004062A1E0228DA0000062A13300300F600000024000011027BC70000040A06450200000005000000C500000038DA00000002157DC7000004027CCD000004286200000A2D0B720D190770734700000A7A027CCB000004286200000A162F0B722D1A0770734700000A7A027CCF000004FE151800000202167DD000000402027CC9000004286200000A7DD10000042B6902257BD000000417587DD0000004027CCF000004027BD00000047D47000004027CCF000004027BD10000047D4800000402257BD1000004027CCD000004286200000A587DD100000402027BCF0000048C180000027DC600000402177DC7000004172A02157DC7000004027BD0000004027CCB000004286200000A3284162A1E027BC60000042A1A73B600000A7A062A1E027BC60000042A7A02282300000A02037DC70000040228AF00000A6FB000000A7DC80000042A0000133002001F000000520000111FFE73E10000060A06027DCA00000406037DCC00000406047DCE000004062A00133002002D0000005300001102A5190000020A0312007B49000004286800000A810E0000010412007B4A0000046C289000000A81110000012A00000013300200540000005400001128AF00000A6FB000000A027BD40000043315027BD30000041FFE330B02167DD3000004020A2B071673E90000060A06027BD60000047DD500000406027BD80000047DD700000406027BDA0000047DD9000004062A1E0228E20000062A133003000B02000024000011027BD30000040A064503000000050000002A010000BE01000038EB01000002157DD3000004027CD9000004288D00000A230000000000000000330B720D190770734700000A7A027CD5000004288D00000A027CD7000004288D00000A3421027CD9000004288D00000A230000000000000000340B7235190770734700000A7A027CD5000004288D00000A027CD7000004288D00000A3621027CD9000004288D00000A230000000000000000360B72AF190770734700000A7A027CDB000004FE151900000202167DDC000004027CD5000004288D00000A027CD7000004288D00000A419400000002027CD5000004288D00000A7DDD0000042B6902257BDC00000417587DDC000004027CDB000004027BDC0000047D49000004027CDB000004027BDD0000047D4A00000402027BDB0000048C190000027DD200000402177DD3000004172A02157DD300000402257BDD000004027CD9000004288D00000A587DDD000004027BDD000004027CD7000004288D00000A3284388F00000002027CD5000004288D00000A7DDE0000042B6902257BDC00000417587DDC000004027CDB000004027BDC0000047D49000004027CDB000004027BDE0000047D4A00000402027BDB0000048C190000027DD200000402187DD3000004172A02157DD300000402257BDE000004027CD9000004288D00000A587DDE000004027BDE000004027CD7000004288D00000A3084162A1E027BD20000042A1A73B600000A7A062A1E027BD20000042A7A02282300000A02037DD30000040228AF00000A6FB000000A7DD40000042A00133002001F000000540000111FFE73E90000060A06027DD600000406037DD800000406047DDA000004062A0013300200540000005500001128AF00000A6FB000000A027BE10000043315027BE00000041FFE330B02167DE0000004020A2B071673F10000060A06027BE30000047DE200000406027BE50000047DE400000406027BE70000047DE6000004062A1E0228EA0000062A13300300FF00000024000011027BE00000040A06450200000005000000CE00000038E300000002157DE0000004027CE6000004288D00000A230000000000000000330B720D190770734700000A7A027CE4000004286200000A162F0B722D1A0770734700000A7A027CE8000004FE151900000202167DE900000402027CE2000004288D00000A7DEA0000042B6902257BE900000417587DE9000004027CE8000004027BE90000047D49000004027CE8000004027BEA0000047D4A00000402257BEA000004027CE6000004288D00000A587DEA00000402027BE80000048C190000027DDF00000402177DE0000004172A02157DE0000004027BE9000004027CE4000004286200000A3284162A1E027BDF0000042A1A73B600000A7A062A1E027BDF0000042A7A02282300000A02037DE00000040228AF00000A6FB000000A7DE10000042A00133002001F000000550000111FFE73F10000060A06027DE300000406037DE500000406047DE7000004062A00133002002C0000005600001102A51A0000020A0312007B4B000004286800000A810E0000010412007B4C000004286400000A810D0000012A133004006802000057000011046F4A00000A250B3943020000FE137E600000043A4A0100001F19732700000A2572B305007016282800000A2572671A077017282800000A25724705007018282800000A2572E105007019282800000A2572410500701A282800000A2572711A07701B282800000A25724D0600701C282800000A2572350500701D282800000A2572751A07701E282800000A2572550600701F09282800000A25722F0500701F0A282800000A25725F0600701F0B282800000A2572290500701F0C282800000A2572791A07701F0D282800000A25726D0600701F0E282800000A2572230500701F0F282800000A25727D1A07701F10282800000A25727B0600701F11282800000A25721D0500701F12282800000A2572ED0500701F13282800000A25723B0500701F14282800000A2572811A07701F15282800000A2572D10500701F16282800000A2572871A07701F17282800000A25728D1A07701F18282800000AFE138060000004FE137E60000004071202282900000A39D90000000845190000000200000002000000020000000D0000000D0000000D00000018000000180000001800000024000000240000003000000030000000300000003C0000003C0000003C00000048000000480000005400000054000000540000006200000062000000620000002B6D0F0003283F01000A0A2B780F000328CC00000A0A2B6D0F00036C286300000A0A2B610F00036C284001000A0A2B550F00036C284101000A0A2B490F00036C288E00000A0A2B3D0F00036C284201000A0A2B310F00031D5A6C286300000A0A2B230F0003195A28CC00000A0A2B1672911A07700472B91A0770283800000A734700000A7A062A13300200600000005800001128AF00000A6FB000000A027BED0000043315027BEC0000041FFE330B02167DEC000004020A2B071673F90000060A06027BEF0000047DEE00000406027BF10000047DF000000406027BF30000047DF200000406027BF50000047DF4000004062A1E0228F20000062A133004001C02000024000011027BEC0000040A0645030000000500000047010000DF01000038FC01000002157DEC000004027CF2000004286200000A2D0B720D190770734700000A7A027CEE000004286500000A027CF0000004286500000A284301000A2C19027CF2000004286200000A162F0B727A1B0770734700000A7A027CEE000004286500000A027CF0000004286500000A284401000A2C19027CF2000004286200000A16310B72091C0770734700000A7A027CF6000004FE151A00000202167DF700000402027CEE000004286500000A7DF8000004027CEE000004286500000A027CF0000004286500000A284301000A39120100002B7802257BF700000417587DF7000004027CF6000004027BF70000047D4B000004027CF6000004027BF80000047D4C00000402027BF8000004027CF2000004286200000A027CF4000004284800000A288C0000067DF800000402027BF60000048C1A0000027DEB00000402177DEC000004172A02157DEC000004027BF8000004027CF0000004286500000A284301000A3A6DFFFFFF389300000002257BF700000417587DF7000004027CF6000004027BF70000047D4B000004027CF6000004027BF80000047D4C00000402027BF8000004027CF2000004286200000A027CF4000004284800000A288C0000067DF800000402027BF60000048C1A0000027DEB00000402187DEC000004172A02157DEC000004027BF8000004027CF0000004286500000A284401000A3A6DFFFFFF162A1E027BEB0000042A1A73B600000A7A062A1E027BEB0000042A7A02282300000A02037DEC0000040228AF00000A6FB000000A7DED0000042A1330020026000000580000111FFE73F90000060A06027DEF00000406037DF100000406047DF300000406057DF5000004062A000013300200600000005900001128AF00000A6FB000000A027BFB0000043315027BFA0000041FFE330B02167DFA000004020A2B071673010100060A06027BFD0000047DFC00000406027BFF0000047DFE00000406027B010100047D0001000406027B030100047D02010004062A1E0228FA0000062A133004000801000024000011027BFA0000040A06450200000005000000D400000038EC00000002157DFA000004027C00010004286200000A2D0B720D190770734700000A7A027CFE000004286200000A162F0B729C1C0770734700000A7A027C04010004FE151A00000202167D0501000402027CFC000004286500000A7D060100042B7802257B0501000417587D05010004027C04010004027B050100047D4B000004027C04010004027B060100047D4C00000402027B06010004027C00010004286200000A027C02010004284800000A288C0000067D0601000402027B040100048C1A0000027DF900000402177DFA000004172A02157DFA000004027B05010004027CFE000004286200000A3F72FFFFFF162A1E027BF90000042A1A73B600000A7A062A1E027BF90000042A7A02282300000A02037DFA0000040228AF00000A6FB000000A7DFB0000042A1330020026000000590000111FFE73010100060A06027DFD00000406037DFF00000406047D0101000406057D03010004062A0000133004000C0800005A00001172110000700A72110000700B72110000700C72110000700D171305721100007013080F00288D00000A284501000A23F8FF3326F56B0C43360B72E01C0770734700000A7A02230000000000000000289000000A284601000A280001000A2C1D72401D077013080223000000000000F0BF289000000A284701000A10000F00FE16110000016F1600000A0A06720D0000706F4801000A1304110416312872541D07700B0706110417586F2F01000A181F306F2901000A281800000A0B0611046F4901000A0A0F00288D00000A23000000000000F03F441C070000066FBF00000A195D1309110917594502000000050000001600000038EE06000072601D077006281800000A0A38DD06000072661D077006281800000A0A38CC06000006066FBF00000A19596F2F01000A0D06066FBF00000A19596F4901000A0A721100007013070916176F2000000A25130A3911010000FE137E610000042D7A1F09732700000A25726A1D077016282800000A25726E1D077017282800000A2572721D077018282800000A2572761D077019282800000A25727A1D07701A282800000A25727E1D07701B282800000A2572821D07701C282800000A2572861D07701D282800000A25728A1D07701E282800000AFE138061000004FE137E61000004110A120B282900000A2C7C110B4509000000020000000B000000140000001D000000260000002F00000038000000410000004A0000002B4F728E1D077013072B4672A61D077013072B3D72BE1D077013072B3472DA1D077013072B2B72F41D077013072B22720E1E077013072B1972261E077013072B1072421E077013072B07725E1E0770130711076FBF00000A163109729502007013062B07721100007013060917176F2000000A25130C3945010000FE137E620000042D6D1E732700000A25726E1D077016282800000A2572721D077017282800000A2572761D077018282800000A25727A1D077019282800000A25727E1D07701A282800000A2572821D07701B282800000A2572861D07701C282800000A25728A1D07701D282800000AFE138062000004FE137E62000004110C120D282900000A39BA000000110D45080000000500000017000000290000003B0000004D0000005F0000007100000083000000388E0000001107110672781E0770283800000A13072B7C1107110672861E0770283800000A13072B6A1107110672941E0770283800000A13072B581107110672A01E0770283800000A13072B461107110672AC1E0770283800000A13072B341107110672B81E0770283800000A13072B221107110672C81E0770283800000A13072B101107110672D61E0770283800000A130711076FBF00000A163109729502007013062B07721100007013060917176F2000000A726A1D07706F9100000A39BE0100000918176F2000000A25130E3929030000FE137E630000043A870000001F0A732700000A2572661D077016282800000A25726A1D077017282800000A25726E1D077018282800000A2572721D077019282800000A2572761D07701A282800000A25727A1D07701B282800000A25727E1D07701C282800000A2572821D07701D282800000A2572861D07701E282800000A25728A1D07701F09282800000AFE138063000004FE137E63000004110E120F282900000A3981020000110F450A000000050000001A0000002F00000044000000590000006E0000008300000098000000AD000000C2000000384D0200001107110672E41E0770283800000A130738380200001107110672EC1E0770283800000A130738230200001107110672FA1E0770283800000A1307380E0200001107110672081F0770283800000A130738F901000011071106721A1F0770283800000A130738E401000011071106722C1F0770283800000A130738CF01000011071106723C1F0770283800000A130738BA01000011071106724C1F0770283800000A130738A50100001107110672601F0770283800000A130738900100001107110672721F0770283800000A1307387B0100000918176F2000000A251310396B010000FE137E640000042D7A1F09732700000A25726A1D077016282800000A25726E1D077017282800000A2572721D077018282800000A2572761D077019282800000A25727A1D07701A282800000A25727E1D07701B282800000A2572821D07701C282800000A2572861D07701D282800000A25728A1D07701E282800000AFE138064000004FE137E6400000411101211282900000A39D300000011114509000000050000001A0000002C0000003E000000500000006200000074000000860000009800000038A30000001107110672841F0770283800000A1307388E00000011071106728C1F0770283800000A13072B7C1107110672941F0770283800000A13072B6A1107110672A01F0770283800000A13072B581107110672AA1F0770283800000A13072B461107110672B41F0770283800000A13072B341107110672BC1F0770283800000A13072B221107110672C81F0770283800000A13072B101107110672D41F0770283800000A1307086FBF00000A16310972DE1F077013062B0772950200701306110513121112175945060000006000000002000000120000002200000032000000420000002B5072E41F0770110608283800000A0C2B4E72F81F0770110608283800000A0C2B3E720A200770110608283800000A0C2B2E721C200770110608283800000A0C2B1E7230200770110608283800000A0C2B0E7248200770110608283800000A0C110708281800000A0C110517581305066FBF00000A163D28F9FFFF2B0672602007700C11080807283800000A0C08288100000A2A1B3004007E0000005B000011026F6000000A166A3306285000000A2A140A140B735A00000A250A1304061717734A01000A250B1305026F4B00000A0C070816088E696F4B01000ADE0C11052C0711056F3500000ADCDE0C11042C0711046F3500000ADCDE0D0D096F0501000A734100000A7ADE0A072C06076F4C01000ADC066F4D01000A735300000A2A00000134000002002900143D000C0000000002001D002E4B000C00000000000014004559000D3E000001020014005468000A000000001B300200660000005C000011026F4B00000A734E01000A0A0616734F01000A0B735A00000A0C076F5001000A0D2B0F0809D26F5D00000A076F5001000A0D091533ED086F4D01000A735300000A1304DE1E082C06086F3500000ADC072C06076F3500000ADC062C06066F3500000ADC11042A00000128000002001A002B45000A00000000020014003B4F000A0000000002000C004D59000A000000001B300400470000005D000011735A00000A0A061717735101000A0B026F4B00000A0C070816088E696F4B01000ADE0A072C06076F3500000ADC066F4D01000A735300000A0DDE0A062C06066F3500000ADC092A00011C000002000F001423000A0000000002000600353B000A000000001B300200660000005E000011026F4B00000A734E01000A0A0616735201000A0B735A00000A0C076F5001000A0D2B0F0809D26F5D00000A076F5001000A0D091533ED086F4D01000A735300000A1304DE1E082C06086F3500000ADC072C06076F3500000ADC062C06066F3500000ADC11042A00000128000002001A002B45000A00000000020014003B4F000A0000000002000C004D59000A0000000013300300B40000005F0000110F00284800000A726A20077072110000706F7100000A6F4900000A0A06726E2007701E285301000A2D0716287F00000A2A0616196F2000000A287900000A0B0619186F2000000A287900000A0C061B1A6F2000000A287900000A0D072C06082C03092D0716287F00000A2A07209A020000330716287F00000A2A072004030000310716287F00000A2A0720DB030000331C081F4133170920E0100000320F0920E9100000300716287F00000A2A17287F00000A2A133004004B020000600000110F00284800000A726A20077072110000706F7100000A6F4900000A0A727E2007701E73D700000A0B72922007701E73D700000A0C72B02007701E73D700000A0D72CA2007701E73D700000A130472E82007701E73D700000A13050F01284800000A6F4900000A6F4A00000A25130A3928010000FE137E650000042D551C732700000A25721100007016282800000A25720A21077017282800000A25721421077018282800000A25721A21077019282800000A2572242107701A282800000A25722E2107701B282800000AFE138065000004FE137E65000004110A120B282900000A39B5000000110B4506000000050000004400000054000000640000007400000085000000389100000007066F3501000A3A9C00000008066F3501000A3A9000000009066F3501000A3A840000001104066F3501000A2D7A1105066F3501000A2D7016287F00000A2A07066F3501000A2D6016287F00000A2A08066F3501000A2D5016287F00000A2A09066F3501000A2D4016287F00000A2A1104066F3501000A2D2F16287F00000A2A1105066F3501000A2D1E16287F00000A2A723C2107700F01284800000A281800000A734700000A7A16130618066FBF00000A185D5913072B1B11060611071759176F2000000A287900000A5813061107185813071107066FBF00000A31DB161308066FBF00000A185D175813092B330611091759176F2000000A287900000A185A130811081F0A2F09110611085813062B0A110611081F09595813061109185813091109066FBF00000A32C311061F0A5D2C0716287F00000A2A17287F00000A2A00133003008F0000006100001120000100008D7E0000010A202083B8ED0B160C160D2B2D090C1E13042B1808175F17330808176407610C2B040817640C11041759130411041630E30609E0089E0917580D096E068E696A32CB1513051613062B26110520FF0000005F0211066A6F5401000A61D2130711051E640611079561130511061758130611066A026F6000000A32CF1105666E283D01000A2A0013300300A90000006200001102250B398900000007725E210770282100000A2D36077266210770282100000A2D37077270210770282100000A2D3807727E210770282100000A2D3907728C210770282100000A2D3A2B46285501000A036F5601000A0A2B4E285701000A036F5601000A0A2B40285801000A036F5601000A0A2B32285901000A036F5601000A0A2B24285A01000A036F5601000A0A2B16729A2107700272C2210770283800000A735B01000A7A062A0000001330030055000000630000110F00284800000A6F4900000A6F4A00000A036F4B00000A28970000060A73F900000A0B160C2B1C0706088F2B0000017207000070281400000A6F1500000A260817580C08068E6932DE076F1600000A288100000A2A8A0F00284800000A6F4900000A6F4A00000A036F4B00000A2897000006285C01000A2A13300400F4000000640000110F00284800000A726A20077072110000706F7100000A6F4900000A0A06729502007072110000706F7100000A0A06726E2007701E285301000A2D0716287F00000A2A0616176F2000000A287900000A0B0617176F2000000A287900000A0C0618176F2000000A287900000A0D0619176F2000000A287900000A1304061A176F2000000A287900000A1305061B176F2000000A287900000A1306061C176F2000000A287900000A1307061D176F2000000A287900000A1308061E176F2000000A287900000A130919071104581107585A1D081105581108585A5809110658110958581F0A5D2D0717287F00000A2A16287F00000A2A13300300630000003F0000110F00284800000A6F4A00000A250A2C4D067238220770282100000A2D0F06723E220770282100000A2D1A2B310F01284800000A72442207701E285301000A287F00000A2A0F01284800000A726C2207701F09285301000A287F00000A2A7E5D01000A2A001B300400A30B0000650000110F00284600000A2C0717287F00000A2A0F01284600000A2C0B7247230770734100000A7A140A140B160C72110000700D161304728F230770130572C723077013060F01284800000A1204285E01000A3AF20200000F01284800000A178D2C000001130A110A161F7C9D110A6FD500000A13071107130B16130C38BD020000110B110C9A130811086F4900000A6F4A00000A25130D3980020000FE137E660000043A160100001F15732700000A2572BB02007016282800000A25727703007017282800000A25723103007018282800000A2572F702007019282800000A2572AD0200701A282800000A2572730000701B282800000A2572830000701C282800000A2572FF0200701D282800000A2572430300701E282800000A25720B0300701F09282800000A2572DF0200701F0A282800000A2572150300701F0B282800000A2572CD0200701F0C282800000A25729D0000701F0D282800000A2572C30200701F0E282800000A2572930000701F0F282800000A2572B10000701F10282800000A2572C10300701F11282800000A2572870300701F12282800000A2572630300701F13282800000A25720F2407701F14282800000AFE138066000004FE137E66000004110D120E282900000A3949010000110E451500000005000000100000001B00000026000000310000003D0000003D00000049000000550000006400000073000000820000008E0000009A000000A6000000B2000000BE000000CA000000D6000000E2000000E200000038E900000011041760130438FA00000011041860130438EF00000011041A60130438E400000011041E60130438D900000011041F1060130438CD00000011041F2060130438C100000011041F4060130438B50000001104208000000060130438A6000000110420000100006013043897000000110420000200006013043888000000110420000400006013042B7C110420000800006013042B70110420001000006013042B64110420002000006013042B58110420004000006013042B4C110420008000006013042B40110420000001006013042B34110420000002006013042B28110420000004006013042B1C722524077011086F4900000A7205CE0470283800000A734100000A7A110C1758130C110C110B8E693F38FDFFFF72FB4C067073F800000A250A130F066FFA00000A73FE00000A0B07066FFF00000A07176F5F01000A1104175F17335B1D8D2D00000113101110161105A21110177241240770A21110181106A21110197241240770A211101A7249240770A211101B0F00284800000AA211101C72C20C0770A2111028E800000A0D07096F0101000A076FFC00000A26170C1104185F18335B1D8D2D00000113111111161105A21111177251240770A21111181106A21111197251240770A211111A7249240770A211111B0F00284800000AA211111C72C20C0770A2111128E800000A0D07096F0101000A076FFC00000A26170C11041A5F1A335B1D8D2D00000113121112161105A21112177261240770A21112181106A21112197261240770A211121A7249240770A211121B0F00284800000AA211121C72C20C0770A2111228E800000A0D07096F0101000A076FFC00000A26170C11041E5F1E335B1D8D2D00000113131113161105A21113177273240770A21113181106A21113197273240770A211131A7249240770A211131B0F00284800000AA211131C72C20C0770A2111328E800000A0D07096F0101000A076FFC00000A26170C11041F105F1F10335B1D8D2D00000113141114161105A2111417727B240770A21114181106A2111419727B240770A211141A7249240770A211141B0F00284800000AA211141C72C20C0770A2111428E800000A0D07096F0101000A076FFC00000A26170C11041F205F1F2040B0000000728924077013090F0228A200000A2D4B110972CF0000700F0228A300000A8C3A000001286001000A13090F0328A200000A2D1A110972DE1F07700F0328A300000A8C3A000001286001000A1309110972DB000070281800000A13091D8D2D00000113151115161105A21115171109A21115181106A21115191109A211151A7249240770A211151B0F00284800000AA211151C72C20C0770A2111528E800000A0D07096F0101000A076FFC00000A26170C11041F405F1F40335B1D8D2D00000113161116161105A21116177299240770A21116181106A21116197299240770A211161A7249240770A211161B0F00284800000AA211161C72C20C0770A2111628E800000A0D07096F0101000A076FFC00000A26170C110420800000005F2080000000335B1D8D2D00000113171117161105A211171772A5240770A21117181106A211171972A5240770A211171A7249240770A211171B0F00284800000AA211171C72C20C0770A2111728E800000A0D07096F0101000A076FFC00000A26170C110420000100005F2000010000335B1D8D2D00000113181118161105A211181772BB240770A21118181106A211181972BB240770A211181A7249240770A211181B0F00284800000AA211181C72C20C0770A2111828E800000A0D07096F0101000A076FFC00000A26170C110420000200005F2000020000335B1D8D2D00000113191119161105A211191772C5240770A21119181106A211191972C5240770A211191A7249240770A211\
-191B0F00284800000AA211191C72C20C0770A2111928E800000A0D07096F0101000A076FFC00000A26170C110420000400005F2000040000335B1D8D2D000001131A111A161105A2111A1772D1240770A2111A181106A2111A1972D1240770A2111A1A7249240770A2111A1B0F00284800000AA2111A1C72C20C0770A2111A28E800000A0D07096F0101000A076FFC00000A26170C110420000800005F2000080000335B1D8D2D000001131B111B161105A2111B1772ED240770A2111B181106A2111B1972ED240770A2111B1A7249240770A2111B1B0F00284800000AA2111B1C72C20C0770A2111B28E800000A0D07096F0101000A076FFC00000A26170C110420001000005F2000100000335B1D8D2D000001131C111C161105A2111C1772FF240770A2111C181106A2111C1972FF240770A2111C1A7249240770A2111C1B0F00284800000AA2111C1C72C20C0770A2111C28E800000A0D07096F0101000A076FFC00000A26170C110420002000005F2000200000335B1D8D2D000001131D111D161105A2111D177213250770A2111D181106A2111D197213250770A2111D1A7249240770A2111D1B0F00284800000AA2111D1C72C20C0770A2111D28E800000A0D07096F0101000A076FFC00000A26170C110420004000005F2000400000335B1D8D2D000001131E111E161105A2111E17721D250770A2111E181106A2111E19721D250770A2111E1A7249240770A2111E1B0F00284800000AA2111E1C72C20C0770A2111E28E800000A0D07096F0101000A076FFC00000A26170C110420008000005F2000800000335B1D8D2D000001131F111F161105A2111F177227250770A2111F181106A2111F197227250770A2111F1A7249240770A2111F1B0F00284800000AA2111F1C72C20C0770A2111F28E800000A0D07096F0101000A076FFC00000A26170C110420000001005F2000000100335B1D8D2D00000113201120161105A21120177245250770A21120181106A21120197245250770A211201A7249240770A211201B0F00284800000AA211201C72C20C0770A2112028E800000A0D07096F0101000A076FFC00000A26170C110420000002005F2000000200335B1D8D2D00000113211121161105A2112117724D250770A21121181106A2112119724D250770A211211A7249240770A211211B0F00284800000AA211211C72C20C0770A2112128E800000A0D07096F0101000A076FFC00000A26170C110420000004005F2000000400335B1D8D2D00000113221122161105A2112217726F250770A21122181106A2112219726F250770A211221A7249240770A211221B0F00284800000AA211221C72C20C0770A2112228E800000A0D07096F0101000A076FFC00000A26170CDE0C110F2C07110F6F3500000ADCDE0526160CDE00DE13062C06066FFD00000A072C06076F6101000ADC08287F00000A2A00414C0000020000005403000020080000740B00000C0000000000000000000000460300003C080000820B0000050000003E000001020000004603000043080000890B000013000000000000003216286201000A283D01000A2A1E02282300000A2A00000003300300F1030000000000007E53000004728525077023000000000000C03F6F6401000A7E53000004729925077023000000000000203F6F6401000A7E5300000472B525077023000000000000803E6F6401000A7E5300000472D125077023000000000000E03D6F6401000A7E5300000472ED25077023000000000000403D6F6401000A7E53000004720926077023000000000000A03C6F6401000A7E5300000472252607702300000000000020406F6401000A7E53000004723926077023000000000000503F6F6401000A7E53000004725726077023000000000000B03E6F6401000A7E53000004727526077023000000000000103E6F6401000A7E53000004729326077023000000000000703D6F6401000A7E5300000472B126077023000000000000D03C6F6401000A7E5300000472CF26077023000000000000C0406F6401000A7E5300000472EB2607702300000000000090406F6401000A7E53000004720927077023000000000000503F6F6401000A7E53000004722F27077023000000000000B03E6F6401000A7E53000004725527077023000000000000103E6F6401000A7E53000004727B27077023000000000000703D6F6401000A7E5300000472A12707702300000000000060416F6401000A7E5300000472BD2707702300000000000030416F6401000A7E5300000472DB2707702300000000000090406F6401000A7E53000004720128077023000000000000503F6F6401000A7E53000004722728077023000000000000B03E6F6401000A7E53000004724D28077023000000000000103E6F6401000A7E5300000472732807702300000000000000426F6401000A7E53000004728F28077023000000000000D0416F6401000A7E5300000472AD2807702300000000000030416F6401000A7E5300000472D32807702300000000000090406F6401000A7E5300000472F928077023000000000000503F6F6401000A7E53000004721F29077023000000000000B03E6F6401000A7E53000004724529077023000000000000A0426F6401000A7E5300000472612907702300000000000070426F6401000A7E53000004727F29077023000000000000D0416F6401000A7E5300000472A52907702300000000000030416F6401000A7E5300000472CB2907702300000000000090406F6401000A7E5300000472F129077023000000000000503F6F6401000A7E5300000472172A07702300000000000040436F6401000A7E5300000472332A07702300000000000010436F6401000A7E5300000472512A07702300000000000070426F6401000A7E5300000472772A077023000000000000D0416F6401000A7E53000004729D2A07702300000000000030416F6401000A7E5300000472C32A07702300000000000090406F6401000A2A42736501000A8053000004289F0000062A1E02282300000A2A000042534A4201000100000000000C00000076322E302E35303732370000000005006C000000B0360000237E00001C3700007C2A000023537472696E67730000000098610000EC2A070023555300848C0700100000002347554944000000948C07000434000023426C6F620000000000000002000001579FA22B0902000000FA25330016000001000000890000002B00000006010000010100007101000037000000650100000A000000EF00000003000000650000000B00000016000000160000004D0000000E0000000100000001000000030000001A00000000000A0001000000000006004A01430106005101430106005B0143010600A7028C020A00C202B6020A001503FA020A002103B6020A007E03FA020A00AF039A030A00B8039A030A00C1039A030600270443010A0041049A030A004D049A030A00DD049A030A0011059A030A0044059A030A007B059A0306002D061A060A0040079A030A0048079A030E0052083308060094091A060600C609B1090A00AC0B9A030600AC0C8C020A00BB0EFA0206003A0F1B0F06005C134A13060073134A13060090134A130600AF134A130600C8134A130600E1134A130600FC134A13060017144A13060030141B0F060044144A1306005D144A1306008A147A140600D014B0140600F014B01406001315430106001815430106001D1543010600C406430106003E1532150A005E15FA020A006915FA020600B615430106001916B0140600581643010A005E16B6020A007916B602060094161A060A00BA16B6020600D31643010600DB1643010600E11643010600F116430113000F17000006003F1743010A004917FA020A0072179A030600951743010600EB17430106000D18031806001A18031806003F18430106008B18B01406009A1843010600A01843010600C31843010E000C1933080E00A10833080E00121933080E002E1933080E004919330806009D1943010600C419430106000A1A43010600151A430106007E1A43010600A41AB1090600C61A430106001A1B8C020600281B8C020600DC1C43010600B01D9D1D0600D91DC81D0600061E43010600551F1B0F06006B1F1B0F0600B71F43010600CD1F43010E009C203308060034094A13060009114A1306002C0943010A00AD21FA020A00EA21D4210A000422D4210A002722D4210A00482235220A005A2235220A00A122D4210A00C92235220A00E322B6020E00102305230E00222305230E00812305230E00912305230E00C52305230E00DD2305230600FF23321506001124031806001E2403180A0033249A030600822443010600872443010600B12443010600FA25B1090E004E2938290E00592938290E00802938290600A22943010600C629A9290600CA29A9290600E429A9290600E929A9290600F029A9290600F729A9290600FE2943010A002C2AB6020E005E2A482A0600682A430106006B2A430100000000010000000000010001000100100013000000050001000100022010001A00000005000100070002201000270000000500130009000100100034000000050014001100010010003C000000050016001C0001001000410000000500160035000300100048000000050016003C000B0110005400000009001B003F000300100064000000050020003F000B0110006E000000090025004200010010007C00000005002A0042000B0110008100000009002B005100090110009A00000009003800510001001000A700000005003A0051000B011000AD00000009003A00600008011000BA00000009003F00600080011000C400000005004200620001001000CF00000005004500620001001000D8000000050045006D000B011000DF00000009004500840001001000EC00000005004700840001001000F00000000500470085000B011000F8000000090047009F000B01100004010000090049009F000B0110001201000009004B009F0001010000230100000D004D009F00010000002B010000050053009F0000000000D415000005005400A200130100005A18000009006700A20003011000D61A000005006700A20003011000051B000005006800A400030110001C1E000005007300AD0003011000561E000005007500B000030110001220000005008400B90003011000D620000005009400C10003011000C22400000500A800C90003011000102600000500B900D200030110007A2600000500C600DA0003011000D22600000500D200E20003011000332700000500DF00EA0003011000C52700000500EB00F200030110006D2800000500F900FA000600B90132000600C40132000600CD0135000600D80138000600E30138000600ED0135000600F3013B000600FD013B0006000302350006000D02350006001A02350006002502350006002B02350006003602350006003F02320006005002320006005F02320006006D0232000600AE0242003100E5038C003100300497000600780632000600840632000600920632000600A20632000600A7068C000600780632000600840632000600920632000600A20632000600A7068C000600780632000600840632000600A20632000600A7068C000600480032000600780632000600840632000600A20632000600A7068C0006004800320031002C07250206006107380006006C07970006007807250206008907250206009A0725020600A70725020600B40725020600BE0725020600C70725020600D50725020600E80725020600F60738000600040838005680110832005680210832000600F10838000600FA08320006000009380006000609380006000A09380036001109380036001709380036001D09380056802C09320056803409320056803D09320006009A0A380006009E0A320006000B0C38000600120C38000600190C38000600220C250206002B0C38000600370C97000606430C380056804B0C28065680540C280656805B0C28065680700C280656808F0C28063300B90C450613003416E60713002B17E60713017718CF0B1300B019E6071300F619E60713006A1AE6071300901AE6071300761FE60713008A1FE60713009E1FE6071300E81FE6071300D325E60713008427E6071300E828E6071300FC28E60713001029E60713002429E60713008E29E6071300182AE6070600470FA4140100A71BCF1401003C1C38000100471C38000600470FA4140600871CA4140600971CD2140600B21CD6140600C81CD6140600E81CDA1406000F1DE31406001F1DE7140600470FA41406004800A4140100A71BCF1401003C1C38000100471C38000600470FA4140600871CA41406004800A41406006A1EA41406007B1E34160600951E38160600A91E40160600C01E40160600D31E44160600FA1E44160600211F4D160600321F52160100A71BCF1401003C1C38000100471C380006001B10A41406002020A41406003010A41406003A20A41406004210931006005120931006004A10A41406005E20A41406007420B41D06008920B81D0600AC20BC1D0600BA20C11D0600C82038000100A71BCF1401003C1C38000100471C380006001B10A41406002020A41406003010A41406003A20A4140600650A93100600E220931006004210931006005120931006004A10A41406005E20A4140600ED20B41D06000221B81D06001521BC1D06002321C11D0600312138000600472138000600552138000100A71BCF1401003C1C38000100471C380006003D116E250600CE246E250600220DA4140600DF24A41406009A1193100600EE2493100600FF24722506001425380006002925762506003B25320006004E257A2506006225320006001F1D762506007E2538000100A71BCF1401003C1C38000100471C380006004112931006002726931006004A12931006003526931006005112931006004126931006004B26AD2A06001425380006005E26380006006C2638000100A71BCF1401003C1C38000100471C380006004112931006002726931006005612931006008D26931006005112931006004126931006009C26AD2A0600AF2638000600C42638000100A71BCF1401003C1C38000100471C380006004112EE2B06002726EE2B06004A12EE2B06003526EE2B06005112EE2B06004126EE2B0600EB26F22B0600002738000600152725020600242725020100A71BCF1401003C1C38000100471C380006004112EE2B06002726EE2B06005612931006008D26931006005112EE2B06004126EE2B06004927F22B06005F2738000600752725020100A71BCF1401003C1C38000100471C3800060074126C110600E2276C11060082126C110600F5276C1106005112931006004126931006006B12A41406000628A41406001428532D06002D2838000600432897000100A71BCF1401003C1C38000100471C3800060074126C110600E2276C1106008E12931006008628931006005112931006004126931006006B12A41406000628A41406009A28532D0600B32838000600C9289700D02000000000960060010A000100202100000000960079011100020065210000000096009201170003008321000000009600AD011C0004009421000000009600AD0124000700CE22000000008618B3012E000B00D8220000000086007C023E000B00A524000000008618B3012E000B00AD24000000008618B3014A000B00C424000000008100CC0250000C00D428000000008600DB025B000D002C29000000008600E9025B001000182A0000000081002B0362001300432A000000008100450362001500802A0000000081006C036A001700C02F0000000086008C03700018000430000000009600CB03750018009E30000000009600D4037E001A00C830000000009600DF0385001B004C31000000009600F10390001C00E833000000009600FA037E001D005C3600000000960003047E001E009C36000000009600150490001F00043700000000960056049B0020002C370000000096006A04A2002100CA37000000008618B3012E002200A037000000009118CF0CB1042200D4370000000091007E04A9002200A83F0000000091009004B00024005841000000009600A304B7002600AC41000000009600B304B7002B002042000000009600C204C60030003C42000000009600CE04A20032007F42000000009600E804CF0033009442000000009600F304D6003400B8420000000096000205D6003500DC420000000096001A05DD0036009C430000000096002705E8003900CC430000000096003505F1003B0034470000000096004E05FC003E0064470000000096005B0503013F00A04700000000960066050A01400064490000000096006A0517014400F84F0000000096007205200146003053000000009600840529014800CC540000000096009B0534014B007C55000000009600B205A2004D00D855000000009600BD05A2004E003356000000009600C8053D014F007056000000009600D40550015600D456000000009600DB05A20059000957000000008618B3012E005A001457000000009100F3055B015A00187B000000009100030664015A00407F000000009600390678016000607F00000000910048067F016100088A000000009100560688016100F48E0000000096006B069C016700188F000000008618B3012E006900208F000000008618B3012E006900288F000000008618B301A5016900388F000000008618B301AD016D00B98F000000008618B3012E007200C18F000000008618B301A5017200D08F000000008618B301AD0176004490000000009600B106B6017B00C090000000009600BB06BD017C000095000000009600C406C4017D00509B000000009600CC06CF018000D89B000000009600D406D60181004C9C000000009100E006E1018400609D00000000960000070D029200EEA00000000096001D071E02980002A100000000960022071E02990016A100000000960027071E029A002AA100000000960037071E029B0044A1000000009600720528029C0080A1000000009600530731029E00F2A1000000008618B3012E00A100E2A1000000009118CF0CB104A100FCA10000000096005F08C202A100C4A30000000096006F08C802A2003CA40000000096007708D502A600B8A40000000096008308E202AB003CA50000000091008F08F102B100B0A5000000009600A1080503B70020A9000000009600A7081203BB0054A9000000009600AF081F03BF00F8AD000000009600B7083003C60034AE000000009600BD083F03CB002EAF000000009600CA085203D30041AF000000009600D1085203D50054AF000000009600DA085903D7005CB0000000009600E0086803DC0019B1000000008618B3012E00E40024B100000000960023097B03E40080B1000000009118CF0CB104E400D8B100000000960045098A04E400CCC40000000096004B099404E700ECC70000000096005C099C04E900C4CC0000000096006809A604EC00A8D90000000096007209AC04ED00C0DA0000000096008409B104ED0018F00000000096002C09B504ED0038F00000000096003D09B504ED0054F000000000910089097B03ED00B0F00000000091009E09BA04ED004CF2000000008618B3012E00EF0054F2000000009600D509C104EF00E4F2000000009600ED09C704F00084F3000000009600F909C704F40024F4000000009600010A8500F80050F4000000009600060AD404F90094F40000000096000F0ADD04FB0008F5000000009600180ADD04FE007CF5000000009600230AE8040101D8F50000000096002B0AE804040134F6000000009100340AF304070130F9000000009600B708FE040A015CF9000000009600480A09050D01C0FA0000000096004D0A1405100114FC000000009600560A85001301E8FC0000000096005E0A1F05140134FD000000009600650A2805160148FE0000000096006B0A52031B010000010000009600730A37051C0158010100000096007E0A480522010403010000009600820A530525014E04010000009600AF085C05270170040100000096008C0A67052B017205010000008618B3012E002E017A05010000008618B3012E002E018405010000009100A20A72052E015C08010000009600B50A7D0531012C0A010000009600C60A7D053401580A010000009100D30A880537014C0D010000009600E80A93053A01240F010000009600FB0A9E053D01500F0100000091000A0BA9054001880F010000009100220BB4054301D014010000009600380BBD054601C4160100000096004E0BCA054A01F816010000009600600BD7054E01101F010000009600680BDE054F01D01F0100000096006D0BDE0550016C20010000009600740BDE055101DC200100000096007C0BDE0552017821010000009600840BE505530138220100000096008F0BEC0554019024010000009600990BF50556012C250100000091009F0BFC055701E425010000009600A70B040659014526010000009600B60B0D065B016826010000009600C10BE5055D016827010000009600DB0BEC055E01D827010000009600ED0B16066001D433010000009600FC0B23066401E133010000008618B3012E006401EC33010000009600C00CB1046401E937010000009118CF0CB1046401FA37010000008618B3012E006401847B000000008618B3012E0064018C7B000000008600E91AA8146401EC7B00000000E101361BBC146501347C00000000E1017A1B220865013C7C00000000E101E81640086501AC7E00000000E109B41B28086501B47E00000000E101F61B2E006501BC7E00000000E101211C2E006501FC7E00000000E1095C1C28086501047F000000008618B301C4066501237F0000000081002A1D2E006601748A000000008618B3012E0066017C8A000000008600301E2E166601B78A000000008600431E2E166701F08A00000000E101361BBC146801448B00000000E1017A1B220868014C8B00000000E101E81640086801608E00000000E109B41B28086801688E00000000E101F61B2E006801708E00000000E101211C2E006801B08E00000000E1095C1C28086801B88E000000008618B301C4066801D78E0000000081003E1F2E00690198A600000000E101361BBC14690104A700000000E1017A1B220869010CA700000000E101E81640086901E6A800000000E109B41B28086901EEA800000000E101F61B2E006901F5A800000000E101211C2E006901F7A800000000E1095C1C28086901FFA8000000008618B301C4066901E0A900000000E101361BBC146A0158AA00000000E1017A1B22086A0160AA00000000E101E81640086A01C0AD00000000E109B41B28086A01C8AD00000000E101F61B2E006A01CFAD00000000E101211C2E006A01D1AD00000000E1095C1C28086A01D9AD000000008618B301C4066A016CF600000000E101361BBC146B01CCF600000000E1017A1B22086B01D4F600000000E101E81640086B01C4F800000000E109B41B28086B01CCF800000000E101F61B2E006B01D4F800000000E101211C2E006B01FFF800000000E1095C1C28086B0107F9000000008618B301C4066B0126F900000000810070252E006C01BC0501000000E101361BBC146C011C0601000000E1017A1B22086C01240601000000E101E81640086C01220801000000E109B41B28086C012A0801000000E101F61B2E006C01310801000000E101211C2E006C01330801000000E1095C1C28086C013B08010000008618B301C4066C01880801000000E101361BBC146D01E80801000000E1017A1B22086D01F00801000000E101E81640086D01F20901000000E109B41B28086D01FA0901000000E101F61B2E006D01010A01000000E101211C2E006D01030A01000000E1095C1C28086D010B0A010000008618B301C4066D01940A01000000E101361BBC146E01F40A01000000E1017A1B22086E01FC0A01000000E101E81640086E01130D01000000E109B41B28086E011B0D01000000E101F61B2E006E01220D01000000E101211C2E006E01240D01000000E1095C1C28086E012C0D010000008618B301C4066E01780D01000000E101361BBC146F01D80D01000000E1017A1B22086F01E00D01000000E101E81640086F01EB0E01000000E109B41B28086F01F30E01000000E101F61B2E006F01FA0E01000000E101211C2E006F01FC0E01000000E1095C1C28086F01040F010000008618B301C4066F01FC1101000000E101361BBC147001681201000000E1017A1B22087001701201000000E101E81640087001981401000000E109B41B28087001A01401000000E101F61B2E007001A71401000000E101211C2E007001A91401000000E1095C1C28087001B114010000008618B301C4067001041501000000E101361BBC147101701501000000E1017A1B22087101781501000000E101E816400871018C1601000000E109B41B28087101941601000000E101F61B2E0071019B1601000000E101211C2E0071019D1601000000E1095C1C28087101A516010000008618B301C406710100000100D60C00000100E00C00000100F30100000100EA0C000002004D0A00000300F10C00000100EA0C000002004D0A00000300F10C00000400FF0C000001001A0D000001001A0D00000100220D000002002C0D000003003A0D00000100220D000002002C0D000003003A0D00000100490D00000200560D00000100490D00000200560D00000100490D00000100640D00000200730D000001008A0D00000100970D00000100640D000001008A0D00000100A10D00000100B00D00000100BC0D00000100C60D00000100CF0D00000200D70D00000100E60D00000200F90D00000100CF0D00000200070E000003000F0E00000400190E00000500230E00000100CF0D00000200070E000003000F0E00000400190E00000500230E00000100320E00000200370E00000100CF0D00000100320E00000100CF0D00000100CF0D000001003D0E00000200470E000003004F0E00000100CF0D000002004F0E000001003D0E00000200470E000003005F0E000001006C0E00000100750E000001003D0E00000200470E000003007D0E000004008E0E000001009A0E00000200A30E000001009A0E00000200A30E00000100A80E00000200B30E000003003D0E00000100CD0E00000200D50E00000100CF0D00000100CF0D00000100320E00000200370E00000300DD0E00000400E10E00000500E60E00000600ED0E00000700F40E00000100CF0D00000200000F000003000F0F00000100CF0D00000100170F02000200780602000300840602000400920602000500A20602000600A70600000100470F00000100170F02000200780602000300840602000400A20602000500A70602000600480000000100470F00000200480000000100780600000200840600000300920600000400A20600000100780600000200840600000300920600000400A20600000500A70600000100780600000200840600000300A20600000400480000000100780600000200840600000300A20600000400A70600000500480000000100520F000001005D0F00000100520F000002006A0F000003006F0F00000100520F00000100720F00000200770F00000300820F00000100170F020002006107020003006C07020004007807020005008907020006009A0702000700A70702000800B40702000900BE0702000A00C70702000B00D50702000C00E80702000D00F60702000E000408000001008D0F00000200980F00000300AB0F00000400B70F00000500C70F00000600D50F00000100520F00000100520F00000100520F00000100520F00000100520F00000200EA0F00000100F80F000002000210000003000F0F000001000F10000001001B1000000200301000000300421000\
-0004004A10000000000000000001001B10000002003010000003004210000004004A10000000000000000001001B10000002003010000003004210000004000A09000005004A1000000100170F02000200F10802000300FA08020004005B10020005006410020006000A09000001001B10000002003010000003004210000004004A10000001001B10000002003010000003004210000004004A10000000000000000001001B10000002003010000003006B1000000400650A000005004210000006004A10000001001B1000000200301000000300650A000004004210000005004A10000000000000000001001B10000002003010000003007710000004008A10000005004210000006000A09000007004A10000000000000000001009E1000000000000000000100B110000001001B10000002003010000003004210000004000A09000005004A10000000000000000001001B10000002003010000003006B10000004008A1000000500650A000006004210000007004A1000000100C61000000200D51000000300E61000000100F31000000200C61000000100FB1000000200091100000300161100000100D510000001000911000002002D11000001000F10000001003D11000002004911000003005511000004006011000001003D11000002004911000003005511000004006011000001003D11000001003D11000002004911000001003D11000002004911000003006011000001003D11000002004911000003006011000001003D11000002006F11000003007B11000001003D11000002006F11000003007B1100000100170F020002008811020003009111000001003D1100000200220D000003009A1100000100A61100000200220D00000300AA11000001003D1100000200B51100000300220D000001003D1100000100BF1100000200CC11000001003D1100000200D91100000300421000000400601100000500E01100000100ED11000001003D1100000200D91100000300421000000400F51100000500601100000600E011000001003D11000002000212000003000C12000001003D11000002001312000000000000000001002212000002002D12000003006B10000001003D11000002003212000003000F0F00000100170F020002000B0C02000300120C000001004112000002004A1200000300511200000100411200000200561200000300511200000100170F02000200190C02000300220C000001004112000002004A1200000300511200000100411200000200561200000300511200000100170F020002002B0C02000300370C000001006012000002005112000003006B12000001007412000002008212000003005112000004006B12000001007412000002008E12000003005112000004006B12000001009D1200000100AA1200000100B91200000100AA1200000100B91200000100CA1200000100CE1200000200D71200000100DE1200000100E71200000200DE1200000100E71200000200DE1200000100E71200000200DE1200000100F11200000100480000000200FF12000001000A13000002001913000003002C13000004003D1300000100FE1A000001003C1C00000100FE1A00000100FE1A000001003C1C000001003C1C000001003C1C000001003C1C000001003C1C000001003C1C000001003C1C000001003C1C000001003C1C000001003C1C2000160020004D0020001A002000DD002000F1002200160022004D0022001A002200DD002200F1002300160023004D0023001A002300DD002300F1002400160024004D0024001A002400DD002400F1002500160025004D0025001A002500DD002500F1002600160026004D0026001A002600DD002600F1002700160027004D0027001A002700DD002700F1002800160028004D0028001A002800DD002800F1002900160029004D0029001A002900DD002900F1002A0016002A004D002A001A002A00DD002A00F1002B0016002B004D002B001A002B00DD002B00F100D900B3012E00E100B3012E00E900B301BA06F100B301BA06F900B301BA060101B301BA060901B301BA061101B301BA061901B301BA062101B301BA062901B301BF063101B301BA063901B301BA064101B3012E004901B301C4065101B3012E00690124156B0771012B1571077901B301BA06590123097D0779014C158207090023093E006901B30193076901241599077901B3019F0779015315A50779014C15A90781017115B30789017A15BA0669017F15B90779018E15C40669019915BF076901A315C5077901AF15CB070900B3012E009101B3012E006901CC153E009901B3012E000C00B301C4060C004816F5070C004C16FD07A10123093E0079014C1506081400B3012E00290070161C08B101A0162208B901AE162808C101C2162C083100CB163108D901FA083508140048163A08B901E8164008E101FD162E0014000517A5071400C2165808690124155E086901480A65081400A01672081C00AE1684081C00E81640083100B3019B083100B301A30869011A173E003100B301AC08F101B301BA064100B301BA08F901B3012E0051005E17400849006917050959005E1740080102B301BA06590083173E006901010A3E0069018D173E00510083170A097101AD170F096901BC1718094900B3011D0949005E1740085100691769094900831718097101C8176E095100B30177097101DC17B7097101E417BC094900B3012E0079014C15050A1102F7177B035100B3012E001902B3012E0071012B15570A71012B155C0A21022118610A5100B301660A49005315C30A51005315C30A7901B301C40671008317A50761002B185A0B69003318600B69008317B40B61004818B90B29025118A50771003318C10B3102B318D30B6100B301DD0B6100CD18E40B6100DB18A5076100E918A5076100F118A5076100FB18A50761005E0AEA0B6901AF08250C710104192B0C5102A108300C610283173E0069011A19320069012019C50759023E19380C6902C2163E0C71014F19450C6901230A4A0C710157199A0C6900B3019F0C6100C204F10C6100E8047F0D79003318C80D610060193E00590033180E0E610071193E0061008219B40B61008B19920E81008317C30A61009319C30A6901F909300F6901F909360F6901B7083C0F6901AF15BF07810223093E006100B301A20F89008317AC0F6100CA195A0B2902D519AC0F89003318EC0F69015E0A31107900E619400869005E1740087100F119931089020F1A971071014F199C1071011D1AA1109102B301C4069102271AA8108902331AB41071014F19BD1061003B1AA5076100441AA50761004F1AA50761005A1AA5076900F1196C116100B301701191005E17400891008317E3119902B301BA06610023097D07A102B01A39136100230940132400B3012E00240048163A082C00A016C5149900A01622083400AE168408B9011B1C2E00C902B3012E00D102E01DF414D102F21DA5072400A01672083C00AE1684083C00E81640084400B301101524002D121615D902B3012E004C00B3012E004C0048163A085400B30110154C004D1F69164C00A01672085C00AE1684085C00E81640084C002D12161569015315A507E102B301811664004C16FD078902B21F971071005E174008F102B3012E00F102BE1FCF17F102B301C4066C00B3012E008902C31F7E198902C91F84198902331A97108902C31F8A196100DE1F93196C0048163A0889021D079710890222079710890227079710A1008317CA1AA9008317111B910223097D079102230940136901B708211B6901B3011D095102B301771B51026F087E1B5900F119A4145102A108CB1B5102A108111C4900B3011A1C7400B3012E007102FC1F400861020820A50761025315A507740048163A085102A708CC1D0103C216D41D01030517A5075102AF08151E5102CA08651F5102D108651F690124152020090366212E2009037B213420110383213A2019038F21A50719039921A5071903A321A5072103B3012E00B900B3012E007901C3218207B90048165B20B900CE212E002903B301BA068901F521602031031122A5077901202267203903B301BA067901B3012E00410355222E002903B301B32049036422A507410374222E002903B3012E0029037A22E92079008922F02049039122BA062903AF22F62089017A15FC20690124150321F101BD223E005903D6224008590374222E004103F3220B214903FD222E0069031B239F2171033123C40671035223C40671037323BF0679039E23A6216903B523AC216903D123B3218903ED23B92199030824BF21A103B301C521A90329243E00890374222E00A90374222E00B103B301BA0689014924FE21B900C216042241005A24092289016424FE21B9000517A507890173242E0079014C159B226901B708A922B9039924B3221900AB24BC229902B301C5226901ED0913236901F90913236901060A311069010F0A0D246901180A0D247101E417942469012B0A4A0C59038925400859039525E82659039E2504225903B72540086901ED093B2769019915862769015E0A0D247100201909287900BC25F0207900C52512287101DC17D32851026F0831105102AF08250CA102B301BA06A102E725C52981020726CB29A1010726D829D1010726E52959010726F22981003318FF298100F119052A6100982793196100A1275A0B6100AA275A0B6100B5275A0B610052285D2D61005E285D2D8902D8289710890052284C2E8900DC28552E6901F9095E2E6901AF158627D903B301AF2E21026929BA2E210274222E0019026F290A091902B3017709D903B3010E2F21027729A507E903B301AF2EE903B3010E2F51026F08F12F5100C2168B30F9031B239C300104D829A23009041B23A93011041B23AF3019041B23B53021041B23BB302904B301BA06C900331842317900F119E431A1010726B4324903382ABB3269012415C2323904FD162E004104FC0B4B334904B3012E0064004816F5076400B3012E000E00E0003C020E00E40083020E0008017F030E000C01F0030E0010015904080038012C0608003C013106080040013606080044013B060800480140062E002B0070332E00330076332E003B0050332E0023005A332E0043008C332E004B0070332E005B0070332E006B00CF332E0073002C062E007B00DB332E008300E4332E001B00503320021B02C80840021B022A0960021B027D0980021B02C809A0021B021A0AC0021B027D0AE0021B02CC0A00031B02120B20031B026C0B63031B0B2C06A30333012C06C0031B02590CE0031B02B10CE30333012C0600041B02020D030433012C0620041B023F0D230433012C0640041B028C0D430433012C0660041B02CE0D630433012C0680041B02140E830433012C06A0041B02540EA30433012C06C0041B02B10EC30433012C06E0041B02F00EE30433012C0600051B02640F030533012C0620051B02B00F230533012C0640051B02FC0F430533012C0660051B025A10630533012C0680051B023211A0051B029B11C0051B02F111E0051B02421200061B02881220061B02C41240061B02011360061B025013E0061B02B01340071B02421540081B02881660081B02C81680081B020817A0081B025417C0081B02921700091B02DA1720091B02B41924090B004D0640091B02EA1960091B02201A80091B02561AA0091B02901AC0091B02D21A400A1B023D1B600A1B028D1B800A1B02D31BC00A1B02251CE00A1B02F91C000B1B02DB1D040B0B004D06200B1B02251E400B1B02E41E600B1B022C1F800B1B026A1FA00B1B02A51FC00B1B02DD1F400C7B074020600C7B078D20800C7B07C820A00C7B072C21C00C1B025821E00C7B07E421000D1B021D22200D1B025E22C00D1B02D422E00D1B022223000E1B025D23200E1B029523400E1B02D123600E1B021B24800E1B025924A00E1B029E24E00E1B02DF24000F1B028D25200F1B02FF26400F1B024B27600F1B029127800F1B02D027A00F1B022328C00F1B025E28E00F1B029C2800101B02F32820101B02492940101B028429C0101B021A2AE0101B02B72A20111B02512B40111B02FC2BA0111B02A72CC0111B02652DE0111B02132E00121B02792E20121B02D62E40121B02272F60121B026D2F80121B02B52FA0121B020030C0121B02543000131B02C73020131B02063140131B02493160131B02A13180131B02E831A0131B020B33C4130B00600604140B004D0664140B008106801473052C06A01473052C06C4140B008106E01473052C06001573052C0604150B008106401573052C06601573052C0664150B008106A4150B008106001673052C06201673052C06601673052C06801673052C06C01673052C06E01673052C0604170B008106201773052C06401773052C0664170B008106801773052C0684170B008106A01773052C06E01773052C06E4170B008106001873052C0604180B008106201873052C0624180B008106401873052C06801873052C06A01873052C06C4180B008106E01873052C06E4180B008106001973052C06201973052C06401973052C0664190B008106801973052C0684190B008106A01973052C06A4190B008106E01973052C06E4190B008106001A73052C06401A73052C06601A73052C06641A0B008106841A0B008106A01A73052C06A41A0B008106C01A73052C06C41A0B008106E41A0B008106001B73052C06041B0B008106201B73052C06401B73052C06601B73052C06841B0B008106A01B73052C06A41B0B008106C01B73052C06C41B0B008106001C73052C06041C0B008106201C73052C06401C73052C06601C73052C06841C0B009406A01C73052C06A41C0B009406C01C73052C06001D73052C06201D73052C06401D73052C06601D73052C06841D0B009406A01D73052C06C01D73052C06001E73052C06201E73052C06401E73052C06601E73052C06A01E73052C06C01E73052C06001F73052C06201F73052C06401F73052C06601F73052C06A01F73052C06C01F73052C06002073052C06202073052C06E4240B00810604250B00810624250B00810644250B00810684250B00A706A4250B004D06042C0B0081060000010000000E0000000100000011000100400000001E0077078907D3070D0844086C088908B308C1082309C1090C0A6D0AC70A670BC70BF00B500CAA0CF70C840D9A0E460FF20F3610C4107B11E71139127E124813A013AB13FA142215271532153D155B16C316021748178D17D5179919CE1A171B281B841B201CE51CC61D1D1EDE1E231F26206F20BB2011214B21CF210F225A22A222CB221C2315249924DA247F258525ED2640278B27CB271B28D8283029092A152AB12A462B4C2BF62B952C9B2CA02C572D0D2E632EC22E182F602FA62FF92F3B309030C130FD309431C932200001002200030023000500240007002500090026000B0027000D0028000F00290011002A0013002B0015000000381DF0140000761DF0140000381DF0140000761DF0140000381DF0140000761DF0140000381DF0140000761DF0140000381DF0140000761DF0140000381DF0140000761DF0140000381DF0140000761DF0140000381DF0140000761DF0140000381DF0140000761DF0140000381DF0140000761DF0140000381DF0140000761DF0140200A70003000200AA0005000200B30007000200B60009000200BC000B000200BF000D000200C4000F000200C70011000200CC0013000200CF0015000200D50017000200D80019000200DD001B000200E0001D000200E5001F000200E80021000200ED0023000200F00025000200F50027000200F80029000200FD002B00020000012D0020004801550120004A01570120004C01690020004E015901200050015B01200052016B00200054015F00220060015501220062015701220064016900220066015901220068015B0122006A016B0022006C015F0023007801590123007401570123007601690023007201550123007A015B0123007C016B0023007E015F0024008801590124008401570124008601690024008201550124008A015B0124008C016B0024008E015F0025009201550125009401570125009601690025009801590125009A015B0125009C016B0025009E015F002600AA0159012600A60157012600A80169002600A40155012600AC015B012600AE016B002600B0015F002700BA0159012700B60157012700B80169002700B40155012700BC015B012700BE016B002700C0015F002800C40155012800C60157012800C80169002800CA0159012800CC015B012800CE016B002800D0015F002900D40155012900D60157012900D80169002900DA0159012900DC015B012900DE016B002900E0015F002A00EA0159012A00E60157012A00E80169002A00E40155012A00EC015B012A00EE016B002A00F0015F002B00F40155012B00F60157012B00F80169002B00FA0159012B00FC015B012B00FE016B002B0000025F00EE0715087C089913AE14B514001508152B156116791641177719DE1C60370000560004800000030003005300000001000000C9060E15000002000000000000000000000001003A01000000000200000000000000000000000100B602000000000200000000000000000000000100430100000000030002000400020008000700090007000A0007000B0007000D000C0010000F001500140018001700190017001A0017001E001D001F00070020000700210007002200070023000F0024000F0025001400260017002700170028001700290017002A0017002B0017000000003C4D6F64756C653E0053514C232E646C6C00436F6D6D6F6E00536368656D61436F6C756D6E00526573756C74536368656D6100434F4E564552540044415445004C6F6F6B557000436F756E747279436F646500434F554E545259434F444544617461005374617465436F6465005354415445434F444544617461004D415448004D617468416D6F7274697A6174696F6E5363686564756C6500417070436F6E7374616E74730052454745580052656745784D617463686573005F5F56657273696F6E005F5F4C6F636174696F6E0053514C736861727000535452494E4700535452494E4753706C69747300537973005554494C495459005574696C697479496E7473005574696C697479466C6F617473005574696C6974794461746554696D657300486F6C6964617900556E6974436F6E76657273696F6E006D73636F726C69620053797374656D004F626A6563740056616C75655479706500456E756D00436F6E76657274436861724172726179546F42696E61727900436F6E7665727442696E617279546F486578537472696E67004765744672616374696F6E616C5365636F6E6473466F726D6174005072696E74002E63746F7200436F6C756D6E4E616D650044617461547970650049734E756C6C61626C6500436F6C756D6E53697A65004D61784C656E6774680049734D617800507265636973696F6E005363616C65004973416C696173656400497345787072657373696F6E0049734964656E746974790049734B6579004973526561644F6E6C7900497348696464656E004261736544617461626173654E616D650042617365536368656D614E616D6500426173655461626C654E616D650042617365436F6C756D6E4E616D650047657446756C6C44617461547970650053797374656D2E436F6C6C656374696F6E732E47656E65726963004C697374603100436F6C756D6E730053797374656D2E4461746100446174615461626C6500506F70756C617465536368656D6100476574436F6C756D6E4C69737400476574436F6C756D6E44657461696C73004D6963726F736F66742E53716C5365727665722E5365727665720053716C4D657461446174610053716C44625479706500476574436F6C756D6E4D657461446174615769746853697A6500476574436F6C756D6E4D6574614461746157697468507265636973696F6E416E645363616C6500476574436F6C756D6E4D657461446174610053716C446174615265636F726400476574446174615265636F72640053797374656D2E446174612E53716C54797065730053716C43686172730053716C42797465730053716C537472696E6700546F4261736536340046726F6D42617365363400524F543133005555456E636F64654D6170005555456E636F64650055554465636F646500486578537472696E67546F42696E6172790042696E617279546F486578537472696E67004461746554696D65005F5F4D53496E744461746545706F63680053716C4461746554696D650053716C496E743332004D53496E7444617465546F4461746554696D65004461746554696D65546F4D53496E744461746500497344617465427573696E657373446179005375627374697475746554696D655370616E0046697273744461794F664D6F6E7468004C6173744461794F664D6F6E74680044617973496E4D6F6E746800446179734C656674496E596561720053716C426F6F6C65616E0049734C656170596561720046756C6C44617465537472696E670046756C6C54696D65537472696E670053716C496E74363400427573696E65737344617973004973427573696E65737344617900466F726D617454696D655370616E0053716C446F75626C650046726F6D554E495854696D6500546F554E495854696D65004167650045787472616374005472756E636174650053716C496E743136004E74684F6363757272656E63654F665765656B646179004765744461746554696D6546726F6D496E7456616C7300476574496E744461746500476574496E7454696D65004E65774461746554696D6500466F726D61740044617973496E4D6F6E746846726F6D4461746554696D6500476574436F756E747279436F64657300434F554E545259434F44454461746146696C6C526F770053797374656D2E436F6C6C656374696F6E730049456E756D657261626C6500476574436F756E747279496E666F004765745374617465436F646573005354415445434F44454461746146696C6C526F77004765745374617465496E666F004E756D65726963436F64650054776F4C6574746572436F64650054687265654C6574746572436F6465004E616D6500466C6167496D61676500466163746F7269616C00436F6E7374616E7400436F6E766572740049735072696D650052616E646F6D52616E6765004D415448416D6F7274697A6174696F6E5363686564756C6546696C6C526F7700436F6D706F756E64416D6F7274697A6174696F6E5363686564756C6500436F73680053696E680054616E68005F5F4F6E6554686972640043756265526F6F740053716C427974650053716C446563696D616C00466F726D6174446563696D616C005061796D656E744E756D005061796D656E744461746500426567696E6E696E6742616C616E6365005363686564756C65645061796D656E740045787472615061796D656E7400546F74616C5061796D656E74005072696E636970616C00496E74657265737400456E64696E6742616C616E63650043756D756C6174697665496E74657265737400546F74616C496E74657265737400546F74616C5061796D656E7473005061796D656E74734C656674004441544554494D455F464F524D4154004441544554494D455F4442464F524D41540053797374656D2E546578742E526567756C617245787072657373696F6E730052656765784F7074696F6E730047657452656745784F7074696F6E730049734D61746368004D6174636853696D706C65004D617463684C656E6774680052454745584D6174636846696C6C526F77004D61746368004D617463686573005265706C6163650053706C6974004361707475726547726F75700045736361706500556E65736361706500496E646578005265706C61636549664D617463686564004D617463684E756D0056616C756500537461727400456E64004C656E677468004D616A6F72004D696E6F72004275696C6400546F537472696E670056657273696F6E00417373656D626C790057656253697465005365747570004772616E745065726D697373696F6E7300536574536563757269747900556E696E7374616C6C004973557064617465417661696C61626C650048656C700047657456657273696F6E0041727261794C69737400416464417373656D626C794F626A656374730053797374656D2E476C6F62616C697A6174696F6E00436F6D706172654F7074696F6E7300476574537472696E67436F6D706172654F7074696F6E73004C617374496E6465784F6600496E6465784F66005472696D00436F6E7461696E7300456E6473576974680053746172747357697468005061644C65667400506164526967687400535452494E4753706C69747346696C6C526F77004A6F696E00576F72645772617000496E697443617000457175616C7300436F756E74004E65776C696E65004E7468496E6465784F66004375740049734E756D65726963005472795061727365546F496E74004E756D0056616C005554494C495459496E747346696C6C526F770047656E6572617465496E7452616E67650047656E6572617465496E7473005554494C495459466C6F61747346696C6C526F770047656E6572617465466C6F617452616E67650047656E6572617465466C6F617473005554494C4954594461746554696D657346696C6C526F77005554494C4954595570646174654461746554696D650047656E65726174654461746554696D6552616E67650047656E65726174654461746554696D657300546F576F72647300475A69700047556E7A6970004465666C61746500496E666C61746500497356616C696453534E00497356616C69644343004352433332004765744861736800486173680053716C42696E617279004861736842696E61727900497356616C6964436865636B526F7574696E674E756D62657200497356616C6964506F7374616C436F646500497356616C6964436F6E7665727400476574546F74616C4D656D6F727900496E744E756D00496E7456616C00466C6F61744E756D00466C6F617456616C004461746554696D654E756D004461746554696D6556616C0076616C75655F5F0053617475726461790053756E646179004E6577596561727344617949665765656B646179004E6577596561727344617949664E6577596561724F6E5361747572646179004E6577596561727344617949664E6577596561724F6E53756E6461790044696374696F6E617279603200526174696F7300506F70756C617465526174696F73002E6363746F7200486578537472696E670042797465417272617900536F75726365004D61784C696E654C656E67746800576F726457726170436861726163746572734F7665727269646500526573756C747300536570617261746F72004C6566745369646551756F74650052696768745369646551756F746500436F6C756D6E4E756D626572004669656C64446174615479706500556E656E636F64656456616C756500426173653634466F726D617474696E674F7074696F6E00456E636F64656456616C7565005465787456616C756500486578537472696E6756616C75650042696E61727956616C7565004D53496E7444617465005265616C446174650054686544617465004578636C7564654461794D61736B005265706C6163656D656E744F7074696F6E730054696D65436F6D706F6E656E74004E6577486F7572004E65774D696E757465004E65775365636F6E64004E65774D696C6C697365636F6E640059656172004D6F6E74680053746172744461746500456E6444617465004578636C756465446179734D61736B004F7574707574466F726D617400554E495844\
-6174650053514C44617465004C6561705965617248616E646C696E6700496E636C756465446179730044617465506172740044617465004F6363757272656E6365005765656B6461790053716C466163657441747472696275746500496E744461746500496E7454696D650044617900486F7572004D696E757465005365636F6E64004D696C6C697365636F6E64004461746554696D65466F726D61740043756C74757265006F626A0053797374656D2E52756E74696D652E496E7465726F705365727669636573004F757441747472696275746500536561726368436F646500426173654E756D62657200436F6E7374616E744E616D650046726F6D00546F0053656564004C6F776572426F756E64005570706572426F756E64004C6F616E416D6F756E7400416E6E75616C496E746572657374526174650059656172734F664C6F616E005061796D656E747350657259656172004C6F616E537461727444617465004F7074696F6E616C45787472615061796D656E7400446563696D616C506C61636573005468654E756D626572004E756D626572466F726D6174004F7074696F6E734C6973740045787072657373696F6E546F56616C696461746500526567756C617245787072657373696F6E00537461727441740052656745784F7074696F6E734C697374005374617274506F7300456E64506F73005265706C6163656D656E74004361707475726547726F75704E756D626572004E6F74466F756E645265706C6163656D656E740045787072657373696F6E546F4573636170650045787072657373696F6E546F556E6573636170650053514C7368617270536368656D610053514C7368617270417373656D626C79004A7573745072696E7453514C004772616E74546F005065726D697373696F6E53657400417373656D626C794E616D65005365745472757374776F7274687949664E6F5573657200417373656D626C794F626A6563747300537472696E6756616C75650053656172636856616C7565005374617274496E64657800436F6D70617269736F6E5479706500537472696E675769647468005061644368617261637465720053706C69744E756D0053706C697456616C0053706C69744F7074696F6E0053514C004A6F696E4F7074696F6E004C696E65576964746800537472696E6756616C75654100537472696E6756616C7565420053656172636800436F756E744F7665726C617000454F4C54797065004E74684F63637572616E63650044656C696D69746572004669656C6473004E756D626572547970654D61736B0045787072657373696F6E0046696E640054617267657444617461547970650053746172744E756D00456E644E756D005374657000546F74616C4E756D73004461746554696D65496E0053746570547970650053746172744461746554696D6500456E644461746554696D6500546F74616C4461746554696D6573004E756D6572696356616C75650044617461546F436F6D70726573730044617461546F4465636F6D70726573730053534E0043434E756D6265720043435479706500426173654461746100416C676F726974686D00526F7574696E674E756D62657200506F7374616C436F64650056616C7565546F436F6E7665727400436F6E76657274546F44617461547970657300446563696D616C507265636973696F6E00446563696D616C5363616C650053797374656D2E5265666C656374696F6E00417373656D626C795469746C6541747472696275746500417373656D626C794465736372697074696F6E41747472696275746500417373656D626C79436F6E66696775726174696F6E41747472696275746500417373656D626C79436F6D70616E7941747472696275746500417373656D626C7950726F6475637441747472696275746500417373656D626C79436F7079726967687441747472696275746500417373656D626C7954726164656D61726B41747472696275746500417373656D626C7943756C7475726541747472696275746500436F6D56697369626C6541747472696275746500417373656D626C7956657273696F6E41747472696275746500417373656D626C7946696C6556657273696F6E4174747269627574650053797374656D2E536563757269747900416C6C6F775061727469616C6C795472757374656443616C6C6572734174747269627574650053797374656D2E52756E74696D652E436F6D70696C6572536572766963657300436F6D70696C6174696F6E52656C61786174696F6E734174747269627574650052756E74696D65436F6D7061746962696C6974794174747269627574650053514C230042797465004368617200537472696E6700436F6E63617400546F427974650053797374656D2E5465787400537472696E674275696C64657200417070656E64006765745F4C656E6774680053716C436F6E746578740053716C50697065006765745F506970650053656E64004C617374496E6465784F66416E79007365745F4C656E67746800537562737472696E67006F705F457175616C6974790052656D6F76650053657269616C697A61626C6541747472696275746500546F5570706572003C50726976617465496D706C656D656E746174696F6E44657461696C733E7B35343131323337462D434134392D344438382D393230432D3541383845313636444142437D00436F6D70696C657247656E6572617465644174747269627574650024246D6574686F643078363030303030372D31004164640054727947657456616C756500496E7433320044617461526F77436F6C6C656374696F6E006765745F526F777300496E7465726E616C44617461436F6C6C656374696F6E426173650049456E756D657261746F7200476574456E756D657261746F72006765745F43757272656E740044617461526F77006765745F4974656D006765745F4D617800426F6F6C65616E00496E7431360044424E756C6C004D6F76654E6578740049446973706F7361626C6500446973706F7365006765745F436F756E7400456E756D657261746F7200546F4C6F776572496E76617269616E740024246D6574686F643078363030303030662D3100457863657074696F6E0053716C46756E6374696F6E417474726962757465006765745F49734E756C6C006765745F4E756C6C0053716C54797065457863657074696F6E006765745F56616C756500546F4C6F77657200426173653634466F726D617474696E674F7074696F6E7300546F426173653634537472696E6700546F4368617241727261790046726F6D42617365363443686172417272617900546F496E74313600546F4368617200456E7669726F6E6D656E74006765745F4E65774C696E650053797374656D2E494F004D656D6F727953747265616D0053747265616D005772697465427974650041646444617973006F705F496D706C696369740054696D655370616E005375627472616374006765745F44617973005F5F5374617469634172726179496E69745479706553697A653D36340024246D6574686F643078363030303039662D310052756E74696D6548656C706572730041727261790052756E74696D654669656C6448616E646C6500496E697469616C697A654172726179004461794F665765656B006765745F4461794F665765656B006765745F4461794F6659656172006765745F446179006765745F4D6F6E7468006765745F5965617200546F496E743634005265676578004361707475726500456D707479006F705F496E657175616C6974790047726F7570436F6C6C656374696F6E006765745F47726F7570730047726F757000546F496E74333200546F446F75626C6500546F4C6F6E6744617465537472696E6700546F4C6F6E6754696D65537472696E67006765745F4461746500436F6D70617265006765745F5469636B7300537472696E6753706C69744F7074696F6E730024246D6574686F643078363030303032362D3100496E743634004164645365636F6E6473006765745F546F74616C5365636F6E6473006765745F497354727565004E756C6C0024246D6574686F643078363030303032612D31004D61746800466C6F6F7200446563696D616C00546F446563696D616C006F705F4469766973696F6E004365696C696E67006765745F486F7572006765745F4D696E757465006765745F5365636F6E64006765745F4D696C6C697365636F6E640024246D6574686F643078363030303032622D3100417267756D656E74457863657074696F6E0024246D6574686F643078363030303032632D310043756C74757265496E666F00437265617465537065636966696343756C747572650049466F726D617450726F7669646572003C3E635F5F446973706C6179436C61737332003C476574436F756E747279496E666F3E625F5F30005F5F436F6465003C476574436F756E747279496E666F3E645F5F340049456E756D657261626C6560310049456E756D657261746F7260310053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261626C653C53797374656D2E4F626A6563743E2E476574456E756D657261746F720053797374656D2E436F6C6C656374696F6E732E49456E756D657261626C652E476574456E756D657261746F72003C3E325F5F63757272656E740053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261746F723C53797374656D2E4F626A6563743E2E6765745F43757272656E740053797374656D2E436F6C6C656374696F6E732E49456E756D657261746F722E52657365740052657365740053797374656D2E49446973706F7361626C652E446973706F7365003C3E315F5F7374617465003C3E6C5F5F696E697469616C54687265616449640053797374656D2E436F6C6C656374696F6E732E49456E756D657261746F722E6765745F43757272656E74003C3E335F5F536561726368436F6465003C5F5F43757272656E74436F756E747279436F64653E355F5F35003C5F5F43757272656E745265636F72643E355F5F36003C5F5F436F756E747279436F64653E355F5F37005072656469636174656031004353243C3E395F5F436163686564416E6F6E796D6F75734D6574686F6444656C656761746531004353243C3E385F5F6C6F63616C7333003C3E375F5F7772617038003C3E6D5F5F46696E616C6C79390053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261746F723C53797374656D2E4F626A6563743E2E43757272656E740053797374656D2E436F6C6C656374696F6E732E49456E756D657261746F722E43757272656E740053797374656D2E446961676E6F737469637300446562756767657248696464656E4174747269627574650053797374656D2E546872656164696E6700546872656164006765745F43757272656E74546872656164006765745F4D616E616765645468726561644964004E6F74537570706F72746564457863657074696F6E003C3E635F5F446973706C6179436C6173733130003C4765745374617465496E666F3E625F5F63003C4765745374617465496E666F3E625F5F64003C4765745374617465496E666F3E645F5F3132003C3E335F5F436F756E747279436F6465003C5F5F43757272656E745374617465436F64653E355F5F3133003C5F5F5374617465436F6465733E355F5F3134003C5F5F43757272656E745265636F72643E355F5F3135003C5F5F5374617465436F64653E355F5F3136004353243C3E395F5F436163686564416E6F6E796D6F75734D6574686F6444656C656761746565004353243C3E395F5F436163686564416E6F6E796D6F75734D6574686F6444656C656761746566004353243C3E385F5F6C6F63616C733131003C3E375F5F777261703137003C3E6D5F5F46696E616C6C7931380046696E64416C6C005374727563744C61796F7574417474726962757465004C61796F75744B696E640024246D6574686F643078363030303034322D310024246D6574686F643078363030303034332D310024246D6574686F643078363030303034332D3200537172740052616E646F6D004E65787400526F756E6400506F77004D6964706F696E74526F756E64696E67004164644D6F6E7468730024246D6574686F643078363030303034662D31006765745F53756363657373006765745F496E646578003C4D6174636865733E645F5F30003C3E335F5F45787072657373696F6E546F56616C6964617465003C3E335F5F526567756C617245787072657373696F6E003C3E335F5F53746172744174003C3E335F5F52656745784F7074696F6E734C697374003C5F5F52656745784F7074696F6E733E355F5F31003C5F5F52656765784D617463683E355F5F32004D61746368436F6C6C656374696F6E003C5F5F4D617463683E355F5F33003C5F5F52656765783E355F5F34003C5F5F496E6465783E355F5F35003C53706C69743E645F5F38003C3E335F5F436F756E74003C5F5F52656745784F7074696F6E733E355F5F39003C5F5F52656765784D617463683E355F5F61003C5F5F4D617463683E355F5F62003C5F5F52656765783E355F5F63003C5F5F5374617274506F736974696F6E3E355F5F64003C5F5F496E6465783E355F5F65003C5F5F4D6178436F756E743E355F5F6600476574457865637574696E67417373656D626C79004765744E616D65006765745F56657273696F6E006765745F4D616A6F72006765745F4D696E6F72006765745F4275696C640053716C50726F63656475726541747472696275746500417070656E644C696E6500436C6561720053797374656D2E446174612E53716C436C69656E740053716C436F6D6D616E640045786563757465416E6453656E640053716C457863657074696F6E006765745F4C696E654E756D62657200496E736572740053716C436F6E6E656374696F6E0053797374656D2E446174612E436F6D6D6F6E004462436F6E6E656374696F6E004F70656E004462436F6D6D616E6400457865637574654E6F6E517565727900436C6F7365007365745F436F6E6E656374696F6E006F705F54727565007365745F436F6D6D616E64546578740053716C446174615265616465720045786563757465526561646572006765745F4D65737361676500446244617461526561646572006765745F4973436C6F73656400436F6E6E656374696F6E5374617465006765745F537461746500507265706172650053797374656D2E4E6574005765625265717565737400437265617465004874747057656252657175657374007365745F4D6178696D756D4175746F6D617469635265646972656374696F6E73007365745F4D6178696D756D526573706F6E7365486561646572734C656E677468007365745F4B656570416C6976650043726564656E7469616C4361636865004943726564656E7469616C73006765745F44656661756C7443726564656E7469616C73007365745F43726564656E7469616C7300576562526573706F6E736500476574526573706F6E73650048747470576562526573706F6E736500476574526573706F6E736553747265616D00456E636F64696E67006765745F555446380053747265616D52656164657200546578745265616465720052656164546F456E640053716C4E756C6C56616C7565457863657074696F6E0053656E64526573756C7473537461727400536574537472696E670053656E64526573756C7473526F770053656E64526573756C7473456E6400547970650052756E74696D655479706548616E646C65004765745479706546726F6D48616E646C6500506172736500537472696E67436F6D70617269736F6E003C53706C69743E645F5F30003C3E335F5F537472696E6756616C7565003C3E335F5F536570617261746F72003C3E335F5F53706C69744F7074696F6E003C5F5F43757272656E7453706C69743E355F5F31003C5F5F43757272656E74436F756E743E355F5F32003C5F5F536570617261746F723E355F5F33003C5F5F54656D70537472696E673E355F5F34003C5F5F53706C69744F7074696F6E3E355F5F35003C5F5F53706C69743E355F5F36003C3E6D5F5F46696E616C6C7937003C3E375F5F7772617039006765745F486173526F777300497344424E756C6C0047657450726F7669646572537065636966696356616C75650052656164006F705F46616C7365006F705F42697477697365416E640024246D6574686F643078363030303037612D31006765745F43757272656E7443756C74757265004E756D6265725374796C6573005472795061727365003C47656E6572617465496E7452616E67653E645F5F30003C3E335F5F53746172744E756D003C3E335F5F456E644E756D003C3E335F5F53746570003C5F5F43757272656E74496E743E355F5F31003C5F5F496E6465783E355F5F33003C5F5F496E6465783E355F5F34003C47656E6572617465496E74733E645F5F37003C3E335F5F546F74616C4E756D73003C5F5F43757272656E74496E743E355F5F38003C5F5F43757272656E74436F756E743E355F5F39003C5F5F496E6465783E355F5F61003C47656E6572617465466C6F617452616E67653E645F5F64003C5F5F43757272656E74466C6F61743E355F5F65003C5F5F43757272656E74436F756E743E355F5F66003C5F5F496E6465783E355F5F3130003C5F5F496E6465783E355F5F3131003C47656E6572617465466C6F6174733E645F5F3134003C5F5F43757272656E74466C6F61743E355F5F3135003C5F5F43757272656E74436F756E743E355F5F3136003C5F5F496E6465783E355F5F31370024246D6574686F643078363030303038392D3100416464596561727300416464486F757273004164644D696E75746573004164644D696C6C697365636F6E6473003C47656E65726174654461746554696D6552616E67653E645F5F3161003C3E335F5F53746172744461746554696D65003C3E335F5F456E644461746554696D65003C3E335F5F5374657054797065003C5F5F43757272656E744461746554696D653E355F5F3162003C5F5F43757272656E74436F756E743E355F5F3163003C5F5F496E6465783E355F5F3164006F705F4C6573735468616E006F705F477265617465725468616E003C47656E65726174654461746554696D65733E645F5F3230003C3E335F5F546F74616C4461746554696D6573003C5F5F43757272656E744461746554696D653E355F5F3231003C5F5F43757272656E74436F756E743E355F5F3232003C5F5F496E6465783E355F5F323300416273006F705F4D756C7469706C790024246D6574686F643078363030303038632D310024246D6574686F643078363030303038632D320024246D6574686F643078363030303038632D330024246D6574686F643078363030303038632D340053797374656D2E494F2E436F6D7072657373696F6E00475A697053747265616D00436F6D7072657373696F6E4D6F646500577269746500546F4172726179005265616442797465004465666C61746553747265616D0024246D6574686F643078363030303039322D310055496E7433320053797374656D2E53656375726974792E43727970746F677261706879004D44350048617368416C676F726974686D00436F6D7075746548617368005348413100534841323536005348413338340053484135313200496E76616C69644F7065726174696F6E457863657074696F6E0024246D6574686F643078363030303039392D3100436F6D6D616E6454797065007365745F436F6D6D616E64547970650053797374656D2E436F6D706F6E656E744D6F64656C00436F6D706F6E656E7400474300466C61677341747472696275746500000000053000780000055800320000032E00000100050D000A00000D620069006E006100720079000013760061007200620069006E0061007200790000096300680061007200000F7600610072006300680061007200000B6E00630068006100720000116E007600610072006300680061007200000F64006500630069006D0061006C00000F6E0075006D0065007200690063000009740069006D00650000136400610074006500740069006D0065003200001D6400610074006500740069006D0065006F00660066007300650074000003280000074D00410058000003290000032C00001543006F006C0075006D006E004E0061006D0065000019440061007400610054007900700065004E0061006D006500001543006F006C0075006D006E00530069007A006500000B6E007400650078007400001741006C006C006F007700440042004E0075006C006C00000D490073004C006F006E00670000214E0075006D00650072006900630050007200650063006900730069006F006E0000194E0075006D0065007200690063005300630061006C00650000134900730041006C0069006100730065006400001949007300450078007000720065007300730069006F006E000015490073004900640065006E007400690074007900000B490073004B006500790000154900730052006500610064004F006E006C007900001149007300480069006400640065006E00001F420061007300650043006100740061006C006F0067004E0061006D006500000D3C004E0055004C004C003E00001D420061007300650053006300680065006D0061004E0061006D006500001B42006100730065005400610062006C0065004E0061006D006500001D420061007300650043006F006C0075006D006E004E0061006D0065000003200000094E004F005400200000094E0055004C004C00000D62006900670069006E00740000076200690074000009640061007400650000116400610074006500740069006D006500000B66006C006F0061007400000B69006D00610067006500000769006E007400000B6D006F006E006500790000097200650061006C00001B73006D0061006C006C006400610074006500740069006D006500001173006D0061006C006C0069006E007400001573006D0061006C006C006D006F006E0065007900000974006500780074000013740069006D0065007300740061006D007000000F740069006E00790069006E007400002175006E0069007100750065006900640065006E007400690066006900650072000017730071006C005F00760061007200690061006E007400000778006D006C00000775006400740000090A000A0009007E0000057E000A00004D42006100730065003600340046006F0072006D0061007400740069006E0067004F007000740069006F006E002000630061006E004E004F00540020006200650020004E0055004C004C002E00002169006E0073006500720074006C0069006E00650062007200650061006B00730000096E006F006E006500004149006E00760061006C0069006400200042006100730065003600340046006F0072006D0061007400740069006E0067004F007000740069006F006E003A002000005D3B002000760061006C006900640020006F007000740069006F006E00730020006100720065003A0020004E006F006E006500200061006E006400200049006E0073006500720074004C0069006E00650042007200650061006B007300000F250028005C00640029002A006400000525007B0000053B003B00000573006D0000056D00730000057300730000056D006900000568006800000564006400000577006B0000056D006D00000579007900000725007B007D00000758005800580000053200380000036600000766006500620000156D0069006C006C0065006E006E00690075006D00000F630065006E007400750072007900000D640065006300610064006500000F690073006F0079006500610072000009790065006100720000136400610079006F0066007900650061007200000F7100750061007200740065007200000B6D006F006E007400680000097700650065006B00000F690073006F007700650065006B000011690073006F005F007700650065006B00000D690073006F0064006F0077000015690073006F007700650065006B00640061007900000F7700650065006B006400610079000007640061007900000968006F0075007200000D6D0069006E00750074006500000D7300650063006F006E00640000176D0069006C006C0069007300650063006F006E006400003149006E00760061006C00690064002000440061007400650050006100720074002000760061006C00750065003A00200000514F006300630075007200720065006E00630065002000630061006E004E004F00540020006200650020004E0055004C004C0020006F00720020006C006500730073002D007400680061006E0020003100013F5700650065006B006400610079002000630061006E004E004F00540020006200650020004E0055004C004C0020006F007200200065006D0070007400790000315300740061007200740044006100740065002000630061006E004E004F00540020006200650020004E0055004C004C00000D730075006E00640061007900000D6D006F006E00640061007900000F740075006500730064006100790000137700650064006E0065007300640061007900001174006800750072007300640061007900000D660072006900640061007900001173006100740075007200640061007900002F49006E00760061006C006900640020005700650065006B006400610079002000760061006C00750065003A00200000594E00650069007400680065007200200049006E007400440061007400650020006E006F007200200049006E007400540069006D0065002000630061006E0020006200650020006E0065006700610074006900760065002100000730003000340000054100460000074100460047000017410066006700680061006E0069007300740061006E000085BF36003000300030003000300030003000460030003800300036003000300030003000300030004500300036004400330046003600380030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030004100330031003200320033003800460030003100370033004300300030003000300030003100320035003400390034003400340031003500340033003800380044004400350039003300330031003400420030003200300031003100430043003500370046004400450036003500310045003600360031004100340041003800370031003900340036003500460041003000380036004100380038003600330036003100330034003900310030003200340041003400320031003800320041003600420036003900360042004500340030003500460041003200410031004200350032003100390043003100430041003200410035004100360036003800410038003400310038004100390036003100410035004100330041003000380034004200390032003000380046003300420041004500450043004300330042004300440036004200360044004200390033003300340045003100410037004300450042003700420045004600330037003300430046004500370046003100460036003000450033004100300035004400320030004500440045003000450044003200\
-44004300320046003100390036003500330031003300300034003600370041004200330046003000440031004500370038004500380032004600320031003700460033003200340039003200430039003300430031004100430044003500330030003500350039003500360036004200390044004300330046003500380035004100390041003400350038004100430034003600390033004500330046003200310038004100300032004100330037003300330033004200340038003600300044004600380042004100370033004500440042003900340045003100310031003800300042003100310032004200410043004600320035003100350031003900380044003800440039003400340044004500350045004100370037004500370039003800310042004300390043003200350031003800300043003700410030003700380046003200340031003200350038004400460030003200390033003800350031004300310044004400440034003000420044004200450036003200330043003900370034003200380038003000340039003800380041003400460037004200300037003700460035003600410042004600380046004300330036003800440046003200300044003600320035003800320032004200410039003000450032004600440046003600310045004400330044003400350031003500450031003400350037004200300045004200430036003600440041004400340039004600420042003100340032003200380039004600450035004500440045003000300034004400310042003600390031004600330036003900410043003800370035003700330041003200440043004200330042003100380041003000420031003700460034003800370038003600330038004400360038003700360038003500410045004100310035003300330046003300420043003700330038003300410038003500370039004600370035004500450046003700330045004200370036004400310038004100320035004200340036003200410039003600370046003400420037003000360045004600460033004600450030004400460043003000330038003700390030003500370043004300460043004500450036003800310045003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007320034003800000541005800000741004C004100001BC5006C0061006E0064002000490073006C0061006E00640073000183973600300030003000300030003000300045003000380030003600300030003000300030003000320042003300310045004300430044003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900300046003100340033004200330036003700450042004200380035003100440030003000300030003000300039004200340039003400340034003100350034003300380038004400360033003600340030003800350045004600410039004600300031003000420042003000390031004200390043003900370030003300380042004500380039004500310039004100410046003200310030003300390037004500450031003700300036003800350042003600440042003000430038004300410044003400420042003100320039004300350030004100390038003800380035003600340039003200320031003800370041003000360042003300300038003700320037004300430035003200410043003100430042004600450030003300340033003000430039003700350041004100430030003600420046003200420034004500320033003500410033003100320039003600410031003900360046003900420036003900360031003400440031003500330030004600300045003300300045003100370030003300310033004500370035004600300036003300360045003900390046003400340031004200430041004300300034003000430033003300300036003600460043003700460038004500300031004100460038004200390031004400330033003100320039003800300034003500410038003700370031003600350036003000390030004200450039003300420030004300440042003200320042004100350030004300340037003000410039004300350036004100460030004600420031004600440043003500380032003500330045004600460045003400430030003100300043003300410035003100360031004200310038003700410031003900380034003600360030003600300033003000300038003900460042003200380045003600420037003200320037004500370033003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007300030003800000541004C00000741004C004200000F41006C00620061006E006900610000865736003000300030003000300030003100300030003800300036003000300030003000300030003100320045004400380046003200360030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030004100320036003200360033004100310045003500370042003300300030003000300030003100340042003400390034003400340031003500340033003800380044004200350039003200420042003400450030003200340031003100380034003600430046004300430044004500350038004400300034003500340030004100340041003000420032003300310033004500380032003900350042003100330036004400410035003800350042003100310036004100340041003100460043003200370037004400300038004100330037003300300042003100450036003000390041003800410044003200380038003900350032003800300035004300320032004200300043004500430045003600460036003300380038004300360045004300430036003200350045003100320042004500370046004300330039004600330043004400340035004600350032004200320037004300320030004500410032003700370032003100440044004100390044003800340044003000330032004600430039003100410032003300380032003400310042003800460046003100380044003100320041003500340030003100370038003500430038004400420039003200420031004500450031004100320037003000390035004500320044003400300039004600320038003900430042003400410046003300460034003300390041003300310037003200460042003800300041003200320031004500350036003600330030003000410045003800330038003800460042003800460031003100310037004600450031004500440037003700450039003400420046004200310038004200430032003800380042003000310030003400420037003700330035004500310035004400310032003000300042004100410042004300390038003600420039004100380046004300360032003000350033003400420035004300370035003400310032004500360036003200330037004500420041004600360032004400380035003700390041004100360046003600330032004200340031003900380046003200370043003000440030003100410032003200450035004600430036003100390031003700320031003800350041003400330044003600330046003400440036004400450043003200420038003500300036004300450042004400310032003500330042003100330043004300370033003300300030003200450046004400380038004200320044003200450038004500460039003900440043003800440034003300330034003000370044004100410031003100440044003600310038003200340036004200360045003800320033003200330037003400310039003900340031004200320041003600310044004400360033003800440030003000450036003100430036003600460034004400320035003700330042003100430043004300350044003200380042003100370037003400430032003300410037004400420033004100340036004600390036003700340043003200330041004200440037003800420031004500310036003900340039004200440038004100390041003700360036003800310035004100410036003800450030004300440031004100300045003900350030004200340041003300380037003600370043004300450042004300320032003300360041004200350035003900360046003800450037003700310031004100440041004500350042003600350030003000310038003400380036003700360037004600420031004100440043003400330046003700330045004500390035004600450033004200460041004100460038004400420037004300450043004500430034003500460032003900300036003600420042003800420035004200330035003900410042003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007300031003200000544005A00000744005A004100000F41006C006700650072006900610000860B3600300030003000300030003000300046003000380030003600300030003000300030003000450030003600440033004600360038003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310031003000410033003200320043004600340036003500360039004600380030003000300030003000310033003800340039003400340034003100350034003300380038004400430035003900330042004600340042003000320037003100310038004300360033004600460037003300440037004600430032003600310044003000460030003000440043003100340030003800320031003200370031003100360044004100350042004300330043003900320035004200320041003600340032004600430030004600360041003000380039004100410032004200390034003500390043003100410042003200320039004300370046004500380035003700300030003800320037003100310032004300300038003200340030003800450032003800340030003600330035004400340033004200450046004200450030004400340045003000440044004400390044003400360046003400380043004500460046004200460030004500310045003100450035003700390033003500320045004200360031003500300031004100350034004500390042003400310041004400380038004300300043004500300035004600350042004600360030004100310032003000360033003800450037003100330041003100440037003000440044003400300045003000390030003900460032003100460046003300410041003400370041004600370038003200370030003100350035003300410037003800360039003600340043003100320032003900310034004400300037003300420039004500350043003100360042003400330039004200430036003700350039003700440036004200410043003100440045003600310038003600430039004400390031003500350038003100360036004100330030004600300034004400450043003700390038004100380033003400370031003300360033004500410037003000420032003900420036003600310041003100320034004300410041003500350034003600410035003100320038003400430033004200460030003300410037003300460032003600330038003400320045003300350039004300360045003700300033004400330043003400360041003300340031003800390035004300420045003000390033004400410031003300440043003500420038004400410031004200420038004100320044003700330033004300310046003400380034003900410034003500380043003400410038004400350032003000390031003500380031004500370043003900330039003700380043004100320033004100390037004600370033004400410032003300330039003700350038004100350038003200350031004100460038003300360044003700420034003200300031003700340037003600350032004500370033004600320044003300460041003300330041003000460031004200300039004600360035004200370044003800450039004200450046004100430042004300390039004300430044004100360044003400340032004100380035003900300044003200310033004100430030003500370039003600390041003100360030004200330033004600410036003700330037003400380042003900450043004400380032004600300041004600420046003600460038004600300031003500430030004400390045003600340044004300420037004200420044004600430032003000340037003600320045004100380033004600300033003700460030003100410043004100340035004500420039004400460032003800340042003900410030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073000310036000005410053000007410053004D00001D41006D00650072006900630061006E002000530061006D006F0061000086EF360030003000300030003000300030004200300038003000360030003000300030003000300037004200460043003700440037004500300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300039003200350030004200350036004100410045003600350043003000300030003000300031003700310034003900340034003400310035003400320038003900310041004400390032003400420034004200340032003000310031003000380035004300460042004400350045003000440046003300380031004100320039003900320038003400350031004100340034003200350041003600350030004100300039003900300036003100390034003100390042003700360044003100410032003100460044003000330046003800380039003600380035004500420032003800360038004100330039004200320038003600380044003300320046004200300038004300320030003800410030003800370031003200310034003100320030003400340032004500430043003800410038004200360039003100410039003400440037003500370033003600320044003800410031004500390038004100340045003100350039003000460044004600330039003300330036003700310038003600300038003100440030003000320045003900440039003000320038003600420038003100430031004300410041003100320042004300310045003300330042003800350036003800310034004300360045003100370044003400360045003200370030003400320035003000370039003900340036003000370041003600440031004300340042003500320030003300420044003400360045003200370041003400390036003700450032003400430032003700420042003800300038004500440045003200320041003700430030003400340031003200380036003300450039003300300035003100330046003700310042004400340034003000410042004200310035003000430032003700460041003900430033004200300039003200430032003300420041004500390034003300460036003000350041003000330036003200350041003600310037003500370032003100360039003900370037004600380031003100420030003500370044003100370031003100340031004400440033003700300032003600380042004100410031004300390032003500350031004100390045003600350031003900310037003500380032004500370037003900430030004300360043004400440032003900410037004300390038003400450030003700340036004500390032003600420030003400350044003500360032003900310031004100440035004500350046003900330045004100350044003300320039003800410031004400300037004300390033004600360033004100360046003500320039003000330033004400410034004500460034003900310030003000340031003200410035003500450044004400320042004100310042003200300031004300310041004300310032003900310035003000310034003700310046004600300045003900380043003800310039003100380046004500300045003200430043003700340031004100320045004200300030004300330042003200330035003600390043004200380035003100430032004100440037004400420032003800450037003900330044003000460036003500380032003100450034003600320045003800370032004300440041003300440046003300350030003900420031003500380035004300420046003300430033004400350042003800300045004400450033003300340031003300450033004200440045004600360035003800440033003900370045003900430045003600320039003100330043003700360044003700340030003300430039003600340030004100340041003500390031004500360041004100330030003700340036004300420031004300310034003100410035003300370033003500460046003100390042003500310034003900460042003000430038003100330046003400300032003600460033003800380034003100410046003000460035003200390039003000410030003000310041003000370033003700420042004400310042004600430031003700460031003900420044003000310045004400320041004400300030003900320043004400410036003100430035003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007300032003000000541004400000741004E004400000F41006E0064006F007200720061000085E33600300030003000300030003000300046003000380030003600300030003000300030003000450030003600440033004600360038003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310031003000430031004300300046003500390038003800360044003100340030003000300030003000310032004500340039003400340034003100350034003300380038004400430044003900330042004400340045004300320036003000310034003800360039004600450046003600420034004200310042004600450034003400340043003000300031003700310033003000440041003800420038003300380038003000380039003000450032004500320045003500450039003700330037004500310030003500420038003700420030004200320045003200360032004500410045003400450031004100320031004200380030003800450031004200460035003000420034004100350045004400450037004100380030003300310034003800340038003500370037003300430045004600330039003400460034004500340045004300450032004200430045004200390035003500430043004400310036003300460044004300360031003600340032004100350036003700370039004100310041003300440039004200350045004200430033003900390031004500380030003900430036003700410043004100420043004400300030004100420037003000460039003500450037004400350031004300330036003700460033003800380045003900330037004200340044004100310035004100340039003400450034004200320043004600450038003700310038004600370043004600320036003300330044003700300041004600350033004300300037004100320038003900300034004600330038003600380039003900370037004300340039004200340031004500370033003800340037004100450042003800300036004200380044004400320044004500410042004400360031003800390039003300370044003900460036003000360034003100320033003600420042003800340041004500410030004200460037003700340031003700370044003000380045003900430038004400330034003300330041003900340036003200300031003900440031003600410042004400380030004100310038003800450044004100360044003100340043003000460039004400300031004400420035004200370035004400460045003600360030003300350046003000330034003300300034003000320036003400390033003800350046003600300046003800380038003900320034004200320043003000360036004100390041004300340039003900430034004200350039003500330037004400360032003400360038003400320044003100330038004200440034003400360041003000360034004100450038003000340036003300300046004300420035003400390038004100360031003700460039003200330039003100360030004400330039004300410038003600410045003500380045004200310039004400450032004200350037003600380035003500300031004500450035004500410031003300390036003300350034003400420041003600410036004500360032003100370038003200300031003700340043003300320037004200330044003300450037003200430037004200380046003100300042004600460035004400300038004400420043004300340046003200300031004600390030004200350044003400360039004200310031004500390046004600450038003000370037003800420044003500460045003500370045004200310043004400410038003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007300032003400000541004F000007410047004F00000D41006E0067006F006C0061000085AB3600300030003000300030003000300046003000380030003600300030003000300030003000450030003600440033004600360038003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310031003000410033003200330036003000390030003700390030003800320030003000300030003000310032003000340039003400340034003100350034003300380038004400430044003900340033004400320046003000340036003100310034003800350043004600370044004500370039004400310044003900420035003900330042003300420039003300310035003800320045004300430036003200360044003800340032003400310035003400310032003600410030003500410031003100360031003200330046003400300034003400410033003100360038004400340045003200460042004100410044003500340030004100410042003500320041003800420036004400380034003200430031003600460039003000310030003800340033003000310031003300320035004600360036004100450034004100430037004200430045004200360033003100320032003700420039004500350046003300450034004500340031003400390037004300450045004400310031003400360030003600310031003500390034003800460046003900310035003800300030003500410042003100420033004500350033004100310037003000420041003000420043003100430041003000420041004600420038003200450032003400430046003400330037003600320043004100300031004600360035004300380038004400380032003500350043004500440039003800320038004100460030003600440030004600420045003200440046003800420033003900300034003800430034004100300043004100330031003200320033004200430031003400370030003400460037003400440038003000420036003100320041003200330031004200460045004100330035003200330043003300450034004200420038003300450030003400440043003500420034003600310034003700380045003800330046003000330031003600330037003000390030004400440046003400420032004600410034004200410045003900340039003900440032004600390041003000450038004600300045003400390030003600430030003600420032004200370039004400450035004100330037003500350039004300350041004400430045003300300038003900450039004100440030004600390037003800420046004300340034004200460033003500440044004300330041003700300042003800330041004100300041003500330032003500320033003500380033003900390032003700310043004500440035003900420038004200390034004600460030004600340039004300360030003600430035003800450032004200340045004400450033004500450032003100350031003400450041003800360043004500430035003800380032004500420033003500430039004600350039004100360034004100420032003000370038004200300035003700450033004500440038004400300032003100420033003900460041003900320041003100380046003300440042004500390042003500320033003700320031003700410030003300350045004200440043004600460031003100460038004200350035004300390045004300350037004200430030003300370044003100440038003600360045004600370044004300320038003700380030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073600360030000005410049000007410049004100001141006E006700750069006C00\
-6C00610000881F360030003000300030003000300030004200300038003000360030003000300030003000300037004200460043003700440037004500300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300039003200350031003600330035004100430038004100380035003000300030003000300031004200440034003900340034003400310035003400320038003900310041004400390030004200460036004200310033003700310031003800380037003900460045004600460037003700410035003100310033003600420041004200430036004500320030004600320043004300410042003500390043003900340030004500430035003600420037003400410038003400440037003100300041003200450034004500360041003100370041004200380033003500350038003400360038004600460030003100310044004200410038003900340035003100300030003700410042003200320038003200450032003900300038003000300038003500320035003400330034003400420031003700410037003900340036003800340033004300340045003500340043003800420032003100410035003800440038003600440038003600300038004300330031004200390043004200330039003700390037003000350034003200310034004100390046004500390045003500460033004600300037004500370038003700390034003500360036004600320042004100410033004600340045003800350043003700420035004400320032003100360034004200310032003300440036004200330030004600360045003000330043003800460043004600440044004500370046003600410033003100340044003100360033003700420031003800330037003700430032003800330044003300410037004400410037003500460044003200320041004100320042003700460037004100410033003300330036004200340038004400310033003900410038004400330041003700430039003400340043004100450034004100460037003900390033003000460039004500390045003700450038003600350031003300360035004200460043003600420044004200390039004600430043004300430041003400330031004300440043004600410044003100370037004600330030003000430043003700390033004400380033003600440035004600390037003900460043003000330030003300410030003200380031004500440035003900370033003200440043004400390045004600360046003500320041004200300039003300340030004400340043003500330044003000440031004400310041003400350043003900360041004500360046003500420030004300390046003400340030003800340031003300300042003800390039004100450035004100310031003300350042003800390044004500410043003400320035004200360034003600320046004400330041003800350034003200390037004300320041004600300034003500420036004500330033003800300045004100340031003600440043004300350034003400360032003800340039003000410045004100310039003600340043004100430031004400460044004100340042003300380042003800340034003200300039004400370043004200370038004200310038004200370044003000370037003500330036004400350032004200440043003700430032003700420039003900310044003900300038004300300035003400440032004500310043004100440042003000300038003100430031003400310046003600360045003800310043003400430037003800360045003700460041003300360041003900450032003200420042004500340037003700340031004500340030003500440034004500350032004100460044004200350045003300460042004300410031004300300044004400460038003100320044003300410046003900360042003000410043003200360034003700300045003000390038003600340036003400450033003100390037003500450045003100340044003300320034003700320043003200360031003900310044003000440031003100440045003500440046003200320043004500360046003200410042003100430046003600310035004300300046004100300031003800440030004100460039003800350045004600440045003100460043003300300035004500460038004600350042003200340031003200460031003700330045004200430045003700310032004300310039003400300042003500420046003700310037003100460043003100390042003300420033003700350044003700320042003600300034004300460045003400460037003100330036004400420034003000420036003700460043003500450045003800450046003000450032004300390035003300450032003000460035003700440037004500370045003200440046004500430044004300440035003600340036003500350039004100450043003900440037003200360046004600430038003900460034004100440037004100350046003800360046004600430030003200330045003500360039004100410036004300430042004400380034004200440030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073000310030000005410051000007410054004100001541006E00740061007200630074006900630061000087733600300030003000300030003000300046003000380030003600300030003000300030003000450030003600440033004600360038003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310030003100370030004100310039003100390030004200340036003600360030003000300030003000310039003200340039003400340034003100350034003300380038004400420035003900330033004200320046003400330036003100310038004300370037004600410037003100370035003500340045003200420035004100440035003000340037003500360042003200410033003100390030004200380031003700310046004300300045003200390036003800380034003400320043004200450038003000350031003600430030003600420033003000310046003100310035003200340035003800320043003100320043003400360032003100300039003700340038003100300042003700340036003700340039003000410036003300410042003400370031003800390033004100410041004200340035004100380033004100380044003400330039003600440038004600430031003700460037004300460032003700460037004600450046004600420042004300430046004600330031003700420041004100360038004500390033004600430038003300330034003600410034004300320036004100330039003600450036003100410031003100380037004400350038003000320030004100380030003300450042003700320031003900390043003700360032003300420033003600330034004500410043004100320031004500380030004600440045004200330030003400370033003700430046003200430045004400380036004400340038003300300044003700410030004400360046004200310034003400390041003600310044003800360044003400420034003100300031003300410045004200430043004200380035004400360036003400360042004200450044003600430039004400330044004200300042003000310039003500300030003400410037003700440034003500410037004300420043004300350030003800370032004400440035004100450032003000340030003500330038004400320038003300420032003400300038003600300031003100370035003800430037003400390035003500320035003400410030004400430037003400350041003700350044004600310042003600360037004100420038003900410043003100420036003100320044003600340046004500450037003100420042004300430035003400350038003000430031003900440042003000350041003800320046003200460045003000430030003100420043004500460045004500320042003700350038003800320043003500390044003200300032003500320036003300440045003300330044004500350042003400440036003900410042003200340032003000310045004300340035003700390045003800420034004600320038003900430041004200360043003200310033003800380046003000310034003800390045003700300034003700450036004200420032004400460034003100340033003600350036003100360045004200300043004400410034004100370041004300330038003400460033003500310038003400300041003700350031004600310045003200450030004400330033004200460033003100420043004100390033003500360035003200320032003000390044003100420038003300430036003300380041003000310044003900420045003700430032003400460041003600420045004400330032004500390044003200460046004300320042003900340046003900320044003500310035003700370045003500340031003800410033003300330030003700330034003100350046003800420031003500330031003500460043004200460033004500420030003700380044003500350038003500330038004500440034003600440039003900360043004300360044004400430032004100350045003900380033003100370039003500320046003400320033003200440035004400430042003700420033003000440031004500420041003000410032004600440030003700420043004200320031003700450032003200410031003000460039003100420046003800420037003300340043003200350037003300300034004500370044003100320046003700350032003100430043004600450044003000420041004200380037003700370031003900460044004100410043003100380039003200340043004300410043004600390044003500440041004600390030003400320041004100360036004300330034003500420046003500350033004600380030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073000320038000005410047000007410054004700002741006E0074006900670075006100200061006E006400200042006100720062007500640061000088D736003000300030003000300030003000460030003800300036003000300030003000300030004500300036004400330046003600380030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030004100330032003300380045004500420046004200440038003500300030003000300030003100450042003400390034003400340031003500340033003800380044004100440039003200420031003600420035003300350031003100340043003600370046004600370042004500420043003300430046003200390045004100460043003900420033003100310039004200330038003300340032004400430035003500340030003700380035004600450030003100310039003400350035004100310030003100370038003500420041003200380041003500310031003100370034003100340041003200310039003300320035003100300032003800300038004300450041003500370035003200440033004100440034003200440035003300370030004500380044003400420039004100340030004500340032003400300030004300320038003400410034004100390034003100410036004200350032004400410033003400450046003300410036003800310045003600390046003200390032003600360046003000380033003000420038003700370033003700450045003700450033004600300037003100390039003000420038004500320038004500300042004600420045004200390045003000380038003600320032003700330032004100350031003200350041003700300032003000390038003800380034004200330035003100450044003700440034003700380034004300350033003800390042003800310043004300430036004100340031004200350031003300390039003500320030003100350033003400380035003600410044003100380030004600370046003700440041003600380039004100320035003300410033003100310038003900310045003800300034003700370037003400330039003400420046004200410038003000360032004500320038004100430036004600410044003600310031004300440035003300460038004600310044003300330044004300330045004200300038003500360041004400310038004100360039003000380038003500440045003700410041003000320037003800370033003700430043003000430042003400360039003500360045004100440033004600420037004200310034004300430031004300440041003400380045003000300038004100410035003200360046003500380036004500320034003900450045004200300038003700350044003300360032004600460031004300300037003000300030003900300045004400450036004200430045003100390030004400320032004400300046003000410044004200390032004300430038003200340039003700340035003400330032003900420033003200420038003300360041003100390031003900430044003400390038003400440031003900340034003200460036004100360034003100360034004300430032004200360042003700340045003400410042003700390038004600460036003700300041003100300036003800310037003000320043003800440039003700310039004500350044003300380045003500420042003800300037003800440034003000350042004400380035003100330036004500310031003300320035004100300038004600390039003700300039003100390030003200430037003000390038003100360045003300330039004400390034003700430041004200340041004100320030004100370032004200460030003300380038003800450032003400420044003200380044004100440041003100440034004200460032004600380037003600300036003500370034003800380036003900310035003400320045004100460030004100320046003900380041003900390034004300450046003600420042004300310039003900340041003800390037003400330031003300460039003400320039003400300042004100390038004500460033003100460035003300350030003600340038004500460046003900430033004200450034003700450043004600390031004600440031003100330038003500330037003100380042004200380043003900440037004600380042003700300043003200420045003800420045004100410030004300360045003100390044003700420041003800430041004200450045004600330043004500300044004200300035003500340036003500310046004200310039003200360035004600320046003500310041003000380044003100330035003500340037004300370041003900410045004400360042003000410037004400410032003600380041004200350036004400380041003600420041004200310044003900440033004100460036004500360043003500320032004200360043003000460035004100450044003100460038003500300037003000340037003500390032004500460042003600300038004400440042003800300045004300300044003100460042003000460039003400360045004400440034003700390044003300340030003700310041003900460046004200410037004400340034003900390033004600320045003200310032003600450042004400380031003500420036004600350030003500450035004300330041004400370031003400300036003600340044004300410039004500330038004600360035004200450032004300360037004200440037004100310038004600440030003100360042003500360043003100320041003200430036003500340034004600370030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073000330032000005410052000007410052004700001341007200670065006E00740069006E00610000836B360030003000300030003000300030004500300038003000360030003000300030003000300032004200330031004500430043004400300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300044003200350030003100420031003700360041003700390045003000300030003000300030003900300034003900340034003400310035003400330038003800440036003300320043003500440037003500460042003300460030003300300044003000300031003300320044003000430031004400390041003000360042003300450038004300390046003000440030004300340036003000430036004600460046004600460046003100330038004300420043004200460035004600440046003300310037004300370046003700450038003900380031003800310045003100330046003000330042004200420038003000450030003300320042004100460032003800340031003800330038003900300041003800410036004600430046004300450033003300370043003300450033004400380031004500310044003300410039004300390030004300330046003500450035004500320035003400360030004200370031003000360033003300330032003300310033003300330030003300320042003200330030003300300033003300330033003300300033003000330032004600430032003300430041003600300041003200380032004500320046003700450037004400370030004300330046003500460035004500360031003600300036003000360030003600340045003000390034004400340036003300360030004500360031003600320032003600430046003000450032003600330043004600360039003900320034003100350038003200450033004400460039003400320030004200370033003800370036003000300036004100310039003900430031003000300043004500390035003200390036004300310045003500450031004400320030003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007300035003100000541004D000007410052004D00000F410072006D0065006E006900610000820B36003000300030003000300030003000420030003800300036003000300030003000300030003700420046004300370044003700450030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310031003700300044003100320037003900320034003600450034004300300030003000300030003000330038003400390034003400340031003500340032003800390031003600330046004300430046004300300046003000390046003800310030003600380030003800390031003600380036004400320044003400360030003900360043003900300043003900450043003700360039003600310033003000320033003000330043003300410041004400310033003000360036003600300036003000360030003600300036003000420043004400440032004300370031003800430032003600300036004600460039004600330039003900410038004500320031003000300030003000310039004400390030004100330032003500440039003000370046003200450030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073500330033000005410057000007410042005700000B410072007500620061000083B3360030003000300030003000300030004600300038003000360030003000300030003000300045003000360044003300460036003800300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300041003300330030003400440038004300420046003000340033003000300030003000300030004100320034003900340034003400310035003400330038003800440036003300380043003600380044004300460044003900460030003100300041003100380031003900310039003100390046004500460046003800370037003300320039003000320034004300330030003000360032004200330033003100330034003300380038004400340036004600410041003100380030004100330037003900380039003100390031003900310043003100350046004500340031004200380033004600440046003100380044003000430043003200350043003200430044003400330031003900380038003900390031003900310032003100340036004500360031003700380033004600330039004500320035003000430032004300310037004300450033003200390034003700460033004100430036004100300032003800430043003400310042003100430031003800430042003000330030003500360031003700360030003600360034003800370043003700390038004300410031003800320044004400390043003600320034003300310039003100380039003000430032004600380045003600380037004200460030004300430042004500340045004300410038003600320032003800380041004300310030004300300043003000430030004300390037003500450046004500410034003800440043003100440034003000340034003300430046003600300043003600320037004100370037003400410038003900330044003500440030003000300043004200410041004300420031003100420034003300300039003700380031003400350034003100460030003300450036004400300043004100360039003500380042003600390031003600370039003000300032003300350045003200350032003300360034003400350033003500420030003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007300033003600000541005500000741005500530000134100750073007400720061006C006900610000883F360030003000300030003000300030004200300038003000360030003000300030003000300037004200460043003700440037004500300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300041003300390033003700390044004600340037003900440046003000300030003000300031004300350034003900340034003400310035003400320038003900310041004400390030003300440034004300350033003600310031003400380036003900460045004600440045003700410035003500440034003100410041003000380044003400390030004200430034004100360041003500450044003400320034003200420038003400340041003600440032003300340043003400410031004400380041003100310042003200340046004500300044003200360032004300340030003600330032003200300042004200300034003000310043003400390033004200390038003100380032003700380037003200360039003000450032003600360033004100440035003800340043003900300045003600380031003300310034003100440031003400300038003600300034004400340030003500300030004200430036004600320039004200370041004500310033003200310038003200310042003700310037003600330030003700440046004500440042004300450037003900430045003700460042004300450032004200440036003400370045003200370041004300390045003300360033004600380038003500320030003900350039004100320033003700360044003700340044004600430036003900390034003000370046003700390045004600330032003800420039004300340034003000460038003300430046003700440035003300440034004100310045003100460030004400420037003300450035003200410039004100340043003000430034003600350039004500340044003700440032003700450031003900440036003700370039004100410038003300360030004200300031004500380030004500420041004100390035004200350038003700360037003800380044004400420043004300410044003800350036003000420031004400410033004500420041003600360035003400350039003100340039003200340034003200320038003800410036004300450041003000390035004400350035003700350038003300370033003700300030003000420033004200330044003000440043003000430042003200370031003400310043004300370034003900420030003000380031003400300031004400440039004500430038004100430039004200370034004300420037004400460034003600300038003800310043004400370036003800450046004100460044004100460043003800460036\
-0035004100320043004600440042004400360038003700440033003100420034004100440035004400420045003700440032004500460030003400350041004100340036004400370037003500390038004600390036003500300032004600430038003100410041004500410031003500330036003300360046003600430039004500370037004600460045003800450045003200340039004100310031003100360037003800420039004200340042004100350036004400340036004400450044004100310038003700430035004600300037004300300045003000450042003500410037004100440045004200380031003000410044004100440042003800410043003100410045003900340035004500350031003800330036003300340044003400380036004400370035004200360044003700380043003000360045004100460043003200450031004200380037003000460032004500330031004200360037003900370037003900330043003200390031003300430046003800300041003600450044004400300037004500360044003900330035003700430031003300420045003400440045003600440046003200330032003500370032003000390035003900320045003800450041004600320044003100450039003300380033003900330037003900440035004500320032003900460032004600310045004400370034004400340044003300360033003200390039003400460043003600440038003600300043004300390038003300310036003000420035003200410031003400380042003200350044003300440039003700460039003300440033003700390039003100440035004400350036004400380033003200370039003500300046003400350032003200360045003900320043003900340045003200320031003100370037004300350045003000370032004500380041003900360030004200460042004600380036003600380044003400380033004400460035004600460033003400460041003000320034003000390034003200410031003000360032003400340039003900380037004100390036003700320036003300370043004600430030003300420039004400430031004100300042003000420033004600320041003000320038003700430033003200450042003200440039003100350030004500300046003800440038003900390045003900410046003100460046004400300031003100370042003300420038004300450043003800390046003800380035004600450030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073000340030000005410054000007410055005400000F41007500730074007200690061000081CB36003000300030003000300030003000460030003800300036003000300030003000300030004500300036004400330046003600380030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100340031003400320035003300350042003400450042003300420045003600300030003000300030003000320038003400390034003400340031003500340033003800380044003600330042004300320031004300370046004100390046003800310030003600380030003800390031003600380036003800450031004100380043003000320031003800460046004600460046004600330046003100410037003900340033004400340036003000430036004400310039004300330037003700340030004400300036003000300044003300460041003000380030004300390046003200440037003100300033003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007300033003100000541005A00000741005A004500001541007A00650072006200610069006A0061006E0000833736003000300030003000300030003000420030003800300036003000300030003000300030003700420046004300370044003700450030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030004100330031003000460037004400320046003400420034003900300030003000300030003000380033003400390034003400340031003500340032003800390031003600330036003400390038003700340046004300330046003000330030004400300030003100330032004400300043004100350041003900430031003200430037004500310037003200450031003000410035003900300039003100390031003800310045003100330046003000390038003100430036004600380038004100430035003100430041004600370032003400360034004500370036003000360039004500450039003100350030004300330046003900370036004300360037003600300046003800460042003800460045003100440037004300310037003300300043003000430046004600460045003100310033003400390038003600300035003000420030004500380041004200330031004600430033003900370042003800330045003100440037003900450035003300300043003100430045003900340031003000430045004300460045003700360033003400370030004600310042004600370046003000430042004600300045003100300045003700360032003400360041003900410039004500350034003400380035003100430032003300300033003200330043003300370046003000360045003200300033003900390045003500390039004500340034003700410032003100350039003300300032003800360035004500330041003000360030003000320031003100370032004200380039004200450035003600310039004100420030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073000340034000005420053000007420048005300000F42006100680061006D006100730000837336003000300030003000300030003000420030003800300036003000300030003000300030003700420046004300370044003700450030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030004300310043003300380045003100330035004300380031004200300030003000300030003000390032003400390034003400340031003500340032003800390031003600330036003400330030004200300046004300430046003900300035003000430030004300300032003000410044004300300034003000340044004300300043003800430030004300300046003000390046003800310038003500390035003800310043003100330033003800430038003100320031003300380039003100380031003800310039004200390037003800410030003600430033003000300041004600300030003000330034003300340034003300410030003300380033003600420030003000300033003000330032003300310033003100350030004400380036003000320030003100310035003300390030003600420044004100430037003000300036003500310037004400370035004500410031004100300043003000330030003100310045004100320030004300420044003700350041004100300043004200320035003200310043004400340033003500390038003800310038003100380031003400310034003800380030003900350045003100430030003100410032003300300036003000440031003500360045003900320030004300430036003100420039003000300031003100450041003200300043004100370042003700390039003900320036004300320038003000330030003300440044004300320039003800380041004100390038003200300035003400320035003200330046003100440042003300330030003100380035003800330032004400300032003200450037003000310030003000430046003200300031004200300044003400350046004200310034003900450030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073000340038000005420048000007420048005200000F4200610068007200610069006E0000844F36003000300030003000300030003000440030003800300036003000300030003000300030004100440041003500390045003600330030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030004300310043003300410030004600330042004100390033003700300030003000300030003000430039003400390034003400340031003500340033003800380044003600330046004300460046004600460046004600370046003000360033003400460030004500460045004200330037003800360046003700360042004200370033003000420043003500390042003400390041004500310044004200420039003400420045003800440032003400340030003100340036003600430030003600430033004300300046003700430042004400370031003900390045004400360037003600330030003700430033004500370034003800320036003400380033003500390042003000300039004600450037004500460035003800360045003100340031003600410031003100430033003900370043003300320037003400390033003600310030003000360037003000420041004600380044004600440037003600460030004300450046004400370036004600360033003700380033003300360046003100390043003300420037003000420035003700340039003300360039003800300039003900370043003400380046003300420046003700310039004200450035004400420038004300320046003000460033004400450032003300390032003000440036003500360030004300300031003300310034003600460031003700410045003600320037003800420046003600450032004200430033004400460034004600390046004300390033003200310038003600460045003400460044003700450046003500380036004500310036003100350041003300310037003500320033004500460034003500430037003600340038004100350043003800430033003500380043003500390043003500340034003100380038003400450033004300330031003800300034003400330037004300310038003900380046003900370038004100390036003700330030003000330030003300300033003000330038003700380041003200320030003300390037003800310030004500300033004200420039003200310043003500390030003600440033003300460031004400330033003300300044003000320030004500370035003100410033004100430030003000300030003300390039004100370034003500370041003700390039003200450033003100300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000730003500300000054200440000074200470044000015420061006E0067006C006100640065007300680000846B36003000300030003000300030003000440030003800300036003000300030003000300030004100440041003500390045003600330030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030004300320031003000350044003300420035004300430042003400300030003000300030003000440030003400390034003400340031003500340033003800380044003600330036003400430038004600320046004200430046003400300030003300430030003400340030004200340033003100390031003800310038003100380035003800460030003400390032004100370044004600460043003700390030004600420045003400310037003800330043003100450037003700460030004300370046003100390031003900310038003000450030003800330030003300330034004300390033003600310036003300370038004300370043004100340038004200450043003100380045004500460046004600330030004100430042003800460032003900440038003100460042003200460034003200430043004500320045003300350046003800360044003800310037003700460031003800330043003000440033003800310039004500450037003100450032004600370032004300350036003500390044004500330046003000430030004300300042004100450046004400340030003300310031003400300036004100340037004600460045003600330039003800370033004600440030003700340031003100370036003300330035004400380045004200450044003600460030003600450031004400460042003800450033004400340045004300440033003500460030003600420035003600460046004600340038003300370035003800450036003200370045003100380034003200320046003700380033003000430038003300390046004200300031003300380045003900430034003700310043003600340038003400460031003300360036003100350036003800360042003700370038003600320046004500310034003100460033003300430033003200440032004500330032003000430046004500430043004300320043003000390030004100300043003500430031004600300039003500310039003500330045004500320039003300420031003300340033003800410032003600300037003500450034003300310039003100380046003000320034004200370046004400380032003200430030004300390036003200360044004300360034004100370036003300430036003200310039003700410035003000310045003800430045003400310033004200300038004400390042003800410044003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007300035003200000542004200000742005200420000114200610072006200610064006F00730000851F36003000300030003000300030003000460030003800300036003000300030003000300030004500300036004400330046003600380030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030003600310045003300300044003000340046004100370037004400300030003000300030003000460044003400390034003400340031003500340033003800380044003600330036003400350030004100420046004600430046003800300030003300350043003600420044004600370036003400430035003300450041004100330031003500330036004200390045004200430046004600380038004600360039003500350037004100360031003900350036003300360030003600300036003000360030004300320032003500340031003200390031003800370038003800330046004600460046003800370036003000410041003100380046004300300046004300390042003000300033004500370042004500330031003100430033003800460037003000440036004500430039003300460030003200390036004500300033003500460038004500460042004600460046003800430031004500380035003400460031003800450045003300440046004400430044004200300036003400430037003600370038003600320035003300420033004500330033004400430037004200460041003900420043003100410033004600300030003900430033004400460037004600460046003100390046003100450039003600350043003100320037004300390043004100430043004600380033004600440036003800330038004600360031004300370038003900410046003000430043004500410036003500430030004300300043003000430030004300300043003300420034004500370043003600350038003800460035004500300036003300360030003600350036003600430034004500420036003600380032003600310031004300450041004300430043004200370030004500360043003600300046003300380046004600430043003800440031004600300043004100310043004500420043003800340042003400450031003700370033003100300033003000330030003300300033003300420032004200320033004300330045003700360046004600460031003900440036004500450046004600300043003700310030003900310033003200330030003300330042003200420044004500350030003200300043004500360030003000360030003600300036003800360042003200310038003400310038003600390044003200370032003000310031004500370036004500430031003400350038004300310036004500320030004300330036004400350045003400360030004200380046004400460038003300370039004300340044003300350038003300310039003100380031003800310038004600430036004300420039003800390035003500340041003900410043003100330043003900430041003400360035004400320038003100430046004400320041003400300032003000300043004600310041003400410046003100390046003400320046004400410035003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007310031003200000542005900000742004C005200000F420065006C0061007200750073000083B7360030003000300030003000300030004200300038003000360030003000300030003000300037004200460043003700440037004500300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300041003300340031003800380033003800420033004100430042003000300030003000300030004100330034003900340034003400310035003400320038003900310041004400440032003400440030004100380032003500300031003400430035004600310046004600370042003600410036003400410030003500310044003400430034003400310044003100300036003600410031003300450044003300350037003000310036003400440041003300340039004200340038003000370034003000440038003200440031003000370035003800410032003600340043004600460037004400410043003400420044003000420046003800370031003300380045003700410041004500460046003100450034003600430037003900430033003500430037003300420041003500440038004100440034003600390039004100310036003700370037004600380030004200350036003200320038003800300035003600430033003100300031004400340035004100300042003500320043004600430043004200330033004200410046003300340035003300430042003100450046003200350030003900350034003100460035004300350044003800420043003200440041003100410030003300370031003800430046003300330043003500390035003800300037003000310033004300350046004100380035004500420038003800410042004500320038004500380043004200390032003700340042004200450032003300300035003800430038004300310043003100360036003800440033003700390039003900320032004400440046004500430044003500350038003000450037003600340044003800420041004400320041003700430032003300460043004300370038004300340032004400340037004300380036004600310036003500430037004600420030003300350041004300390033004100300035004200350046004400430030003200330030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073000350036000005420045000007420045004C00000F420065006C006700690075006D000081FB36003000300030003000300030003000460030003800300036003000300030003000300030004500300036004400330046003600380030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310031003500310039003200430039003500360046003700300044004300300030003000300030003000330034003400390034003400340031003500340033003800380044003600330036003400360030003600300046003800430046003800300030003300320043004500440045003500360030003800380046003200360035004300310032004100460037003600370033003700320046004300330038004600360036003700310035004300350041003100390039003800370030004300410035003000300038003400360030004400310045003300350037003800440034004500300035003100380033003000370044003400360030003000300043003900330038003000360035003800420031003400350036003000390044003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007300038003400000542005A00000742004C005A00000D420065006C0069007A0065000089CB36003000300030003000300030003000460030003800300036003000300030003000300030004500300036004400330046003600380030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030004100300031003100460042004600440045003600440044004500300030003000300030003200320038003400390034003400340031003500340033003800380044004200350039003400420044003400460031003300300031003100380043003600370046004400370036004200420039003100450039003500380046003800330041003300380037003000320044003200420034003400350032003200300037004300340036003800300032004200310036003800460043003800380033004100330039003300310036003800320032003900330038004200360038004100320034004500320045003100410031003300430033003600300037003000320030003400450030004500450041003600320044004300360035003600330035003100310033003600330030004300310030003500340035003400300038003900300030003000320031004300410034003700320031004400320035003200410030003700370044003500360042003800460038003300460041003000370044003800380036003600410043003200420042003300450045004600460033004300420046004200420045004300390046004200300038003500460039003500340033003500390046003600410030004400430041003700460035004100450035004400390042003100410045004200350035004600340042003000300036004300300044003400440043003200410033003300300042003600420042004200380033003000440042003100320038004100460037003800320034004100430044003100370033004100440031003500380046003600420030003900440035003500420034003100390036003200430037003600420036003800430035003400450036003200340037003700390046003800450033003200330036004200370039004100440037004500420043004100320037003700340033003400440037004400320037004200420042003800360036004400360036003100300034004100450030003500440037004300380030004200310043003400300038004400390036003200390031003500460044003900340039003500450044004300330046003400360034003700370033004500440042004600380031003600350043003900340044004300460046003500310030003200320033003600340044004600380031003900370044004600460038003600450044004400350030004300460031004500380031003400410046003000370031004500410033003100410030004100460031003800440034003500310045004400440036004300340032003900360044004300380035003800330032004600390044003000440036003300350041003800420044003400360044003000380041003400300037003900450037003000350031004100390043003300370031003000430045003200420036003800310039003200440034004600380046003400460032003300390035003200430043003200340039004400350045004500310043004100330039004200440037003000370030004100340035003500340035003700320031003500350031004100350035003600450031004400350031004200410039003600380035003000450038003800450044004300450033003600410045003000330030003400310035003900320035003100430030004100370032004300300031004600430034004200320032004400380045004200370032003800330039004300310033003900460037004100380035003700460044003800380041004500\
-3400440032004100460035003300360042004300300031003900440039004400340043003800360044003900430031004200370045004300440037004200360041003900450039003300430038004600350043003100440043003100450037004600330042003100460034003600440031004400410037003400430032004100370043004500320045003500430034003300410041003200430042003000330038003000360044004400420044003800300038004100340034003200310031004500360038004200320046004500300046003200350035003600320035003900310036003000300041003600390033003200320039003100340043003100370033004500460031004600300043003400300036003900350031003500300036004500330033004600330046004600330037003100420036003900460042003800310031003600330037004300410035003100450032003100320042003100330032003800460042003400320041003000420043003900310041004500330033003700370033003000440033003000360032003300310033003900420033003900430031003000320041003700370041004600460046004100330043003500390037003200440033004400460044003700380036003700370045003700330037003500410036003900390030003800350031004600300039003100430036003500310041004300460038004500380043004200390035004300340045003500300046003700420033004200300033003600340044003800330031003600410031004200440046004200310035003500360043003600320039004500430031003400350036004300360045003100450031004200330034003500330043003500320032003900420031004500340037003700410041003000460043004100410038003600320030003700330045004200310038003500390030003500450034004400330034003300360034004200370033003600440033004200330037004600410030003600370033003400320046003300380032003000310038003600320036004100330044004300450041003900420032003100420035004100350045003100390037003400420039003800330037003800370033003100450044003600390045004300410044003200340046004200450034004100330035004300370045004600300038003100410031004300390036003800330045003300420034003200450039003800390039004500350044003400330045003800370046004200320034003200440038004100420037003400460042003000330031003200310038004300420032003200420039003400300030003400370030003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007320030003400000542004A000007420045004E00000B420065006E0069006E0000824336003000300030003000300030003000460030003800300036003000300030003000300030004500300036004400330046003600380030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030004300310044003000320033004500320032003200300045003800300030003000300030003000340036003400390034003400340031003500340033003800380044003600330036003400360038003000460046004300430046003800300030003700310038004600330037004600420039003700440044003200460041004100320032004100330045003300350044003800300030003100330041003900310041003400360030004400310045003000310030003600420033003100300035003200460030004600370031004400430042004600460034004600310044003700430030003700410039003600450033003000430033003200420034003600430036003500460033004200330038004500440034003900330035003700380045003800380035004600310041003800430031004200340033003700310038003000300044004300430046003000450032003100370033003900360042004400420042003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007300036003000000542004D00000742004D005500000F4200650072006D0075006400610000884736003000300030003000300030003000420030003800300036003000300030003000300030003700420046004300370044003700450030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003000460031003100300037003300330037004200450039004300410038003600300030003000300030003100430037003400390034003400340031003500340032003800390031003900440039003200340031003400380035003300300031003100380043003700370046003600460036004600360041004500450041003900390031003000450030003700360039003600320042003800460031003200430030004300380036003300330030004600340039004200330030004500330042003800340039003700300045003400390039003700350036003000370045004400420034004600320035004300440034004100310041003000300038003400330044003800410039003200300034004100320032003000320042003700420033004500340041003800310036003400340041004400380033004200430039004100340045003000370031003600360044003300410031004300350044004300360036004300360038003600440030004600390037003700420037004200440045004400360044004500430039004200310046004600450039004500330046004200460031004600440046003900460033004500370031003300450032004600370041003600370035004400310032004500460033004500380035004400380045003400300034003000430031003700370043004400380035003700370046003600330041004100460032003700390045004600330045003400350035003100340044004600380035003200450032003600350044003800440038003800370036003100390046003500430041003400350036004100390035004500300037003000440043004400350042004400320033004500440035004300450041004400330036003800330038003700420039004500370038003500410041003500450037004100410039004200350046003400460044004600320030004500460032003400310030003800460046003700460031004500430036004200390031004600390046003900310035003000320038003900300037004200350031004200410046004200390035004300420041003600310041003300360039004100380042003100310038003100360041003700310033003400340044003100380030004400340036003800420034003300320039003700330044003100450043004300310036003000420044003900340032003000310041004200320034003500310035003200350035004300340037003000420038004300320043004400320039004600370033003800380032003200300036003000420035004200360044003000420039004200420034003500380033004200350030003300370035004500410030003600340037003700430033003700440039004300420041004200360034003300360033003300360034003400440041004400450038004200410038004500410044004300410042003800440037004500460041003700440031003600360036003300410031004200420039004200370033003700330037003300430038004200320034004300370041003600300041003000430032003400440043003100410044003400450037004100300037003600350039004100460046004500350046003100320046003900420039003800380039003100460030003200450030004200310041003200370033003600370034003900340032003100410031004100450032003500380031004200420043003400460045004500310039004400320039003700380041003400350041003600360046004400460032003200330035003700320039004100450030003400320038003800430043004500460039004300380031003900420042004400340044003300460035003000380032003700460046003900460043003300360038003600350036004400320037003000300043003900460041003000330030003300410034003600430037003400410038003400390043004600320039004400390039003800300043003800460030003600350030004600360033003400370034004200380036004300330038004400460038003200410042004200460039003500350044003200350044003700360035004100390041004400410034003900320042003800420044003800410041003300420046004500300036004300360038004500360042003500340046003200450031003700440036003200440039003400440042003600440037003900330042003400460036003300380033003800350039003200430037003300450041004300350043004200460046003500350044003400360033003000410046003000450031003600370039003000430034004100370031003000440032004100300039003300350034003200340034003400350038004600460036003200450030003700350032003700320045003000330031004600460042003200440034003400430045003100430043003600420044004600380038003700440031004200350030003200440035003300460035003400420037004600310034003100410041004200420038004100380033004200340030004600370030004600410041003200450036004300360034003700460034003800340030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073000360034000005420054000007420054004E00000D420068007500740061006E0000892B3600300030003000300030003000300046003000380030003600300030003000300030003000450030003600440033004600360038003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310031003000430031004400320030004500420034003200360031003000430030003000300030003000320030003000340039003400340034003100350034003300380038004400410044004400330042004400360042003500330036003100310034004300370046003100450046003700440043003900420044004200440034003900410043004200350032004600380038003400350041004200330036003800410042003500320030003600320034003100380041003800380030004500450032004100300034004500380032003700460038003000320032003800450046004500300031003800320032003000380038003700340044003200430031004100390042003300380042003000450032004500340041003500410042003000360030003700310037003000350030004500380035003200360041004100310034004100390034003900320039003600360038003600430035003500340043003900410045003600420045004500350033004500460037003300380035003900420039003300360032004400300039004600340043004300450037004600390046003000330042004500370046003000360038004200460046003300320037003800340031004400320043004600310043003000390046003500360039003800330042004300330036003900380030003100300032004400300041004600450035003400380034004400340036003900310046003500450034004600300044003400330036003600390030003600430042003800340030004500430031003600440031003800390036003900390038003400370035003100390033003000420033003400450036004600460030004400440046003100360031004300450044003100450043003500450041004200440038003000440035003300330038003200310038003500390044004300420041003400420043003700380046003100390041003200340032003100350046003700350037003100350038004200440032003400360041004600440045003200410032004100390041003800440036004200300043003600300046003400390044003200370030004300340033003300300031004300350032003400420046003300420038003400350032003100390045004300430036003300370044003200420032003500460041003500420034004500410043003400390038003000360031003300410038003800300038004200320046003600390035004400410046003800340033003100410037004400430037003300300044003300300045004600410041003900350031004400340046003700330032003500410031003400420036003000450038004200390045003200310045004300420039003400320031003800460038004400380041004200310033003800340043003100360031003900430045003300450037003500300042003700380045003600300041004300390034004400310037004400310037003300440046003000440030003200360039004500420037003900310035003800370037003000380037003200370037003600390035003800300033003500380041003600380035004100350041004500410033003200410036004200440034003800330039003000450030004600310030003300370034003100350036003100320043004300430038003100430034003600380046004600330044004400440031003600300045003300420043004600410030003900430031004300390032003100460032003300390041004600370035003100340033003200370030003900370033003400330037003400370038003700350036003400360045003800360044003800420032004400310036003200440035003300430044003300370036004200300036003600300044003600330044003900350044004100340030003700410046003200310046004400300037003500310032004600390046003600310043004500420045003200370046004100420039003800410037003900450033003300360044003900330042003600330033003400330041004600370042003400300036003000370042003200300042003200460037003300390036003500410045004600370044004100410039003500370045004200430030004600420033004100430031003700330045003900320045004100450045003000310034003000440045004200430034003200310045004400440034003300340041004300420044003800300037003000450039003100310039003300390044004400330043003500340045003200340042003900420035003900310041004400390043004200360038003900440031003700460031003000420039004600350031003400460043003600380039003200460035004400320035003600350033004200430034003200460039004500410032004400350036004200430039004300370046004200460036003100330041004600390034003900420041004500320033004200310036003300420046004400380034003700420043004200340038004300370041003700370037003300360033003100430044004200340039003600330046003700450045004100350041003200450039003900420030004500320032004500350044003200410036004100330032003500360030004100390038003300330046003100350031003100320044003100360038003000340032004100320032003100370045004600420031004100420046004100420031004200370033004200440042004100300035004200310030003500310043003700440038004100460031004100370031003500450032003300350036004600350030004300350032004600360044003800310037004600450042003000460035004100410036004400360037003800460037004100420030004500300031003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007300036003800000542004F00000742004F004C00000F42006F006C0069007600690061000081E3360030003000300030003000300030004600300038003000360030003000300030003000300045003000360044003300460036003800300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300042003200450030003300420038003000310036003300430042003000300030003000300030003200450034003900340034003400310035003400330038003800440036003300420043003200310043003700460041003900460038003100300036003800300038003900310036003800360038004500310041003800430030003200310038004200460033004600310032003100390038004400420043003200310036004100330030003000420045003700300043003400440039004100310038003300430046003400380032003600320045003800310039003000430030003000310044003400340030003500430046003500370036003900360031003800460030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073000370030000005420041000007420049004800002D42006F0073006E0069006100200061006E00640020004800650072007A00650067006F00760069006E0061000085D3360030003000300030003000300030004200300038003000360030003000300030003000300037004200460043003700440037004500300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100310030003100330031003900330046004600380039004500390045003000300030003000300031003200410034003900340034003400310035003400320038003900310041003500440032004200310034004200300032003600310031003800380030004600310032003700390031004200410041003300340044003200350039003700380041003800360039003600410038003900360046004500380030003100340036004100310030003800410042003600420043003400320041003700380036004300340035004400420037003600380033003100460037003800410042003800340039003800320036004200380038003000450043003700380043004500300030003600350031003100410045003200410036003000360033003900360043003200420030004100370034003000380039003100380033003600420039003000300042003600440032003800320031003300340042004400320045003900460045004400370042004600390046003800460031004600320046003100380044003000350038003300370032003800370045004600430032004500310031003900340043004200330038003500320038003700380038003800410044004300390036004300410043003500360037003000450041004600310036003900380041003400380032003200440039003300370046003700460043003300430039003400340041004100460046003800370043003000320044004200440031003000350030004500430045004100320031003400430041003800420038004500460030004100300042004300420044003800330036003200460031003000350035004400410046003900330043004200340035003400380041003700430036003800310030004200330036003400330038003600360042004400380044003300330042004500380037003400430030004200320036004300330032003900390037004200340032004500310033003900360045003100460035003200460046004400410042004300300046004500450036003600310038003000440036004100330035003000420045004200460044003800330045003300410042003300440044003700460038003400300031003800420045003900450041003500440039003600430037003100370032004200410043004500410031004200430045004200300041003100460030004100300033003500340041004200300044003200340045003900390041004100330036004300300038003400350034004200460045003100390037003700380034003600440042004200380044003600350044003900320038003800410038003100320030003400430041003000350035004400320031003400430041003400420041003300430033004400440037003400420044003800450032003800370041004600310046004200320037004300390039004500430037003100430033003700450046004600420036004500430033004400320042003400360037003000320030003100310031003500350044004400360032003400370036004100300033003900370043004300430046004200450038004400300045003000330039003800360036003800420037003800460043003800360046004400430034003000410046003900420042003000300043004200440033004500410041004600460037003300450030003100450041003100320036003400320034003000360034003800330044003500350030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073000370032000005420057000007420057004100001142006F0074007300770061006E00610000824736003000300030003000300030003000460030003800300036003000300030003000300030004500300036004400330046003600380030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030004300310044003200330037003200340042003300300042003600300030003000300030003000340037003400390034003400340031003500340033003800380044003600330032004300350044003700350046004200330046003000330030004400300030003100330032004400300043003100440033003500310038003000350042003000390038003200420046003100440031004300340036003000340036003100370031003700310037003900410041003400300041003400360030003600300036003000360039004100310038004300430045003200450032004500320034003200300042003700330031003900310038004400370039004300370039003400390031004200310037003900460042004300460037003800390031003600450036003000450043003100370034003300430046003400300043003000360030003000300031003200450030004400310030003700370039003000430045003600360030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073000370034000005420056000007420056005400001B42006F0075007600650074002000490073006C0061006E00640000073000370036000005420052000007420052004100000D4200720061007A0069006C00008A03360030003000300030003000300030004600300038003000360030003000300030003000300045003000360044003300460036003800300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003300300037003000330032003200370037003500310031003800390035003000300030003000300032003300360034003900340034003400310035003400330038003800440042003500390033003400440034003800390033003700310031004300430037003300460037004200440038004400360035004300380046003700420037003100460036003600340034004400420037004200390035003800330042003400380032003800410034003100300038003100370038003500410038003700380038004600300042003600320045003100440042004300440038004100310032003200320032003400380042004300340034003900450039003600340032003100340044003500410035003200350035004500320032004500380038003500360045003800320038003100370034003200390038004200360030003100450043004300310031004200390039003600320046003500420043004300390037004400350044004300370032003700330044003300340044003900460037003500350030003600370032004600380046003300360038003800420045004300370046004600430042004500370046004600450035004600420046004400460044003500350044004300360039003200420046003200310046003200340039003400370042003500300032004200310034004400310030004100450035003700420032003800300042004400430032004100410036003000380042003800340037003000390042003800340037003600390031003500350033004600460030004500420036004100380030004200460034004400420032003600310038003700320030003600350039003800460038003900410043004300370034003400380036003900430034003100460041003600440031003300350038004400340038003500350044004300310036004100410035003400350031003500370030004200360036004100310045003900460037003500380041003800460045004600410044003900430042004300440046003400310033004300320031003000320032003000350039003300320035004300330042004600370039003200460031004300360030003000440044003300310032003700300046003100370036004200350030003000410045\
-0038003000460043003700360045003500440039003600360031004400370031003800370045003700420038003800370038004400340034004300430046003000330032004600340042004300420045003600440032003700450033004300320031003700320042003900450046003100340046003100410038003100390042004600330044004300340042003000360042003000430042003700320045004100420036003000360045003700330032004100320041003000340039003900410042004600420041003300350043003900310041003200410035003900320039004500300036004500460033003200390031003300340041003200440031004100410041003900440041003600420036003000380044003000320030004200390033003800420030004300330045003000410044003200440036004600430039003900350042003500440038003300300030004500340036003500310035003300370045003300330036004600410031003600360043004500340036003400360031003300420030004100340031003000350034004600450041003300460037003000430032004200300046003800430042004100420043004600300036004400450031003100380045003500360035003300350039004100390032003700390044004400450037003000370035004400430045003300450030003700430041004600380037004600310031003700310041003600300030003300410043003100350038004100370034004400370034003400330038004100410034004600440033003300450037003500300034004200390042003800310039003800350035004300300034004500460037003400300033004200450037003900330042003700390035003900350035003000320044003700440037003600350042003100440036003900410035003900350044003200440032003000340039003600360032003400430039004300300044004200450031003100390030003600410045004200460041003200410039003700310033004200390045004200430041004300430032003300370036004600430037003300420044004400380030003500430046004300320044004500330039004300320043004400300033003300450037004100300032003500440034004300430034003800430036003000380034003000340037004600420031004200420045003200370044003300450043004400310036003900340038003600370039003600430039004100440041004300360031004200350039004100410039004100440033003700370032004500430043003000360044003000300034003600330032003400360035004100340032004300440046003400430043003300390034004100330031003200380039003600310037003500410044003100450033003000390033003700440031003100390037003100320033004400390039003200440043004200380046003400390043003000410034004400390043003500430033003600340046003700410032003900380042004300310039003400450035004500320036003900330046003900320032004400340039003600370043003400380044003200370044004300340034003600380034003500420046003700330037003900340041004200320041003800300042004600340031004500390043004500340038004300450039003200420039004600360036004100410030003100330038004500430046003800430036004500330044003400330045004200410036003600300046003900310035003800440033004500430037003400370035003700370046003000390036003500410043003500310034004600370045004100430032003000300035004300460038004500320045003200370035004300360046003400420037003200420045003500380031003800310044003200300038004600450035004300450045003600450035003200460043003700390034004100320041003100370042003800410035003100460035004500450041004300440035003700370031003100460045003900370042003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007300038003600000549004F00000749004F005400003D4200720069007400690073006800200049006E006400690061006E0020004F006300650061006E0020005400650072007200690074006F0072007900008E87360030003000300030003000300030004200300038003000360030003000300030003000300037004200460043003700440037004500300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440036003000330030004100300039003000440032004600330031003000300042003700420044003000300030003000300033003500370034003900340034003400310035003400320038003900310034004400390031003500390034004300440042003000350030003000380037004200460037004600300046003800310031004500410043004500420043003100440031003700320035003800410030003300360041003500320030003300420035003800300039003100300045003300350030003600340036004100430038004500360033003400380038003900390043003900340036004200320036003800390043003900390038003900380039003300310033004100330034003100410031004600440034004300430045003300360035003300310043004200390036003600350044003300330039003900330032004400310038003000390039004200310031003200360038003100450031003600360031003800440042003900430045003100320038003800450041003300410033003700340041003300300035003700410043003200410030003100340032003800360044004600460033004500360038003700340044004600450042004500460045003500430042004500460031003300450045003700430037004400340041004500340035003100330033003900460044004500370041004300300046003900340045003200370036004600450044004200360037003300450030004600380031003100430045004200450046003900330039004400460035004300420041004300330045003100360041003000330041004600350039003600340043003800340042003800410038003800390038004100440036003400450042003900350037004300370031004200410039004600460039003700300039003400390036003300440031003500350034003900360039003900420038004400300033003900430041004500350046004500420042004200430035003800360046004100330046003100430039004300370039003800460034003800340031003100320043004300460031004600310033003500420042003600450039003700380042003900350030003000410031003500310035003000430037004200390037003200390033004100420038003000460044004600410039003700330035003800390037004200430034003800340043003400360034004500330038003500370042003800370038003600350039004300390032003000320032004400420033003800310036003500440045003300420035003800340042003800450035004500430035004600370033004600300046003100330039003200300045003500300039004100360044004100370041003100360041003000420033004400440037003000320046004300370032004400350038003500370045004200330030003200360031004200430045004500300035003900310038003700310030003900330034003900350036003900440036003300360034003900340044004200310030004100340044003200380037003200370041004500310045004600410039003000310043004200440038004100320046004200460045004400340037003500330045003000320033004400460032003800340033003500340030003400300038003800350045003300440043003900460044003400420031004300440045003400410030003700310045003700420046004300360039004400390046003900430031003400300035003000340030004300350041003000350034003600390035003100430038003900340034003600300046003600450044003500360038004300430037003300450034003300310034004100340046003800380033003400420043004300320044003600440032003000320032004400320041003700330034004500330030004600340037003300390042004300430046004300310035003000420030003900370045004500440031003300450034003200410042003300450032004300420041003700320035004500410044003700450030003500440046003700340033004100350044004200460042004200440030003600390031003400430038004400410045003200350039004200430042004600350044003400440036003200430041004300440035003100360037003000320032003100430042004300300037004500450030004500380038003400380034004500300030003600310043003700310045003400350031003300380045004400450031004600340035003400390032004600350042004300300044004100430036003600330044003000370035004100330042003500300036003500410045003600330032003800340044003200330032004200340044003800330045004200350045003800380038004600390043004500440041003400320032003900360046004600330046004200450037004600410039003500370046003400320035004500340037003400430044003200360030003800320044004300340042003000310037003600410044003800440045004400460038003500370033003600370032003300320033004400330031003100450034003300320032003900340044004200420045004300450034004300440034004400440033003100370043004600360034003200450031003800410035004200450042004100380038003800350035003800380038004200350033003500300039003200330042003700430045004200320041003500420036003900390045003400380036003400300038004500320036003800370039004500300031003300370030003600410044003000320045003100460031004200440043003700430035004500320037004300320044004100330037003700300033003500340039003500390042003900380046003000380034003200390043003800440044003800340044003300450035004100370041004300320034003800420036003800320043003000450034003000360038003300310038003600350041003900310038003600330031003400420043004400440034003400430030003400380044003300410031004400340033004300320034004400350033004600310031003800360044003900450035003200440036003900340035003600390043004100450030003000380045003700320044003300330046004300360044003700460045004600340038003800380033003600330046003300330043003500440036003500360036004400410042003700340038004100450035004500340035004600460044003000300043003900350046003600350043004400360045003300340039003100450039003100430042003100380037003300300037004400310036004200310034003100340045003400360036003300320031004600350041003200310039003500340041004500310038004600410043003500300033003600460043003300310039003200430034003100340032003900370039003000390033003700320044003100460046003000440034003000450033003300460037004500360031003700350031004100360043004200310031003900450037004200450033003000370037003100340037003900390039003100380045004400450046003100460046004500410045004600410044004200370037003100360033004400380038004200440042004200420038003000340034003100300044003800350044003600370043003500310046003800450046003200440042003100460031004500440034004300410033003400320041004100430044003900450034004500380035003500430043004300440043004400350030003500420039003800360034004600320038003100380032004300440046004100370043003200450035004500310039003200370039003100340043003100310035004500350043003400350033003800440039003700360035004200420043003300390045003200410035003600390039003700310044004100420035003900430037003600430037003000390039003300330033004600300044003500320042003300330035003900460038003600390041003600320041003200320042003700310034004500420034004400440043003600410030003500350044003200460043003600430031003900330032003900390043003000380035004300450035003100450036003400330035003100460036004500460041003900340030003900430042003800380043003300420043003300340031004600370037003500330037003200460033004400360033004300330036004100440036003100330035003900380043003200310042004300460042003500350042003700450038003200380033003700460031004500330041004600370046004400310037003300430033004300440035003600350042003200450038003700390041003200420031003900310038004600360037003200420045004400330038003900350041003900310034003600450042004500420034004600310030003800380041004300370030004100360037004400390030004400300034003200380043003700370035004100410041004300390044003600410039004600380041004500360033003800380045003400450043003000380042003600390041003300410031004100360041003800410036003900450046003100390041003300460042004600410031003400440041003400440031003900460043003000440043003400430043003600350036003200460031004500410043004400380039003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007300039003600000542004E000007420052004E0000234200720075006E0065006900200044006100720075007300730061006C0061006D0000883336003000300030003000300030003000420030003800300036003000300030003000300030003700420046004300370044003700450030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100300031003700310030003100390041003900320036004200430042004400300030003000300030003100430032003400390034003400340031003500340032003800390031004100440039003100430031003400450031003300350031003100380034003600430046003900440033003200420035003500380041003000420034003100320032004100380041003900310041003600310031003100330035003300320032003900360037003600310034003400330044003400420030003700330034003300450032003400320035004400460038003000450032004300370035003400370037003000450037003500330046003800300034004100450035004300450038004300450038004400380039003000420036004400410037003100440032004100360039004400320030003600340035003800420034004400300034004100390044003500420036003000430044003300390039004200390044003700340044004400350031003800340042003300300043003100360046004600420032003700450037004600420037003300330045004200310042004600360035003200380045003500370044004500300037004600340037003200380041003500390034003900320030004400390034003500330034003400370036003800420034003800410037003800300045004100310036003500310046004500430045004400310043003100460044003000450043004100460042003800340045004300310036003700410038003500300035004200450044003600320043004500430039003200430044004300390034003500460046003900460043003000380031004200440045003600380042004400350036003600410033004300410035003000370038003900380044003100450038004500390044004600380044004400410030003800390041003300450038004400330036003700380038004400430030004400300035004400410041004300460034003600350030004200410043003100370038004500360033003600320032003300300038003100310030003000320032003500370037003800310046004500340035003000320046003800460035004600310046003800440038003000300039003900340042003700310038004300450043003000430035003900450033003300410045003700360032003700330032003400410046003200450039003200370046004600300039003000350030004600440033003300420038003100450044004400430034003100390044003200380046003500360036003800410043003500370033003800390031003400410032003200440044003300320043004100330031003700420031004100320044003900340035004200300031003700430043003400380032003100310035003400430035003700350039003700370036004500370036004600320033004200370038003200410033003000430043003600300034003100370032003600360033003400340043004500340045003900300033003800330046004300420037003400370034003000410037004400450043003100340041004400450044003100440036003600450045003200460046003700370031004400380034003100330041003200350038003400420044003100390035003700420045003000460045003500410041003800370035003900370032004300390035004200320045003600460032004300380046004200370036003500390037004200300031004600450030003500450032003800430041004300320035003400380038003200370045004600350041003300380043003000390044004300390036003100410041003700420033004500350042004400390030003800370033003300370030004300380043004600390039004200430043004100360039003700440030003800330043003700460046003500340036003100360046004300360046004200380045004500370037003400310035004500360032004200340039004500350042003900360030003600300034003300320033004400350030004300410033003800350031003400340046004500420036004400350045003700360036004300300041003800450043004400460037003900450044004600360033003400310043003100430035003500340038003400340043003300410034003900440036004200380043003200450035004600390041003500380033004300310033004600440033004400430031003000440034003100460045004200380038003300360033003800460042003100410044004600410034003800370039003900360038004600310042004100450036003900300042003700330043003600410046003500300033004300360033004200300043003700430035003800420036004200460034003800370032003900360034004200430045003700320033003100440037003300430037003200360042003200450042004200300044003700390037003400370030004200460042004300460046004500380046003300300033004200300039003800440035003200420039003700420033004500380041003400300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000731003000300000054200470000074200470052000011420075006C006700610072006900610000820B3600300030003000300030003000300044003000380030003600300030003000300030003000410044004100350039004500360033003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310031003000410032003700320046003500410044003900440045003500360030003000300030003000300033003800340039003400340034003100350034003300380038004400360033004600430046004600460046004600460037004600300036003100410030003000320036003500410031003800330041003300340030004400360036003500310035004400440036003700430039004300320036003000360044004600460039004600380043003600390032003100360030003600300046004300310033003000380045004200450037003800390033003200360036003100430043003700380034004400340044003600380033003400380033004400300044003600360030003000300039003900370044003000440046004200410042003200350046003000360036003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007380035003400000542004600000742004600410000194200750072006B0069006E00610020004600610073006F000083AF36003000300030003000300030003000460030003800300036003000300030003000300030004500300036004400330046003600380030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100320030004600320038003300370044004100350033003300370043004100300030003000300030003000410031003400390034003400340031003500340033003800380044004500440044003200330031003000410030003200330031003100300038003500450031003300460031004100440036003200380037004100300039003200350030003800450042003800410044003800360038003600330032003900380032004200370046003300300034003500450034003400420030004200330042003000440039003400450034003100430031003300330036003800410035004300390031003200350039003400420043004200300039004300320032003200380038003500330034004400330031004500460031004200310038003400360035004400300037004300330039003200300041004100410035003600300035004600410038003700330046003800330042003500300044004400340036004400380038003800360042003500330034004100300035004100410030004300370030004500330044003700330030003000380034003900440032003100450034003800360046003200320045004300300041004200340039003400370044004300330045004300440030003200380042003900310030003700360030003700420036004200420033003200460045003400380043003600320042004400310034004600460042003800360037003000410033003600460036003800340030003200450036004500370033004500310037003900460038003800420030003700380030004100380030003800360037004100390032003100450033003200300030004200410038003900380046003800390043003400430031004300370034003700460033004400440033004200310033003000350037004600460046004400440037004500310046003700450030003100330045003000320032003200430031004200360033003700340039004500410030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073100300038000005420049000007420044004900000F42007500720075006E006400690000899F36003000300030003000300030003000440030003800300036003000300030003000300030004100440041003500390045003600330030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030004300310044003200350039004200320038003900350038003300300030003000300030003200310044003400390034003400340031003500340033003800380044004200350039003400340046003400380044003300370031003100380043003600330046004500460033003600410043004600440043003100390041004200320036003600350033003600360041003500310030003200320032003500360038003600350031003800340032003100310037003400410038003300430032004300320046003400320039003700300036003700350041003900420043003400340035003100300043003800350043003000330031003300410034003400380037003500390034003900380034004400380034003900380037003800370033004100380034003100350035004400330041003100350035003100370036004300380038003800310035003400440034004100350031004200370046003900300037003400330033003600390044004600320044004200440045003000450041003600310035003600410034003900450030004600330044004500310045004400450046003700430033004600420037004400370038004600390038004100410041004100410031004100380036003800450044004600450039003900320043003400430044004200420045003400440032004200330046004300380046003400430037003600310042003400350039003700430046004200330045004400380032003500460043003500360032003100310046003300360038003400330045003600370041003500350034003100320035004300350046003500380037004100350045003000370034004100330031004100380039003700310043003900370043004600410042003200370045004100320030003800430045004300360039003300450043003800410044004300440033003200440034003700450042003600350033003800\
-31003300450037004300410034003000340038004300340044004200350037004100370039004200430044003900420033003800420037004200330038003900450036004600320033003300420041004300390039003400320037004100390039003700360046003100380030003900380034003900380046004200310030003500440039004500430046003200420032004400300031003600300036003100360038003600340044003900420033004500450041003900410030003200340031003400430030003700310045003800300030004600330042003900300035003600440038004600330044003900300046004200350046003200330036003400420032004600330038003800420037004100460034004500390037003100410033004400350036003300370041004400310035004300440031004300320046003300410038003200450036003700320033004100440035003100350039003100450046003800460039004600350033003100430030004100360030004400450035004400300041003400300046003600460033003100300041003300380031003100300035004200310042003800450035003100450038003600460035003200330031003900390045003400340039004500320030003500360044004400310037003600430036004500360039003200420046003100450046003200330042003700380034003900370035003800350033003500420034003500350035004500440032003700320043003700300045003400310031003500340034003700380042003400410046003000410030003000350046004600460037004200390036004200430035003800450041003900420042003600370045004200430032003500410046004100360044004500410044003400430036003800330035003300300038003000340035004300430034003400300045004400450036003600420046003700330032004600300030003100330044003300370031003400300037003100330039003300440030003000420043003900440031004500410030004500390046003500340035003000430043004400410045003100410042004400360039003500350031003700330030003300340034004200430041003400380030003300330030003100380038004600450032003700320036004500430037004500350046003400330030003100380035004600430043003300440036003500410034004400370038003400460045003100350036004300310031003300330030004500380042003900440044004500410037003600310039003200440035003300450038004300390046003900350041004300460031004400310046004200320043003800430043003300360032004300370032003200450036003300350043003100450042004300410033003800390039003400450045003200370036003100340030003100390030003400430032003500370030004400420044004400460046004300430046003800380046003800440033004400350036003300370031004400440035003400310037004100360041004300330039003400440039004200430034004300370036003700360031003300460033004600390043003900310046003900450035003900450045004300390031004600390045003200310045003600460033003300330044003900440039003400440039003900430044003400420034004600360044003900380038004500450041003200300031004500410042003700420045003500430036003100420037003200430037003600370046004200410046003600410034004200340035004200330039003600440041003800410036003500320031003300390041003100360033003200440033003700360034004600410036003100440046004500320034003900410044003400370032003200330038003400460039004400430030003100330042004300410036003700390036004500390037003000430043004400380045003600410033003000440041003200450042003200350031003700460043003500300046004300450032003800300039003400410039003600450032003200430046003900300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000731003100360000054B00480000074B0048004D000011430061006D0062006F006400690061000085E7360030003000300030003000300030004600300038003000360030003000300030003000300045003000360044003300460036003800300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300043003100440032003800450035003900390045003900330045003000300030003000300031003200460034003900340034003400310035003400330038003800440044003500390034004200440036004100430032003600300031003400380036003900460032004600320036003100380038003700410038003200380046004500380031003700350042003000380042003200450038004500410045004500320032003200380041003200320037003800310039003400450037004100320042003800450042004400300038003600460034003200330032003900350034004500320045003000450035003200390037003800320034003200310036003200350033003100460045004100300035004600440032004300310032003200310034003000430044003800320031003400330043004600370036003700380033003900300046003800370030003700430045003100310046003000450036003100330034003200320039003600310034003000340033003000350041004200370035003100360041003100380030004300350030003700330043004500350033003800350036004100420030003100370030003900430043004600390046003000320030003700410042003100300030003200410033004400460042004600420037004600310035004500380046003700380042003700370042004500460038004400340045003000370038003400300038003100430035003700380033003000320041003300440031003200300033003700310043003700320033003000340044004100320044003500320041003800390035003600300042003000310033003800420033003100390045003700430035003800320045004300370038003800430045003700330038004200380041003600460039003700380041004600320030003100350041004600440033003200390036004100330045003800460042003700440046004500330035004600410046003600380042003900310043003200380030004100390037004300440030003600300031003200380043003900320034003500370043004200450032003700330033003000460038004400420043003600350041003200360034003300320034003900440034003600320039003100360035003100360032003300310032004500440042003200440044003100350032003000390042004400350032004500310036003200350039003200300032003500360041003200410031003500410038004500320041003100450033003700380042004200380044003500410032003800450030004200390032004500440032003700350033003900410046004400370030003800340030004400410033003600430037004500350031003200450046003700300034003000450045003700360041003000360039003100380043004400450036003700330032004100410032004500350033003200320046003900330030003900310031004300330034003000450038003300410046004500450039003700340030004200370043003900460034003800320032003800310042003400450044004400420045003000340046003200360031004400380037004100460044003100380038004600330036004100460035003100420035004300360037003100430043004100340039004100420045004600350034004300330045003000460045004300330035004600460031003000440035004100380043003600320031003400340031003400380033003700440039003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007310032003000000543004D00000743004D0052000011430061006D00650072006F006F006E0000837336003000300030003000300030003000460030003800300036003000300030003000300030004500300036004400330046003600380030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030004300310044003200440039003500460033003100440042003100300030003000300030003000390032003400390034003400340031003500340033003800380044003600330036003400410038003800410046004200430046003800300030003300410043003500390037003100450039003900380044003200460042003600460035003600440038004500340034003400320033003700450031004500390033004300430046003800380045003500350038004500380031003800310038003100380031003000390039003700300034004100350036003000440034003600300044003200300044003600360045003600460045004300460043003000430043003800440033003300390045003300310030003000300042003300310038004100440038003200350046004600330031003000380037004100460043003600320046003800460046003900460038003100450031004600440034004500330036003800360035004600430046003000390042004200380037003200380038003300350039004100350046004600330032003800380034003600460046003600300036003000360034003600300036003000460038003700410039003900390039003700410030003600370046004200440043003400430032004600300046003900330038003200420038003400370044003900390032003800320044004300340031003900460043004600460030004600320033004300330038003300350041003600450030003800380037004300380035003800320031003400450044003900330046003100430036004300380041003000440032003600300033003800430031004100300043003000370030003000460041003200380032003600300045003600440037003900370034003500300030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073100320034000005430041000007430041004E00000D430061006E006100640061000084333600300030003000300030003000300042003000380030003600300030003000300030003000370042004600430037004400370045003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310032003000460032003200330030004200450044003800340041004500330030003000300030003000300043003200340039003400340034003100350034003200380039003100390044003900320033003100300041003800340033003000310034003400340031004600410032003900350036004400440038003500320036004300320043003600430041004400360044003700320032003100360042003600460032003000440045004300340034004500420030004200350046003000310032003600320036003300450033003200310032004300300034004300310036004300310031003400340037003600430033004300360041004300300033003000330039004600390039003400430031003800460032003800330030003200360035004200300032004300390035003300330041004100430041004300430038003300460032003700300043003500330030003600380033004100430032004500440045003200410036003800310041003200440030003600430031004100410037003800380036004600370035004600370031004400390036003000350042003600300044004300360035003100360042004400420030003600460033003000430037003100300043003400310046003000420030004200310039003400390030003600350044003000420036003900370044003600420036003500410039003300460032003600310045003300450033004400300036004200350038003500370045003800420041003400420033004600360037004100350046003400390039004200460031004200370042003100450044003400330035003000380036003100370041003400320036003800430046004200330043003400370046003300410030003000370039003000450037004400360046004500410037004400410046003300440030004200450043004300420030003300340038003100320039003800410036003400460032004400380041003600450036003300460037004400460032004400300043003200310034004400430031004600370041004600330039003000430036004600360033004600370038004400340046004200430035004500440036003300370046004400430036003100420045003900320032003600460034003100410038003400390037003300370038003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007310033003200000543005600000743005000560000154300610070006500200056006500720064006500008547360030003000300030003000300030004400300038003000360030003000300030003000300041004400410035003900450036003300300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300043003100440032004500300043004600410034004300300042003000300030003000300031003000370034003900340034003400310035003400330038003800440036003300360034004200300039003800460043003900460038003100300036003800300038003900310036003800360030004500330033003800330039003900390038004600450033003300460030003700320046004300360032003700300044003300420041003000420045003700350033003600430033003000300037004500420031004600380036003400320039003700310033003000430033004600460046004200300033003000440043003700450032003500430043004100300032003200460036003800450032003100430043004600380031004100340039003000360033003300390036003400460033004400380041004500320031003400360036004300360033004600300043003300430036004300310046003100390033004500460045003100340034003600370035003000310045003300350046003000360030003100460036004200370030004300450046003700450038003800310031003600350033003000340042003000390046003700360033003500340030003300350038004200450033003000330030004200310042004600360034004600380046003300350035003100390034004400450039003300460030003600350036004200450045004200300043004200460033004600360039003100330036003700460030004500370030003300430037003500300042004400430030004600430038004600380031003900390046004200300037004300330039004600340046003200460035003100430035003100390046004600330031003300300046003300370044003600370046003800460033004600310032003300350031003000360033003300450045003300450046003500300038003200350032003800440038003100380044004600330031003700300033003200330045003600340046003800460038004300460031003000350035003200310043003300310046003000360036003100410036004100330030004300360046004600450044003900310033003600370033003000420036003900430043003700430031004600410038003700320031004400430046003400320041004300330043003200360033004600410030004300360043003200430046004600310038003400340042003800420046003300320031003800320042003300430036003700440038003700430035003100380044003200380034003300310039003100380037003000410034003800410031004600420046003500390031003800420036003500440035003200360035004500300045003300460038004300390031003000360036003700320038003500450031004600440033003700340045003800360030003300330037003100350038003800330036003100340041003700380042004100390030003100300030003600420033003100350031003400360034004500390036004600430042003000300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000731003300360000054B0059000007430059004D00001D4300610079006D0061006E002000490073006C0061006E00640073000088973600300030003000300030003000300042003000380030003600300030003000300030003000370042004600430037004400370045003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310031003000430031004400330034004600310039003800420035003700310030003000300030003000310044004200340039003400340034003100350034003200380039003100390044003900300034004600360043003400420030003100310043004300370033004600450046004200440041004500460033003300430046004400430033004400410031003700350034003900390036004300440033003600340041003700460032003400360032003200360042003300420032003400300045003400340034003400380032004500440041003200460033003600460037003300350030003200340038004500430032004300310043004400390046003400380039004300320043003100330031004300370030004500380033003800330038003200430032003200320043003200310038003200350033004200420042003200410035003800380041003400350034004400360036003900420032003300320034004400420041003700350034004400440042004200350039004500390033004600310035003200380037004100350044004600440042004500460043004600460037003900420036004600330045003400320046004300450032003100350035004400360041004600350037003000450039003500390039003600370030003300380034003200450038004200300034003600460030003400450033004600460037003800460044004600450032004300360044004400310038004100310035004400320045004600410033003400330033003500320041004200380037004600360034003300340046003500380041004300380034004200360042003600300042003700410042003000370033003000350030003700350041004100410033003400460038004200370031003300340046003100350035003800440042003100420045003000440042004300300036003300330043004200390030003400440032004600410031003600360045003400360034004200300043003000460038004600390033003400380037004300410046003000390033003000390042003400440039003400430042003900350044004100450030003800460039004100410036003100420033003600440035003200410038003500420031003300310039003600370041004200440032003000340039003800360035003300370042003400430033003300430043003200460039004600460037003200320043004500330043004300340045003200440043004300440034003600440046003200330043003300430044004600340033003500370030003100300034003100310030003700300033003800390036004100310031003600410037003600390037003000330034003500310033003800370033003800410045003500410031004400330043004300450037003000420036003400320036003300320046004300310030003200440045003800420041003000450042003100410034004300310037004300460039004400350033004400350045003200370034003700460031004100460032004200440036003300340031003600380037004100360035003500390041003300370037003900390030004300420037003900410045004200460031003300420039003100360035004600300032004300300044003500380038004300450046003900420037003000410034004100340037003000370036004500320042003800430037004300390045003300370031003800460042004600360042003800330038003300370039004200450033003800310037003300310035003600370032003700410037004400380042003700340044003300350033003600460036003300370036003600310038003100430034004100330033004600300033003400340044004100350046003200300042004400460031003600380031004300450041004500360045004100320045003300350033004200430038003900410034003000380038003700340035003700410037004100330036003100330035003800390044003300350031003800450035003200360031004200320036004100420031003500370042004300350038003600430044003200450032003300430046003200380034003600430036003700300043003200430038003700380039003100330041003100360046003400420032003500320038004200360032004200330045004300320030003300370046004200380032004500430046004200410044003000430044004500310045004600440038004200410032003900450044003000450045003200450039003500390033003300420044003300420038004400440034003700320039003100350034003700370030004100460033003900340032004200460032004600430035003700450039004600370033004500310043003700350034003400460037003000460032003600370039003900320046004200410038004200300044004400360030004600430038004500430041003500440039004600450038003900340034003500450032003500390035003400420032004600460043004400340038004400450032003800460031003400410035003900310042003900420039003500320043004400420045003200450031003400460046004500410037004600410031003000300042004600300031003400330036003100390041004300300035003600440032003900380035003200300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000731003400300000054300460000074300410046000031430065006E007400720061006C0020004100660072006900630061006E002000520065007000750062006C00690063000085A336003000300030003000300030003000460030003800300036003000300030003000300030004500300036004400330046003600380030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030004300310044003300370036003800390031004500340043004200300030003000300030003100310045003400390034003400340031003500340033003800380044003600330036003400330030003600380046004100430046003000300030003500430041004100320045004600310038004500450042004500310036003600320034003000300037003600420039004600310045003600300035003000460044004600440038003900380031003800310038003100380031004500310033003600320042003100460034003300420030004200340030003300380036003100410037003400430030003000340036003300420038003600380044004400360035003500380039003400420041003800450032003100430033004500310033003400300033003000420044003300330046003800320031004100380039003300360046003800450043003400330032003900300036003300310042004500320046003000430037004600460045003300310033003100460043004600390043003700380034003400460030004600350031003800300033003100420034003700340043004400350039003000360030003600300036003000360035004500380045003400460043004300440046003700460037003100460045004500330045003500460038004300430046004300460045003900420044003000310046003600340034003500440039004100420036003600360041003000410037004400370043004300460043003900430030004300300043003000460030003800450035004600460030004600420044003400420030004600340045004200300034003000440046004500460046004600460046004600370046003400320038004100360045003500420034003700330032004600430042003800370036003800370038003100380031003800310038003100380031003400330034004200380035003400310046003500450038003700320038003200320045004100360044004300430046004600340033003600390038004100350037004100370046004600350034003100340032003800410037004300440045003300440033003300450031003600310036003000450030003600360036003000360030003600300037003800460033004500450044003900440037003000350046004200410042004300460031003000330034003700380044004400430044003700350046003600380034003100340035003900330031003700300033003100460030003400300033004400460037003800\
-45004500310030004200330037003300310037004100380036003600300031003800310046003300310042004500370033003800450039003000410032004400370032004300350041003900410042004600310039004400380033003800310039003100380031003800310038003900340035003900460045003700430033004600360032003700430038003700360030003300410036003600310031003600360046003900360033003400340034003800440031003300420044003600420046003000430042004600410031003600430036003600440036004200460039004300430034004500380031003900370041003600310030004300300030004500390035004100350035004600410033003100310033003000430038004400300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000731003400380000055400440000075400430044000009430068006100640000820F360030003000300030003000300030004600300038003000360030003000300030003000300045003000360044003300460036003800300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300043003100440033004200360031003200370041003800450030003000300030003000300030003300390034003900340034003400310035003400330038003800440036003300360034003500300043004400460043004300460038003000300033003500430045004200350042003700310034004300350033004600410042004400310035003300360042003900440037003200420043003500380046004200440039003800320039003800420035003500380045003800310038003100380031003800310030003900390037003000340041003500360030004400340045003000350031003800330034003700300044003100450033003500370038003400300030004400300036003000300035004300370036003000410033003300430041003700390037004200340033003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007310035003200000543004C000007430048004C00000B4300680069006C006500008377360030003000300030003000300030004600300038003000360030003000300030003000300045003000360044003300460036003800300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003200300044003300320032004500300044003900310042003100420046003000300030003000300030003900330034003900340034003400310035003400330038003800440036003300360034003300300035004400460042003900460030003100300037003500380044004100360043004300410031003000450035003200450038004200340042003100410032004600360030003400320045003100330030004500310035003200340036004100310043003100420035003400390039004100440034003300370042003800320039003500440038004200410031003200450034003500380033004500310045003800310043003700420030003600310031003700450037003600450041003100390042004300460035004500380030004200380036003900420038004600420045003300300039004300420046004600390039003100450031004300440043003700390046003100340031004200430043003000320036003300440043004200380046004600390039003400310032004200360043003300370030003300320046003100370032004200430035003800360033003200330030003200300042003900460038004500330044003700440046003000430030004300300043003000430030004300390046004200460046004400410036003800410043003100320043004300390037004600420036004500330039003400310034004400420037004600380035004500310043004400350033003700450042003200300043003600360042004300410032003200370038003400330033003100440035003300300032004100380039003800370032003400370030004400310045003300360030003600300033003000300043004100420043003200350030003800430045003100410042003900310041003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007310035003600000543004E000007430048004E00000B4300680069006E0061000083A7360030003000300030003000300030004600300038003000360030003000300030003000300045003000360044003300460036003800300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300042003200440032004500440036004600330036004300370044003000300030003000300030003900460034003900340034003400310035003400330038003800440045004400390032003300310030004500340031003400310031003400340035004300460046004600320031004100380034003400310034003200340044003800380035003800320031003500320038004500430043003100300041003200430034004300320046004400340032004300340035004100320044003600380042004500320032003800300038004400460039003700390031003600460041003600310033003300370042003900430039004200430039003900390037004600330036004500320036003200460031003300320034004100340033004100370030003000390042004500370045003500340046004500350032003800440030004100450037003300450042003000370044004500420041003800320045004300310038003700440037003600380042003300350030003300370044003000320035003300410032003800440043003500350046003400320044003400460030004600440038003000310037003300450030003000300043004300450045003500330043004600340030003100420041003800410035003200340035004500410030003200370037003400350046003900410033004500460043003300450041004400450030003100330033004300340035003700330037003400350032003600410035004100410031004500330031003400370030004400390031004400370034003100330039003700350036003300300030004200410045003500420030004200450038003000320043003700380038004600460030003500430032004500300034003400430035003600450045003900310046004600430043004200450030003200420032003500390030004300310032003800420034003700430043004200420045003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007310036003200000543005800000743005800520000214300680072006900730074006D00610073002000490073006C0061006E0064000087D33600300030003000300030003000300042003000380030003600300030003000300030003000370042004600430037004400370045003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310030003100330031004200310044003400410042003600300039004200330030003000300030003000310041004100340039003400340034003100350034003200380039003100390044003900320033004600360038003500330035003100310034004300360037004600460037004400440031004200440033003300340037004600340038004100440031003000370043004100460043003500390036003300380042004300410038003000380044003200340035004200310039003300360030004300310042003100380033004400360041003100330038003600350037003400350030003100430035004300310043003800410037004200370031003700300037003400370034004400300043003100350032004500380032003200410045003000450039003500370036003700320044003000440032003200410032003200380035003200360042003500320036003100410044003200440041004500300037004400370039004600370035004400380037003600380046004500440030003800410041003600360037004200420031004600380037004500460046004500420045003700330038004500380038003400460033004500420036003900390038003900310035004500320035004500390039004100330044003600350038004300320035003200300039003000340046004200410036004100330033003900420041004500340035003200350039003900410041003600420032003300340038004400320045004200390034003700330032004100450033003500300035003400460046004300380030003600330041003200410033003000390043003600310037003600430037003700350033004400430032004200440033003400460038003200410042004300330030003600320043004600380043003900380038003200440032004400350038004600430041004100350041004300340044004400340044004200370036004600450035004600310033003300380035003000330030003900390034003800300045004200420039003900300031004200330039004400330034003300300035004600300042004100320036003300390039004600420032003100340035004400430033004400390036003400380037003500310033003200330034003300330046003700450037004600310037003600410044004300450034004500350035003600330032004400440030004300380046003000360033004400440034003700360046003800460046003000450038004300410030003700450045004500350037004600320032003800310046004300360030004300340037003200350044004200360030004400380043003800350033003700370035003800370043003900410043004500310037003200330036004100320031003600430032004400410042004500380033003200330030003400410034003900330032004400460043004100300031003900360031003800430036003500460034003600340038003200380037003700370043004600300030004100300034004200320045003500450043003200330032004600420032004500430045004600440034004600330031004100360038003600410032003100450045003200410043004200320035004300330042003600310037003800460041003400350037003100370031003700350038003000310037003300420042004600340037003100310035003300300045003700330037003700300041004500440043003600350033004400450032003000420035004400440032003600300046004500360044004600420037004200350041004400380046004500330033004300330042004100370032003900420041003200310045004200390046003300440043003200420032004300420045003900380034004500350034003200330041004500320037003800430043004600320042003200320041003700390046003500340044004400320037003500310034003000370039003700450037004500360030003600410038003700450030004600300038003900410031004400330032004500350034003400440043004200430042003400380031003900340031003100430046003900370037004400370034003200380046004600420039004500340031004500360033003200310036003800430044004200370038004600460041004400420030003700330044004300420032004200430045003800430039003100340041003200410033003600340042003800440046004600330036003300360037004200360039003100410031004200300035004600340046003600300038003200410042003500380042004300410045004300310044003400450030004300460044003500330031004600390036004500300031003700450046004400370041003400370043003400440032003700420031003400440030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073100360036000005430043000007430043004B00002F43006F0063006F007300200028004B00650065006C0069006E00670029002000490073006C0061006E00640073000007310037003000000543004F00000743004F004C00001143006F006C006F006D0062006900610000822736003000300030003000300030003000460030003800300036003000300030003000300030004500300036004400330046003600380030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030004300300046003100370032004200300042004200340044003000300030003000300030003000330046003400390034003400340031003500340033003800380044003600330046004300370033003500310045004300330046003000330030004400300030003100330032004400300043003100440033003500370038003800380031004200430043003900320042003400430030004500460032003000320044003000430036003600360034004200300039003800330043003900410038004500310039003100380031003800310038003100380031003800460037003800380045003800390046004100350038003500430031003200430034003200370046004200460031004200440031004300320045003000410031003100370043003600300030003200450039004100300041004500310043004200310041003300380041004600300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000731003700340000054B004D00000743004F004D00000F43006F006D006F0072006F0073000087333600300030003000300030003000300044003000380030003600300030003000300030003000410044004100350039004500360033003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900300046003100310030003800330034003600320031003500340033004500410030003000300030003000310038003200340039003400340034003100350034003300380038004400410044004400320034004600340038003900330037003100310038004300300046003100450046003400460035004500420037003600390038004200350034003500380041004300340034004200300033004600340041003900380031004500350032003400380035003000370036004300380046003400440030003200310034003100300046003300420037003800350038003800340037003800450039003900300038003700320043004600300044004100320035003800320044003800440031003400420035003200350030004400300033003100340031004400300038003300390035003400380035003900420042003600410042003100380033003700460030003600390042003700330036004200350034004600320042004500410044004300440037003700360042004500440037004400330041004200440034003500370034004400390045003600460042004200440033004300430046004500310045003100370033003700410044003400420044003200370033004400370032004200420033004400340037004100420041003700380043003900330044003500340035003000430031003700410031003800460032004400430043004500460033003700360032003500410043004100330039003100380041003000360034004300310042003300460044003600330038003400330036003500410037003800370033004500300037003100300034004400360045004300450035004400340038003900440033003700340046003900420042003700390041003100320037003700380046004500320044004300420039004400430031003200300033004400320037004300460044003400300043004100420034003000420038003400460034003600320045003500430045003300340036004600460032003400370037003100370041003600330039004500420033004200430037004600420044003800350042003900340035003200350043004500390031004300360031004500360045004100320043003500450046003700460031004100410045003100330041003800460045003600360031003600360037003800390036004300370031004600450036004300380036003400440033004500340038004200330039003000300034003400380034004400350041004400310035003200360039004500380045004200330031003400350044004300340031003200410042003200410035003800360042003600440036004100410033004100310042004500390031004400440041004600330042003000380034003200350032004400460046004200450037004300300033003000370035003100450041004500440043004500370044003300410042003900370044004300350034003800330039003500430033003200390032003300380039003500390033004100450034004200430041004600380033004300460044004600350033003700340046003900420042003700390031003700350042004600420037003300450030004300440030004200440037003500370038004200350043004400450038004300390030003900360034003800450035003700300045003100350037003800310034003700410046003100460033003000330035003700300038004200450044003200460035004200420038003300340031003700300030003000410043003500410035004500380034004600380032004300420034003500310041003000410035003200330031003600380041003700300032004500310033004500380031004200460035004600390031004400300045003300310038003300420037003100300032004500420043004400460038003300330041004500410041004300310046004600360030003000300043004100430044003500380033004600340036003100310042003300420037003600360044003000340045004200330038003700450034003800360042003000370032004300330032003000450045003200330041003300300030003900410031003400320045003200320044003900330031004100340045004300370033003000340042003400460042003000440038003900460034003800360044004300390032004200410046003700390035003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007310037003800000543004700000743004F004700000B43006F006E0067006F000086AF3600300030003000300030003000300046003000380030003600300030003000300030003000450030003600440033004600360038003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310031003000430031004500320043004300390044003900370045004500340030003000300030003000310036003100340039003400340034003100350034003300380038004400390035004400340034004400320038003400340035003100310034004300300046003100460046003700440046003700440044003500310035003300340041003200320038003400390032003900320031003400460039003600380035003200310036003100360039003200380035003800440038004400420032003500330031003600390036004300410043004100340045004100340034003400350032003900320046003200390035003600430032003600320035003900310043003600360032003100360042003200350031004300410034003200320039004100350045004300300044004100310031003900380046003300310043003300320030003100460036003300320033003900310037004200440046004200430033003900420042004400420033003900460037004400370041003900370033004500450031003500430043004200370041003700430039003300320037003200410035003200300044004300360043004400330039003200360037003600390046003300300046003600420035003100460034003100390039003700460030003400420044003800300039003900380044003100430034003400360038004300370038003300300039003600310044004500430039003700310030003000410032003800350041004600330030004400450038004200360043003300460044003600410031003400430030003300420039004300360033004300310035003600390033004100320043004400380030003200360034003300300045004600370043004200330037003300460036003700340046004200300034004600430030003600360039003300410032004100330034003000350046004600450031003800420045004500330036004500460031003000360037004500340044003200420032003300450043003100330042003000440045004100380045003800320043004400340039003700330045004500440043003600370031004500360041004500460046004100300030003000420036003100420032004100300035003000340031004200310034003500440034003500380036003400450046003700450032003300380042003300350037004600460035003000440037003800450041003500380030003600300042004400410032004200420044003800440030004500390037004500300032003600370045003600300041003300450046003400440042004100410042004400320035003000350041004300440034003200390037004100340041003000430045003800340031003800320044004200410039003400420032003300410041003800350030003500420030003500340041004200450038003200440044003500410033004100390043003300320034004300450041003400330042004600410030004600310036004300300034003200410044003400440035004600390039003100450037004400330045003700410045003400370036004600430038003200460034003700420045003600430037004600410032003300300038003600300041003600430036004100360042004600350043004500410044003100450033003200370036003200360033003100310034004600450038003100460037003800420041004300360036003600410030003400320038004600420045003900430037004300410033003600460044004500420046003100350030004200360030004100320035004100330032003600380034003200340046003500330034003400340037003200320041003400350046003300450033004400410033003000300044003600360038003900350036003400410038003500320042004600430045004100460036003700320039003600320043003300450037003500390041003300300030003500460036003300350037003700350038004400300046003800320044004400380044003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007310038003000000543004400000743004F004400004343006F006E0067006F002C002000440065006D006F006300720061007400690063002000520065007000750062006C006900630020006F00660020007400680065000089273600300030003000300030003000300046003000380030003600300030003000300030003000450030003600440033004600360038003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310031003000430031004500320039004200390042003300380041003600420030003000300030003000310046004600340039003400340034003100350034003300380038004400390044003900320035004400340038003500330036003100310038004300370037004600450037003300440041003700340044003500420037003000390036003500460031003300350044003500380030004300340036003700350035003500310030003400340034003100310037003200310035004400450043004100360032004500300041003200410032004100460041003200300031004300300039003700390031003300340034003800430031003600310032004500340039004400330037003700360031003100380033003600350038003900310036003000390030003900440031003800440034003500340034003100370043003100340030003000410045004200410041003800460038003900340032004100310044003100410036004100390041004200390044004400430034004500330042004500370037003400330031004400420044003600410036003900420046003300370046004600420046003000460043003100450044004500460037004600370039003700310038003900430042003400350038003800450034004400430041004100300035004200300041004500420038003900320043003100390039004300410045003100420045003500420041003100360043003200300043003600420038003800430032004500310039003500450036004100310037003500340031003700440036004100380034003300\
-3700300044004100370042003800330031004400300043004200320046004600460031003200440041003900380034003000350031003300300046003000330039003200330041003800370032003900320041004200430044003000330034004300410034004200360041003000390039004200350033004300340042004500430043003300340032003200410030004200440043004200330046003100300033003300440043004500440042003700380034003700330045004200320046003800350038003200310041003100430042004200390039003900430038003200300033003300460033004100370039003100360030003400420039003800310041004100310031003300360038004500390036003700320041004400440035004100310036004500410042003100340046003300330045003800300045004600320045003400350044003200370034004400360037003200370039003800370046004100380036003000450041004400390039003900440044003600420035003100440046003200420035003000300030004300360042003500450044003400430041003500350042004600390036003900330038004600380039003400440041004300410045003700350034004400420038004100430030003700410032003500340031004300300044003500430046004600310046003700340046003500390030003800300041004500320042003100420043003800460030004400320045003800420043004400370045003900330045003100350044003800370045003900380039003500440043003800380032003600420038003400340045003700380046003600300038003200330030004200450044003900430041004300370042003800450039003000340043003400430032004200460046004600440042003500320032003400440035003700440033003200330033004100420046003300450032003000370039004300440032003000310045003200440037003800460032003200360036003800330038003900370045003100350035004600420030003100420041003600370046004400340043004300450042003800300031003900300030004100350042003500310039004300360032004400330044004100350038004600450039003800420030003800310046003300350038003800360045003800440031003100440030003400310036003200460046003300460036004600370043004500460046003700360035003700450044003900360034004600380044003700300043004200440036003800370037004100320046003400360045003200380035003000430045003600330032003500340038003000370041004300380032003000370031004400450043003500320035004200440038004200440031003600460046004200350037004400430032004600300031003900370033003300450044004400380036004200320032003200450033004100420038004500390046003000330033003300340045003700430033004200300045003400450032004600350035003200420030004300370033004500340044003700370036003300380038003800330032004600350046003300330037003700350046003600310033004500390039004200460036003900460037003500410033003800330041003600340045004500420034003900440041003100320046003700450038003200410035003900340037004400350035003600300030004500350043004400310037003400380037004300390046003000450045004100430045003900310046004400460044003500380041004300300037004600390031004200450044004300460035003500380043003900390030003400310033004100390041004500460036004400380039004500390042003400370042004300440043003000310043003700380044004300420039003200440044003700380041003400410041003600410042003400390046003600440044003600420033003400350044003100350042003800310041004400330044003500450034003200460039003800340035004400360038004500430041003700450033003900320038003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007310038003400000543004B00000743004F004B00001943006F006F006B002000490073006C0061006E00640073000089BB36003000300030003000300030003000420030003800300036003000300030003000300030003700420046004300370044003700450030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100350030003100300042003100440032003800300038003900430043004500300030003000300030003200320034003400390034003400340031003500340032003800390031003900350039003100350044003400380039003300370031003100380043003500370046004500460037004600350042003500330033003600320035003700330036004400360031004100330035004300410035004100360041003300350030003800340041003000370030003100360030003400340041004500390038003500340034003400320035004600410034003500300039003000340038003500380041003300380042003000410036004100300039003900360034003100350030003900380035003200320031003100390037003500310031003400340044004500360034003800340038003500350045004100350037003600310031003000360034003500450030003600370042003500410039004400420037003200390042003700330032003800430045003900390044003900460036004100450038004200390031004200340032004300360038004500370046003200390043004500370031004300300045004500370039003100310043003000440043004400440031003900340030003200330033003100440046003600340035003600410045004600420044004100330042003600430032003400430037003500350042003300440038004600340045004400360037003300450037004400390030003000410037003800420030004300440034003600350038003600340039003200390033003000420033004600360045004300360042004600450038003400310030003000320035003900390036003500370046003000430041004400320031004500390039004500330032003100300046003500350043003600300038004200450042004200320035004200380039003500320039003400340044004100410030003600320043003700370041004300450031003900310037004400300045003600360035004400310045004400350041004300320037003600460042003600330039004300420031004400340042003200310039003800300030004200410037003800410042003900440045004400410038004200320034003400310035003700410046003700440035003900390037003400360046003700350036003400360037004600330037003400340045003600450036004600390033004500450036003400340036004400440041003800300032003200350035003100420031003700390036003300330042003100310035003800300041003600340042004600420030003800340037003600340034003600450043004400330037004300310045003000460039003000390035003900390034004500420036003400390038003700340041004100350043003000370041004600350036003500410043004200310044004400350032003800320039003000320034003400430030003600300044003600390034003900300032004100310035003000450030004200320035004500340031003500460037003700380032003700300037003000310045004300460041003200380034003300370042003800340034003300340030004100340043003300380044003100410037003600420035003100300041004300310038004400460042003600460039003800460034003000350030003100450038004500390031004600320037004300330039003000430041004300350031004100300042003700410039004400380036004100390045003900310030004500320036004200350041003000360038003500380035003200360035003400370045003300460038004400370044003000310041004500300044004300350044004100330035003000450043003300380042004200300031004500360033004200360039003100310043004600310038004400360045004400370030004600300030003500410036004300460042003900390039004100350039003500380030004500460044003800350034003900440046003100430046004500340030003800380031003600350042003500390041004300420031004400410045004400410034004200320032004200340034004500460039003700330039003600340033003900340041004400310037003600320038003200410032004500410035003700460036003400380041003500420045004400310045003600410031003400380032003600330037004200330036003700320044003000410043004100350041003900430037003800330032003400320034004400410033004200300037003500360033004300300042004500300045003900410042003400310031004100420032003000440042003100380044004400390037003200330039004600410044003700410042003700460045003000350030004600390033003600340036003100440037004500330045003000430037003900350037003600380046003900420039004500420043003800440044004100340045003300340039004500370030003000320032003900310035003000380030003100310043003700330034004300440042003600370032003300340043003900410041003300380035004500390033004200430038004100310036003500420031003900430033003600330030003100300030003100340041004300440039003500440039004600340038004200300044003700330046004300460044004200460037003400450039004500420037003100450036003500360032003700320031003600420035003500410034003900370045003500450030003600380046003600460031004500410030004600410037004300300037003800330039004600370043003000300038003900330037003000360037003000420038003600370032003900330045004600320039003000330033003500350042004200350038004100440034004400430032003500410042004400310033004300420045003100300037003800430042004200360037003900360036004600310032004400450046003800370046004600310031003300310030003700410043003000340043004600430039003800380037003200300030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073100380038000005430052000007430052004900001543006F007300740061002000520069006300610000825336003000300030003000300030003000440030003800300036003000300030003000300030004100440041003500390045003600330030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100320030003800320045003000460041003100340034003300450035003700300030003000300030003000340041003400390034003400340031003500340033003800380044003600330036003400440030004100450046004600430046003400300030003300430030003400340030004200340033003100390031003800310038003100380031003800430046003500430037004400340041003100330031003700330033004600450046004600460046003900460033003600300036004400460034004200430038004100330038004400430031004500370030003400440035003800360035003600450034004400310043004300360030003100360030003100370046003000460039004100310038003400430042003300350034004300310037003200450046004300390037004200350041003900380043004200430030003300380045003400420032003300340030003000360034004100300031003600450045003400340046004500330032003200330030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073300380034000005430049000007430049005600001B4300F40074006500200064002700490076006F006900720065000181FF36003000300030003000300030003000460030003800300036003000300030003000300030004500300036004400330046003600380030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030004300310045003200450032003700440037003100460043003800300030003000300030003000330035003400390034003400340031003500340033003800380044003600330046004300350045004300460046003000390046003000310030003700360030003000440035004500430041004300300041004300310042003800350035003500360045004400390042004400310033003000430044003100300037003600370045003200440032004300410043003000380034003500330038003600340032003300300036004100460030004100380043003100410033003000360038004600310041003300430041003000300036003000330030003000440037004400330030003800310042003300460037003600440036003800310030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073100390031000005480052000007480052005600000F430072006F006100740069006100008573360030003000300030003000300030004200300038003000360030003000300030003000300037004200460043003700440037004500300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003700300033003100310032003100310045004300370030003600370037003000300030003000300031003100320034003900340034003400310035003400320038003900310042003500390032003300310034004200430033003500300031003400380035004200460042004300330034003200460044003200410031004400320038003000340041003200350032004400410039003100300043003700300045003500320037003000450039003200360033004100460038003200460046004300300035003500360037003700440044003700340044003100430031003500460045003000330046004400300043003100440035003500440043003100440035004100350038004200350032003900370042003600320030004400350032003600420035003900300032003600370039004300340043003500460039003300440041003900370038004100360030004200460037003900430043003300450031004400450036003300460035004600430042003500380032003700460034003000430039004300380039003000390032004100390045003700330033004100460044003500420030004200320031004300450037003700440034003800450035003700330030003400360039004600410033003700450033004400420046003300300042004100320039004200360037003300320046003500340031004400450042003600410039004100420033003600340042004100440039003000440044003600450035003700360046003200430039004200430031004100330038004500440030003700390031003900410043003800420042004400440036004500410037003200330045004300420041003100320030003700310043004200340045004400360037004200380042003600340033003300370038004400350045003900410043004100320032003800420034003300370034004500460042003700440043003600350037003900370033003800460035003000360034003500390032003900300030004600300037003700380038003700430037004200380045003100410036003300450042003100370036003000420035003800410045003800420046003400310042004100380043003900300034003000300031003900360043003800300031003000320036003900390044003900350038004400380033003600450041003200420030003600340037003000320041003000450032003100380046003100330033003600420030003300380035003500420036003700300046003300410038003200420034004500310046004500410030004200410045004400340043003200330030003100390030003500350033004300420035003700330033004400370045004300410039003500420045004100350039003600350035003300440033003200460036004200380032004300300035003200370046004200320042003400380041003700430034004500390044004400380038004400390035004300390039003100330046004600430036003700380031003100390038004200460042003000320030004200450030003100430036004600390035003300430031003700360035003300340037004500380030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073100390032000005430055000007430055004200000943007500620061000084D7360030003000300030003000300030004200300038003000360030003000300030003000300037004200460043003700440037004500300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300043003100450033003100410041004400460031003200330044003000300030003000300030004500420034003900340034003400310035003400320038003900310036003300390043003200410045003500460045004200460039004200430037003900320045003100300031003000420033004600300033003300350030003100450033003700390031003100450044004600460042004600310039003900390031003800350036003700300036004100330033004300430045003600330032003600340046003800430043004300340034003600330044003800330045003100330043003700450037004500380036003700460043003900340039003000430046004600370044004200430031003900310038003900380039003800410038003600380033003000310033003100330030003300430033004200460037004600300043003900430042004100390041003000430044003200430044003600350030004300330043004400360041003600390034003100420043004300430043004300370043003300320030003900320031004300430035004600300042003200370046003100360035004300460032003900450042003200310045004300330035003100450042003200300038003600320046004200430038003200320034003100420043004300430032004300300043003000430030004300300032003200320043004300380041003000420041003700440031003900300033003900420041004300320034004300330041003700370033003500370031003800350045003100440033004100430042004600300038004400380039003800350038003100460039004500310034003300300036004200440034003700440033003100380044004100370038004100440031003900360045004200310030003800390033003600450046003000390046004200370045004600310039003500450043004600350041004300430043003000430034004300310043003100460030004600330044003400350039003000360044004500460046003300460031003900370038004600460046004500360034004200380041003700410043004300370037003000430039003300410038003800430031003800310035003700390030004300310038003100340034003100370041003300380036003300310031003400350030003300350038004300310039003100380031003800410038003900460032004100360038003900310038004500350039003800450042003100430039003300300046003400460030003500380033003000440043003600370031003100410030003800410038003100330030003000300030003000440033004400440034004200370046003000380042004100460046003600410030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073100390036000005430059000007430059005000000D43007900700072007500730000856736003000300030003000300030003000440030003800300036003000300030003000300030004100440041003500390045003600330030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030003900320038003000430037004400360030003000440042003200300030003000300030003100300046003400390034003400340031003500340033003800380044004200350039003300420044003200450030003400350031003100340043003700370046003700370033004500370036004400380046003100350035003400390043003400350037003400330041003700350031004400330032004200420043003800300044004100360042003700380030003000320044003800440034003200450033003100310042004300380031003800380032003800440036003800410034003800320038003300360035003900360043003800380045004300380041003000440031003100430032004300450044004300390044003800460041003300330032003100410037003300370037003800330046003900390035003200370046003700460043004600320043004600330039004500370032004100310031003100310030004100430030003200410034003200460041003600370037003100460032003500340038003300330034004600410032003700370031003100410031003300330037003400460030003800380045003300370035003100410045003000460039003600460042004500330033003300410037003100460035003700370030004200300034003100370034003700420038003800460032003400360034003900310045003200460037003000450037003500360046003000350037003700370043003000460036003700320037004200370032004300350031003200330043003100330039004500450044004100320032004200440042003400380031004300320030004600410045004400330042004600340045004200370044003600450044003200440045003800390044004400330032004200410042003200340035004600410044003100430045003400410043004100310039003600340036003800360044003100460036003700360036003100390039003400330032003800410039003500450039004400430045003200440036003200390046004100370043003800460046003400450035003000360036004600370031003100440036003700370041003000390036004200360034004300410032003800430043003100300030003300360031004400340039003500360041004100330032004500390044003300300043003800360041003100440041004400410035004400410041003800340042003100380037003500340044004100440036003200350043003500450043003900370036003400380031003000380045004100450036004200320043003400430043004500300032003700300044003900420043003600330041004300450043003500330042003200430044003700420033003700380045004500320038004200410042004600360030003300430033004400450030003000300032004200430045004200390030004600390046003100380039003900450039003300450038003400420046004300310042003000410046004200440032003900460034003400300046004100390044004600340033004400380042003600320042003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007320030003300000543005A00000743005A004500001D43007A006500630068002000520065007000750062006C006900630000862736003000300030003000300030003000460030003800300036003000300030003000300030004500300036004400330046003600380030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100340030003400300037003000310032004500430042003200410030003300300030003000300030003100330046003400390034003400340031003500340033003800380044003600330046003000320046003500440046003000450038004400440041003700360046004600460041003900300044003900380035004600370031004500420046003500320044004400460037004400450031003900460042004100390043003200380041003300420032003800430033003000300033004200350030003000330033004100370042003200370044004300330042003700310046004200460031003800440037004500430042004600430043004600300046003400460035003200370030003600310042003700440034003500300036003700360035003600310036003800410030004400360036003400320045003600320043\
-004400390037003100380045004300310032003600370044003100410043003300410031003000420046003700320039003300360039003800390039003500330044003900420045003000310035003900450030004400330044003700310046003000430032004200460037003500430036003400370038004600460046003900310042003800330042003500390045003000320030003300320042003000420033003300350039003000360033003300360031003100330046004300460046004600460033004600430033004100430030004400320037003100390031004300420032003600360033003000390043004200440046003100380034003200430038003300330031003500430038004300300043004400450037004400460041004300360042003000370043004400370030003500380036003900460042004600460046003300320035003800450038004300410033003300330030003300330036003100370035003000370035003600430030003200380045003800350041004600370039004600310038003800350038003100330032003900430030004300350044003000360042004300340034003100390046004100460046004300370038004600460037003000340041003300390046004600390046004600330046003800360039003800350037003900370031003800390032003200450039004500360033003700380042004400460039003100460035003100300036003300330033003000330030003000380045003200330035003500380046004500430037003000370038003600440041003400370030003700310039004200340042004500420045003200360044003600340030003300380043003000360041003300300032003300300033003000330034003300430038003900420041004200300043003500390034004600340046003300330042003000460046004600420034003300420032004100310035003800300044003900360046003800460035003800350041003100450041004400310032003100300036003900330043004600430046004300380033003200310030004100420043003100330045003600460036004600330032004500340033004600330044004300390043003000460044004600370031003700340035003800360043003200300044003100360046004500460044003900440041003100460032004400310032003100300036004100420034004600380046003200390033003600310030003600450042003000450035004300370032003700410046004500420031004600450044003100370045003500460042004600330039003300360041003800360033003200330030003300300033003000300030003000300039003700410033004200430035004200440030003900360045004200450039003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007320030003800000544004B00000744004E004B00000F440065006E006D00610072006B000082A336003000300030003000300030003100310030003800300036003000300030003000300030004400390042003100350043003800330030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310031003600310038003300380039003400450038003200420042003900300030003000300030003000350045003400390034003400340031003500340033003800380044003600330042004300430030003600330046004300390046003000310030003700440030004200430042003600380035003800310034004400350036003800320045003100350035004400460030003200380036004500370046003500350033003700300032003900430033003000410039003800340038003500320033004400360041004600300043003800330030003900380046003100440033004200450039003300330038003900330031004200420037004100350030003100300033003100330030003700310042004300330041004600340037004300460031003800370045004400450037004400340032003900410043003100460046004600460046004600430037003600390033003000320035003800300045003500460033004600450035003300330038003200350032003900370032004600310036003800430045003100420033003500390038003700450030003600300033003000300045004200410034003200360032004400340031003600420041003000330034003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007320036003200000544004A00000744004A004900001144006A00690062006F007500740069000085CF360030003000300030003000300030004600300038003000360030003000300030003000300045003000360044003300460036003800300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300043003100450033003300340034004400310037003300310031003000300030003000300031003200390034003900340034003400310035003400330038003800440041004400440031004300440034004100300032003600310031003400430036004600310042004600450038003800440037003800320046004100450042004400310041003100370035003200390042003600380039003100360044004300320034004400410044003500410044003400340041004100340041003200300046003400380032003200410031003800440031003800320045003400410043003400390043003100340042003100330032003400420034003300310030003900440031004100430037003100390039004200380046004600370036004400330035003000420033003100430035004100390037003900370036003800370046003300460030004500330043003000300039004400350046004100350033003700390046003200410038003300310039003800420038003000340039003900390030003900340035003200330041003400320037003200460033003600430037003000460044004100340046003300450044004300380045003000360030003600460035003000340044003900370042003300430036003900380037003200360046003100410032004300450043004100350033003500420034003300380035003200330034003300450033003400320037003500380031003800340030003400380032003800420043003100410035004300330036003700350034004300350042003000340030003700370042004400310032004400430031003400350036003300340043004500390044004400360034003700390037003300310039004500430042004100390030004300420034003100330043003300450035003700450043003700430044004100310043003200420031004100360044004400350046003600300039003400420030003900380039003000340036003400420033003500300032004300340032003300340033004100350037003100360035003200430038004600350037003200340036004300390037003700320042003200330037004600310037003900370034004100410030003600390031003000380042003400310033003800330043003500330041004300410038003000410043003900360041003800410046004200350031004400350045003700430035003000420033003200420034003500340033003600390035003300340039003900430045003300390034003200410045004600450043003400430038004100320038003500320033003500440030004500350045004200320041003400450041004200420037004300440039004500330039003500430031004100350046003000450044004500300038004500360034003700350038004200420041004400360046003200300044004600450030004100460037004300430033004500310042004200350031004400340045004200420035003700370046003000360036003700360030003400420044003800450043004200350030004500340039003300370046003700390039003300380043003600420046003500310038003000340038004200450035004600360030004500440036003100390042004200360046004500310036003000380045003800450035003000370032004200300036004200350042003300440046003600450038003900390037003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007320031003200000544004D00000744004D004100001144006F006D0069006E006900630061000085C3360030003000300030003000300030004200300038003000360030003000300030003000300037004200460043003700440037004500300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300043003100450033003600330034004200420038003700390045003000300030003000300031003200360034003900340034003400310035003400320038003900310039004400390032003300310034004200340032003600310031003400380036003900460045004600410036004300360042004400370032004200420034003200300036004400360035003400300044003200440031003900420035004400350031003200310034004200350033003600340038004400300031003000340031004400300044003200320032003000340032004500460044003800330036003800360039003700340041003800410031003800360041003000320031004300410036004100410039003200310043003800320039003000340038003700300041003700320038003900380043004100320034003100300044003200390042003800340039004400370044003400300042003500460046004600450030004600420043004300370037003700450043004600430033003700420043004500370039003000350045003900330039003800390034003600430042004400310030004100390046003900370032003500360036003100360042003600370038004500430046003900450032004500380046003900340036003300370038003200410031003700350037003400410038004200360043003000340032003400320041004300310036004300340032003900420042003000380041003900350044003100300038003000380030004300450036003000330035003200350046003300360039003900330038003900430032003100300032003200370042003800450033003300310036004500310032004300320031004600310034003200340032003100440045003600320035003600370032004100320033003300340046003600360033004600380032003700370044003900340041003200350031003300450046004300330030003700310046003700390044004600300036003200390035004500300035004100350039003000440045004500310044004200360039003400450030003100440037003700390030004500390042004100430044003500420037003800390034004500340044003200310033003100370030003700320044003700320045003600300046003200390045003700350035003000390030004500450034004500460038004200340041003400330036003300460042003900300045004600440044003000430038003600460044004300300043003000410046003400310042004400420042003800420041003900460035003500350046003200390042003200420045004100430034004200410042004100350039003400440043003900440045003600390038004400460031003800320034003100440033003900300044004300430035003200330036004300320034003700430045004400380044004200350043004600460033003400320038003200410042004100340043003700460035003700310039003500430039004400390031003400420037003200330033004500350045003300310041004200310042003600420041004600360045003500320034003000430035003600450045003100460036003300420034003800410031003400450046004100320046003700300032003700460041003000330046003100340038003500430039004300450035003600380032003200370034003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007320031003400000544004F00000744004F004D00002544006F006D0069006E006900630061006E002000520065007000750062006C006900630000841F3600300030003000300030003000300045003000380030003600300030003000300030003000320042003300310045004300430044003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900300046003100310030003900320032003800460044004100430037004600410030003000300030003000300042004400340039003400340034003100350034003300380038004400360033003600340044003000340044004600410043004600340030003000300034004300410042003800390036003100430038003000430037003300360034003600300036003000360030003600300037003800330042003600460030004400430033004200330045003200340045003400320035004100310038003900380030003800410041003200300031003300380043003100410030004300300037003800430045003500460044004100420030003900340036003900450042003400320030003100420043003300460037003500460035004600310039004300430046004500370045003600370046003800430034004300430043003900360030004600360045004300320044003600310038003300460046004600460046004600340046004400300045003000390045003500440045004200310038004600450039004500370038004300300032003000460038004600460032004600430033003200350032003500350036003800360032003900420031003000350030003400300044003200360032004100320038004400380039003800390039003100390037004500370044003700430043003200370030004500410043004400350044003000360035004500300045003200450036003200420034003300300033003000420045004500410035004600340030004400300043003500460046003900340045003500310038003300450046003300420031003300310046004300460042004600370039003700450031004600350034004600310036003800360032003300430046003300450031003200330036004600380039003200380030003000390034003100380033004100350037004100430042003100390038003400390033003400320031003800310038003100380031003800310038004100360041004600440041004300460039003000440035004200320038003400410030004300310034003300320046004200390030004400330044003800330030003100340044003800410033004100310037003000350039003000380033004200420030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073200310038000005450043000007450043005500000F450063007500610064006F007200008513360030003000300030003000300030004200300038003000360030003000300030003000300037004200460043003700440037004500300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300042003200450031003800330032003600340041004100320037003000300030003000300030004600410034003900340034003400310035003400320038003900310042003500390033004200440034004100300033003500310031003000380035004200460042004200370042004200440030003900340041003200410038003300390030003100460034003400310031003200310036003000380032003900440030004100420031004200330046003600320035004100430045004400370043003000420034004200320044003700430031003200320031003200300044003800300038003200320031003600430031003400300034003800390033003400360038004300380039003200430044003100450030004200320042004100430036004500430039004600390044004500350041004300340034003700360043004100390039003700330043004500310043004300450033003000320041004500430041004300320034003600340035003000350036003100360041003200300030004600410032004600410030003900370043003900320032004400330035003900430030004100370031004600410033004200350041003100420036004600410046003500370046004500310038004600350039003800310041004200350042004300330041003300420037003800390046003700450041004200300031003400460041003900430031004300310042003000410030004200410045004300380034004200380044003600320037003800310044003100310043003400310036004300420039003500310044004100410035004200380037004400380041003500390030004100370039004200460034004200330045003800440033003500360035003300300034003300340041003600320033004300360045003300320032003100420046003500330035004500450042004100310033003800430035003300360035004100340042004600420039003600430033003500340034003900450036003200450046003500430035004300420046003600440033004600370033004200340044004600430033004300440041004400310033003200350035003000460034003100460033003800420042003600460044003200300046004300410042003200360033003700310030004100300043004600330032003500440045004400460042004100430034003500450031004200410035003600440031004300390033004300330043004400390037003200310039003000370039004500410041003200370032003200300030003700360036003000310033003100410038003200340030003200310034003800390042003200370045003700420041003200450033003500440037004600390030003600360037004100410045004300410045004300340031003700450030003000320030003700370034004400420039003600380036003400370030004500440030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073800310038000005450047000007450047005900000B4500670079007000740000832F360030003000300030003000300030004600300038003000360030003000300030003000300045003000360044003300460036003800300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300043003200340033003200310036003700460039004400460045003000300030003000300030003800310034003900340034003400310035003400330038003800440045004400390033003300310030004100300032003400310031003000300034004100420037003700310037004600310043003200380044003100340033003100310034004100330046004200390042003000460046003100360046003300450034003000330030003100350041003300300035003200330034004600460034003700360038004300380044003900430043003000300044003000450041004500450033003900450030004100410041003100390039004400460032004400450036003800390030004400300030003200330041003800330042004600320032003300330046003300380044004600370042004100380032003300410034003800440039003500350034004600410045004400360045004400380038003200440044003600350030003400310036003300380031004400350045003100330046004500300034004100340032004500460030003200320031003500320034003300370032004600390037003300330039003500360031004300350030004400430041003200420038003400310037003600460037003900430033003800310044003000460031003700370038003900430038003100320037003700340033004400320043003700370042004600430031004300300046004300370039003100330030003500370046003000300031003500450041003100460033004400450031003100390030004300390045003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007320032003200000553005600000753004C005600001745006C002000530061006C007600610064006F00720000831B36003000300030003000300030003000430030003800300036003000300030003000300030003600360046003900340044004300360030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030004300320034003300310038004600370036004300430034003400300030003000300030003000370043003400390034003400340031003500340033003800380044003600330036003400350030003900380046004600390046003800310030003600380030003800390031003600380036003000450034004400380033003100390046004600460046004600460034004600330038003800430046004600370044003600360046003800460041004600310030003900300033003200370039003700300030003000330031003300320042003200460030003300300033003100330030004600340031003200440032004300430034004400380042004500450044004400300031004500300036003200350044003600410037003000430037004600460046004200330033003100420043003600360031003200360036003700300042003000300041004100360038004500430031003600370041004500350043003600360042003800320037004600350039004600450031004400370045004600460046003000430039003200330043003400340036003900320031003200450032003800370045004600460037003800430039004200300046003500450038003600310030003600340036003400360034003600300036003100460036004200330042003000360036003600370036003500310043003200300036003800460041003600360033003900410031004200300043003000300043004100410044003200350032003300360043003400330046004200360045003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007320032003600000547005100000747004E0051000023450071007500610074006F007200690061006C0020004700750069006E006500610000867B3600300030003000300030003000300046003000380030003600300030003000300030003000450030003600440033004600360038003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310031003000430032003400320044003900420037003700390030003000420030003000300030003000310035003400340039003400340034003100350034003300380038004400410044004400300043004400320042003400340035003100310043004300360046003100450046003300390037003300390039004500390034004100430041003100440042004100310036004400430030003600360042003200420030004200340042003400420036003500430037003800360034003600340038003900310032004300320043003800430038004400340032003700360046004500300030003800390035003800340038003200390034004100430034003600450035003600460045003800340035003900340043003400390036004100380036004300340039003000460037003300420032003300330034004400330042003800430037003600360043003800360042003700370041003600450045004100460034004500410037003900450044003300460039003700340043004500320033004100430046003900310031003600350031003900320042003700380033004400460032004500430036004500390034004600330038003700340031004500460036003100380030004400330044004200370031003500320038004600360031004500460036003100380030004500340045004400300034003200390042004200440037003700420031003800320035003400380044004500340043003700320036003500370037003700390030003200300042003200320033003100460035003200440031003000420030004400430035004400460046003300320044004300360036004500340033004500420032004500430044003300380039004300430036003700410046003800350041003300320030004100300039004200410041004100430032003200450034004200380043003100440041004300460034003000320039003100380044004200420044004400300030003300390041004400340046004200350042004100420030003100370038004300450035003500420031003700340042\
-00300043003900450035003500420038004100440039004600360036003900430043003000410045003100460041003600320046003900350037004600380045003600320038003000360042003600430045003300380042003900430046003100360037004500320031003600390046003200330037004400300039003200360046004300320041003700390035004200420041003200460046004300320033004500320039003500380045004600420031003600380033003400460043003000300036003400330032003100390043004300340030003900300033004100320044003400380033004100390044003200450030004100460045003500350038003500310030004200300044003800360031004200430046003400330035004300420039004300360033004400420030003000350034003800320041004300410044003300310042003500390030004400350034003800410035004100360045003500310044004400420032004500410044003600330038003100360032003300450042003600340030004500370034004500350034004200460030003400460044004500420035003900350035003600310037004600320044003200430042003700460039004100430034003200410030003900380038004200410046003100300033004500380044003100360037003100410044003000340037003800320036004200450043004100350030003600320044004600310033004600340031003300390045003300410035004300360033003300380042003100450037003100390030004100320030003200330034003700310042003800430031004400360046003700420038004100300032004200430030003300390043003200420036003600460038004400430033003300310045003300370030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073200330032000005450052000007450052004900000F45007200690074007200650061000085D3360030003000300030003000300030004200300038003000360030003000300030003000300037004200460043003700440037004500300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300043003200340032004100300035003100330030003500410038003000300030003000300031003200410034003900340034003400310035003400320038003900310041004400440032004200440034004100340033003300310031003800430036004600310037004600390032004600330044003100460041003000310034003500330039004100380030003800410032003700350036004100370035003100310041004300320045003700410030003300360045004300350033004200370030003700360046003400340036004200430030004500420037004100320041004200440030004400310032003200300038003600320041003900390042003800330032004400340041004200420032003800410038004500370044003400390033003900330033003800310034004100420042003600350034003600440046003500440039003100320043003200450046004300390031004200320032003200450045003600300041004200360039003200340046004100380041004300310038003200410046003900380034003400360036003000460038003800460038003800410036004200330036003900330046003600460033003400380032003400450043003100350046003800420042004500430032004400320045003200410044003600420043004300410033003400340042003800390036004600380043004100310039004200390041003800300042003800420042003400360035003700430032004600340032004400460034004100380034003000340033004300340030003400330035003800460032003400310030004600330046003500310031003700340045004500440042003400420031004100310034003400380043003500390042004300340032004300430044003300360031003900410038003900460044003900300039003700410033003100340046004100350041003000440042004300440039004100300032003200450037004600440038003000350041003300340042003400340046003100440045004300380033004300300044004600380045004200310036004400380031004100450032004200350034003600300042004500380035004500370035004200390032003600320035003900350032003200430037003700440036003900370043004200310039003400450042003600410036003300450036003000370033003200370046003100440036003600320046003000320031003600390030004100450034004200340043003500350044003800440038003900430046003900430034003100320036003000300041004400340043003400300033003500390042004100330042003600390034004100370039004100430044004400310043004100300034004200440036004600300043003900330030003700430046004200430039004500420042004100380038003500300034004500310035003900460034003800440032003200330041004600360037004600300035004600350041003600450046004200420041003900350039003800330042004200310031003100330039003500460043004100310041003000440045004600340043004400370039003100460043004400350030004100440045003700410038004500440030004500300037004600350043003100410033004400450045003800410037004200430030003100380042003800340039004500360043003500380034003500440030003700320030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073200330033000005450045000007450053005400000F4500730074006F006E0069006100008207360030003000300030003000300030004500300038003000360030003000300030003000300032004200330031004500430043004400300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300043003100370031003700410039003100300032004300380039003000300030003000300030003300370034003900340034003400310035003400330038003800440036003300420034003200410033004400460032003900460038003100300036003800300038003900310036003800360030004500340044003800330035003900440045004400450044004300340046003100330038003300310039003100390031003800310038003400360032003300380046004200360030003600420033004100430035004100420035003800410032003600300036003300330046004500460046004600460037004600330034004600320036003800360042003300300030003000460041004100380030004300300045004600430035003100350032003200330030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073200330031000005450054000007450054004800001145007400680069006F0070006900610000851B360030003000300030003000300030004200300038003000360030003000300030003000300037004200460043003700440037004500300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100310030003000450031003700320037003200430044004600380035003000300030003000300030004600430034003900340034003400310035003400320038003900310042003500390033004200440034004100300033003500310031003000380035004200460034003900360045004400430036003500360031003800440033004600360030003400300034003800360031003800410038004400380032003300360034003900310033003000420043003900320033003500380046003800300041004500390044003200360039004100420039003500440036003300450034003100390045004300330030003700420030004200310031003000420036003100320031003400320031003000340031003400320035003400390045003300320036004500410039003200380044003900420035004300300042004300310046003200440045003600440037003600410041003800310033003900370033004500360043004300390046004400300036004400360042003700320042003000340032003100450041003400300030003200410031003300340041003000340044004300430041003900460033004600310042003800310042003600330037004100390034004500380032004100390031003100390030003800410034003300420038003700360043004100360034003200350043003000390031003100460044004300360034003400300032003300420041003400360045003900430034004100430032003500450039003600460031003900430042003500460042004500370036004200380038003900300045004400390046003700460041003200380033003400460037004400460037004200310043004100460044004600370032003500310045004400390039003100350031004200410033003400300031003800440037003900390032004600340042003400340041003900340046003400410039003100350035004600350034003500310038004400370036004400360039004600360045003500330035004200430032003700330045003100360033004500310042003600410034004100440035003100390033003300390043003600460044003200460034003100450041004400430034003300320033004500410042003100390034003700310031003100370035004300330041004300310033003900370037004600450030003100380032004100360046003500460039003400300045004600460039003000410036004600330039003300330031003300420046003100430045004400350041003500370041004300340035003100380039003400420037003000310044003800390039004200430032003300350039004100450043003200380041003000300034003400360042003600410044003100350042003100360045003800420046004500350046003600320030004200460037004600390035003400380044003100420036003900340036004300350034003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007320033003800000546004B00000746004C004B000037460061006C006B006C0061006E0064002000490073006C0061006E0064007300200028004D0061006C00760069006E0061007300290000886B3600300030003000300030003000300042003000380030003600300030003000300030003000370042004600430037004400370045003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310030003100330031004400310031003100350035004100450032003100450030003000300030003000310044003000340039003400340034003100350034003200380039003100420035003900300034004600340038003900330037003100310038004300370033004600450046004500460044003500320039003500360038003400330036004400450046004500300038003900350036004400330041003900300030004500430036003600420033003100420030004300440041003200430032004200430037003400320039004600330039003000420033003800330044003900360035003600390041003700300045003500320038003700300045003400310044003400410035003400420034003900350031003100310044003900360031003000420033004100340039004600340038003700450038003100320034003100330031003100390033004100300034003400310032003600380036004300330043003100390036004500330034003500390037004200450042004300450042004400440042004200420037004400420031004200450046004100390033003100450038003300390033004400330043004400460045003700460042003700390031004500420045004400320046004300450044003700420042003600450043003000460037003000460037004100330034003600320043003900360032003000370041003500390032003500460032003700430039003400350037003200330034004600370039004600340033003200340039004200340042004600390035003200420041004100300037004400390031004600410030003700330045003800310044004400350039003600440034004400450037004500430042003800450046003400420034003700300043003100360037003500310031004600330041004300390037004300340036003600370046004600370030003900380044003500430039004200370030003400330036004400320043003800360044003300450039004500430043003900340039003800390045003400450039003100340045004600460041004300310045004200430041003000410041004200360036004200360032003500390045003800370033003700330033003400370035003700350038003100320043004200420041003400430045004100340045004100460034003600370041004500460037003700330042004100460037003200300046003100440039003000440030004300340042004300320042003300390041003200330033003500460035004400390044003100450042003700450038003400300037003900300032003400300039004100460037003700330042003800410035003100410030004400450042004200300042003700440046004300310041004300440044003100330031004300430034004400390044004600430034004100390045003300350042003100300033004400420042003600320031004200390045004300310038003500370042003400330032003200370046004300310045003200320043003100300045004200320039004100430045004600390033004200330039004400370031003300370035004600310038003200430032003400340035004600300042004400360044003200320032003000460036003600300035003600320034004600320033003900370038003000460042003000390039004200380032004200310038004400380039004200450036004500310041003900370031003600370039003900360033003400350044003400360043003300410043003700300045003300430044003700420033003600370046003600460044003100320030003000300044004200450037003000360038003700310041004600320033004300380045003600370039003900460043003900300041003500350043004100450037003000460043003900380034003400340046004500460034003500360036003500320033003900420045003200360033003200430034003600320038003200430031004300310041003300380034004600370036003900320045004500330042003900360030003200420041003700300045003100380033003400310035003300350044003600380034004300320037003700410035003800440038003700410046004200460046004300430044003100380041004500420041003300330041004500420032004300450030004500370037003300330031003000420032003300310032004100440030003600430041004500460033003200320041003100460030003600390045004100390042004100330038004200350041004100300030003000330037003400370038003300360034003400410037004200350031004300430032003200430042004100320038003300360038004400380046004400350046003400440036003000320031003200340034004100430035003200430034003700370036004600450034003200440045003700440039003800340033003500420030004200350038003900360038003100310030003900320042003300350033003700330031003400460046003300430046004500330046004100300030003000370046003000300037003100310036004100310038003400430033003500320046003900430036003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007320033003400000546004F000007460052004F00001B4600610072006F0065002000490073006C0061006E00640073000082C736003000300030003000300030003100300030003800300036003000300030003000300030003100320045004400380046003200360030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100350030003100300041003300390030004400310030003400390035004500300030003000300030003000360037003400390034003400340031003500340033003800380044003600330046003800380046003000330033003000310034003100440046004200460046003500450035004200460037004600460037004200360044004400440046004600300043003400350043003700370030003200390043003300300039003900380031003800360038003000340034003600300044004100360042004400430031003200430038004300430035004300370038003900350032003400380041004300330041004200380046004100460037004400410042004100460046004300390037003100310031003200310034003000420033004100300036003000360034003200380033004100380036004400330043003500450046003700370041003600330033003300300033003000330030003300300030003800420041004300460032003400440039003600300039003600460046004200440039003600440038003600440034003400300042003500330035004300450041003700300038003100410031003900370044004300340036003000440038003600300033003000300033003600310046003500460038004200410046003700300030003300420031003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007320034003200000546004A00000746004A0049000009460069006A00690000888336003000300030003000300030003000420030003800300036003000300030003000300030003700420046004300370044003700450030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030004300320034003200360030004300410035003400390038003300300030003000300030003100440036003400390034003400340031003500340032003800390031004100440039003000340042003600380031003300350031003100340038003600420046003900420034004300330034003600360031003200390033003800360034003600340037004100440034003900320043003600320041003500350032003400310041004200410032003100340041003900310035003000350031003700410044003000410036004100420042003500300034003100460030003800350044003400420044003000350035004400420038003100300032003900310036004400430034003900370031003500310046003100300031003700350041003100340038004100420036004500370043004100430034003500310037004200360039003800350038004100390044003500320045004100340030004500330031004200350039004100380043003300340043003900430034004300430036003400350043003800380044003500380042003100350034003200460031004400420044004300430033003300390045003700460046004500460045003100310037003600460037004100360045003300380041003200330036004300360043003500450037003500460042003900460044003300300034003900450037004400450033003500310043004500440045004400410036004500460035003400310037003500370030003600340036003300380044004400420034003800340031003300370035004600330031003100420035003300310032004500340043003100410035003400380041003600420043004600310033003800330042004200430046003200360033003800410037004500350031003800420044003700360038003000450036003400440037003100300030004200360044003700340037003100380033003900420039003900320043004500440036004400350046003400350039003100410042004200410046003200360032004100330036003000350031003000450046004200360031004400370036004600450036004300330038004200360038004400390039003100430043003300440042004200300030004100450031003700360034004200430042004500370033004200460036004300460044003400350035004500390034003900430032004200390032004300340032003300380032003800340041003800390042003400320037003400320034003600350042003300430033003300350037004400450033003700420037003200300038003400410030003300410045003400360033003500310045003100310042003900450046003000340032004300430033003300330044003000340038004600420037003600330045003500380042003700430039004100460038004300320036003700430046003000320031004300340037004600410039004600310044004400390032003100310041003900370046003700450033003800430046003900420031003700330036004500350045004400380038004400330043004400300038004500460043003800450041003200330046003100460032003200440036004200300030003200350046004300390045003400460032004200380043003300410035003000460030004100300030004400440041003300330036003500440045003300310045003700430045004200450042003800390041004100320045003100450045003900390036003600340039004300380041003400360042003900310033003300460043004200370034004200320038003900350042003600440043003700430038003600430044004500320030003600370044004300310036003200450037003000320046004100310044003300390031003300300037003900390043004200370039003900310032003600350035003200410044004200420039003800310032003600350035004500450041003600390044004100300037004400450037003200440044004200370038004300320044003700350034003100340039003500380039004400420032004400380033003700350043003800320043004300330034003800370035004500430046003200330046003200350031003800450034004400310039003000430046003900300031003500380041004200460044003700430043004200430030004300440039004100380044003000300041004300410042003500390030004100380030003400450030004500440044004500460039003500380034003800360041003600410032004200360045004300410034004600380046003400310035004500410035003600330046003800310041003100450046004600320043003500430043003900310036003100360046003100430042003300360038004500310030004100410038003100380030003500420038003100460038003800340042003700330037003100420030003700370044003000390039003500440035004100310039004300310034004300310036004100330032004100460034003500370037004600430045003100370046004600360032003300360044003300460046003600320046004300320046003700450030003000440035003200320039003700370036003300460045004400320036003900360030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073200340036000005460049000007460049004E00000F460069006E006C0061006E00640000833736003000300030003000300030003000440030003800300036003000300030003000300030004100440041003500390045003600330030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030004300300036003200300034003200370034004100410039003600300030003000300030003000380033003400390034003400340031003500340033003800380044003600330046004300460046004600460046004600370046003000360032004300340030004400450036004600300032004300330041003300310037003100460031003900310038003100380031003800310038003600430030004300450034003100380030004500430046003400410043003400410036003000430032003700360030003200320034003900460035004200300033003600390038003600350043004600410039003700420035003800320035003700450046004300460041003000330036003700370046004600380046004300380033003000310039003700330041003500430038003000390031004300310042003400300031003600420045003400350031003000410038003600350045003100380033003300450045003300450037003900310037003600420035003000340034004400370041004400360033003700380046003500450045003200420030003300300033003000330030003300\
-380033003800450042003200310038003400330037004600410031003300420034003900300036004200330042003800390038003200390036003100390035004500300036003000360033003800310042003300300035003700380033003900310038003700300041003900430033003000350038003600350045003100380044003300430043003600300030003000390039004100320032003100320043003100430030003300300039003100460030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073200350030000005460052000007460052004100000D4600720061006E00630065000081F73600300030003000300030003000300046003000380030003600300030003000300030003000450030003600440033004600360038003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310037003100300032003200310044004400420041003300300032004500390030003000300030003000300033003300340039003400340034003100350034003300380038004400360033003600340035003000360042004600380043004600380030003000330032004300450044003000390036003200380038004600320044003500430035003200450042003900370045003300330030003300340033003700360031003100320045004100440030004300340043003300380036003500320038003000340041003300300036003800460031004100330043003600410046003000410038004300310030003300360041003300300030003000460044003400350030003600350039003000330046003300310032003700330030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073200350034000005470046000007470055004600001B4600720065006E0063006800200047007500690061006E0061000007320035003800000550004600000750005900460000214600720065006E0063006800200050006F006C0079006E0065007300690061000085233600300030003000300030003000300046003000380030003600300030003000300030003000450030003600440033004600360038003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310030003100360033003800320043004100330030004100420043003000330030003000300030003000300046004500340039003400340034003100350034003300380038004400450044003900340033004600340042003400320035003100310038004300360037004600450037003900430038004200430038003300350038003900350030003400390042003800380031003000380036003600350033004400340045003800440038004500300032003700460030003000420030003400450031004500430032003700310030004400420044004200460041003000300034004400320044003200450033003500420038003300410030004100340035003100300030003900340031003400420043003400380044003400300031003100320044003200340046004300350033004400430046003200440045004400330044003400450041003800390045003200360043003300440046003300460042004600430037003800370039003700380039004600350037004400430041004300310035003300350031003600320034003600440034003000410044003800320039004400460035003500410044003500300041003500380036003800410044004300440031003900340046003700430043003600310037004400370043003400330037003300440035004300360046003000420045003200360039004100330043003500330031003400450030004300330041003400430032004600340046003700390036004400320046003400380045004500360036003000380044003300340033003900320045003500330041004100430031003600390036004400410030004300310039003600420037003800360038003300320042003800340046004300310038004100430042004300370036003800430041004600330045003300300036004400430031004500460046003700310045003300450038003100330045003600340033003200360042003300320043004100320035003400340032003200410034003900450043004100450030004200420033003300450045003800310030003800340046004100320035003500380043003600330038003700390041004600390033003100420039004600460031004400320046003500350031003600310034003000450032003000440041004500380032003000360030003700340042004100300036003600330030004200300035004400460034003300380046003700430042003000340035003200410031004100320030003800340037004300300046004500340045004300450036003400460042004400390035003500460034003400360037003300350041003900440032003700340030003500330044003900430042003900330034004400420039003600360037003000460046004600300043003800340041004100350043003500460046004100460046003800440036003100370045004400350043003400450034003900360042003300460045003700390045003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007320036003000000554004600000741005400460000374600720065006E0063006800200053006F00750074006800650072006E0020005400650072007200690074006F00720069006500730000073200360036000005470041000007470041004200000B4700610062006F006E000082233600300030003000300030003000310031003000380030003600300030003000300030003000440039004200310035004300380033003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310031003000430032003400320034004500320041004200320038004100460030003000300030003000300033004500340039003400340034003100350034003300380038004400360033003600340039003800390037004600300039004600380031003000360038003000380039003100360038003600380045003100410038004300300032003500380037003200430034003100450031004300410037003800350043003100380043003700460032004500380041003800440041003600380041003200310036004100330030003400420044003400430036004100390033003400340039003100350032004300340046003300450034004200350041004400320043003200450030004100310031003700430036003400330043004600360030003000300045003800380033003000420042004600430046003800440036004300440035003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007320037003000000547004D00000747004D004200000D470061006D0062006900610000821736003000300030003000300030003000460030003800300036003000300030003000300030004500300036004400330046003600380030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030003400320044003300410043003700370035004600460033004400300030003000300030003000330042003400390034003400340031003500340033003800380044003600330042004300320034003600300046003200390046003800310030003600380030003800390031003600380036003800450031004100380043003000320031003800360046003300450046004500460032003800380032003600300036003300330042003800360046003100420034004400310035003000430030004300300043003000430030004300380043003900460042004600460046004200450034003600310033003800330038003500440036003600410038004600380036004600310031003000330035003100380030003000420042004200380030004400360031004200440036004500420039003200320030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073200360038000005470045000007470045004F00000F470065006F0072006700690061000083DF36003000300030003000300030003000460030003800300036003000300030003000300030004500300036004400330046003600380030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030004100320038003100370046003500340033003700410030003700300030003000300030003000410044003400390034003400340031003500340033003800380044003600330046003800340046003000340046003800440032003300460045003700460046003000420034003100440044004600460032004600300034003700350046004600370046004500390039004600340033003800430039003600460046003400430030004300360038004500300043003700390041003600440030004300370046003600450044004600340037003100370043003600300039004600450044004300420045004300460046003000360033004300440033003600300043003700310031003400380033003700460041004300440042004300310046003000360044004600410031003200380036003100460038004200440037003300310046004300370044004600380039003400410030004100310037004600310046003300450036003500460038004200310037003800310044003400340043004600420041003100440042003800300044004100360032003600360030003400310045003600370030003000340037003900330030003300300046004300460042004300370043003000410032004100460043003900430030003200430032004600340044003500300033003300420033004200430033003400300033003400370036004300310030003000330038004200390045003200360034003400320046003200450038003300310039003100380031003800310038003300380034003200420043003400380037003300390039004100410032003200300033003800420041004100320032003800360033003800450033003000420034003100440044004600460032003400390039003400340032003400410030003500390031003800440033004300430036003000380036004400310030004300380032004400350036003000360041003800320041003100390037003400310030003000370038004500420045004500330033004600450030003900330042003700340030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073200370036000005440045000007440045005500000F4700650072006D0061006E0079000081F336003000300030003000300030003000440030003800300036003000300030003000300030004100440041003500390045003600330030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310031003300330033003100340044003600380042003700380044003800300030003000300030003000330032003400390034003400340031003500340033003800380044003600330036003400360030003600300046003800430046003400300030003300430030003400340030004200340033003800370041003600430031003200430037004200310039003100380038004500440033004300320036003000430036004200420041003300390031003000370030003500320043004600430039003100330034003000410045003300460046004500370034003600430033003900380043003600300036003000330030003000380042004100320030003800370036003600360037003700340035004200440030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073200380038000005470048000007470048004100000B4700680061006E0061000083A736003000300030003000300030003000460030003800300036003000300030003000300030004500300036004400330046003600380030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310031003000300041003300350039003600320030003500420036003500300030003000300030003000390046003400390034003400340031003500340033003800380044003600330033004300320037004100380046003600390046003800310030003600380030003800390031003600380036003800450031004100380043003000320031003800460046003500430031003400320033003200410046003200360045004400430046004600430042004300300043003000430030004300300041003000410031004300380034004300390034004300310030003400350044004600430045003300450037003700460038003600460037003900460046004500330033004100430044004100460031003800330036003100440035003800450031004600300043004500460033004600460044003600370046003800460031003900330042003000350042003500380030003800320039004600380046004100460044003300460034003300360032004300440032003700380036003600440038003700370046003300310033003000330030003300300033003000390043004200390046004100390042003600310037004500300042003100460030003300300037003300420032003300350045003700440034003400300035004300350041003300450037003700460031003900440034003700440044004500330032003300300033003000330030003300300044004300440043003200320043004300320030003200370034003900330038003300380030003800420041003900380038003100380031003800310045003100440032004100440033004600300043003800370031003600300041004300320044003900430034003100380043004300430038003900300036004400330046003900410046003300380036004100380043003100300030004300340041003400330034004500430046003600300035003200360042003600300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000732003900320000054700490000074700490042000013470069006200720061006C00740061007200008573360030003000300030003000300030004200300038003000360030003000300030003000300037004200460043003700440037004500300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003000310033003200460032003900440030003200380030004500460031003000300030003000300031003100320034003900340034003400310035003400320038003900310042003500390033004200310034004100430033003500300031003800380035004200460044004200440038003600300039004200390032003200300044003800320036004200350030003800380041003000380032004500460041003000380038003200430046004100310042003300390042003600460041003500410046003600310031003100420041003700360037003200450042004300350031003600340042003000320038004400330035004200340030004400440045004100360032003900410036004400370044003500320035003400440041003800370038004400360046004600390043003800460033003300390043003500460036003800410044003300350046004600410030004200440032003200430033004500420045003300310033004200310037004300360033004600340046004300380032003100300038003200390033003900420036004200450043004600330033003300320045004500460036004500460046003000360034004500460043003000300044003500450044004100310038003200380030003600410044003500340034003700350037004200350034003600420046004200380035003800440032004200440042003800450045004200340039003400380032003400380037004600340033003700320039003500460035003600310044004400350041003800440033004400460041003400340034003700320043003800370041003100320045004500440045004400380046003400350043003400450034003700360033003800450041003600330033003000450033004200430037003000300037004300460038003300450033003500370033003800430045003900420039004200420038003300300031004100340039003400380034003700450034003000330038003900300030003800410030003800350043003000340044003900360035004300310034004500340042003600380032003300330041003500350038004200350033004400410032004600390030004300440035003100340030003800320030003900410036004100390043004200360034003700410036003100340038003600360035004500350036003600340035003700380046004600390030003300420042003700320043004600420032003600390045003200440035003800430036003000420035003400450042003900330037003900390036004400310038003900350043004500410042003600380033003700440045003000360030003100380046003900420044004300340038003000340036004100390031004400340046004100460033003400320043004100300046003900320045004300410044003800420037004100460045003200420037003100320030003700430034004100410046004300320046003900350030003600440033004400300035003400440032003700320036004400300031003700450030003000420032003900390036003700320035003100450046003500380031003000460030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073300300030000005470052000007470052004300000D4700720065006500630065000084B73600300030003000300030003000300046003000380030003600300030003000300030003000450030003600440033004600360038003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310031003000430032003400320032003000420043003800380044003900410030003000300030003000300045003300340039003400340034003100350034003300380038004400360033003100340039003000450046004600410043004600300030003000350034003700420036003200370042004500390037003900340045003000360031003500350033003600390043004300430043003300340030003200310036003000340031004500360037004300460045004600320034003300390030004600460033004200310042003800410030003200320037003500420030003500300036003300450033004500370036003900320030004300360035003600360036003200460041004300360034003200340038003500310037003300420035003000330038003300390036003800360032003800340039003000360033003300330030003300300037003000330031004500450033003900370030004600460043004400450037003200460033004600380035003100390031003800310038003100380036004300320044004500350031003800420038003300380035003900310038003700360045004500420042003000370035003700420031004600460046003000300033003800360034004600390046003700460039003200450043003600320043003600460046004600460046004600460046004300370041003700430038004400410036003300300031004300330042003500310042004100460034003900370035003300310030003300320033003700320045003400360044003500460031004400430039003200300032003300430044004300370041003000360042003300350031003300410045004500300045003800380045003000340037003200380032003800320038003100360030003100380045004600330042004600430038003000450031004400360044004400370037003200340031003900430041004300420043003300460045003900360041003000430031004200350041004400300037003400380033003200310034003000410038003400300039003400360031004500330039003800300039003700380037004600440032004400430031004300380032003300310037004100300034003400310045003300350030003100340042004200300041004600450036004200370042004600460046004600450037003100350031004400330035003000410032004400320033003100420039003800300033003100330039003600370046003300350037003900410042003800390038003500360036003100300043003000300046004100310032003500350033003900460036003900360042004400390043003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007330030003400000547004C000007470052004C00001347007200650065006E006C0061006E0064000085EF360030003000300030003000300030004600300038003000360030003000300030003000300045003000360044003300460036003800300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390030004600310031003000410033003800350039003900350036004400340033003000300030003000300031003300310034003900340034003400310035003400330038003800440036003300460043004600460046004600460046003700460030003600310041003000300032003600350041003100380043004100430030004300300043003000430030003800320034004200450032004500460038003700340046003000430039004600370036003100450036003500460038004600440045004300310035003000330038004200390038003100300030003300390046003800420031003500300033003800420042003800330030003600350030003600420046003500460042003600390035004500310036003900350039003000460043003300440046003800460039004600450031003600320034004300390043004500430030004300450032004400350045003900300043003600320046003900370031003400340031003900430043003800380031004500430036003100460033003700450045003600330037003800310030003500420043004500430030003800300032003300450038004100350033004200380042003100390034003400420032003200320034003900330033004600380046004600440046003700460030004300440037003700350037004300310039003700450033004600370039003800390035003300300033003100330030004600310037003800330044003600430044003600440030004300430043003700430033004300370038003000440034003600380039004200430045004600310037004100450045003300330035003900340038003100380031003800310045003100440046003900370036004600300043003500460030004500390043003200320045004300450032003000460033004200300046003100460038003000360042003700410046003700350039004600300033004600430033003700460037003900380032004200410046004500460044003700440043004500320043003200320038003800440037003000350038004300310037003700380038004300450031003400310043003100360035004100430043004400410030003700410036003000320031003400310037003300310046003400340039003700330031003700430044004300420034003000460041004600310041003900410030003500300035003800410043003100460046004600460046004500360033003700380035004100440031003800420033003300340035003300300033003000330030003300300033004300360046003900450043004500460030004600370044003300310037004400320030004300360036003600300038003000320034004200370034003700310039003000440032003800360039003900380038003100380031003800310045003100440046004600370039004600300043004300460036004200320036003300310042004300390039004200360039004300410030004100310030004300300043003600380036003100380043003000430039003800300035004600\
-38003100380046003800440043004100440031003900350038004100350043003400310038004600450042004300370041004300370046003000360039004300460033003100380036003300460032004600440046003100320036003500320038003500450038003300320039003000350033003400320042003800340030003000320030004100330037004600440042003400360037003600380044004500420030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073300300038000005470044000007470052004400000F4700720065006E006100640061000088FF360030003000300030003000300030004400300038003000360030003000300030003000300041004400410035003900450036003300300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300043003200340032003000450035004300360045004300420036003000300030003000300031004600350034003900340034003400310035003400330038003800440039003500390033003400440036004600350032003500310031003000380036003900460037003300450031003100360032003200440030004600320038004400390034003600450031004100320043003800390039003100460041003800310035003100420042003700350038003700380044003300360041003400320042003700370036004500460041003200460035004300310030003100360046004500300046003500440039004200310038003100320039003300430041003500410032004200320031003200360041004400330031003900300036003800440041003100300031003700440036003100410036004600380031004400450044004100340030003800350034004200330039003200450030004500340035003200390031003500370034003300360045003700320034003300330046003300430043003300420039003300310039004200310045003500340042003400380043004500390038004400300032003000390030003600390037003300350030003900380045003200410034003200350030003000370030003500440045004200300032004400300046004300360030003000370043003000370036003400310045003200340042003700370041003800450037003100440043003800440045003500390030003200440038003000310044004100420041003400360045003300380036003100440032003100370045004400370042003000440043003900320046004100350035003100440032003900460042004500300041003000410036004300300034004500390042003200410032004500320034003600440033003700440034003600450045003900380033003100430032003900300035004600450046003700350044003100430035003600340046003800310042004600340043003300420043003900440045003800440039003300340044004500450042003000330041004600370031004400340044003800430033003400330031004400360037004100350032004600300036003200330037003400320041004500420032003400300041004500350041004500350035003200420044004100350043003000300030003100460037004600420038003700380035003800420043004300450041003200460037003800380035004300370032003800370030003700420033003000360034003200380043003000370034004100300039003200460046003700430032003600340032004200300042003900340034004400430046004500380032003800460045004200340042003200450039003600310037003500320033004300350034004400460046003200310044003900360034003900350045003500410038004400310039003700440035003000460035003000310033003600310046004400350042003900380035004300320035004300450036003600360033004500360044004300410032003000330046003000390044003800300038003900350044003400380044004500440036003700430030003000360043003300360036003600350038003700390039004400360032003200390036003800460032004300340042003500430044004400430033003300300042003800300044004400340037003300410038004600390042003000390034004100330035004500460044003800360045004200340044003300340046004400430044004400450032004500390039003500330032003200390046004600450031003500300034003000410039004500360041003500390030003000460031003300350039003300420032003600420032003700360034004300320031003100460039004500300038003100440035003200420043004200450031003700450032004100300041003100460033004100390045003500310045003000410035003800300041003900410041003400330033003000360046004200430046003100440030003000410034003300330030003600360046003900410044004500380039004600300030003100440038004200340037003400350045003500390041003100380031003600330036003400430036004200370044003500330033004100460033003500440039004100300046003400450046003300330033004500420035004200460036004500380035003300360031004300420037003100430033003500420038003700370044003100390038004200430031003500390037004100370039004200460046004200440043003700340032004300300034004100430043004500300046004500450043004600450036003000380046003000370042004500320044003500460034003200390045004200440033004300430044003000360038003100340034003000370046003300420033003100440045004200410037003900320045004100380039004100390039003300330045004600410041004100420034004500380043004500310045004400450046003900320045004600350045004400320039003700410032003700300041003300360037003200370039003000450041004200340037004600340035004400360037003400380034004400320038004400360043003100350045003100340034003800340042003600350042003900310036003100350044003800350035003500360043003500380035003000450043003100370030003000370035004200460031004600430032004200460041003000350038003400340042004300360031003000360037003500320032004500370038003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007330031003200000547005000000747004C0050000015470075006100640065006C006F0075007000650000073300310036000005470055000007470055004D0000094700750061006D000084AB36003000300030003000300030003000440030003800300036003000300030003000300030004100440041003500390045003600330030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100300031003700300046003000350037003000370044004500450036004300300030003000300030003000450030003400390034003400340031003500340033003800380044003600330042004300360041004500310046003100390046003800310030003600380030003800350038003100380031003800310043003100350035004200340039003000450031003000420031003300330042003500350030004300450034004600390046003700390033003600310046003700450042003700450038003800430031003900460031003900440039003100390033004500330033003700320035003000430035004500300046004600380043003100300039004100380039003500380030004400430045003400430030004600310039004400430035003900310045003100300036004400300031003500310030003600310042003300330042004500360034003900300046003200310036003600370045003000460035003100340036003100420030003600340037004300340032003300440038003300460044004200340037004600330032003300430036003600460042004300450046003000390039004500390032003700380033003900460031003600370031003700310043004400340032003900340032003200320031003100310030003600380037004600460034003200300043004400430037004600440045003300320030003800430041003700320033003200330030003500430041003500390032004300310039003700420036004100450036003300460038004100460032003900430042004600300046003300440042003100390030003600420035004400460033004300300043003000430030004300450039003000340046003500310030003100350031003400300046003800350030004400310039003600340038003500460037003300320041003400460041003900450036003100330038004600390043003300390032003100380032004400430034004200390046003800430034003200460036004400300036004500310044004200390045003000430042003700360046003700410033003000310043004600410041004400340037003300440038003300310039003100380031003800310038004200360037004500320033004300450041003500320038003000360046003300460045004600460043003900430030003400380041003500380043004300440046003300460046003200370030003300300033003000330030003300300033003200330041004400430041003000410030003000340045003300320033003900420035003200370035003300380046003700300030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073300320030000005470054000007470054004D000013470075006100740065006D0061006C0061000084673600300030003000300030003000300045003000380030003600300030003000300030003000320042003300310045004300430044003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310033003100310030003300300044004300340032004200460041003000450030003000300030003000300043004600340039003400340034003100350034003300380038004400440044004400320043004200300041003000310036003100310038004300360046003100460046004300430033003800390036003400330035003800320038003100370038003100420035003700320033004200410045004300300030003500350038004200390030003000350037004100300045003400330041003200430031003400320036003200420035003200320034004500350035003400300045003200310038003700420031004600300045003900390042004500310030003600360038004100360043003600360032004600320036004300390046004100370044004600450036003700440039003500360041003700370046004400450032003400420034004100420039003700340032003700310035004600360031003700330045003700350042004400380044004400310036003900410044004100450031004600330042003000300046003500350042004500310033003600370046003000430030004200370031004500370037004500350041003200300041003500460043003000440032004300320044003400390035003300360046004600320037004300450043003600390030004600360042003300340046003400330041004400320042003200430037003600440045003100410044004200310032003500390033004300430032003000300045003700330042003200420031003300430036003800330033003700360043003600430045003300440039004300300038003200370031003800380043004200420032004300380046003800320038003900420038003700310033003900340038004500320041003100420038003700420033003800310032003800380037003000390039003400450039003900430038003300450030004200370033004300440037003900420034003200310031004100380043004400410043003200330045004400420030003500350030003200390044003700330031003200440031003300350035003500310035003000380041004300450045004500450044003000380030003600440030003500340043004400450039003100340046003000430032003100460037004200300036003700450030003300350032004600410034003700420032003300360045003200320046003500370030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073800330031000005470047000007470047005900001147007500650072006E007300650079000085773600300030003000300030003000300046003000380030003600300030003000300030003000450030003600440033004600360038003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310035003000310030004300300031003700330034003800350036003400360030003000300030003000310031003300340039003400340034003100350034003300380038004400420035003900340042004600340041003000330034003100310030004300360037004600330042004200370031004300360038004400340045003000390046003200450042003500380044004100300034003500360041004600310031003100380032003600300045003300340033004400380041003800380044003900350038003500390035003800440044004100350041003600410041004600380044004300460036003000360033003900330033003200340044004500410038003000300038003000410045004100390039003800340037003800420037003600420031003100380044003300390046003600450030003000360033003900420046003600410039003600390044003600460045003600390042003900390039004400330035004400450037004200340046003000390039004500330037003700370034003800330042003500440030003000450043004400410032004100430042004600370042003700360035003100340036004300410039003000370034003000450034003900300034003600330036004200310033003500440030003000350037003600340032004500440045003800310044003800300043003100410035003500340031003800440038003400330044003600380042003200360042003600300036004200410046003400370046003800300031004400350043004400460039003400330041004100350039004400320045003700310045004200440037004400360037003000430043004500330045003200370041003500300039004300440044004600380043003400420044003400380041004500450043004400390038003300300034003000430046003400430046004500360041003600440038003200300038004400380043004600340032003100300045003100350031003700360035004200330043004400310031003300330037004200340039004100310039003200460041004400360033003000370037003100450035004500440035004600340038003100440033003700360043004300450042004600360034004100350045004600310036003100300032004400450044003300330046003900460030004600310034003100370038004100350042004200380033003800320045004200430039003800430036004400420046004500300039004500450036003900330043003600370044003700380042003000380033003800420042003200310043003700360038003300370032004600360045004200350030003100310038004400440033003500350035003900420046003700370046004300460034004400450035003600350032003000460041004500390041003500410039003300320042003000330038003300450034004500430037003400330039003300410035003200410046004600380041003400430037003000440046003200420032004400370035003500440046003700420045003000300035003400310033003500370030003800360035004200420042004400380035003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007330032003400000547004E000007470049004E00000D4700750069006E006500610000820F360030003000300030003000300030004600300038003000360030003000300030003000300045003000360044003300460036003800300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300030003000460033003700310039003700460036004400370043003000300030003000300030003300390034003900340034003400310035003400330038003800440036003300330043003200370041003800460036003900460030003100300037003500300035004600460030004600390031003800420042004300320035004600320042003600430037003200330044003800460039003500380045003500350033004300440030004300300032004100430037004300300043003000430030004300300038003400340042003800320035003200330030003600410046003000410038004300310041003300300036003800460031004100330043004100300030003600300033003000300043003100450046003000410031003100460042004400430038003600460039003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007360032003400000547005700000747004E004200001B4700750069006E00650061002D0042006900730073006100750001839736003000300030003000300030003000420030003800300036003000300030003000300030003700420046004300370044003700450030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100340030003200300037003000460043004400460045003700420042003600300030003000300030003000390042003400390034003400340031003500340032003800390031003600330033004300320037004100380046003600390046003000310030003700350030003500460046003000460039003100380042004200430032003500460032004200350043004600320046003800300030003100330033003900390041003000360038004600430031003500460031003900460045003500310044003700450030004600460030004300300043003000430031004600460045004600460036003500360038004600390046004100390032004500310046004400460046004200460030004300330046003100390037003000300036003300420044003100380030003800350038003100380031003800310038003100390031003800310038003100360031004400440043004600380046003000430042004200370045003700440036003600370038004600430045004600330037004300330030004300310045003100390030003600370036003400360034003600380036003000390046003700430034004400460044004600360034003600300033004400340038004200360043003100300043003000430030004300300043004600410032004300310043003000430043003900310043004300320030004300320043003800430030004300300043003300430038004300390030003100300039004100460042003400330035003800460030004400450035004200330036004200320035003200300035004400430036003000360033003100360032004500300036003600330031003600320045003700320043004300430030003000410038003600370038003700320041003300320036003000300030003000340033003700300032003500320043003200360046004100350035003100310030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073300320038000005470059000007470055005900000D47007500790061006E00610000878736003000300030003000300030003000440030003800300036003000300030003000300030004100440041003500390045003600330030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100300031003600330039003100300039003500370045004600310043003500300030003000300030003100390037003400390034003400340031003500340033003800380044004200350039003400340031003400380035003300370031003100430043003700330046003600460042004500320044004100370033004500420031003300430033003900390034003000430043003200380032003600300030003700390033003700360039003500330031003300410037003400310030003300440038003800330042004100350032003000390044004200410038003800300036003300420031003400440032004400310039004200380037003400380030004600440031004100390034003300320043003100380038003200420041003900330039004400410034003900360036004300360033003200410041004500460030003900320031004100440033003000370039004200430046003500360036004300320043004400460037003800450046004600440042004400410034004100340041004600420036003200350046004100330044003700460046003900460030004600440037004400460039004600320039003300310045004600380042004200430035004400440032003700320033003700430039003400350034003300450036003400330046003500330042003600300043003200450034003200370035003200460042004600420042003900460043004600420046003500440041003400410037003200390034003700330038003300380034003400360046004100370031004600390037004600330031004100370042004100350030003300340041003800360037004500360045004200300039003400420041004400410032003500300030003500360038004400350046004200430036003900440030003700380033003400450045003200320033003800440030003800330035003000300032003600430035004100420037003700380039003700320044004200300039003000340039004200300037003600420030003800350034003000460043003300460031003800430030003400340031003000440031003700460042003200370045004200420043003000440034003500330033003700370037003600450043004100320030004200370032003200320039003000310046003200350037003700430032004300450036004400440043004300450044004100360035003900350032003500370041004200350045003700330030004100370043004100430031004600430032003600340034003600440037004600300046003400390037003900390037004300440043003400340038004200320032004600440037003600330042003900310031004100370044003900380038004400370045003500360046003400300045004300320045004100320045004400310034004300380032003900440036003200420036003300360046003000420031003300360034004400390044004400390042004100370044003100450038004500430039003000430046003700440035004500330037003000390043003300310042003800360045003200300033003500440046004500370039004200450034003200350041003200310039004300430036003700350032004300340037003200350046003300300038003500350035003100390030004300360030003000310031003300340035003100350045004600410030004300390037003400340038004600390042003700440031004500390043003100440031003300360043003900350037004300370033004400430036004500320041004600390030003200420034003100340046003100320033004600390033003100390045004500360042004200300031004200430045003200360038004500370044003200320039003600370042003800440032003900410043004200460038003300460046004500430037003800410045003500410043003700310042003000390037003600380041003400390031004200450033003100340044003800420045003000410043003500420045003800410045004400330034003400420045004100460042004400410035003700370031004400310033004200390036003300350043004200450030003400350035003900430033003300420037004100390044004600300037003800380038003000340045004400380043004500450036004400310031003400440043003600440039003300460035004300410045003100390036003400340042003700430035003900420046004500320030003800450037004600310044004100440044003000340046003500450042004100330030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073300330032000005480054000007480054004900000B4800610069007400690000840B360030003000300030003000300030004400300038003000\
-36003000300030003000300030004100440041003500390045003600330030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030004300320034003100440042004400410045004100300041003700300030003000300030003000420038003400390034003400340031003500340033003800380044004500440039003300420042003000410043003200340030003100300034003500430046004100410041004300380036003800340039003000320046003100300035004200370042004200460032003600350038004400390044003900460039003200370032003200380038004100440046004500340039003200430030003400340031003700430034003400330042003100420031004200460042003200300033004500330036004100420039003200410043003800440046003500410036003400410032003100330038004500440031004300300045003900370031003900410045004100300033003500330035003900340033003000390035003300320041003400420046003200390041004500310035003000310034003200340030004500300034004200430030003000300030003200380030004300420046003500380035003200390046003800340043003600310036003200440046003900330032003400370031004300380037003800440038003600300033003200370032003400390045003200310030004400460039003300430035003800390037004200370041003600420030003500310043004500390031003000340035003600440039003200460035003100390039004400430032003400320043003600370034003900460037004200350032003900440044004100430035003000330042004400420034003000320041003200450045003300320035003700330045004200370046003700300036004100410038003600390033004300410045003800450042003100350042003900420045004400420043003500440036003200440039003000330046003500320039004100420033003200330037003900450045003200320038004300380031003500440034004300410036004400340046003700440041003900360034003000380037004100300046003300320046003400380042003900450032003000460032003800380035003300430039003300380043003000360037003700370038003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007330033003400000548004D00000748004D0044000043480065006100720064002000490073006C0061006E006400200061006E00640020004D00630044006F006E0061006C0064002000490073006C0061006E006400730000073300330036000005560041000007560041005400003B48006F006C0079002000530065006500200028005600610074006900630061006E002000430069007400790020005300740061007400650029000085CB3400300030003000300030003000310034003000380030003600300030003000300030003000380044003800390031004400300044003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310033003000450032003700300046004300430042003700390045004300390030003000300030003000310032003800340039003400340034003100350034003300380038004400450044003900340033004400340042004300330036003000310030004300370037004600340044003600330041003800450036003200390032004400360041004600310030004400360042003500310038003800300035003400310041003400320032003800450038003200380042004500300044003000450032004500320045004300450041004400370037003000460037003200330042003800460042003100350031004300380034004600410033003200360038004100380034003300440030004100320032003200430035003900370038003200340032003400440035004200410042003500360036003900330034004400340032004400320032003200320032003400430046004100340045003000370046004200430046004600460031004500330045004500420038004200420035003000460042003800410033003600370045003300340045003200320046003400440046003100390035003100350034003000460046003400300046004600420032003200420036003500450043003400410046003900350042003500430030004400300041003700410041003800440042003200380036003100310035003300330042004600380039004500420042003800430043003600350035003700370031003500410041004600460034003200360046004100450035003800300042003500450041003300440041003700340035003100330045003100450043004100330038003600310034003000450037003600300036003100390031004500390044003900320030003700310045003900390037004200440034003600430031004200320033004100320046003000440038004400320041003800330036004300450044003100420035003600370039003800390038003000340032003400360036003500380042003000340041004400300041003100440031003800410034004400340033003700370038004100340034004500370030003900430037004600390037003500430046003000460035004300360031003200450039003700410033004400390036004300370032004200310042004200340031003500320041004600410031003600370039003600390039003400440041004600430038003000330037003900320041004600320037003200420039003800350035004200330046003600330046004200330041004300440037003800450043003000440032003300310035004600360045004300430030003200440033003700360045003000460038003900300042003800330038003800320036004500380038004200430037003100390031003000380032003900420042004200430046004600350030003900300043003900430035003900350038003000330039003100410034003200370033003200430046004400300042004200340041003500370033003400340041003700360037003100430039004600330034003300420032004400460041003600360034003500390045003000420041003800430036003500330032003500460045003200440032004300300039004600460034003700420036004500460039004500460030003200330046003000300038004300370042003500410046003100320041004400450038003500410042003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007330034003000000548004E00000748004E004400001148006F006E006400750072006100730000833336003000300030003000300030003000420030003800300036003000300030003000300030003700420046004300370044003700450030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100350030003200310045003100320038004400340034004400390031003200300030003000300030003000380032003400390034003400340031003500340032003800390031003600330036003400370030004400460046003500390046003800310030003600380030003800390031003600380036004400320044003400360030003900360035003000350042003700310044004100390038004600430031004600300046004500380035004300370039004600460046004600410045003300330036004600330030004300340037003700390044003700420046003300420046003600440045003500370044003700430035004100460046003300330046004500460046004600460031004600360037004500340046004400460045004600330039004600380031003900390038003900390031003800310038003900380039003800310036003100440045004100450041003700300043003000430046004600310039003100380039003200440043004100350031003900460045004600440036003300360030004600380046004200450046003300460030003300320042003000420032003300370039003200450036004500350044003700450045004600460046004400360039003300410046003300310043003400420037003900450037004100460044004200460036003500460039003500440046004300320045003000450036004400420039003400380039003300450034004300360033003800390041003800450036003100300030003000300035004200380041004300300042003100320035003200370037003500310045003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007330034003400000548004B00000748004B004700001348006F006E00670020004B006F006E0067000084D7360030003000300030003000300030004600300038003000360030003000300030003000300045003000360044003300460036003800300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300043003000340032004100390030003900370032003100300041003000300030003000300030004500420034003900340034003400310035003400330038003800440043004400390033003300310030004100430032003400300031003000340035003900460035004100310039003100310036004300440032003500410039003800350036003200310038003500300037004600300030004500300031003800440036003000350041004100420033003400330039003800300036003000360037003900370032003600370036003500360045004500370031003700320038003100330034003800310041003000380035003100380034003100460030003000300038003100420035003500380032004200380042004400440032003800300036004600430033003000430044003300300046003300450036003300330043004300420034003200340034003800310041003500300042004200300039004500380039004600380030003800330030003000390032004100340033004500350039003800320033003400430036003700380032004300360035003900450034004200390039004100360045003600440041003500370045003800310044004100460035003600450030004200410033003000390039004300300036003000300030003600390030004100350031003000340037003100410043003700320031004100420035004200340035003700390031003600350044003000450039003800300031003000360041004300300045003500300032004300420032003500440043003600450036003000440042003300300039004400430032004600390046004300300035004400380046003700450031003700300038003000440033003000390042003600350042003900350042003300360044003100380030004500360031004200460038003700420032003800340041004100460041003000320030004300330030003100410038003100450037003400310041004600410037003100430045004600370036003600410031004400340032003600380044004200430043003500370033003100390042004300310037004100300044003600310030003800440044004100450037003200330039003900460031004200440042004600340045003000370045003100460031003600300042004200300032004300440038003600430045003000370038003800340045004200310035003800410043003200300038003300360041004600450032003500440038004500300033003800460030003700440043004500460033004600300036004400370044003400310046004200430046003400380037003700410030003200390039003200340036004300330042003600420036003500440045003200450030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073300340038000005480055000007480055004E00000F480075006E00670061007200790000820F3600300030003000300030003000300042003000380030003600300030003000300030003000370042004600430037004400370045003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310031003000420032004300320035003500380033004100380034004200340030003000300030003000300033003900340039003400340034003100350034003200380039003100360033004200430041003400410043004600330039004600380031003000360038003000380039003100360038003600440032004400340036003000310036003700450034004600330037003900410031003800430043004600380046004600460046004600460044003100330030003600360036003000360030003600300036003000360030003000390044004200440032003400410031004200380033003500370044004600330041003400340031003300380033003800370035004500310038003000330030003000330033003500350030004100410042003900430043004500330038004600420030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073300350032000005490053000007490053004C00000F4900630065006C0061006E006400008323360030003000300030003000300031003000300038003000360030003000300030003000300031003200450044003800460032003600300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300041003200390030003300460036003800320039004600330042003000300030003000300030003700450034003900340034003400310035003400330038003800440036003300360034004200300039003800460045003900460030003100300042004200380042003400320034003800430038003100330044004400320038003300380031003500350035003200390032004500310035004100440039003200340030003600390046003900320045004400440038003900340045003100300034003400430032003400410039003100450033003500370038003500300031003900430043003700380045003600460041003200420041004300410039003400320034004200350031003900300045003100420031004100440031003500300033004100420041003400320034003800330044003000440032004400350030004300370037003900450037004300320034004300440045003000330042004100450041004500350038003000440036003600360030003600300036003000460038004600440046003400320039003000330032003300330033003300330030003300380042003800340030003400380039004500450031004400380041003400310043003100360032003900320042003800310036004100420043003400410035003200350036003100300043004500430035003000460036003900310038004200430046003400370037003300440045003400380033003200310038003000300045004500350045003200370037003200360038003900410042004200320030003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007330035003600000549004E00000749004E004400000B49006E006400690061000083C736003000300030003000300030003000460030003800300036003000300030003000300030004500300036004400330046003600380030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100350031003600320037003000410038004200380033004300370035003200300030003000300030003000410037003400390034003400340031003500340033003800380044004500440044003300320031003000410043003300330030003100380043003500460031003700460034003700300039003800330039003800430032003600320034003600360043003400350041003700410037003600360036004100370042003800440031004500360037003500370039003800450042003100310036003200360042003600330041003600410042003500360035003100380038003900430036003900360035003400430032003800360034003700410032004100410032003500340030004300460036003000450046003000450033004600310033004500420045003200430033004500410045003900310031004400370032004400380030003300460044004300330035004600430039003600320038004300430039004500330038004400450033003900420042004500370046003000310044003000330034003100370041004100450041003900430038003400390033003800440034003300350038004200310037003600340032003200390038003900350032003100320036004200320037003400320035003800420037004300330043004500320044003600380035004400360030004300430038003000330031003000330035004100310037003300380042003700320034004500310045003400310034003200310041004300370034004400440031003300320039003000350030003000440045003000370044004100460036003800360031003000460039004200360043003600340032004500340044003400370035004300390033004300370042004500360044003900350033004400370036003500310032003000350043003800340045004600370045003300460046004600330037004500310034004600450030003000320038003300350033003700430033004100330041003900460031003500310030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073300360030000005490044000007490044004E00001349006E0064006F006E0065007300690061000081DB36003000300030003000300030003000460030003800300036003000300030003000300030004500300036004400330046003600380030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030004300320033003100390046003500380032004600320037003900300030003000300030003000320043003400390034003400340031003500340033003800380044003600330033004300320037004100380046003600390046003800310030003600380030003800390031003600380036003800450031004100330043004300340030004400360036003700430042003300370034004500440030003100390041003100380046004300460046004600460046004600440031003700340033004300360041003300300039004400300043003000360030003000430030004400430030003900310041003300420036003500360046003800340030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073300360034000005490052000007490052004E0000334900720061006E002C002000490073006C0061006D00690063002000520065007000750062006C006900630020006F0066000083F736003000300030003000300030003000440030003800300036003000300030003000300030004100440041003500390045003600330030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100370031003600300043003100410034004100340044004500320044003400300030003000300030003000420033003400390034003400340031003500340033003800380044004400350039003300410031003000450043003200340030003100300034003400440046004200360032003500300034003800410034003200390031003200300046003900300030003100430037003500300044004200360035004600430039004200460039004300380033003000410030004300300041003800390043003100310030003100340041003400390034004400430044004400320032003900410045003000360038003400460042003400380032003300310036004600430035003600340043003400340043003500360035003600420042004100440033003200380030004100320032003100340032003000370030004400340045003300360038004200330035004400360035004200390032003200380045003900390035004200320042004600310045003100350030003400350030004400410032003800380046003200370030003000330041003900420042003600460041004200450037004500350035004500440031004300410046003300320030003600370037004200460030003300310030004300460045003700340043004600320042004300420033003800410041003000380045004400460041003700310033003700380030004600440045003300370037003700380030003800320038003200440033004100320045003000370035003300380035003000390037003200350036003900350031003000340030003500340042003600350038004300410041003700330034003800310043004600330039003300440036004500320036004500330037004400340035004100340036004300420032003500450041003700440042004200440046003300390045003400390032003600350032004100450033003300310035004100440037004600340034003900330039003300370033003300460036004100450046004600460042004200430030004600360035003000360039003500340031003300460037003900410036003600330030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073300360038000005490051000007490052005100000949007200610071000084D7360030003000300030003000300030004600300038003000360030003000300030003000300045003000360044003300460036003800300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300043003200330031003400380042003300330038004500430034003000300030003000300030004500420034003900340034003400310035003400330038003800440045004400390033004200440036004100430032003600300031003800380035003900460043003400390046003200410032003400340038003600390030003500440033003400350035004300350041003700340046003400310032003700340037003000450045003600440037003400360039003900370035004500340031003700370045004600340031003000410042004400380030003600450032003200300035003000370031003500420041003100340038004100360038003000340044004400320041003800390035003600330031003900310039003800310032003500330045004200440037004100310032003000380041003700330030004100380032003600370033004200430042004300330033003900450037004500350039003500440045003400450032004600300035003000310034003800300045003000320037004100300034004500460034003800310032003400320046004300430046004600310045004100410033003100450039003600450046003000320036003000460042003500460034004300420044003000350039003600450046004100320044004200300036004200410036004400300030004500300037004300370042004200430043004600330045003000300042003000370043003900370046004100410038004200370030003700300045003600460039004200380039004500370037003000460037004600410034003400330036003700310043003100340033004600450039004100430036004200380038004600420033004600320043003800320038003400390043004100390044003200410030003000430046004300350035004200320041003800330032003600420033004500350038003200410042003400340038004100390042004400360032003300460041004400430041003000350036004200410032003700310039003500330033003700410043004200440032003900350045004300430032004500320031004500390041004600380038003100410038003900310031003900350043003300390043003900460032003800450038003700330031003300380030003800320039003600410035003600440030004400380039003800370041003200410034003900350033003300390041003900460037004400370045004300340039004100410032003900360044004200340039003100430044003800430036003100320037\
-003000460043004200430030003300300035004600460030003200310034004500440035003700310032003600330039003100340036003600410030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073300370032000005490045000007490052004C00000F4900720065006C0061006E0064000081EB360030003000300030003000300030004200300038003000360030003000300030003000300037004200460043003700440037004500300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100310034003000440030003000380038004400420041003100350044003000300030003000300030003300300034003900340034003400310035003400320038003900310036003300360034003900380039003500460043003900460030003100300037003500380045004100390038004300410031003000410035003600320038004500350044004600320043004100310045003000360038003600460035003400440042003800420034003300320033003000450031003900340041003100310030003800430031004100330043003600410046003000410038004300310037003800300030003000300030003900390043003000360044003300440042004500370035003300340045003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007380033003300000549004D00000749004D004E000017490073006C00650020006F00660020004D0061006E0000843B36003000300030003000300030003000420030003800300036003000300030003000300030003700420046004300370044003700450030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100300031003300320046003200360034003000390037003100330036003000300030003000300030003000430034003400390034003400340031003500340032003800390031003600330037004300320031004100380046004200390046003800310030003600380030003800390031003600380036003000450039004300430031003500460030003500370039003100390033004500360038003400420033003300460043004600340037003700360031003700380035004100310042004300320046003000380046003900310039003100450031004100440044003400330046003800360031003700410045003800360030004300370046003300380044003800430039003300370039003800460042004600440036003700380036003600460045004100330032003000430037004600310045003300450036003500390030003900340033003600360034004600380036003900410032004300310043003000410031003600410043003100320030004600340045004500330037003000330043004200380046003900460037003800300044003600360032003400320036004600320046004500320041004300410033003000420043004100450046003300360031004500300031003600350032003600360046003800460044004600440031003300300033003500370035004300330042003000330043003700410046003300460037003800460035004200300031003000330032003900340038003100380031003800310045003100370035004100320030004400300033004600420046004100350042003000430045004300300037003100360033003300330030004300420038003800310030003300340039003400380031003800310043003800430038003100330036003900350046004300460043003000410038003200430043004200460030003500390038003200380031003800310045004200440041003400330036003200420034003100300036003700330030004300420046003700390046003000430042004600380046003100450036003700450030003700380034004600390034003000370031003900310038003100380038003800300043003600330037003200300030004300440044003200330031003000300039003900410037003300360046003500350033004100460043003100430042003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007330037003600000549004C000007490053005200000D490073007200610065006C000084373600300030003000300030003000310030003000380030003600300030003000300030003000310032004500440038004600320036003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310031003000420032004500320035003600410030004300450036003300360030003000300030003000300043003300340039003400340034003100350034003300380038004400360033004600430046004600460046004600460037004600300036003100410030003000390036004300450044003500430046003600380036003100320045003000330032003300380033004300370030003900390041004200380039003800380039003100360038003600330032003300300033003000330030003300300031003200310042004300360031004600420045004600450036003500360030003600300036003000360030003100300045003000360036003200360043004100360030003100360036003200350044003500300042004200450038003300310030003300300033003000330030003300430033004500340034004300300035004100320044003400310033003700340042003100350046004300330032004400300036003300310034003100310036003800360044004200340046003700450033003000330030003300300033003000330030004100380043004100370030003300300042004300370041004600460038003700360031003500330038003300310041003700450039003300460046003100330030003000350042003400460042004400460046004500460035003200370039004600440046004600440037003100460037004600460046003700460046004400460031004600370042004600340042004500350046003500460046003500420034004600420044003200370041003400450044003300460039003100390031004600370031004600300037003100420033003700320030003200450032003800300034003500380031003800360045003300460038003500300036003800350033003400300037004300330041004200300046003800340038003300380032004500380035003400390031003300420046004400300031003000330030003300300033003100350032003300300046003000360034003800340044003600450034003300320046004500370042003100390034003800370034004100440031004300340036003000410032004300330039003800350034003000300030003000360033003100460039003600430043004500430032003000320031004300430030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073300380030000005490054000007490054004100000B4900740061006C00790000820F36003000300030003000300030003000460030003800300036003000300030003000300030004500300036004400330046003600380030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310031003400300044003000350046003800420031003500350044003200300030003000300030003000330039003400390034003400340031003500340033003800380044003600330036003400390038004500340046003600390046003000310030003700420038003100360033004400460042003900380041003600390030003900430031003500330036004200390035003700460033003900370031004300370042004400410033004200300035004100420031004300300033003000330030003300300033003100330032004500300039003400410043003100410038004300310041003300300036003800460031004100330043003600410046003000380030003100410030004300300030004400310034003100300041003400440030004100370032003600430033004200300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000733003800380000054A004D0000074A0041004D00000F4A0061006D0061006900630061000083933600300030003000300030003000300042003000380030003600300030003000300030003000370042004600430037004400370045003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310031003100300030004100330033003700460034003300460045003500300030003000300030003000300039004100340039003400340034003100350034003200380039003100360033004600430037003900380042004500310033004600300033003000330030003300430033004500350037003700390043003000430042003300360046003800380033003200390043003700430043003500430033003400300030004500330030003100370046004200430032003900300041004100460031003900410034003100350037004500380033004200300033003000330030003300300033003000330041003300380042003000440043003300460046004400410035004300300036003000360030004200340033003800380030003200350032003200440034003000330037004600300043003400370039003000360038003600450036004300390030004300300043003800430030004300300043003100300031003700420042004400380033003000330030003900300036003200300031003200450030003300460037003100430038003100430038004300330030004400380036003000310034003200310036003100300033003200310030003100390046004300430037003800360035004400360043003100380046004500310046003500430043003900460030004600460045003700320044004500430046003800450030003400410038003800310041003500430046004100370031003100410030004300430033003900440031003500390038003800360037003600350036004500300044003700380033004400370036003000340041003500440034004300420033003300300041003600350044004100410041003000350039003300410041003600350035004300450030003300300030004200440032003800440044003300460032004500410036003300350044004600300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000733003900320000054A00500000074A0050004E00000B4A006100700061006E000084D336003000300030003000300030003000460030003800300036003000300030003000300030004500300036004400330046003600380030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030004300300035003000300035003200330037004400390039004400300030003000300030003000450041003400390034003400340031003500340033003800380044003600330046004300460046004600460046004600370046003000360031004100300030003200360035004100310038003300410042003000300036003700460033004500370042003900350045003100390032003700370031004100430033003200310033004500320033003800360034003300370043003400360030004300390037004200430044003300310038003300450039004600420044003400410044003000360030003400360037004300360031004600430037004500430046003300310038003600340042004200450031003900300043004600460037004500460043003400340037003500300044003000370033004200380033004400450045003600310039003000430038003200320045003500360041003400310042004600430045004600440037003600460038003600310033003200410041004500300043003300460031004600330046004300370041004100390031003500440035003600390032004300310045003200430045003600450030003600320036003300360035003600410043004600320033003800380033004500320045003300450031003300330033003800300044003600350036003000360030003600300046003800460039004600380033003900430033004300370043003300360037003700300043004100450033003300340046003800450037003900330031003700330038003300350031003100410033003000360041003700430031004500430033003200310032003000340030004400430036004100370030003600410037004300310046004300420036003200360030004300450043004200320039003200420038003000440039003500390035003600340045003000420037003300350032003100440044003600300032003600330036003500360030003600430044003700390036004400300043003400430031004300450043003900380037003200310043004500430031003000330039003100430031003100430037004300300043003000430030004300300046003000390046003000300046003800370034004500360043004100460046003800420035004500410039004600460030004600460032003100410046004500330046004300380036004200460038004600460041003200350037004500410046004600340046003600370041004500310030004400320046003600310046003600460033004100410036003000340030004300420044004200320030003200300030003100330034004200390030004500460034003500350042003100380044004100300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000738003300320000054A00450000074A0045005900000D4A006500720073006500790000865B360030003000300030003000300030004400300038003000360030003000300030003000300041004400410035003900450036003300300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003500300031003000430032004500440038003900390036004200310046003000300030003000300031003400430034003900340034003400310035003400330038003800440041003500390034003300310034004200430033003400300031003400430037003200460031003900300045003300410035003500430039003900320038004300350044004200420042003500350033003200370030003700410037004100450035004400310034004100440037003600310030004200340045003000420037004300380039003700450038004400410034004600360030003300450034003000320036003800370030003600420037003000380035003200330034003500330032003100300045003300410030003400410035003100300036004400410031003200310046003900330039003100430034004400390035004100360036003900440035003100460031004300310043004500460042004400460046003900460037003700430037004200420031003300340038003000390039003600300035004300330032003100360034003100390043003500410034003200340043003900380034003200340039003900300030003600390037003100340039003900360032003900300046004300420030003200320039003100310030003400300031004200340044004200320030003000340042003400350041004500300046004200360042003900410046003900410037004300330046003400450039003800340045003900460038003800380046003900430037004300440042004100410039004500460032004200410044003100300043004100320042003000380031003000370039004400320037003100410030003500360030003300350044003800370037004500310046004100320032003800340046003200440034003600320033004400450032004600460036003700380042003900410043003900320044004300440044004100450030004300410033003400380044003500450041004200410044003200330041003400450039004500350041003100390030003300430043003600360036003000440042003500300041003900380030003600310043003000360030003000300036003900340041003700320033004600320036003300410044004500450037004600390042004300340041004600360046003000300038003600390041004100370032003800360041003100360041003600440035004200360039004200460046003100440033003700380034003900310038003400320041003700410033003800450044003600360038003800300045003700460031003700410037004400430030004400420044003500320031003700380039004500380041003000390041003100360041004300320042003000440030004100320044003800370038003800390045004200340032004200440030004500390041003400360044003600330044003200330033004400450044003800320041003600410039003900380045004200390036003400410043004200380044003000310045003200310038003900410034004400440035004100310031003000360041003100460043003700350042003600350033004200370037003400430041004600410037004400360042004600330041003200450042003800450033003900430033004600440044004600310038003600410039003500380045003300350037003500330035003100330032004300370031004200320039003900440045003300310044003500450044004500350036003000410035004600390045003900340036003000390041003500420046004500380041003100440035003800460045003100350041003600300039003500320046003200300035003500410043004100440042004500320043003500350033003100430044004300300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000734003000300000054A004F0000074A004F005200000D4A006F007200640061006E00008403360030003000300030003000300030004200300038003000360030003000300030003000300037004200460043003700440037004500300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300043003200330030004600300031003500360034003700320038003000300030003000300030004200360034003900340034003400310035003400320038003900310036003300390038004300350032004200460033004400460038003400380035004500420033004600300033003000330030003300350035003300310045003300330039003400310042003500460046003000430030004300300043003000430036003700460045003700430036003300390038004600350046004400310044004300330039003900330046004400460031003800410038003000310045003000300036004300330030003000420035003200430043003000330030003100380030003600310045003000410037003200330033003100430035003500390032003600340037003800320038004300380034004400420039004300310034004300450043004500430030004300460046003700450046004500340034003500310043003000360033003600330043003600320030003500390039003600430042004300300036003300360033003400360039003200430031003400430033003000300036003800420041003800330030003800330046003200420041003700390030004300300043003400430034004300320038003000410042004500310043003300390043003500370030004400420032004600390036004500310034003500450037003100340030004100350043004300430043003500430039004600300045004600440042003700370041004100420038003100380036003700310038003500460031003600360037003600370035003800410031003200370043003800370030003500390039004300390044003200340030003300360031003800300030003500350044004500300038004300330034003200420043003300320043003600330035004500380036003300330044003200410043003000430039003000320034004600390038003300330032003800330035003100300044004100340031004300420030003500300044004200340030003100380030003000300030004300330042004100350034003700450038004500360032003400380030003300300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000733003900380000054B005A0000074B0041005A0000154B0061007A0061006B0068007300740061006E0000861F360030003000300030003000300030004200300038003000360030003000300030003000300037004200460043003700440037004500300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300046003200450031003900340032003600410033003200360044003000300030003000300031003300440034003900340034003400310035003400320038003900310041004400390032004200440034004500430032003600300031003400380036003900460045004600410033003500380038004100320032003600380038004300300041004600450033003000310038003100320038003300420041004100320038003300390042004100330038003900410033003000450041004300350045003800340038003300370037004500320034003500410038003300370036003000440030004300380036003000450032004300340032003200320031003300380039003000310038003100330038004400410035003400340032003900380035004400320046003600370033003600330032004100380035003800310042003300420045004300460037003900460032003200360045003700300038004500330046004500350031003600440034003800380042004100360042004600430036003200430034003700310045003600380032004400430045003100330044003500390039003400410030003100420034003500460039003500430034003500320030004200440031003100300033004500370039003600390031003200390037003200450034004400320046003800420034003700360043004200320037003800340039004600340043003800340038003300420031003200330041004400360045004200350043003100410030004600300038003100310037003000440033003300440041003100330032004400430039004600320043004200360035003400390032003700360031003000440045003500380041003000440030003800340034004600320039004600450034004500440039003700380030003200410030004500360045003600410039003700410042004200460038003400380030003200320035004300370038004100360035003100320039003700390034004500380038003700380036004400420044004100300046003600350045003300390039004200410039003700450033003200420034003800460033003100440041003400370039004600330033003700420039003400380035003400430039003400410032004200420032004200310037003400390038004500330034004600450039004100310041003100450039004100350032003800430034003300450036003900460038003300390034004500430044003600420043004500440041003500370042003400380032003100350046003600420034003000460033004100370045004600340035004400360034003400360044004100320043003400420032003700330034004500430039003200450030004200360037004600430038004200410045003800420030003100410042003300370030003500340039004300320044003600310037003200330037003200380036003100310033003500450036003600320034004200360038003200370039003300410038003100330031003100360037003800310044004500450035003000370031003800420033003800450038003100430045003900300044003600430039003500450030004300350032004400340034003400410030003100420034004200340045004300390031003100310044003100350046003000310035003000310039003100340041003900300043003800410031003300420039003900310042003800330036004300430036003300460041003800420035003300320046003400430033004200460046004200410041003200360043004100380038003600460035003900430043003800300030003000300030003000300030003400390034003500340045003400\
-340041004500340032003600300038003200000734003000340000054B00450000074B0045004E00000B4B0065006E00790061000085A33600300030003000300030003000300046003000380030003600300030003000300030003000450030003600440033004600360038003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310031003000390032003800300046004500340036003900350043003000380030003000300030003000310031004500340039003400340034003100350034003300380038004400420035003900340042004600340041004300330035003000310034004300360037004600360039004200320044003400330046003000350044003300320039003100390038003200340042003300300038003500330038003100340041003400440030003400390043003100330045003400300045003100380032003800460045003000310033003000380035003900310043003500440046004100330030003400320034003700430031003500300039004300300033003200350038003300380031003000450044003900330041004400340041003900410031004300340036003000310037003100330035004400390043004200340044004300310042003200390033003900440033004500350046003000370044004200460037003300420038003700300033004500300044004600380041003200380031003600410033003500300031004100440030003500460036003300430041004600350036004500460044004600360030003200310030003400420036003600350033003100370031003100430032003600380045003800330036004400350039003000380032003100390034003600300032004400300038003000320045003900310046003500370035003500380035003900350041003600350043003600440042003700300030004200430042003400440042004200430042003900320045004100440039003600370043003200370045003300360036003300450035003700340045003800460041003300300038003800360034003300300030003300410042003300310039003900370034003500410031004600340031003800350039003100380034004100300035003300390033003000300035004300450031003600300042003000300041003600370039004300450034003900310038004400320035003100380031003500350039003300440037003400300030003600310043004600390033004500300030004400390037003200430039003100410046003600300037003700370030003100310033003200380039003200300034003700450044004500350044003900350030003900330030004300430044003100340038003200410033003000380031003700310031003400370031004400380045004200300031003300300044004500360043003300380031004400300043004400340045003000450037003300420033003900420038004600430032004300330039003700380033004300380036004400350030003700300030004500460045003200390041003200370037003100380031003600450045003800350032003900460043003600410044004600430041003400460042004600340034003900430041003500370031004500350032003100420038003000370042003700370038003500410046003900460031003300310033004500460030003700410036004500320045004600310039004500440045004100460044003200410037003500350036004500430035003200440034003400380039003800430036003400320045003800310042004300420033003900340039003300300043003700460039003600430035003200300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000732003900360000054B00490000074B004900520000114B00690072006900620061007400690000893F3600300030003000300030003000300042003000380030003600300030003000300030003000370042004600430037004400370045003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310030003100370030003400310033003600370035004400380032004600360030003000300030003000320030003500340039003400340034003100350034003200380039003100410035003900320043004400340045003100330030003100310034003400360043004600420034003400330041003700330033003500330038003700460045004400320044003200320041003200390031003400440041003500380035003400330030003900350031003000350037003200360032003600430036003800350030004200350037004200410044003200390035003300460037004200390046004300320043003400300037003200310033004500380031003800460041003000310032004100440031003600310031004200340042003500380033003000440034003200410031003500300044004100330032004400300034004500360037003500410033004100320045003800380032004500300042004300360042003300420044004600370033004200460039003600450037003200380035003400460038003100420034004300330031003000380034003100390030004200440031004500350041003200410046003800420042003800320037004600410042003800320037003000370044003800310035003000310034003700460037003000430038004200320031003000450039004400300032003800330042003200300034004600370034004300300032003400460038004500370030004200410032004500300045003900370042004300330038004200410037003400350036003000430045003100410043004300360037004600370030003200320037004400380034003100330030003100310041004500450046003300410043003900460044004400310038004400350043003100460037004200300038004400370041004400330030003600300037004400410045004600330044004200340035004600410042003300380041003600460030003700460036003200360039004300450032003600370034004400460034003200460031003900440033003600460035003800450035003900440038004400460034003500450043003700370044004500450031004500320044003000450033003000370037003400460032003200420046003400390042003800370032003800460033004200330034003800430039003400420039003800450042003200350043004300460035003100320035003200370032003000320046004600420033003100340036004100410032003800450044003800320042003900430031004500330030003300410034004600450034003700390039003800350036003500460043003700410041003600430032003200360037004400330043003800440039003300340035003600450035003100370039004400430032003100410036003200360030003100340032003500330037003800370046003000460034004400350031004200360037003300310031004200320037004100340043003900450034003400420042004200390034004200370039004200350043003900440038004300330030003300370033004400380036004200450044004400450032003400330037003100380037004600300041003800430043004500320045003500330038003000300043004200440046004100410044003400300046003400440031003600330032004500330041003400310032003700450035003600430041003700420041004300460045004400430036003700330041003100310032003000390037003800450037003100360030003900380032004300410046003500370031003100440045003700450044004400370032004400360032004100370035004600360035004200310044003600450036003400430036004400310035003400300046004200350034003600390042003200460031004200460042004100340045003200370045004100360045003200370045003200430046004200380034004300460033004600360041003000300035004300390046003800390032003200370039004400430036004300350034003500420045003800440035003100360044003700410036003200320034003400380033003200410034003600440042004500360036003300370031003800370038003800350046003600310033003600310039003400360042003800460044003600320043003900360039003900420033004400370043003800410038003700450033003800450043004400350038003400300041003100350041003300460032003600410038003700390036003900310044003500420038003400330034003900390041003300380045003800350043004200450035003000320036003000330030003100380037003000340031003900310033003800330030003400430046004300330045003800390038003600440031003200350031004500460036004200310044003700450043004600430037003500410038004600320030003800450032004400440038003500340039003700320039003900310038004200320036003700380034004400320035003600300033003700440042004200430039004100330033004200350037003900380038003800360041003100430031003800320036004600390045003200320045003400310043004400430042004600430037003400310034003800300034003200420039003400360043003300450038003900320043004200430034003000380036003900330032003900420033003500380033004400350038004400330044003500320038003900300030004500390038004200340031003400430042004200340037004200450042003800380042004300300041004400390037004500370046004100450033003700460045003500330037003300380046003300430043004100340038003500360038004200380031004300300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000734003000380000054B0050000007500052004B00004D4B006F007200650061002C002000440065006D006F006300720061007400690063002000500065006F0070006C006500270073002000520065007000750062006C006900630020006F00660001842B36003000300030003000300030003000420030003800300036003000300030003000300030003700420046004300370044003700450030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030004300320033003000430039003800350046003100360039003200300030003000300030003000430030003400390034003400340031003500340032003800390031003600330036003400460036003500440046003400390046003800310030003600380030003400350035004400390041004600370033003100320044003000430036003600370043003600460045004600460036003800380032003600300036004200460039003500350035004300350030003800300041003600360031003500360035003000360041004500390036003700410038003600460046004500460044004500330033004600430046004600460030003800310045003100350042003500330033004200430033004600460031004600330046003400380033003200390038003000390039004200320030003600370036004400320035003000330043003300420046003700460030004300330046003600360043004500360031003600300044003600440037003600350045003000340038003800380032003500440039004300350031003800300036003300330046003200460031003300310042003000410038003200380033003100370043003600420036004500360037004600380037003300460031003300320043003300430046003600350041004200310038003500380041004300430043003400390033003600390038003000350035004400450030004600460041003700340046003000430046004600370046004600450036003400360030003500360039003000360037003600300033003100440034003600370036003000440036003500300036003700460038003700330046004500320032004500350032004500360036003600300036003000360030004600380039003200390036004300330043003000310041004500380043003700430030003900390039003700430044004300300046003000460044003200420043003300380046004500390042003300340039003300360039003800360036004100390038003200320035004300300042003200460038003000420034004400300043003300450037003200460035004100350032003600320044003000430030003600300030003200360037004600330039003800450042003200460041003700310032004600300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000734003100300000054B00520000074B004F00520000254B006F007200650061002C002000520065007000750062006C006900630020006F0066000089F33600300030003000300030003000300046003000380030003600300030003000300030003000450030003600440033004600360038003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310031003000420032004600300041004400380043003600450041003200450030003000300030003000320033003200340039003400340034003100350034003300380038004400420035003900320044004600340042003500330036003100310043004300360033004600360037003300460034004500440033003700390031004300440036004100390039003100330030003200310037003700390038003200350036004100310038004300320035003000450041003600450032003000310031003000390031003600370038003300440036004100440030003800350037003800330031003300360039003000460045003800320038004100410045004200440033004200390030004200300031004200320046003100370041003100440045004500430034004500350034003500300038003800370033003800320034004300430038003100310034003200340045003700330042004200310039003600370036004200310038004400410042003700300042004300310039004100360045003200330038003800310045003700380036004600390045004600370046004200370043004500300046004400420045003800460032003200320032004300320037004600390030004100420039003100420039004200340042003400460034004400370038003000360036004200330039004500460033004300360046003200460032003300320042003900350043003800450046003500460035003700350045003200460031003300380045003100370030004200380036003100330030003900460043004600330033003300460033004600340046004200350035004100340035003500350035003500360032004200310035003800370033004200300045003300330038003900380041003600380039003800380045003000460035003700410030003900300034003000320041003700310037003200320044003400330045003700440030003600310031003700430033003700300044003100340042003700390042003400300032003000430030004300450043004500300045003400370034003700340037004100430041004400410044003100310038004400340036004400310033003400450044003800430035003500420037003800410036004300330036003400420037003700370037003300370038003600360031003300300033003900330039003800390041004500450042003500340035003600330037004400380038004100440045003600370046004200450045003400330042003600450046003400440042003000330035003100430041003300420032004200410038003100410045004500420043004300430045004300450044003200440046004400460034004600420031003500380032003400390042004300440044003600330046003400390043004500430039004200320032004300340039004100350035003200320032003200320035003200460039004200410032004600370036004300460031004400370039004400460031003500410039003300420035003600360038003500380037004500310043003100430038004100380038003400380032004100390035003100320043004200420032004300450036003300340034003600390044003500380041003900350044003700360046004500380037003800460031004600320046003700410041004400430032004100390036003300460043003800440030004600370034003300360045003300440039004600320036003900380037004300440036003200430037004100460031004600330046004500440034004400420044004400310041004500330039004500330036004600340045003300310041004600420041004100390046003400340045004600300033004600360035003500330046004600410037003100380044004400430045004500300031004300310031003600440039003900360045003000410045004100310033004500410036003300450033004300360032004200300046003200300044004300420031004600430034003700310041004200300030003900340033004300360044003600430032003800390037004200380044004400320032003700420041003100430037004200360036004400390033003400450041003700300031003700380046003200330038004300410034003900370042003300420032004200390044004100310033003300320038003800300045003600460033003300300046004500370034003000320038003000370034003300410038004400360044004400420041004400430031003900390034004300300036004400330033003400370031004200390035004300320043003200430032004300370030004600440034004100300037004500460035004500340044004400310031003300450043003300430039004200450039003000420035004400330045004600350030003600430032003500380039003600380035004300460045003700430033003300340034004400330032003900390034004300310044004200380045004500460033003100430043003700320031003100450038004600330033003300410033004100430041004500360045003600320036003700330037003300370033004500380042004100430045004300390034004600450031004500330039003700320032003800410041003200330030003700300045003300320041003800410030003200410035003500320038003900390039003900390031003900340036003400360034003600410038003500360041004200320034003900330043003900450036003300440044003600330034003800440034003400320032003400310041003100350030003200300031003200380039003500300032004500390037003000310037003000420042003100340038003600430032004400370031003800450043003300440038003500300032003900340043004200360035003000430043003300360030003600460036004600380046004200310042003100420031003300410032003800370030004200310043003700320032003200320038004200380042003800420038004400450043003800360036004100330036004400420042003200430037004600460041003200350046004500310033003200340046004500420031003200430046004600370031003800300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000734003100340000054B00570000074B0057005400000D4B00750077006100690074000083873600300030003000300030003000300042003000380030003600300030003000300030003000370042004600430037004400370045003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310031003000430032003300300039004500380033003500450032003100440030003000300030003000300039003700340039003400340034003100350034003200380039003100360033003600340033003000440036004600380043004600310030004500390043004100430030004300300043004200430035003400300034004400430030004300380043003000430030004600300039004600380031003900370038004200380031003200310044003200390035003800310043003100350038003800330043004100300036004300330038003000420031003000360030003300420035003500430038004600360041003300300030003300300033003000330033004200320046004300460036004600390037004100410042004300440042003400410037003600310036003100460032003900330031003900380030003500350044004500300045003700450037003200460041004300420041003100460046004600360039004200350035004200460039003500320036003200320045003000330031003300340035004200410030003700430032003600300038004300330030004500360036003300360036004600440044004400410032004100300037003500440042003900390035004600390034004100320033003000340036003300310044003800390035003800440039003700410031003900430034004200380043003400310038003800390031003900390031003200330033003100390031003800310038004100300039003100320037004300340043003800430043003500300043004500320035004300360045003000430041004300360034004200420031003800310037003000380033004100390045003900340041003600340030003000300030003100340033003600310042003400360035003500380043004600340030003100300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000734003100370000054B00470000074B0047005A0000154B0079007200670079007A007300740061006E000085273600300030003000300030003000300044003000380030003600300030003000300030003000410044004100350039004500360033003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310031003100300030004400330036003400300036003800390043003100380030003000300030003000300046004600340039003400340034003100350034003300380038004400420035003900330033004400340042003000330034003100310030003800360039004600440039004200390042004400320038003100410043003400320038003100370034003100420030003300300038003500380044003800320044003800440041004600380036003700460044003200390042003600320032003600380041004200440038003400380043003200380039003200390031003400430031004400430044004500430045003500380041003400420031003500410038003500390038003200390045003700450033004500310036003500440045003100390039003900450044003900450033003900360042003800380042003000300045003200380034003000460035004100370032004500370035004100340030003600380039003800450037004400300041003600340035003900310044003100430046003600330033004400350034003500340032004300360033004400320032003800320042004600300036004400320035004400380044003400440042003500330043003500370032004300380045003300320046003100360041003800310033003600330044004200320045003900330030003300300036003400360034004300340043004200300035004200410035003700420036004100360030004300390045003600340043003200320038004300330044003800420030004100370038003800330044004400370043003800430031003300320032003700380037003500440031003100350043003500430038003500440034003800450042003500380041004500450036003400410041004400330030003400300045003000380045003400350036003900310036003100390031003500420035003600450043003100460031003000390041003400430037004600310046004400310045003300380034003400450031003200460044003400330034004400360038003300320044004500390035003000440032004300320041004600360039003700310041003900420036003700360034003600380037004300350044003600460038003300380030003100450032003500360043004100450044003800360033004400390042004300320032003300380042004600300039003700450033003300320030003900450037003700450038003400390030003200310043003900420035003500460034004200370031003100390042004100460030003000300036004200300041003900420032003600380033003700300038003500420038004500320037004300310033004200460045004500370038004500390037004400320030003500370042004600460031004400460036003300330044003600460036004400320044004600350046003900390035004400360046004600380036004100330030004300410030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073400310038000005\
-4C00410000074C0041004F0000414C0061006F002000500065006F0070006C006500270073002000440065006D006F006300720061007400690063002000520065007000750062006C00690063000183D3360030003000300030003000300030004600300038003000360030003000300030003000300045003000360044003300460036003800300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300043003200330030003700300046003800440043004600310041003000300030003000300030004100410034003900340034003400310035003400330038003800440036003300330043003200370041003800460036003900460038003100300036003800300038003900310036003800360044003200440034003600300039003600390033003600430034003200330034003300310039003800390031003400310032003300380033003600300031003800380042003000390046003300330032004600380033003900450041003300310033003000330030003300300033003000360043004400410037004600380039004500310044003500440042004300460030003400300044003600360032003100410034003400300035003700340044003900410036003100440046003800320030003200300036003100310034003100310045003000360030003600300036003000360038003600460036004600370035004600310038003900430031003200320036003300300035004300420045004600350031003400410046003300450038003200360031004400430035003900310043003000380033003700390034003800310038003100380031003400310034003400390030003800370041003100420033003300380039003000410030003800420030003900310041004100430041003300320036003400350039003400310038004300390030003600350046004200390046003500380043003200380033003100390032003000440032004500450046003500440043004600460030004500360046004400310037003300380046004600430044004600420032004600300043004500350042004400450042003000390031004100340043004200330035003400430031003300380035004400440043003800320032003600350039003900410043003500460043004400370033004200350041003900380033004200300034004300420030004100300030003300300041003800330030004300330039003900380038003900320041003600300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000734003200380000054C00560000074C0056004100000D4C00610074007600690061000081F736003000300030003000300030003000420030003800300036003000300030003000300030003700420046004300370044003700450030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030004300320033003000330030003800450030003000420030003300300030003000300030003000330033003400390034003400340031003500340032003800390031003600330036004300360037004400300046004600430046003400300030003300430030003400340030004200340033003800370041003600430031003800430045003700360037004100450041003100340039003100380033003300460045004600460046004600390046003200360030003600420033003500430039003800420035003900360031003600450036003300320033003000380045003200360033003700390041003100420030004300300030003600300042004100300043004100350042003100410034003800350032003000300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000734003200320000054C00420000074C0042004E00000F4C006500620061006E006F006E000085AF3600300030003000300030003000300046003000380030003600300030003000300030003000450030003600440033004600360038003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310031003000430032003300300030003900310045003900350041004200390030003000300030003000310032003100340039003400340034003100350034003300380038004400450044004400340034003100320042003000340037003100310038004300370046003100450046003700460045004400420032004400380037003600320044003900360038004200390034003000330033003900320038003400390033003600420039003200380036004600430031003500440038004500430041003400350045004500350043004400430031004300390043003100430042004300300032003100370042003900330038003200380032003500340039003300390036004300410032003700300036003000380039003800430041003500340043004200420037003600390042003300350039004200390039004400310046004500310046003200370044003700390039003800390046003600450036003300390046004600460041004600340046003400460034003300430038004600370032004100370038003700380034003000360035003400410034003100310036003800340033004500310036003800360034003700430032004100350034004400300035003100340032003500430035003400360038003500380038003900340038004100380031003900430046003100450041004400440032003100440034004600420031003300320033004100340037003500460037004200320036003300300031004600300044003800330036004500330046003100450037003200350035003700390041003000450034003500380032003400360033003600440041004300340046003200430041003000460030004500460033004500370030004300360038003600360044004200320037003500420042003800370046003900350039004100310042003300320035004300390043003100450042003100390042003900450032003400440036003000330033004200450042003000310036004300440043004500440033003300310039003600350037003400330038004200430036004600320036004300460032003500360038003100460033003500320046004500360046004200300035003300460037003300300045004300330037003900450036004200320036003100440043004400300039004300410045004500300037004600440038003900310045003200450044004500450046003200390042004200440035004400460043003300380036003600440033003200440036003300350043003800340036003700360039003100410032003600330033003100390032003100450036003000370033003700320038003900360043003600360039003800420042004500410038004200320046003100430042003800310035003800320042003000350046004300380037003100360032003500450037003200360041003500450042003300330042004200330034003600360046003600420044004100310037003000350035003000350046004300420046003300420045004200300041003300380034003100380038004100320036003800310042004100300032003500420036003900350032003300410046003800410045004400340046004600410046004600380041003900360046003100330032003400360045003000420036004300320030004600450036003600300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000734003200360000054C00530000074C0053004F00000F4C00650073006F00740068006F000084233600300030003000300030003000300046003000380030003600300030003000300030003000450030003600440033004600360038003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310035003000320031004600300045003800300035004500420034003100430030003000300030003000300042004500340039003400340034003100350034003300380038004400450044003900330032003100300045004300320034003000310030003400350044004600390032003800360034003200300035003100320038003100450041003000350037003000310035003100350037003500350043003000360035003300440039003900300044004500300030003500310038004200340036003700320039003200320036003500350041004300410042004300340036003100370030003000380032003800410031004200420031004400360045004300300041004500410039003200300036003100460034003900460039003700390046003300370031003900340035003700430031003400340036003900380043003900310038004400300044004600300034003000370042004200450044004400410032004200440038003300440045004500410030003100340046003300360038004500310039003500350037003200320045003200370035004200430041004100410041004500380046004200390045004200320032004300420044004300300038003100350037003000410045003800420041003000450043004600300045003800300036003700360033003600420032004400360039003900410036003200380043004100310036003900310041004300320033003000370034003900330043003500330031004400360035004100320039003800410034003200300030003000310032003400430046003700330033003100430036004200380044003600430034004100390034003200360042003400440035004400440037003600340035003900430036003300300030004300420034003600440038004200440036003900410032003400340039004200450041004200440038003900460034004600340045003100350045004600450037003800420044004200450035003000410031003300430035003300320035004500330031003800440036003600340045003100330038004100430033004500360046004600440032004500330038003200330046004200320044003100380039004400350037003000360031003600310038003200300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000734003300300000054C00520000074C0042005200000F4C006900620065007200690061000085433600300030003000300030003000300043003000380030003600300030003000300030003000360036004600390034004400430036003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310031003000300030003000300036004300460033003900370031003800390030003000300030003000310030003600340039003400340034003100350034003300380038004400360033003600340033003000410045004600460043004600380030003000360045003600330043004400420046004200430033004500380043003700320042003000450037003400370031003500320030003000300042003800430039003100310036003600380043004300330030003600420046004400350039003000360030003600300036003000360030003600450035003200350035003300330038004600340038004300310034004300390033003600390034003900310039003500450035003300370030004200300033003000330030003300340033003600310042003400320035003400330036004600380031003100420038003300420037003800440031004100340033003700300046003900340041003800360036003700380044003300440030004300370037003900380042004600390032004500460035004300340036003400360036003600310036003000360030003600300036003800360035004400430037004500460033003200390043003700360037004200430036003700300045003800460043003400330038003600330046003700460046004500330031003800380036003400340034003300320034003800320039003000410039003000360044003200450031003300330037004600370032003700340036003600430036003100420043003400410045003900330033003800330030003900460037003100460046003200310044004300430043003200460043003800440041003500330031004300350046003600310033003300420032003700330042003100460034004300460030004600460042004600370046003000430036004100310046004500450033003200370030003300310039003100360046003300300033003300320037004300370034004600390036003400430038003600410037003000430046004600330045004600430034003400390035003600310032003200440042003400430033003800360030004600390037004100460036003000320043004200460046003300460037004600320039003300370030003900300039003300300042003200330030004200330033003300370045003300390037004400450031004600440042004600410046003500460043003900380046003200390032004300380030003800390039004200460042003000330045003300300044004100370041003000420046003000430046004600460046003500330043003100460033003400380038003000390031004600310031004600450033004400460032004600350046003700460046004400460046004600440038003700390035004100410045003600420032004200320046004300360036003300430032003700410038003800360039003100440043004100380030003100300030003300410039004100350030004100420031003500340036003300460031004200300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000734003300340000054C00590000074C0042005900002D4C0069006200790061006E002000410072006100620020004A0061006D00610068006900720069007900610000819B3600300030003000300030003000300042003000380030003600300030003000300030003000370042004600430037004400370045003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310031003000360031004600320037003400410038003700310033004600420030003000300030003000300031004300340039003400340034003100350034003200380039003100360033003600340039003800360041004600300039004600380031003000360038003000380039003100360038003600380045003100410033004300360041004600300041003800430031003000340030003000300030004500390031003400300031004400410031003600460030004100320043004500300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000734003300380000054C00490000074C0049004500001B4C006900650063006800740065006E0073007400650069006E000083633600300030003000300030003000300044003000380030003600300030003000300030003000410044004100350039004500360033003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310034003100340032003800310036004100330032003200330034004400390030003000300030003000300038004500340039003400340034003100350034003300380038004400360033003600340044003000410045004600460043004600340030003000330043003000380034003200450032003000430045004600310039003800380031003800440045003900300037004300350030003600420033004300300031003800350043003400430039004600310038004300320042003400370037003300300042004300370038004600440039003300340031003500380038003000390035004500310046003900370042003400450038003600370044003200460046004400320039003300370035003800390034004500330032003500380033004200360046003200300046003000360034003500360039003000360030003600300031004500450033004600300043003400460039004500420044003600330033003800460043004500410033003700430033004500460046004600410043003600340031003900300043003000460038004100450037003300460045003400310039003700450046004600360034003600370046003800460046004600330031004600430033004100460031004600460046003100380035003800420038003400340043003800330036003900340038003100380031003800310038003100390031003500360039003100430037003900320046003000450035003300410032004400430043003600350036003000330043003200370041003800340036003900460045003400330036003600410046003000440030003300310031003800300030003800420041003500320039003900460033004500430031003600370041003600300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000734003400300000054C00540000074C005400550000134C00690074006800750061006E006900610000820B360030003000300030003000300030004400300038003000360030003000300030003000300041004400410035003900450036003300300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300041003100420030003300310042004600320043004200340041003000300030003000300030003300380034003900340034003400310035003400330038003800440036003300370043004200310038004300460037003300460030003300300044003000300031003300320044003000430031004400390041003000360042003300450034003900440035003500410034003800440043003100330042003900450030004200440032004300340045003000320031003100380043003600320036003600460046004600440030004300360045003000430043003900420033004600360039003600320046003000440030003000420036003300390041003100390030004300300030004200380033004600300041003200300043003000360031004600340045004100300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000734003400320000054C00550000074C005500580000154C007500780065006D0062006F00750072006700008217360030003000300030003000300030004400300038003000360030003000300030003000300041004400410035003900450036003300300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003500300030003100320030003000440031004300430033003300330038003000300030003000300030003300420034003900340034003400310035003400330038003800440036003300370043004100460041004400460042003900460038003100300036003800300038003900310036003800360030004500340044003800330031003900370046003200450035003900370041003800430032003600300036004600460046004600460046003700460033003400460032003100380031003800310038003100380031003800350038004500450037004300460045003700330039004300310036003000360033003300330032003200430042004500330042003100410043003600420034003300350031003800300030003900410043003600300046003700340039003100410043004200460039003100300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000734003400360000054D004F0000074D0041004300000B4D006100630061006F00008637360030003000300030003000300030004600300038003000360030003000300030003000300045003000360044003300460036003800300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003500300031003000410031003800340031003700390035003900300030003000300030003000300031003400330034003900340034003400310035003400330038003800440044004400390034003300440034004200340032003600310031003400430037003700460038004600460037004400410036003000330037003200320038004200300032004400310038004200330038004400430041003600380036004300300031003700300038004400420030004200330037003800370041003600300038004600430030004300320045003700440038003400390036004400360039003600420045003800370042003900340034003600340038004200440030004500380045003600430042004100340038003400410032004600370039003600320046003200390035003700370044004100450030004400430044003300440041003100450034004400320037004600330044003900430031004600460046004600330033004600380037003200330042003800420045003500410042003000300036004600390044003600300031003500440030004100360043004500380031003200340033003900370037004600300037003800450030003700460042003100380042004100320034003600420042003600430039003900410036004400300043003500440031003200300046004600360037004600300035004500420041004100410032003100300035003000310042003000360037003000330044003800440032003700460042003000380030003000440037003700330041003800300044003000330030003800300031003000420043003500370036003900340038004500330033004100310032004500360033004100390039003100330032003200440030004100420039003300430038003500350043003900450039003400360039003300310039003600310041003900390035003000370037003700350043003700410035003900450034003900320032003100320043003600450046004400330038003800300035004600370030003100460030004600420033003400310032003900310034003300340041004500440031003600330030003500390030004400370043003700390037004300340032004600450046003400390043004400450045003700310030003400440037004300300046003700370037003300370036004300310044004500450036003100360042003700320046003000460044004300390035003100460037004600450043003500350034003600330031003900330039003200420039003200370034003900340036003600320042003400300036003000450041004400380031003400330033003200310032003600330045004500340039003600360035003200370044003200310034004100430037004500350036003600380033004600420044003700360037003800430038004400300044003500410046004400370037003000300043003200440042003300420038004300350043003900370037003200420033004200310033004100420038003600450037003700420030003900430030003300370036003000330030003600330045003200310030003000370038003100420037004300360030003800460034003700440034004500440038004500310032004100430038004300360032003300320039004200350032004100430035003600390030004400450038003200370034004400340032003200310044004200350039003000440045003800320036003200420035004300320036003400330036003500350038003200430035004600460046004400310035004300420045004100300042004400430039003900370032003300420044004300450038003700430043004100300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000738003000370000054D004B0000074D004B00440000554D0061006300650064006F006E00690061002C002000740068006500200066006F0072006D006500720020005900750067006F0073006C00610076002000520065007000750062006C006900630020006F0066000086C336003000300030003000300030003000420030003800300036003000300030003000300030003700420046004300370044003700450030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030\
-00300030003000370037003400340039003400440034003500300037004400370030003900310031003000410032004400310045004600310045003800330036004500360030003000300030003000310036003600340039003400340034003100350034003200380039003100420035003900330042004600340042003400320035003100310034004300370033004600340046003900450045003000300046003100430043003400320034004300380031004100310032003800370032003200440041003500410037003200380042004600450038003500360041003000390031004300350041003500410039004100380034003900410039004200300044003900430035004100360041003000430035004100430041004400390041004400410035004500310042003500330034003100350036003100340033003500410035003000300041004600320030004300390031003700410046004100430041003900370041004600450031004600380045003300330044003300350039004100330043003700300033003800460037004400430037004200420045004400460046003300420044003900370037003300390035003600320031003200370042003300410030004400430031003200340039003800300035003700380044004400390033004500380033003400430035003000420034004200340046004200320037004500340038003800300044004400370036003900460046004200310036003600310045004500350038004100320041003100340031003300350030004200310045003400330038003300440032003800360046003800340046003100440031003200370039003800380045004300300030004300410030003000360038004200370041003500390039003500390031003800320032003500350041003400330036003900310031003700360043003800460043003700440030003400300045004400440035003100380031004100390034003300340035003100330045003900440038003600440030003100410042004300410035004300310044003200450035004200430037003500450046003500360041003900340036003600310033003600300042003100450033004600330043003600460030004200440045003700350043004200330042004200300031003900360033004300310032003400340034003500320035003000420046003800340038004600320042003000380036004600430039003700450046004400300032003400320045004200310030004400450038003400460037004200330035003100430032003300450042003100370045003800380044004400410045003800300035003500300033003600370045004300330034004200420030004400350036003400310046003100340031003700340035003700370032004600440030003400360043003100330038004300310042004300390033004400300031004600300043004500380030003300410045003500380045003800410035004400310039004100460044003800410041003400310046003300310036004300430034003700360039003100340043004200430038003700450046003900340030003800300042004500300035003000380041004300300038004400310033003800350033003600420041003700360045004100350037004600320039004600450042004300390036004600430042004200300043003500460034003500410038003600360046004500350031003300430042003100330037003100450032003600450045003400440034003500410037004500350039004500380041004400380035003100460037003200390046003600420042003500370037003500340043003400350033003500330042004400410043003000450033003200340038004300450037003600300046004500310043003100410037003900370038003400390030004400340038003000310046004300430042004500320033004400420033003700340041003900360039004500340030003500310033004300460030003900340037003500460046003100410034003700450044004500320046003400430035003400410043004600350038003000360039004500390032004500300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000734003500300000054D00470000074D004400470000154D006100640061006700610073006300610072000082373600300030003000300030003000300046003000380030003600300030003000300030003000450030003600440033004600360038003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310031003000430032003200330039004400370046003700450033004600300030003000300030003000300034003300340039003400340034003100350034003300380038004400360033004600430046004600460046004600460037004600300036003100430045003000350046003500330033003500430033004600460033004400330042003700300034003900450033003000350034004300360034004500390031004100330035003700380037003800310042004300430038003200340046003700320043004200460046004200370030004300350037004500350046003100320041003200310043004600450030003100350030004300410046003100380039003600320042003900310036003700460030004400300030004200450033003500310038003300360039003600460033003000300030004200350031003200300045003800330041004500310044003900370031003500300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000734003500340000054D00570000074D0057004900000D4D0061006C0061007700690000842F3600300030003000300030003000300046003000380030003600300030003000300030003000450030003600440033004600360038003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310031003000340032004100320039003000430038004100320038003200340030003000300030003000300043003100340039003400340034003100350034003300380038004400450044003900310033003100300045003000310034003100310038003800350042004600370046004300360045004500310030003200320041004200310033003400410041003200310037004400310042004200380030003900320039004200330038003800350033004200420038003000340041004400380034003000420037003000300031003200440035003100430042003800410045004300300043003500360041003100390032004400380044003900340034003300340031003200410046003700440046003900420046004600370046003200330046003000310035003200370032003600340034003400410038004100420030003000380030004500330044004400390031004100340042003900320037003800380030004600310043003800410033003000300038003200410042003400420035003600310037004600370037003000300033003400350035004300300045004500390036004200300037003200330031004400360031003300410030003700430043003600430038003400340030003800420030004200340033003100390031003600380032003200440031003200430036004400380043003000300036003300310033003600350031004600460042003100410037003700300042003200350044004100440041003700300034004300310044004400330037003200380033003100300030003100430030003900320033003200330039003100460041003800430042004200330046003900460036003700410037003900300042003200450036003400320035003100360034003500420031003700360033003100430033004200300043004100320032003300390042004400370038003100440036003500390038004400420031003300320044003600440042003200310042003600460036004100390044004600430032003500330045003900300045004600340044003700460046003000370037003200340042004400350039004600460033004600440045003800460038003200310046003100370031004400330036003300350037003200420037003700430036003800300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000734003500380000054D00590000074D005900530000114D0061006C006100790073006900610000859B360030003000300030003000300030004200300038003000360030003000300030003000300037004200460043003700440037004500300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300043003000450033003600370045003700390039003500430046003000300030003000300031003100430034003900340034003400310035003400320038003900310042003500390032004200460034004200300032003700310031004300380036003900460038004200330042004100440041004300330042003100320041004400340031004600420036003900380044004400390031003400340045004600450030003900340035003000440031003600440032004400300031003200340034003700420034004200340042003400330044003100440045003100340044003200440032003100300034003400300038003400450041004400380045003800440045003100390030004600440030003200410031004200430038003200340032004200430043004100380038004400330033003300380033003600420041003800370033003200380043003200460042003000450033004500440033004300420038003700390037003600370037003800460039003400380034004300360037003600430037004500460030003200410030004400320032003800310031003200420037004300360030003000350036003400330045003100330037003000460041003100380033003300460042003700460046003900300039004400330030003100390044003600440039003900430034003900420033003700350042003200430030003900300044004600360030003200340035003800450032004500430036004500390043004400370041004100300046004400420039003600300030003500300031003700390033004500320045003200390044004600390032003300440036003000450035003700370039003700430045004200320033003300450037003100430044004600360045004300330031003600350035003300360035003300440042004400430043004300440035003300300038003800300030004500340044003100330031003700460037003700360044003600370038003300310037004200300030004100380037004600320041003000430030003700430041003600380044004400320036004200350030004600340046004200330035004300440039003400460042003900310036003400420043004500430036004300390044003800320039003500330038003300340035003300360033003200340042004600380042004300370035003500360045003200350039004200320035003700350031004600340045003700320030004500460035003600310037003000300044003500440044003700450037003100330031003400300036004300410043003400300033003400350043003200340041003700340037004300380044004400380046003300360042003700370035003300300031003200300035004600370045003200460043003500430043003200360045003500440046004200430036004100460037004100350041003900370031004300420031003700350037003900450031003500410032004300380032003500430034003900450044004200350043003300380042003200430046003200340032003200320034003800350036004600450042004300320044003500330037004300300031003800300039003900350036003300320044003800420046003700350045003400300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000734003600320000054D00560000074D004400560000114D0061006C006400690076006500730000844F36003000300030003000300030003000460030003800300036003000300030003000300030004500300036004400330046003600380030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030004300320032003300360034003700340038004600450036003100300030003000300030003000430039003400390034003400340031003500340033003800380044003600330042004300320034003600300046003200390046003800310030003600380030003800390031003600380036004400320044003400360030003100360036003400430045003100420032004500300036003800360033004200320032003800430036003400310039004100340046003200450036003300460038003300430038003300370031004300300036003900460039003200360031003600320041003800460030003600300034003100440037003400330031003400450038004400380046003100380037004300310045004200440036003300460045004300300036004500330030003300450035004400360044003100300043004400460046004600460045003600320035003800370038003600310031004200430033004200460046004600460046003100390033004500460046004600430038003600350037003300440035003100300036004200420032003800390039003300320045003800340042004100410033003200340034004100440036003900380030003800420033003100330031003300320033003200460043004600420038004600330042003400310031003100310035003700390045003600330032003500410030004300410037003900460035004500340037003100310043003300360037003200380044003100300036003900460037004300370032003800440043003100350034003500410031003300350035003200330032003300460045003400380032003600430041004500300033004400460037003400450033003300350043003700430037004500390042003200310043004600320032003900340038003100390046003800330039004200380031003900370039004400380042004100300038004200380039003800450042004300430045004100330034004200380039003500350043004100430030004300300043003000430030004300300038003800390043004100350036003900390036003800450034003500420045003300310033003000380038003300430041003200340045004400310033003100460034004300410030004100300030003000390039004500330044003000430039003800350045003600370031004200300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000734003600360000054D004C0000074D004C00490000094D0061006C00690000820F36003000300030003000300030003000460030003800300036003000300030003000300030004500300036004400330046003600380030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030004300320032003300340041003900340036003900460034004400300030003000300030003000330039003400390034003400340031003500340033003800380044003600330031003400440039003600410046003500390046003000310030003700330038003200340046003100460030003900380031004100430042003600460032004200360043003700320041004600390036004200330031004400370042003300310039003300300042004100420031004300300033003000330030003300300033003100330032004500300039003400410043003100410038004300310041003300300036003800460031004100330043003600410046003000380030003100410030004300300030003100370036004200300041003200320042003900420038003300330030004600300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000734003700300000054D00540000074D004C005400000B4D0061006C007400610000835F36003000300030003000300030003000460030003800300036003000300030003000300030004500300036004400330046003600380030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100350030003200310046003300310033003600330038003900390032003100300030003000300030003000380044003400390034003400340031003500340033003800380044003600330046004300460046004600460046004600370046003000360030003600300036003800360030004200420044003500330031003800370034003100320041003300310039003500380038003400300034003100390037003000380031003000420041003200330041003300380045003500440030003000310031003300300033003000330030003300430033004500370034003700380046003100390042004500390041004500410033003000420043003300430037003500380036003600380038004400300034003000440042004500440030003300460039003500450031004300430041004400310042003000430030004600310046004400430036003000420038004300440046003200380037004500310037003800350037003100460037003500300043003500360046003300460033003600310039003000370043004600410038003600340031003400320034004100380039003800310046004600450041003000330030003600360044003000460034004600410041003100380043004300300038003000420045003300340033003900330041003700330031003900380030003500300034003300300037003000430038003400410045003100350034003400430034004100310038004300330030004400320036003000360039003000310043003700390042003400300030004100330030003600380046003100410033004300310043003000430030003600300030003400460031004100320043003100330042003900450033003700430035003600300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000735003800340000054D00480000074D0048004C0000214D00610072007300680061006C006C002000490073006C0061006E00640073000089BB360030003000300030003000300030004300300038003000360030003000300030003000300036003600460039003400440043003600300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003000310033003100390030003300380032003800460035003600350032003000300030003000300032003200340034003900340034003400310035003400330038003800440041004400440032004400440034004200350033003000310031004300430036004600310045004600370031003600370043004200420044003100440039003500420035003200440041003700320039003200410035003800320042004200320031003200320033003400460034003500440041003200340032003300450038004100320038004200320038004500380041004500420042003000340046004200300037004600410030003700370041003200330043003400420034004200410032003800380038004500450039004100340039004100380037003900310031003700350036003300390042003500440041003400360030003900330035004500330034004300330041003900380039003200440039004400370033003600450036004200460033003600340044004200330039003500440034003400450039003700410034003300410039004500370046003200420039004600380046003000380033004400460032003300350030004400420041003600460031003100460042003300430035003900450045003600440041004300310032003100430034004400350041003500320030004300300032003600390042003900390044003000370043003700320044004400360030004200390032004400340044003500420044004400330030004500450035003800320037004400410044004300410037003100350044003800360032004400340035003300450033003700360035003000450032004200340033003200330038003300320043004200430038003600340037003400340044004500300045003600420043003000430045004400390045003900370045004300380038003700370041003000380035003100330036003800380030004200310041003200460045003100420032004300300038003500300035004600350044004300340045003500450036004600440031003400330042004300430044004300370043004600300038004100390036003700420030003100330045003400360035003200370046003000340039004400350036003900350045004200300044004100460041003900340045003700360041003000430044003200460032003200450034004500360036003100440044004400370038004300320034003300370036003100370030003600450034003300430043004300390031003100320038004200340039003900410038003200430043003900360037003600420036003900300031003800320030003000370042004400430030004500430041003000410032003500450032004300390036003500350032003400410033004100300042004200340035004200350034003500410033004400410033004300380038004100310037003300350042003200380030004400450042003500300042003400390036004500430032004200320046004200330034003300390030003600300042003000300045003900380043003800410041003800410041003100410041003100340038003000410037004600450030003000330034004600300036004400450035003300360034004200370044003000450033003900460032003000460030003600450039004500410035004300460032004200360038003800310035003100410033004200350036003100380043003000330036003900320046003200340045003200390038004100410034004500320032004300390034004400450034003900360043004100300030004100340039003400330034003800460046004100430036004500390046003600340044004400300046004200360043003100320045003100460042003200410030004300370041003100440045003500320045003800390033003200390037004300340043003000390042003500390032003200330031003000350030003000410042003400310041003300450035004600300033003800310045004400350038004200360038003300300036003100390035004300460036003200410044003300390038003300430045004200430039003100340038003400430045003100360031004600460030003400350044004200450032003000380046003900460034004600360037003100440046003200450033003700390043004200350046003300320038004300340045003400350039003900380042003200450042003100310030003500370033003000360046004400300042003800370032003600380039003200320033004200410034004500340043004300350033004200390031004500340033004200390038003200410031004200390039003900410034004400370032004200370033003700340038004200370042004600310046004400460038004200310039003300320045004100450046004400370032004100460045003500430032003400350033003000410041004400380044003500330031004300430042004500460032003300440046004400440038003800420034004400370043003700430038003800320038003500350042003400460038003300370034003500440042003800430046004400300044004200460030003500460035003700460032003000420032004300450041004500300041003200360037003900410045003300310035003200310031004300350035003400370031003900450036003100430033003700460041004100370045003900420041004500440036003300370043003200360042003600320036003200430030004200310036003700350037003000420045003600450039003100350033003300350033004100340032004300360030003600320045003000350046003400370034003700420038003300430043003400350037004200440036003800440036003500430031003500370034004600380038003000430038003600420037003500330044004200310045003200360039003100310041004600420032003700360043003700350042004500300032004200420033004500430044003100340032003400430035003800320046003000300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000734003700340000054D00510000074D005400510000154D0061007200740069006E006900710075006500000734003700\
-380000054D00520000074D005200540000154D006100750072006900740061006E00690061000085C73600300030003000300030003000300046003000380030003600300030003000300030003000450030003600440033004600360038003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310031003000310031003100310043003600300034003000430031004400340030003000300030003000310032003700340039003400340034003100350034003300380038004400440035003900330042003100340045004300320035003000310038003800350042004600440042003500450035004100410042003200350030004100320039003300310037003100370030003400300030003600310033003200370031004300370044003000440035003700350036003400370044004600380031003100370037003000370030004400320039003900390044003500310035003600390046003000300033003700310032003100460034003000300036004100310034004200360044004100320036004400380031003700420035004400300038003200390034004100450044004500440045003800390039004600450045003400390045004600460043004200430039003900460037004200430034004500390044003300390035004100360034003400310036003900410043003000350041003000310031003000320041003100420038003500320038003500420034003100390036003300410030003000380035003600300041003600380043004100430042003900330030003800360041004100300042003400350035004400320038003600330037003000360031003800430039003600420035003600320041004500360043003000300043004500360042003200390044003700460042003300310041003000310039003700450031004500460032004200410037003000370045003700390038004300310033003900460044003500310036003900420033003900350032003300360033004400330046004100320045003700430037003400340043004100440041004500390041003900300030004300450033003600460033003400430034003900310045003300460031004100330043004300340034003700350042004200370043004500370042003700450041004100460030003100340031004400390039004500320030003900430044003900370031003600410043003300340044004300430037004300440041004400370037003400460036003800330041003300320041004400390045003700380039004300370041004600340031004200460033003900440031004600340042003000300046004400430036003900430037003100450041003500350030003700380046003100320039004600420036004300430031003800300034003500330042004100360045003800320035003800300033004200420036004500430032003200300039003800440032003900360031003900410033004300340032004600300034003100370039004500340032003600390042003800300039003400460042003800360042004200450033003300360043004200440042003100350043003600370039003700360038003900450039003300300033003600450043003300360033004400340031004600440035003100320032003600430044004200420037003000350032003200450039004400300034003800300039003700360043003800460034003900450036003900360041004400390038003300350036004600390032004200390034003600420030004200430038004300390042003500370035003500460046003000460046004300300044004600450042004100360030004100320046003200410041003500360039003900300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000734003800300000054D00550000074D005500530000134D006100750072006900740069007500730000826336003000300030003000300030003000460030003800300036003000300030003000300030004500300036004400330046003600380030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310031003000300044003300370033003700360046004100430038004500300030003000300030003000340045003400390034003400340031003500340033003800380044003600330042004300320033003200310046003700390046003800310030003600380030003800390031003600380036004400320044003400360030003900360045004400360043004300410045003700360038003600310033003000320033004100330035003600460042003600380031003800330033003300300033003000330030003300300033003000430045003500420036003400370033003800300032003600300036004600460037003900430044003300460031004100430036003000430030004300300043003000430030004300320043003700410045004200450044003600380039003200380045003500390044004500460043003600300033003300410032003800350043003100340033003200460038004300300031004200390036003600300045004300370039004500410032003500460046004100300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000731003700350000055900540000074D0059005400000F4D00610079006F00740074006500000734003800340000054D00580000074D0045005800000D4D0065007800690063006F0000844B3600300030003000300030003000300044003000380030003600300030003000300030003000410044004100350039004500360033003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310031003000420032004500330030003000370044003100300032004400440030003000300030003000300043003800340039003400340034003100350034003300380038004400360033004500340032004600300043004600410046004600460031004600420035003700300036003600430036003000360039003500320033003900340033003900340041003900320033003500360042003900340046004200420030004500330030004400430038004400340038004300370032004100430037004300300043003000430030004300300038003400350033003800360034003200330030003400430030004400370045004600460046004500310031004300330041003500300044004300440030004300310044003400390037003600300043004600420039003600430044004100300039004500430031003100460035004500440044003600310042003800370046004600370031003500430033004600370031004600340043003000430042004200350037004300440036003200460038004600460045004600310046003400310033004400320043003800340031003400330043003700460037003100390039004500310045003900390033003600370030004300360043003800430032004300300043003400430035004300340032003000430044004100360036003200450030004300430046003500460035004500360035004500300041003100440034004500300037004600460046003900390031003800350045003000410032003800330032003900430039003700360035003600360045003000450036004500360036003500310030004400330033003500360037004600380046004400460042003300370045003500320045003900360039003600440034003600360042003000460038003700370038004500380031004600460030003700320037004300330033004600300039003000330030003600350044003200350034003900300036003400390030003900310044003800360034004600330037003000450035003000360036003300300030003300300033003000330038003300420034004200340031003100380033004200340042003400310031003300310034004100450031003600300039003800410036003600330037003200300030003000300032003700390046003300380039003400460042003100310043004400420037003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007350038003300000546004D000007460053004D00003F4D006900630072006F006E0065007300690061002C002000460065006400650072006100740065006400200053007400610074006500730020006F0066000083FB36003000300030003000300030003000430030003800300036003000300030003000300030003600360046003900340044004300360030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030003400320045003000350035004100330045003800310043003300300030003000300030003000420034003400390034003400340031003500340033003800380044003600330032004300440044003700340046003700330046003000330030004400300030003100330042003100300041003400350042003800350039003100380038003400420039003500390041003900360042003300300031003300320033003000330034003300410043003800390033003800340033004200430038003900330038003000330031003300320033003700310030003600420033003100300041003300450038004400460037004600300036003800360037003900320037003500460033003200460043003600370038003400420030003200390033003600390038003800390038003100380031004500310031004600390034004600440046003100430037003100460039004300370032004200380046003400360032003000350042004300450043004300430030004300420039004600360044003200300043003600320033004300390038004500310032004100430036004300330043004100390030003600370032003700430033004300300043004200430045003400430042004100430031003000430030004300300043003000430038004300460046003700310030003700450038003700460034003600460043003600310043003200380038003200460042003900450031004600330032004500440039003400310043003100380030004100360039003100380046003900330038003500380031003900460038003300300035004100420031004300430039003000360043003300310035003300310033003200330030004100340039003800340039003300300032003400390039004400330032003000420039003200440033004300460033003900320038003100390031004500310033004600370035003900320031004200330032003700380046004200460035003300370042003100340041003100390031003800310038003100380031003800300030003700460036003600320038004300340035003700370044004100460034004500300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000734003900380000054D00440000074D004400410000294D006F006C0064006F00760061002C002000520065007000750062006C006900630020006F0066000084533600300030003000300030003000300042003000380030003600300030003000300030003000370042004600430037004400370045003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310031003000410032004100310045004200450041003900410030003200310030003000300030003000300043004100340039003400340034003100350034003200380039003100420035003900330042004400300045004300310036003000310038003800350039004600460041004600390035003000410035003100320045003900320030003300360030003300390033004400440036003400320037004200310037003200310039004100450034003300450032003200320035004300380032003400340041004300310035003100420032003300320045003400300034003400360032004600330039003300420034003400380041004200350035003300370041003000450039003200370033003800450042003700390043004600390033003300370032003700330039003000410034004300300032003400320033003400310041003000450045003900370035004500360036004600330044003600370032003600420030003000360036004100350038003900340035003800410038004600330041003500410034004300310031003700450042003300330037003000340032004500360036003800330043004400350043003800300038003800350037003200440039003600370042004200380042004400310036003900440039004200460030003100410046003100370033004100380044004400420039003300380033004100370036003000450036003900430044004600380030003200460031003600390043003000320043003100410041004100410045003200370042003200390030004300370037003800460037004400380037003600340034003400320045004200320045003300340032003000450035004300450035004300360035003900330037003300380036004100340035003700430046004600380031003900360038003900370043003500380041004500380041003700450046003700380038004200390044004300320030003900320031004500430044004600360035003500320036003200320030003700410045004400350033004400340041003900350031003300320032003100450039003000340045003400420037003100450035004300300030003000460039003600430045003800380045004400450045004100360046003000330037003900300031003000420039003800330036003400370035003100340045004400440039003700300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000734003900320000054D00430000074D0043004F00000D4D006F006E00610063006F000081CB3600300030003000300030003000310032003000380030003600300030003000300030003000350046003200350032004500320044003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310030003100360031003100320046003700450034003500370032003500320030003000300030003000300032003800340039003400340034003100350034003300380038004400360033003300430032003700410038004600360039004600380031003000360038003000380039003100360038003600380045003100410033004300360041003300300039004400300044003600360046004300460046004600460046004600360038003000360031003900330035003700380044003400360030003100430030003000300030003700410036004300300036003200330035004100320039004300300036004300300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000734003900360000054D004E0000074D004E00470000114D006F006E0067006F006C006900610000842B36003000300030003000300030003000420030003800300036003000300030003000300030003700420046004300370044003700450030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310031003000300044003300350044003900360031004300440041003200300030003000300030003000430030003400390034003400340031003500340032003800390031004100440044003100330044003000450030003100350031003100300043003000460031004600460044004200420037003600420036003500320039003100340031003200380044003500300032003800340035003200350036004100390044004300410032003100340034004100370035003300420038003000350036003700310030003000370037003000300039004200350043003400300039003400340042004200300035003900350031003000330036004200420042003300340046003200310045003200320033003300340046003600340044003300350031004600390039003500460033003100410033004200360039003500410041004500310034003700320043003800360031003300440036003900440045004500440037003500390036003700420044003600320033003000390046004600440035004100430035003700390032004400460032003600440046003900450038004600430031004600360046003800430044003700310032003900430034003200360041003100370043004500330035003500320034004100410033003800380036003200330046004200310030003700320042004300460036003000360032003300380032004400370044004500320035003000450033003000340039003600450030004100300039003700350030003100410034003700450038003800410045003000330037003800350046003200460034003900320031003900370036003100460038003900330039003200420038004300320038004500340041003000330032004100330036004600330030003100410042004300370041003800410031004300320044004300330032004100330030003500430033003700310041004500430046004300450045003000450034003700310042003900370037003800410037003000310039003000330044004200380033003500360044003000370034004500340032003000350045003100460033003000340037003200430038004500430037003200300033004100300034004500330033004600300045003900440041004400460038003200300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000734003900390000054D00450000074D004E00450000154D006F006E00740065006E006500670072006F0000852F360030003000300030003000300030004200300038003000360030003000300030003000300037004200460043003700440037004500300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300041003200410033003300460042003700360046004300350034003000300030003000300031003000310034003900340034003400310035003400320038003900310041004400440030004200310034004100430033003500300031003400430036004600310046004600420044003400390036003300450034003900410041003600320038004100320032003500410033003500300032004300370035003200380044003200450038003000420033003800380042003800320039003300330045003900310034004600450030004500450045003000330033003000380041004500420041003300390033003800450038004500340045003400350030003400310038004200340033004100430039004100440032004500360045003600330038004200380033003800450035003400360045004300310039004300460033003900440046003800460043003300350031003700370041003700370044003200390031004500430036004300430042003300460043003500450038003400350046004400430038004600390039003500430030004300450037003000410038003700430037003000390044004100420035003200340042004500300032003400300045004600410044004100320046003700440037003700450039004100390045003700320045003200340045003300380033003800350038003400370036004400320045004100310033004200380042003700380034003900380038003700340030004400430031003500310046004200460046004200300031004500330034003000390037003600350041003700430031003900340033003600360030004300360031003300460034003600300044003900410038003800450033004500410034004100350038003300430038003500390034004100300042003700360033004100450036003500380033004100420041003200380042003400450036003300430041003400460038004200420032003500320030003900460042003500350034003300360035003800350046003200370032003800340045004300420036003500380033003600320033003500360039003400360035004600360033004100320035004200460037003900410037003500310043003900440036003700380038003500300038004300380043004200390034003500340044004500340038003200350038003300450037003000390036003500320037003700360043003500410041003200460030003600420030004200370031003900330043003700450044003000330038003600430032003300310041003800410046003300320031003000420034004500420036003000360034004300360045003200310042003700430043004300450039004500360041003700300042004600360030003700460032004200320032003300430034003900460045003100340037003200410032004200440038003800360046003600360046003300340039004400430038003300410032004300330036003900300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000735003000300000054D00530000074D005300520000154D006F006E0074007300650072007200610074000087F736003000300030003000300030003000420030003800300036003000300030003000300030003700420046004300370044003700450030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100330030003000300044003300380031003100460046004400410045003400300030003000300030003100420033003400390034003400340031003500340032003800390031004200350039003000430046003400420044003300370031003100380043003700350046004400460045004600370037003300330042003700360039004600380036003300350033004300410038004100380039003100420042003300410031003600310037004500330035003000320037003300450032004100350030003800410046003900350031003700430044003800330033004600320045004400330046004500380031003200340042004100340039003100310037003400340041004400320045003800310030003100440045003600350039003200340042003200350042003200320031004500330036004100360031004200380033003400310037004300340035003500310033003600360038004300450030003600450032003100430045004100370045003700430033004100300034004400330033003500390030003200310046004100330045003300440033004600370038003500450043004600460042003700390041003400440030004500420033003700340032004200310033003900390038003500410034004300450030004600310037003800370031003000460041003900300043003700450031004500450035004500420046003000320037003300450037004300460031004500330037004500440043004300300038003800350041003800360036003200370033004500300031004300460038003400360041003900390032004500430046003600340039003300310044003800350035004300330039003300410036003200430046004100450045003500450034003200440042003200390036004500330044003700370031003100390039003500450043003000420031004100370041003100330034003300360033003100450033003300420036003200370045003300450038003800410036004500440039003400300045003000450041004200410041003200380041003800360034004200330041003400300032003000310038004300360044003600440041003000320038003000350032004400410037003500460043004400430037004500440037004400340045003700340041003600460032003700430037004500420043003700370034003800360030003300310039004300430046003700350039004200410045004100370034003800390032003800340044003900350043003400310044004400450031003200450037004100370033003200440041003900310037004500330035003400420042003200370034003800320037003500330043003400420036003600320043003400450035003400410038003400310030004500300044004600330038004400390033003200440030003800410035003700440033004500380044004300300041004200320037004500410033003900390044003600420042004600370045003100310034003500380039004500440042004100440043003300440041004500450043003000370030003900430045003400460044003900410043004300420042\
-004400300033004600310037003600460042004400380032003900370041004200320036003400430031004400310044004400430042004300300041003300460044003600440033003400350045003700450041004100440033003600370032003700360031003300390035003800440043003600410032003900450041004500460042003400410038004300380046003700330035003100410036004200460034003700430039003600340037003200330043004200380032003700440031004400350046003300300043003500460046003000330037004300420044004500360044003300430031004500390039004600450046004500340045003500430044003700310033003400350043003300310035003900390037004400410041004300420044003200410043003100450032003400420031003500360046004400460037003600330031003800310033003400350031003300320035003600380046003400350035003000440042003500330042003300460035003900430041003200350043003000360030004100310043003500460032003900300044003900430039004300380038003900450033004600330034003000300031003300320037003100320033004200370042003500330030003700460031004100310034004500410038004600300034004200460045003200380035004100460033004100420037003600330038003000440045003400370044003700420038004400330039004300430034004200370036003600360034003600350032003900370036003700310045003000420033003200340035004600300036003100340045003000320046004600410037004600380046003900350037003000420041003100370037004300300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000735003000340000054D00410000074D0041005200000F4D006F0072006F00630063006F000083933600300030003000300030003000300046003000380030003600300030003000300030003000450030003600440033004600360038003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310031003000460030004400310030003800350031004600460044004100380030003000300030003000300039004100340039003400340034003100350034003300380038004400450044004400330042003100300041004300320033003000310030004300360046003100370046003600320034003500320044003000310035003100300037003400370030003700350037003100310030004100370039003400440044004600340041004500380030004200300038003000450034003500370044003000310044004400360032004400410038003600390041004600380030003600340044003000360033004200320038004400450037004300440046003800460045003300420038003100330044003700410032003000380030004300350030003700320030003800460034004300370036003100380037004300370045003100330046003000460039003700320042003400330042003900330034004300390037003000310036003600420041003800430036003300350043003700420035004100310039004100350038004200430031003400350043004600320030003600460044003500300045004300450042004200430033003700310037003900440037003800440042004300440036003800380033003600370044004100360036003800430036004100370030003300450042003000360042004600410044003100320034003500380030003600440030003400360037003100350042003300340044004300450037003100440046004100410039003900300030003900390037003100460035004400300035003800300031003500320046003000450045003700300044003000300032003700360035003500330032003200380038004600460045003700370044003200460046004300300036003900450042004300320045004200440030004300450037004200330043003900300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000735003000380000054D005A0000074D004F005A0000154D006F007A0061006D00620069007100750065000087173600300030003000300030003000300046003000380030003600300030003000300030003000450030003600440033004600360038003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310031003000430032003200330032003400300032003500330041003700380030003000300030003000310037004200340039003400340034003100350034003300380038004400410044004400320033004400340042003500420035003100300030004300360046003100460046003300390033003700320046003200360034003600370033003400310033004200330034003000360031003500310034003800370038003000350033003600330031003300310030003100340041003100440034003100340032003700430035004400310034003500340031004200300035004600340031003100300030003400340035003100310045004300450038003000370044003000340031004400430041004100320032003200450032004500330041003000380034004500420035003300380039003400410032003200340039003600340030004400340045003100380041004600310032003500420039004400450044004200370030003800450038003300450030004500300039003600450034003300450031004600450030003300370033004300460043004300350046004300450037003800430035004500340045003700370045003000310038003000320032004600320037004300370043004500320044004400360046003700460046003100320037004200370032004200440038003500300031003100320035003600380039004100440044004400330046004600340031003700310045004200430038003500300031003400430041003700430032004400410043003100300035003300330042004600410046003900310035004100440037003000440038004200330033003300330046003900410036004300380041003000340032003300390039003200380042003400340033004200440042003100330034003300330043003800370038003300460035004300310030004100430044003400440043003800410036003700370046004300390031004500430034003600300042004100450044003600360038003900460036003400410035004100390034003400430045004100380044003400300034004600420030004300420033004300320043003200340033003900450041004500370036004300350041003900350044003200360031004300310035003000430033003700340035003700310030004200370045003900360038004200310031003100360045004400330043003300420041004500350035003300350032004300380035003800300044003100320039004300310037003500430046003000300034004500450043003300420039003900430044003400310030003200390044004300460030003000300034003800350036003400320031004400430043003900410030004400460041004300310045003200450044004400310039003900430046004300380043004600310036004400330038004300440044003700320046003700440031004300450045004600390032003900310045003300370030003300450030003600380043003500350043004600390031004600340037004600460038004200350035004300330045003200390037004600390034003900390037003500320031003600440044003400390039003700410037004500330032003800380044003200330042003700450034003100360045003300440038003000360037003500370044003200430043004500430043004100340039003600320031003800350042003200350046004300420039003300320031003400350033003800310035003200310042004500440041003800410031003100330035003600410034003200300031003700430043003000310042003800410038003400390036004300390031004200330045003400430035004600380031003000340035004400410045004400390037004400380035003000310030004300420033003400320044004200440032003200350039003100460045004600420044004100420035004600370037003000340033004100320034004300460043003400370039003600340030004300430046003100300034003000350046003000390039004100330031003600310046003600370046003300380038003800300046003200300043003000350037003800300031004200410046003900380030004200380042004200330038004600380043003000300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000731003000340000054D004D0000074D004D005200000F4D00790061006E006D006100720000848B36003000300030003000300030003000430030003800300036003000300030003000300030003600360046003900340044004300360030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030004300320032003200440043004400320044003300370038004400300030003000300030003000440038003400390034003400340031003500340033003800380044003600330035003400370030003500410046003800390046003000310030004100300034003700380044003900310039003800340030003400330038003100380044004500370046004600430043003100460030004500390043004200320046003800360042004600460046003200300035003200310031004400460030004500330032003200340037004400440044004300350034003000300041003600300038003100330031004100340043003500420039003100390041003400430035003700390031003800360043003400440043003400310039004100450044004400460039004300380046003000450043004500350035003700380036003800420033003700440046003900300036003400310038003300320036003000340032003700360036004400350043003800300033004100380033004100340039003000320030003400330035003600390034003300450038003300420038003000380031003700300033003100370032003700300042003300450042004400430034003100390043004300430039004300310043003200430030004600340039004600390031003400310035003800380043003800350045003100460033004200370045004600300043003700460046004600460044003600330045003000360034004100370038003200430031004300460035004500370044003600350035003800420035004500420030004500430033004100370034004600420046003100390033003600450043004200380043004600460030004600450045003300300046003800360042003700310046003700450039003000360044003300300030004200450046004600460045004600300043003000430030004300300043003000430039004600350046003700450036003700420038004600370046003300300042004300330045003200440037004500460031003900440045003700460046003800430031004600300045004100450044003500370030003600350045004100380032003200330036003800360033004600320034003100420043004300370038003400420035003700450036003300460036003100360035004100340030003300320036004300320034004100340036003000440031004500410043003000360030003300300030004100320043004100340034004100430039004600390037003600370046003500300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000735003100360000054E00410000074E0041004D00000F4E0061006D006900620069006100008AF3360030003000300030003000300030004600300038003000360030003000300030003000300045003000360044003300460036003800300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003500300031003000330032003300320031004200300030004200360044003000300030003000300032003700320034003900340034003400310035003400330038003800440041003500390032003500420034003800440033003700310031003400430037003300460046004600440044004400340033003500410037004300440032004400420031004300320043004200340033003600380041003800440039004300350044003200430041003900370046003900350030003500390032003400340036003100340032004100390039003800380033004400320034003700390038004400430034004300380043003400310032003000430035003700450044004100350030004200330045003900380044003400320032003700430034003800320038004100310038003700390045003400410041003800430030004500430041004100350032004100360036003400310037003200440031004100330041003200370045003900440043003600430037003300420041003100450043003200450039003700460031003300420031004600410042004400390044004400460046003700390043004300460033003900390043004600330031003500440038003700410043004500430033003700460042004300460034004500340031003800390041003000450041004300430037003500440037003300300039003600370046004600310037004500460042004600430043003300370035003100310035004500380043003200450045003900340045003300460031003000380034004200300032003900350038003100370032003000430034003500370041003000450037004400450044004300310039003200350042003800320043003700330044003200330044003200420044003600300041003500360032003900410043003200420034004200370045003800380032004500440037004300420036004100430045003400450045004100420037003800310043003200450046003900410032004400300045004400380039003600420042003900390039004200370031003900360039004100440039003100390031003900450037004500420031003200380030003800360038004600320042003300390030004300430043003500460042003100320033004600420032003200440045004100330042003600370033003300390045004200300032003500440032003400430041003400360036004400430030004600410038003900300034004200330031003900430034003800410037003200440034003900430031003700340037003600330031003500330033004500350030003700390038003400380045004200300039003600300036003400450045004400460035004300430034004600310043004100450042003600410033003500330044004200310031003000340030004600340041003800350038004200330030003900350034003300350034003900340042003400320045003100430044003300420031003500340038003200320046003500450036003700460038003700390039003700350046004400330044003000430033003100390042004300320042004400360035003300460038004200410031003100420033003600330036004300310045004600430045003800340033003300340036004200340032004300360045003900330033003600420042003100460044003000410036003000430038003100410046003200360037003500370035003200300039003500350037003900330042003200380039003100350042003100390033004400350032003800410044004400330031003200350044004500410035003400450038003300430036003500300034003100370035004500380037004200390041003900460044003600430046003600460036003400410031003200420039003400380041003600390035003600380037004400410033003000380046004100420042003000330042003100350043003400340035003600420033003100310044003400460034003300370037004100440038003900430039004600360034004500420046003200390044003500460042004600350030004300350036003600360037003200420034004100420039003100340031004400420042003000420038004500310043003200430030004500310039003200330033003300300041003200340031003200320031003100320038004300460034003900450031004200340043004500380039004200350041003000390043004300390038003900340039003500310039003100350034004100440032003200450043003400320033003900300044004400310033004600420038004600320045004300330043004200330031004500370046004300370046004100440039003200440032004100320032003800340044004200410035004500390034003400390039004500450033003000460032004100300044004400410046003400300041003500340046004300310035003200390042004300330043003100440045003100420046003400370035003700460046003300440033003100370030003500310037003600360036004500410032003300450032004500390030004200310041003200340041003200360032004300360033004100320034003400380039003300320030003800360044003500440033003100350037004500330036004400310038003300410045004100370030004300460038004100370044004200420032003800330038003400320041004200410032004200390032004300390044003800340037004200460037003100390033003100330045004600340034004200350041003900310042004100310031003500420037004400300031004200420030003700340043003700340042004600460039004200340032003400440030003000420043004500440045003900350038003000330031003400350043004200340034003400350033003500330046004300440031003600390031003200380030003400320038003500380037003500450036003300380042003700370036004300410041003800370039003500310038003700360042004400360042004400320043003200380038003000450043004200320042004400310046003600420042004500300031003700430030004500310030004200340032003100390036003100390036003300330031003500390034003300320044003700340037003400460036003200450031004200450038003100440041004100320037003300340035003900340034003100340036003400350032003700340032003700300042003600380044004400410033004100330045004100360035003300330030004500420037004600330041004600410031004500300037003300420043003800300044003800310038003600340043003600330032003700320034003700440042003700380044004300440031004600410034004600430030004200390046003700310042003800380030003900430044003900430045003500420036004300310030003700300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000735003200300000054E00520000074E0052005500000B4E0061007500720075000083633600300030003000300030003000300042003000380030003600300030003000300030003000370042004600430037004400370045003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310030003100370030003800310031003200350045003600410043004400360030003000300030003000300038004500340039003400340034003100350034003200380039003100360033003600340044003000410045004600460043004600340030003000330043003000340034003000420034003300340037003000440034003600300031003800430037003700330037003600390044003300320034004600320031003800390031003500330030003500320033003200330032003300380033003900360042003200320038003800330038003500390045003000430043003300380039003400420034004600310038004100450044004400370044004300440046003000460046003300460037003900460036004100320030003400300035003100420032004200330033003400330035003700390031003200420043003300390043003200360033004600380036004100450032003200350037003000360033003600350036003600360042003200350044003800430036003200460030004300460035004600370046003100380030004500390046003700420043003800460030004500300045003900300037003800360043003300450037003100450033003200460043004600430046003500380037003600430038003300310039004400310033003300300038003000460031003700310042003000330032004600330037003300420043003300450037004100460033004600310039004200450037004300460042003400350042003600430031003200430045003800300032003500460042004500460044004100320043003800340030003100380030003000300030003000310038003700320045003100320030004600360032003300420045003800300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000735003200340000054E00500000074E0050004C00000B4E006500700061006C00008BAF3000300030003000300030003000310034003000380030003600300030003000300030003000380034003600320042004400370037003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310030003100370030003800320034003700330035003500360038004600350030003000300030003000320041003100340039003400340034003100350034003300380038004400390044003900330035004400340038003900330035003100310038004300370037004600450046003900390037004200440042004600430034004300450043003700420044003100390037004400350034004300460042003700320044003600330036004300330033003200430043004100320030003200360046003000420038003200380038003200450031004100360034004500350034003500310031003700440034003000350031003100340044003100340035003100460042003200370035003500370044004400370034003600310035004600300036004500390032003000430044003000410030004400430034003800460042003200340030003400320043004100330032003700300034004500360042003500360033003200350033004100370036004600360036004500460045003900360041004400360036003200380042004500430038003100300033003800370045003700330039004600460031004600460046004600330033004300450037003800300044003300370044003100310034003700450039003700340046004500330033003800340037003300440038003700460042003000330030004400340031003900430030004500310044003900300044003500320039003900330030004100310032003800430033003300350046003800330032003700350042003100420043003300430037004200450033003800460044003900420036003500330043004600350038004500330034004500390046003900300038003300460030003200360033004600450034003100330036003500390044003700370035003600360046004500420037004200440035003200450039004300410035003400370035003800370046003200410036004500340032003000300038003000340034003300390043003600440031003400460034004600300044004400370037004400370037004300460032004400450041004600460046004500310041004500370031003500440042003300460030003100310034003300350030004500390031003100300033004600420045004200320030004400320031003500310046003600460031004600450043003200330044003500460039004100390046003900420037003300320045003900340039003200370042004300390046004300350037003400300038003200440044003800360041003200310041003900390035003600450032003600320035004100380039003000420034003500330035003900320036003200430046003600360036004600350046004200330042003800450031004200460035003500420032003300320031003400460030003600310046003700310034003400340030003300430034003000310041003800390036003500390043003400440042003900360033003300460033004600300035004500300030004600340044003000310030003600330042004400350046003000300034003800460046003300450041003000350043004600330035003700340043004200440039003500420041004600340046003100440035003500350045003700360046003700460033003500320035003100370035003300350046003100430038004300370030003100300032004300460037003900320039003400450037003400300031004600440031004400300034003700330034003900320046003200310043003000340043004200420044004200460044003900390034\
-004500430030003800420045003500320043004100330041003600460036004500350046003100370037004300450042004300370037003900360035003500420042003800410036003100340036003500420038003000360034004600460037004400360032003500300032004300340034004400340044003200330032003800430043003300340030004400390042003500300037003400350044003800460036003600350039003000410032003100410041003900320041004400440034003200350032004500410038003400340043004100370044003100310041003300310041004600420044004300340037003200320044003000330030004100330039003000380041003900340032003500360037003400300044003600340037004500440039004300320032003400430034003800350044003400330033003000320042003000320032003000340043003200360030003000340045003000340039004500320030004100350037004500410043003300320032003500330033003900460045003600390032004100360041003800390030004400460039004200300038003900300042003200410035003800300046003800390043003100350030003000300043004200460036003800450035003600340035003500410044003300410032004100300043003700350044003500370036003400460031004500430046003000450042003400430034003200340031003400360035004200380030003600440042003600430038003500330032004500380041004400390031004500310030003800370041003600420036003400390042004100440035003000420036004100340035004100450035004100360043004300460044003100410042003900450045004500430035003800370041003000310036003000430045004200320041003200430045004200310038004300320037004400350033003900310036004300430035003900350036003000340039003200330033003800310034003700390033003300360037004300370044003500370034004600410045003600370035003900340043004300300034003800350042003300420041003300350044004400440045003300430039003500310035004600300046003200330036004400450044003000300031003800410035004500340035004300410030003200360033004500370046004500300037004400320033003000450037003700450036003900460030003000380033003700350034004100430045004600310042003500440044004100440041004100310043004400360031003800450044004500410032003600440034004400380043003200430030004300330035004100340032003200440041004400420046003000450030003100300035003400330031004400450041003100420035003300440041004100450041004500370039003300420045004600440031004600330041003000320046003500430038004200370038003000370045003100320039004500380039004100310036004600350042004500310041003800320034003300390036004100440046004400380044003400390045003900410042003600390044004300440037003000310032003000370045003100380038004300450033003100460034003500440037004200340039003800360032003000300031003300330041003100370033004600350034003400460042003600380035004600430045004600420030003700420045003600300033003200380033003300370033004300450030004500320044004400350033004500320037003000380033003900460036003200440041003600330032003200320031003400300036003000440041003600340039003000440030003900370033003500460036003200390034003900420037004600300032003400460046003700300033004500320030004400390035003500430041004300300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000735003200380000054E004C0000074E004C00440000174E00650074006800650072006C0061006E00640073000081D736003000300030003000300030003000460030003800300036003000300030003000300030004500300036004400330046003600380030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030004200320046003300310036003900430044003000330030004100300030003000300030003000320042003400390034003400340031003500340033003800380044003600330035004300320037004100330046003100390046003800310030003600380030003800390031003600380036003800450031004100380043003000320031003800460046004600460046004600330046003100410037003900340033004400340036003000340036003400350042003700450045004400310043003800310042004100320030003600300033003000300039003400300030003000370046004100410034003600350041004100360041003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007350033003000000541004E00000741004E00540000294E00650074006800650072006C0061006E0064007300200041006E00740069006C006C00650073000083A3360030003000300030003000300030004600300038003000360030003000300030003000300045003000360044003300460036003800300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003300300030003000450031003000300046003600370032003100440044003000300030003000300030003900450034003900340034003400310035003400330038003800440036003300460038003400460030003000420043003900460033003400460035004600460031004400370031003500390031003400460043003700450044003200350034003400320044004100460045003300330033003100440030003000380038004300310041003000430030003700380043003000430030004300440035004600460038003900350031003100380031004300410043004300440043003000430030004300300043003000420030003700360045004400350035004100320030004300360036004300310032003700320039003200410043004100430044004600300046004100460035003500370030003600300036003000360030003600380036004300330038003700310046003300320033003000330032004600450043003700320041003800370030004400450030003000440038004100440041003500410030003700300036003700310037003100310045003000360030003600300036003000360038003600350037004100460042004500330030004200430037004300300039003300310034003800350043003900430038003700410031004200360044003600300031004100460038004200380039003000410030004100300039003000390035004500380036003100370032004600330045003600330042003000460031003000310041003200320032004100460042003200440032003800450038003100380044003800440039003900380031003800440038004400390039004100310042003200440032003800450031003800320044003000430030004300410033003300390036004600450038003100410030004300300030003400330037003500420043004200380031003900380039004300370044004100300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000735003400300000054E00430000074E0043004C00001B4E00650077002000430061006C00650064006F006E0069006100000735003500340000054E005A0000074E005A004C0000174E006500770020005A00650061006C0061006E0064000087D336003000300030003000300030003000420030003800300036003000300030003000300030003700420046004300370044003700450030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030004500320038003000300037003100390039003500370031004300300030003000300030003100410041003400390034003400340031003500340032003800390031004200350039003100340044003400380035003400360031003100340038003600390046003700420042004600370031003100320042004200390033003000450039003500360033003300350036003800310033004400410038003400310033003800310030004300420041003300320030004300300034003600370032003100380031003000420032003500310037004600390030003300420035003900320039003000340034003500410035003600380032004500340033003600310034004400340038004400340038003100340041004500330035004300320031003600410045004200320039004600350035004200380045003800430046003100300037003400430032003100390036003300440034003400390041003800390039004200390036004100330033004600370044004500410046003800350032003400350045003400360034003100310038003300440042004200370033004400450037003300390045004500460046004400430045003500310043003200460044003400330044003200350035003100350036003000360041003600390039004200410045004400310038004600370034003300350030003500450038003100430045004200450033004400390044004400330045003800360032003700420046003700320041004600440036003400330046003700340035003000330035003700350035003800300042003300460037004400460037003000440038003700300038003400360036003200440044004100460035003100380031004400350045003900330042003500390031003000360035003600310043003200450043004300330031003600380041004100420039003400300041004600370037003100330041004400420032003800320039003900360038003900410034003700380033003900460042003200380036004600330031004300380032004500300041003500320032004500360043003200420046004300390031003800410036003400440035003300310036004500410035004200450034004400450038003200390039003400380046003100460037003400370038003400310033004200450035003200430034003200390043004400440036004500430035004600420045003600320043004200390044003000450039003500310037003800440036003700360038003900420046004500340035004400410042003000450043003800450039003700410045003300370041003000320041003000410033004500430046003400390044004300460039003200410041004100310030003400340037004200310045003500330044004300370044003000370032003300390039003200320042003600410044004200300039004100340043003200330032003500420030003100430044003900370031004100330032003800340038003200390034003900310042003100360042003700350045004100450030003300310030003000410039004300450036003400330046003800300046004100390032004400300033003000300046003500410037004600420033004300430031004100300038004600420043003700380039004300380031003700370031004200330043003900390044004600370039003700310045003000330042004200430033003200380041004600310035004500460036004500320035003700420037003900380038003900360036003700360044004400460034004400360039003500440030003500410045004400420031003300390042004300450041003100360035003800370042004600450041004500330043003700460033003000320041004300370042004600450039004200430035004400340043003600300035003900390032004400410036004200450037004500380036003100390031004100370039003400460033004600450037003300300043003200310035003400360045004400460032003800410033004400390041004600370031003700330045003400300042003000300042004500310032003100370041003600360039003100310038003900450042004400390035003700460042003000460041003600460043004100310033004300350030004300440032003100440034003500430030003100340032004500430038004600430038003000390035004300410038003300390039003900300038003100350035003100410038003300390038004600310036003900430044003000330033004200430034004500310036003900300044003000330033003500390044004100420031004500440046003800310046003300440041003200380043003900460034004200410033003700330034003900300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000735003500380000054E00490000074E004900430000134E006900630061007200610067007500610000839B36003000300030003000300030003000440030003800300036003000300030003000300030004100440041003500390045003600330030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030004300320032003200390043004100340030004600330039003400300030003000300030003000390043003400390034003400340031003500340033003800380044004500440044003300330044003000410043003200340030003100300038003600450031003700370031003200460033003000330041003200310036003800320038003500390035003800350038003500460036004400450043003900380042004500390035003500360032003100420032004300300034004200310034003800360039003500320030003400310031003200310036004100420032004500450037003800380034004400440032003600380035004500300044003400330033003000460031004600330033003800430042003000430044003900340031004500320041004500380030003300460044003400440035003800320045004400350033003300370033003300350041003900350041004500430046004200310041004400390043004600330044003800430038003600450042003100370038003800310042003500360035003500450037004600310039004100440042003800390042003200320045003000300036003500330045003500420039003100380045003900370034004500440038003600420031003500340041004300370046004500390038004200330043004200320042003500410036003300370043003400360046004300310032004400370045003500380031003200360031003000300034004300420032003800380043003900390034004300330037003600450044003800360037004300370041003800390031004600360037003100340045004500320032003800420031004100340038004200300045003100390033003800430033004300380046004600340031003700410038003700420046004600350044003600330041004600370046003200410041003000460035003700300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000735003600320000054E00450000074E0045005200000B4E0069006700650072000083D3360030003000300030003000300031003300300038003000360030003000300030003000300039003400370039004600440038003800300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390030004600310031003100300030003300350038004200330037004500420043003000300030003000300030004100410034003900340034003400310035003400330038003800440036003300370043003100300043003400460036003900460038003100300036003800300038003900310036003800360038004500310041003400430031004600380033003100390042004600310045003500440034003300350034004100410046003800460037004600350032003300430034003200350044004300460043004300340031003900460043004600460046004600370046004200430030003600460046004600460046004200390042004500310043004400380034003000340038003600360046004300370044003600330030003300300033003000330030003300300037003000350039003800350033003000380038003100340032004300360030003600300036003400360036004300350036004200330030004300310041003000460038004200320036004200300045004400430035003000300036003000360030003600380036003600460043003700440036003300300037004300440039003300350038003700410030003800420030003900310041004600430045004200450045003300390041003200430034003400380033003600390038003400440044003900380038003200380033003100390032003000440045003600370031003400420036003100450030004200320030004100380031004600330042003900410043003400320031003800370038004400430035003200300038003100410043004300420038004500450045003900300045004100320035003200300035004300420041003700300046003000430030004300300043003000430030004300370046004600380030003400380038003500310043004500430030004300380042004200340031003700420042003400310030003100410033003500310038003100350030003000300030003900300031004500320046004500420037004600340037004500460039003500300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000735003600360000054E00470000074E0047004100000F4E006900670065007200690061000081EF3600300030003000300030003000300042003000380030003600300030003000300030003000370042004600430037004400370045003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310030003100360031004300320032004200350035004100370030004100320030003000300030003000300033003100340039003400340034003100350034003200380039003100360033003600340036003800300046004600430043004600380030003000330032004300460035003200420036003400380038004400320042003200430035003200410042003700450043004400410036003100380036004500380034004400460044004200380042003400330032003300300045003100390034004100310031003000380043003100410033004300360041004600300041003800430031003700380030003000300030004600420035003800300037004500440032003800370038003900360030004300300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000735003700300000054E00550000074E004900550000094E0069007500650000862336003000300030003000300030003000420030003800300036003000300030003000300030003700420046004300370044003700450030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100300031003700300030003200430042003500350037003600410043004600300030003000300030003100330045003400390034003400340031003500340032003800390031004500440044003000430044003200420043003300370031003000300043003700460031004600370046003700420037004200310042003100310034003100420043004400330043003600430038004300430032003600360041003500380038004300420031003600340044004200390032004400340044004300440034003100380045004100340043003600330046003300300046004600380030003800330038003300390033004500340043003000390036004300420039003400340034003200390043003500390031004200320037003600310034004400330033004300410043003300430041004300430043003400330043003800430036003600340045003300450037004500430046003600440042004300310043004400460042004600450037003900310044003300450045003200370038003700360035003900390036004100430031003600360036003200320043004600380034004200370038004500390038004600340044004100390039004400380030004600420030004500380039004100360031003700450032003300430036003900340044003300430038003500380041004200310036004300390036004100410031004200310037003300300034004100350034003900440045003900440035003700440036003000460041004500390039004100450043003900310030003000460030004400440033004400370044004400340030004600410042004400310038004200370041004400390032003600330037004600310033003700450034004600310042004300310042004300380039004300310038003500320033004300350032003800380030003300380045004400460037004300390034003200320044004100330036004400370039003200360031004200440033003100330039003500380042003700380046003100410035003200380035004600410042004100360034003700450034003200380042003100330046004600310037003100350041003800310039004300310037003900380039003700460036003100340043003300450041003800340036004200300030003200310043003000350038003200350033003000440034003700450045003200440030004500380044003800440043003500450041003500370037004400380038003300340045003700430046003300370030003900460032003400360035004400300032003300430042003600300034003600330039003200430038003500330033003100350035003800440041004100440031003400420046003400390043004300390044004300310043004100350044003200390041003300440041003300380041003100320042003300350038003100370033003000440031004100350042003100370046003500410035003200410037003600360046003700320030003500350044004100310031004500420037003200340033003800340039004100360038003900410036003600330041003800340043003500460033003400390038003900410037003900370043003700340036003300410044003800420032003000440044003500450031003000330043003500340044003100450031003700300033003200350034003200360031003700300034003800420045004300410035004200310042003000380035004300320041003400420046003400300046004600450031003500460046004400300030003800420042003400360031003800370042004600460035003200370034004100300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000735003700340000054E00460000074E0046004B00001D4E006F00720066006F006C006B002000490073006C0061006E00640000858336003000300030003000300030003000420030003800300036003000300030003000300030003700420046004300370044003700450030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030003100330041003200460041003900450030003500440041004200300030003000300030003100310036003400390034003400340031003500340032003800390031003600330039003400360043003600320046003800430046003800300030003500340038004600320043003900390043003300450039004200460046004400380031003400430036004600460046004500450037003300420030003300330033003200330033003300300033003100420033003300310042003500430038004400460031003400340044003900440033004300460033004600330044003300310043003500410036003900460030003900390042003200300033003600370030004600320045003100340031003800360031004200320046003200460031003100410042003900430038003100380035003100380034003500420046004600460046004400360036003500380037003500370031003100310038003300330030003900370032003800380033003900450039003400300039003500310030003600310033004500350045003200460044003700370037003600330030003300430037004300370046003800460045003100460045004600420044004200300043004100460042004500420043004100300038004500430031004600460031003900460045003300330045004300420042004200330038004400450031003100460043003300350046003800360041004200320046003200460033003200370034\
-0031004500410038004100350038004500430031004600460046004500460046003600330037003800460045004600390032003900430033004300460044004600330046003100380039003800390039003900380031003900390045003700430042003800430046004600300046003500440037003600370043004100300044003700450046004200450035003100350030003300300046003100420032004600430033004500420041004600320046003100390033003800350038003300380031003900310038003100380031003800310039003600450042004400420045003400360042003900430031004200330034004600340044003600340033003800460041003600300033004600430033004100460042004600420046003100380031004500420043004200420043003300460030004500360045004200340042003800360042004200360046003600460031003200330034003900380036003000410041004200300035003400420030003600370045003000450035004500300036003300330038004600460046003400320034003800330031003800380046003200340038003300420033003800410031003700380033004100430038003000300032004500350030003600330042003200390037004200330032003300380032003900370042003300320036004300420041004200360038004100380031003900440038003500390044004300310034004400430044003800460041003000410031003400340031003900300043003000330031004500310041003000310030004300380043003500380046003300320038003700360030003000300030004600440045003200350044003100370031003800360045003100320039004300300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000735003800300000054D00500000074D004E00500000314E006F00720074006800650072006E0020004D0061007200690061006E0061002000490073006C0061006E006400730000884F3600300030003000300030003000300042003000380030003600300030003000300030003000370042004600430037004400370045003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310030003100370030003000300036003600450045004300410033003100390030003000300030003000310043003900340039003400340034003100350034003200380039003100390035003900330042004600360042003100330036003100310043003800370039004600460037004400450036004200340043003600430031004100340043003400430044003200340034003900340043003600340036003800420039003100340041003200410045003200350032003200410036003800330030003000450032003200300045003200450041004500320045003000410036004500370035004200310034003300300037003200370035003700370031003700320044003200350031004400420042003500380033003500380035003100340039003100440041003200340042004100300041004400320032003500360035003100380039003900300037003000360044004100460044003400410034003300350033004600410045004200390046003700410045003700460038003000420039004200340037004500440037003000460043004600380037003000460030004600370043003000350046003700440045004200410046003400420038003300450043004400360031003600320037003000380037003500310032003100370030003700430033004500300043004100310039003800320042003400420039003400320042003700410036003100450038004200440043003200370043003300430043003000370034003700340038003100390038004200450038004500310035003400410033003300460037003700350039003900440042003700310038004400430039003700330036003900310045003500340033003300310034003800430037004500340046003500360046003300300041003200450030004600360039004400430044003700440046004100310031004600380039003700310044003700430038004600310037003800340039004600320041004400330039004300360044003400460036003000440042003600460044003500310031004500310045003500440036003100320043003200340046004600420046003700380033003200420044004300390031003700370042003800330046004300430032003300300043003500330035003100460045003300410037003900320038004300310045003000420046003300420041004400320043003700460035003600320038004100450032004300460030004100350033004400390041003000360037003700310035003700310035003000330042004100340042004500320035003700380039003500370038003300310037004300390045003200370030003200310037003300390043003700430044003600340046004200420045003300350032003400460042003400370039004600330046003900330037004500350036003400390045003400430046003500300035004600440046004100350035003100410046003600420046004200450042004200320045003900360034004100420031003900310043003800350031004100450031004600410032003600340030004100340032004100320043003500370030003600410038003800440033003200370035003300370034004100430031003600430042003300350038003900360039003800370031003100410031003700310030004500450030004500430035004600340035003400420044003300320039004100430043004400330033003300310037003200310038004400420031003500370043003300370036004100410043003100410041004200390038004100360043003900350032003700350030004200440037003100350039004300380039003000370046003800360030003200450046003200340037003700350042003700440039003500350038003500410035004100300031003100420043004300340043004400380038004300310046003300420030003800450042003600460033003900370044003900390039003500390041003400390034003000340039004400310033003900430038004600360038003500430034004200440036003900380036003900350046004300310041004400440041004600420035004600300043004600300036004300450035003200300038004200450042003000450034004600370033003000440036003400420033003800360035003200300041004300420042003200380038004400300045003400340039004100450043003300410037003200440038004400340037004100350038004500310037004500450035004400440043004500410042003800440043003700390045004600410033003500300046003100390033003500300036003500300030003800340031003000380043004300380031004600420043003300340030003600420038003300350041004600420030003700420033004300380039004400380045004200460033003000300041003200360045003900440042003300460045003400440036004300320034003100460035004200330031004400410035004100360030003200460038003400350044004600450030003000410037003200410031004500380034004100330038004500300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000735003700380000054E004F0000074E004F005200000D4E006F00720077006100790000829F36003000300030003000300030003100300030003800300036003000300030003000300030003100320045004400380046003200360030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030004300310037003300340030004200370037003500440046004200300030003000300030003000350044003400390034003400340031003500340033003800380044003600330037004300410046004100440046004200390046003000310030004200310030004200380037003200380039003800310035003100330033003900330038003100380031003800310038003100450031004600460046003500450039003000430031004600370034004600340042003000320039004300330030003900390038003400380035003200330044003600410046003000410030003300320039003800340035004500300043004100320035004100320031003400310032004100420030004500300036003100380031003900330034003300320042003000320036003300370034004100300031004300440038003200380032004600310046004600460046004600460033003800350044003800430039004300340031003400380030003500320043004200380037003200310034003700410039003800380045004500360042004300310031003600340033003000300030003200320033003000310038004100390044004600450042003900440041003800300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000735003100320000054F004D0000074F004D004E0000094F006D0061006E0000838F360030003000300030003000300030004200300038003000360030003000300030003000300037004200460043003700440037004500300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300043003200320032003600350041004600460045004500300035003000300030003000300030003900390034003900340034003400310035003400320038003900310044003500440030004100310030004100300032003400310031003800430034004600310046004600410045004200420031003800300045003800420031003800450035004600320045003200320031004300320046003500370042003000360033003100310039003300340044003800340043003300450039003700340035004300330046003500300033004400460034003200420034003800390030003800360036003000350042003700440043004300310036003700350036003600430042004200310037003900430033003800450031004300370033003000410041003200390037003200430031003500380037003000320033003300380031004600410031004100450035003100380042003100350037004100420044003200310032003400310041003400300039004300340033004300440039003700410038004500390030004300390032003200340030003800460043003800300037003500330036003800310045003700300033003700390037003900450038003000460041003200430030003000360038003000460042003000440032003900460037004100380036004300380043003700380030004600440037003000420037003200410038003800320036003000440035003100340042003900430034003500380046003800310044004400440030003600440041003200410036004300370045003900350045003500440030004200320034004400420042004600310045003100350033004100460043003300320045004200350034003100460030004600460037004400460043003000360035003100300030003200310038003700300030004100300035003600310044003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007350038003600000550004B000007500041004B000011500061006B0069007300740061006E0000862736003000300030003000300030003000460030003800300036003000300030003000300030004500300036004400330046003600380030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030004400320044003100320046004400310031003600430034003800300030003000300030003100330046003400390034003400340031003500340033003800380044003600330046004300460046004600460046004600370046003000360033003400440030004200310041003300380033004100310037003200370044003200350042004100330030003400390038003000380039003200320044004400380033004400450045003000340030004300330034003000300036003200440034003900320044004500410031004100350043004500330035003500430033004300300043003300430045004300330037003000450044004600390033003500420038003500380041004300340035003200430038003300420033003800360033003300350036004600350032004300430034003100380041004100320042004100440043004200350030004500360035004500430036003200300035003200320043003000320031003700390033003100330039003200360033003900380031004300330045003900390045003100440044004200370037003700300043003400410044003500340041004500340031003900310043003600450031003200430045004600300046003600450042003500420038003600350046003700460037004500430031004300350031004500420044003700420043003400350030004200320042003600380034004500310044003800440044003600330030004300310043003200430031004300300043003300460046004600460045003600340034003000340045003600300034003400310039003200430032004400320030004300440032003000430036003200420043003600430030004300450043003200430045004600300046003300430046003400460042003800460038003900430032003300370033004500300036004300370036003500360037003600380036003900460042004600310031003700320034003400380035004600310044003300300046003400460031003900420038004400380042003800310038004500320032004300450033003700300041004100340031004300460030004500340034003100390042004300460032004300430034004100380036003700460046004600460046003300310037003400300037003700370033003300440038004100410044004100360032004300380046004200450038004600410041003000300034003100330030003300300033003900310034003100370031004600390045003900360035003800360046004100340044004600350030004300430044004600450043004400300043003000370038004100300046003300300041004300330042004200460038004500450031004300380039004400320033003000430045004300320043004500430030004300310036003800410031003600300043003700390032004200460033003300300046003400310030003600350033003000300033003000330030003300340033004300420042003600310036003800360035004200410046003600450033003100390034004200380039003600330030004600380045004100460039003300320044003800410038004400380033003000360043004200380042003000380031003200310036004200350039003100360043003300380042003400460032004600430038003300370039003800380031003800310038003100360031004400350039003900350035003000430041004200430045004100430032003200340041004500440045003000430038004400320041003400300030003000300039004100340032003600330033004400340032003800310046003900350046003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007350038003500000550005700000750004C005700000B500061006C006100750000851B3600300030003000300030003000300045003000380030003600300030003000300030003000320042003300310045004300430044003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310030003100370030003400300038004500440033003800340042003100410030003000300030003000300046004300340039003400340034003100350034003300380038004400360033004600340035004100370042004500440033004600300033003000440030003000310033003200440030004300320035004300410036003000340045004100360036004600300043003000410031004300420037003100380046003800350039004400450039003100360034003300300030004200320045003000390035003600430036003500460030004300430039004400320044004400300043004500450043003200360042003100380044003800390038003700450033003200460043003600370036003000360034003300380046003300430039003900360036003100430041004100330034003600380036003300370042004600430035004300390037003700370031003900310037004300320035003800330041004600450038003500320030003600330036004100360039004600300043003000430030004300300043003000430038004300300043004600460031003900340043004600390030004500330031004200340041004200430036003300330037003000330032003700440032003500430046003600300031003500430045004100420030004300370036003800320044004200420031003600410039003000360032003700460043003400450030003200390042003200380041003300430038003300370035003700380043004500450030004400350034003400340038003100450041003700430031004400340030003000350038003000440042004500460032004300350030003400410046003200360034003200460032003300380030004400420045004600330035004400390042004500310044003000370042003400460041004300310041003900450046004400390034003600330044003800460045003200360038004300330043003800330031003900310038003100380031003800460041003100450042003600330033003600430037004500310044004300440046003000450042003100460033004200300033003000330030003300300033004300330037004600300036003400360038003600440033003900460045004300310038003200410036004600320046003600340046003800460045003800460039004200410030004300310038004300380034004200320033003400320037004400330033003700300036003700310042003600320037003000430045004600460046003800380033003000370043004600430032003300340034004400300034003000310038004300300039003900340031003600300045003000460042003300460032004500380036003000370033004600440034003800380033003600310030003000360036003800390036003200410030003000300032004100380034003300420038003300350045003700460043004600420030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073200370035000005500053000007500053004500003F500061006C0065007300740069006E00690061006E0020005400650072007200690074006F00720079002C0020004F00630063007500700069006500640000836B3600300030003000300030003000300042003000380030003600300030003000300030003000370042004600430037004400370045003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310031003000430032003200320033003200410039003500310041003800410030003000300030003000300039003000340039003400340034003100350034003200380039003100360033003600430033003000330036004600450042004600390039003800310046004100380030004300390038003700380031003800310043003100390037003100360030003600330033003300300033003000330030004400300043003200370030003100360031003800430033003800370038003100380031003400310038004300380037004500370046003100320045003400310043003100320037004400340033003000390038004600310038004300420031004600310037004600360034003000310041003900420034003300340030003600430039004200340033003400380041003000440036003600340032003100370037003800330036003600420031003600430033004500370042003300360037004100390036004600420030003600340035004100310041003000330041004600420031003300310043003500300036004200330032003000370033003900450035004200360039003300440033003900320045004600370045004200330031004300330038004500320039004400340033003300370038003900370033004100330042004300330032004500450031004300370033003200300043003200370031004600430042003500300036004300320041003000330033003400320038003700360041003900420033003300330045004300350032003600330041003300380036003700390030003800380033003600390036003100320038003000330030003300300033003000330030003000300044003200350031004600350032003600460046004100410038003100350030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073500390031000005500041000007500041004E00000D500061006E0061006D0061000084BB360030003000300030003000300030004600300038003000360030003000300030003000300045003000360044003300460036003800300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300043003200320032003100430034003900420037004200410036003000300030003000300030004500340034003900340034003400310035003400330038003800440036003300460043004600460046004600460046003700460030003600320032004300310036003500340031003500330036003200390035003300320033003000360031003100330032003400440045003200410031003200300044003900450037003100450038003200350037003500300044004600450046003600450042003100460034003300430041004500320042004200300043003800350041004200310046003300300045003400410044004200430043004600460030004600330043004600330046004200320030004400360036003400310045003600370030004200310033003100330031003300380041004100460033003300330042004300460046004600360038003700430031003500350035003300380030003800310039004400300035004100420038003700380038003000320038004300450038003900310046003700450044004400370033004600300036003200450033003600320036003800360045004600420046004600460033003100370030004200320041003200310041003400430035003100450034003700310042003100340031003800340044003000300044003200350031003500330030003700360045004300370038003400320037003400310041003800380033004600420031003900450037003800380033003100390044003200380046003100310036004400460030004600460031003900390036003400340031004200340043003900390037004600310039003100380031003800370045003300440037004100340045003500440038003300460046004600460046004300430035004600300036003900460033003700450038003600320037003900390046003500300043003900460042003600310043003600300046003800460046004600420030004600370035003000430036003600360034003600370036003300460038004600330046003600300033004300330044003700360033004500370031003900460045003700440046004600430031004300300043003800380041003900320037003200350031004400330033003100410039003800300035004400340033003900310034003100460035004300380033003200380036003700460035004600420046003600330043003800350031003600340033003000420037003800350030003100340045003300390038004100320033003000460031003700300030003000300044003600340033003400410033003400350039004400350033003700450030003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007350039003800000550004700000750004E00470000215000610070007500610020004E006500770020004700750069006E0065006100008A5B360030003000300030003000300031003100300038003000360030003000300030003000300044003900420031003500430038003300300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003000310037003000320032003800380030003000430043004300350034003000300030003000300032003400430034003900340034\
-003400310035003400330038003800440041004400390032004200460036004200350033003500310031004300430035003300460046003700450035004600440045003800430042003600420041003800410039004200350032003100380039004100340030003500340042004500420035003400420041003800380039003300330038003400350041004100380042004500380035003600370031003700340037003100410039003400410041003700410032003000340043003900320034003500320043003400340031003300370039004400310044004600430030004600320034003100300043003400410044004100440031004400330041003500340031004300410034004100390041003600310034004200310037004400360041004600320036004300390032004600370035004500440045003700350030003800340044004400420045003400410035003500350046003100430030003800350043004200460037003700300030004600450037003700430045004600310031003500370038004400300031003300390036004600300045004100330030004200430031004600460038003400300030004500340034003400430034003600300041003100330046003400350035004100440031004600450045004500420031003200410039003100370045004200380032003100300035004500300036003300420033004300310038004400430041003000360045004600420043003500460037004600320043003600410039004500460035003400390044004400410039004600350045003400390035004200440034004200350035003000360044004300370035003300360037003900350045004400420032003600330038003400320035003000440031003400310033003100320035004600310041004300380037003900310030004500420030003200360046004400350036004500450030004500300038003400300037003600300045004300460041003900350031003100450046003500320037003800390038004200340038004400370030003300360042004300410036003700450038003900410038004200330039004500450041003300320037003000330038003200420041004100300037003400440046004300320037003900410046003800360033004200330045003800380045004100350038003800360039003900430041003000360041004200370045004600440044003000370043004600300037003200380033003300330034004600310044003000360032004500420041004500380043003900350036003200450041003500340046003900320042004500420037004400420039004400410043003700330039003000430039003600340032003800310034003000410034003400330033004100370042003900350035004600440043003200410042004300360038004600330036003500370046004200410034003500320037004100360030004600310045004400420035004400310031004100300034004600300046003500380035003800390042003300410034003200320046003400360033003500360041003100450042003300410032003300320033003200330039003400430042003600350036004100420035004400360045003700350043004400320036003300450034004100320030003900410032004100320045003500340033004100380039003200410031004500420032004500380033003500370031004100360043003300450038004200410032003200370030003300370045003100360037003500390041003400450038003800420030003600310031003800300034003400310038003000450037003700390036004400330032003100360038004200410031003600390031004100420036003600440033003300310041004400310037003900360032004100350031003800380044004500430035004200310033003100410036003800320037003000330041004300320039003100460036004600350042004300310035003900440045004400460037003300370042003100350037003300370033003700330043004300430045004300450031004500380041003900330043004200450035004300380045003700460033003000380032003100320038003300350035004400360045003500360033004600460033004300360041004400420036003700390045003900420035004400430033004200430042003600410035003700300035003200320043003000340033003000300034004400440033004400380044004100440041004100320035003400320041004200350043003900460035004600350037003500310036003100370031003700440039004400390044003900300031004300300034003300350032004600300031004300320041004200320043003900370039003200440038004100380032004100300035003900350035004400300034004600340039003700360033004600310043003600450035003000360038004400440030003000420032004400390032004300430035003600320031003100440046004600370043003300360038003200360044003500330045003100450035004200320039003800360031003500330035003900340030004600410044003100420043003000440041004400410035004100340046003500310038003000350035004200460043004500340043003600350038003300320035004200460042004200360041004100310043003200410036003600390033003200330044003300440038004400360044004400420033004400340035004600370046003000350044003300360042003900350044003200440046003300420032003600450038003700430036003900360030003700340046003200320039003100390030004500350037003200350039004100360044003300360039004400390043003900310044003700350032004500360038003900360037004300370042003600320034004300410045004300340043003700450035003400410037004300350043003700360045004400350038003500350035003500310034004100350031003500430034003700350044004400360033003500440031004600340034003500410044003100350038004500380034004600330031003100310033003100370041003700460044004500420046003400320031003700380032003700390037003300390038004400460032003500370045004400450046003400410045003000360031003800300036003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007360030003000000550005900000750005200590000115000610072006100670075006100790000836F360030003000300030003000300030004400300038003000360030003000300030003000300041004400410035003900450036003300300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300042003200440031003300380045003900420032003000360043003000300030003000300030003900310034003900340034003400310035003400330038003800440036003300330043003200370041003800460036003900460038003100300036003800300038003900310036003800360030004500340044003800330031003900350046004300440035004300370034003800430031003800380035004400460046004500460046003600330036003500360030003600300036003000450030003600320036003400460041003400440039003400430031004600460046004600460046003200370031003800370039004500460045004500440044003600320042003800420034003600380033004100380033004100340038003800330034003800330041003800390037003300460038003300390030003900320032004100340031003800330038003900300041003800410032004600300037003000460033003100430043003600360042004400430044004200300035003500340038003800340045003100450042004500310044004400430034003600380032003100430045003600300031004500330042003600370038003600390038003200460045004100300043003000450034004600350046003300310037003000440042003700380031003200360035003300300045003300410034003500350042003700380038003000410036003300380036004200460044004600350039003100390031003800310038003100380031003800390038003300390038003900300042003600330030003600380042003100350041003300310039003800340042003600300036003000330030003000370035003400320032003600390046003700330033004600450045003300320030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073600300034000005500045000007500045005200000950006500720075000081FF36003000300030003000300030003000460030003800300036003000300030003000300030004500300036004400330046003600380030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100330030003500300033003000460033003100300041003900300038004500300030003000300030003000330035003400390034003400340031003500340033003800380044003600330033004300430033004300300046003000390046003000310030003700350030003500430042004100390034003400310032003800320041003000410041004200440043004200420036003500430042003100380045004500340037003400370045003300440032004300410043003000380034003500330038003600340032003300300036004100460030004100380043003100410033003000360038004600310041003300430041003000300036003000330030003000430043003700450030003700450039004600390035003100370043003300340030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073600300038000005500048000007500048004C0000175000680069006C0069007000700069006E00650073000085FB3600300030003000300030003000300042003000380030003600300030003000300030003000370042004600430037004400370045003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310032003000450033004100300033003800320044003100440039003900420030003000300030003000310033003400340039003400340034003100350034003200380039003100410044004400320033004400340042003400320037003100310043004300350046003100450046004200460039003400300043003100340032003200370041003700380030003100300035003100310030004500300041004300440030004400330035004600340031004100360043003600420036003900310035003200320038003200380036004100300038003600380036003200380036004100320038003700310030003800320031003800340039003600330036003600390030004100410032003400310039003700380042003500310039003100360030003400350036003000430032003000350037004200310030003900350037004300320034004300420037004200450046004100460034003100390032003500360031004600430045003000420046003800370030003300380031004300370035004100310036003500360034004600350032003800430031003400330042004100340032003200460044003300420037003300300041003500390031003000380034004400420033004500460046003700330032004500340042003400460037003000430035003600320032003900360038003000300032003200300035004600460043003600360033003300390034004500340033003800460032003800320036003100340041004200370042003000300038003500360031003500410043003200460041003400310036003400370042003900450036003700380044003400340044004600430030003700370037003500430044004400360034004200420038003300410035004100360032003100450035003400420036003800360034003500310038003300390033004100380044003100310035003000300032003200350031003900440042003500340030003900320035003400410036004400410030003100360043003300350043003400430041004500450032003200380035003300300039003800340035004400340043003800330032003600410037003800310031004500350037003000320033004200390032003000410036004400330036003700390045003200450030003500450045004600350045004200410037004200360037003400310042004300410038003600370032004300440038003300310038004300440043003600460036003700310039003400430033003000440034003000320039003300450043003100440042003900360041004600440046003900330044003600360037003300430036004400330037003600450036004400350043003400370036004100310041004300410033003900340042003300440039003500320037004200330042004500340044003200350041004100420035004300390046004400380037004100440031004600340031003300350036004600360036003100340033004500370039004400460033003900410034003100300033004500340033003000430042003300360033003100340043003000320036004100350037003300310038004600300039003200330042003800390046003100420031003100370043003400320043003900350042004200300032003500420037003000450035003700360038004300440037003000440033004600460035004500370035003400340046004300300042004600460043003000320031004100370037003900300033004200440037003100370043004100360043003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007360031003200000550004E000007500043004E00001150006900740063006100690072006E0000898736003000300030003000300030003000420030003800300036003000300030003000300030003700420046004300370044003700450030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003000460031003100310031003200370037004400410042004100420032004300300030003000300030003200310037003400390034003400340031003500340032003800390031003900440039003000340044003400380039003300300031003100430043003600370046004500460046004200340045003300370037003300310033004200360045003900390036003300360039004200330036003700350042003300340039004200300041003400320045003200440039003500300034003300440031003500340036003700390038004200300043004500410031003000310032004400320044003700420035003100320032003200340046003200310031003500360034003100370038003300340045003100350035004400380041003300410036003500380037003300340038003900410030004500380043003300330030003600440045003500440037003900430042003100430044004100390042004400420039003400440035004600440037004200360042003700430033004300300031004100350044004100360043004600460031004600460033004300460046003800370031004600380046003300300037003500460035003900360036004100460030004200380037003900330032004100390044003000370039004500370031004400390044003600440036004500340045004600340037003700370033004500460035003400330037004200370031004600380046003700320043003600360042004100350041004200320032003800390043003100450033004100360045003400450043003200300042003900340041004400330033004100390034004500360037003800330043003400380038003700320044003400350042003800410046003800350033003900380044003800310035003400330046004200340045004400440044004300360030003500440042003000410046004100390044004400350030004300300034003100320035004300420045003300390046003200440046003700330042004500320045003800410034003500320042004100330032004300310037004200330041003000310036003600340037003900380032004100460042003900350044004600440046003700390030003500410038004500420031003300360033004400380042004200360037003200330042003500320039003100330045003200420045004300460034004200420030003000330038004200380043004600430037004600300042003800310035004200330032003600300046003800460030003300330045003400430031003500380030004200340043003400350032003300410038004500310043004200320036003700380038003200370046003700420037003200300030004100300032003900350044003600340032003800430033004100310031003500310039003200300038003900430042004200380032004100350045004200320034004300390036003800380043004100300032003200310030003800410032003600350030003500350043003000330046003000420043003000350038003000340038004300460036004300460031003400430037004100420034003900310037004300450036003000320039003200440045003600460043003600310031004600310037004500460044003600320031004100330030003200300032004500320030004600360033003100390046003500460035003900350045003400340035003200320046003400300043003200460037003200360044003200430034003300440037003300330030004500430046003900320031003600360043003300350033003600390043004500320032004100300033003800310044004600450042004500340038003900370043003100390038003700350036003800370041004200360043003100450039003700410039003900340039003200440032003100390031004500300043004400390045003800360038003000410030003300340032003800360035003800330042003300370034004200460042004600330033003800410046003200360039003600340039004100370035003500420043004200420043003000440042004400300043004100440042004100460046003300460034003300450030004100370032003500410031003200330039004400360036003400450037004100380035004200430046003800440041003100320030003000300035003500370039003500420042003100440037004600430045003400340035004100380038003100340036003400320046003800300035003200330034004100360034003800320044003700410033004500350037004600330037004100360045004100350032004400360043003600420039003600380034003700450044003200370035003400420033003000390035003300340035003100440044003700300046003300390033003900370032003500460041003500330039004400450034003700420039003500390041003000460037004500310031004500300030003200340034004300380044004400440031004200320044003200450031003200420037004200300044004200420031003800300043004400460043003900310041003800460043003100340036003900330035004300430046004200450046003000410038003300360046003600410034003900320035004200350030003000380038003100420032004400300035004600300043004600310037003100310039004100330036003100310030004500460045003600320033003100310045003200330046003800340044003400360042004600350032004300360039004100360032003500380043004600360038003300360035003300300043003200300043003700320034003400360035004500310045003400300046003100370043003600310033003100450030003400320039003200420032004600440034004400360044003900430038004200460045003000300041003800410034004200430031003500320032004300460046003000310045003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007360031003600000550004C00000750004F004C00000D50006F006C0061006E0064000081BF360030003000300030003000300030004500300038003000360030003000300030003000300032004200330031004500430043004400300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300042003200300033003000390039003500320032004600350033003000300030003000300030003200350034003900340034003400310035003400330038003800440036003300460043004600460046004600460046003700460030003600310041003000300032003600350041003100380033004100360041004600300031003000330037003900380046003100380045003800380043004400360038003700320031004200330035003900380034004500300036003000330030003000450033003700450030003600340032004300310031003900430036004200330030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073600320030000005500054000007500052005400001150006F00720074007500670061006C0000866F360030003000300030003000300030004600300038003000360030003000300030003000300045003000360044003300460036003800300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300042003200450030004400350046004200390034004500430043003000300030003000300031003500310034003900340034003400310035003400330038003800440043004400390033004300440034004100300032003600310031003400380036004400460045003300380043004100330038004400350046003900310039004100360039003000380034003300390038003400360035003900310032004500340032004500380032003700450037003600340031003500310041004200320045004300300035004400330042003600460041003200440042004100380035004200320038003100320031003100300032003000390030004100440041003500410042003800300038003200320045004400320033003800380032003400360036004600410030003300370035004300360039004600360039004400330032003600390038004200310044003100300038003700410042003600450037003900430038003700460037004300300033003900380034003400430044004100340034003000460042004300350044004600330042003600370043004100310032003600370041004600350035003800450031004500410037003700450030003700460038004200330044003800320038003900410044003900380033003600300043004300350045003800350042003200430044004100310035004200360045003300370035004300430034004600300030003600310031003200310038003100360037004300410030004600350033003600420041003200370032004400390030003600410033004200460032003000440043004200430034003800370031004200350035003600340035003900300030003800420046003900300036004300360038004200360030004400350044003200320038004100450045004500380031003400360035003600380033003300310045003400320043004200310041003500460038004600310044003500380035003300310032004600340033003300320042003500380042003900310034004300310045004300420038003500340042004300430044003600310034003400380041003700330032003800340032003900440044003900310044003800370032004100460036003400420030003000310035004500360039003800310033004100310043004200430046003600380036004500330042003300310042003800340032003300340046003800380034004300310042003300300032003500310044003400320044003900330033003500380045003200300032004600370041003300360034004300380038003800410042003200410041003200320031003100460044003600380032003100410034003200450044003200380033004300340034004100300032003200310042003300430042003100390042004200410039003800340043003900430045003300430031003400380036003300360036003700460030004600430046004300310033003600460034004400350030004500450034003900340030004500330041004600300033004200310032003900330044004400450037003600440043003600350045003900300030003800330034003300310045003700390033004500410034004200440037003700350035003900390034003700340041003000430038004500300037003200370038003100350042003600350044004200390038004100310046003500450036004500360032003400370044003100440045003500370034004100410032003400430044004300450031003300390037004300440031004600330034003100390041003100440043003200440031003500440045003000380033\
-0042003800420042003200460045003900380046004500320044004600460030003600370045003200340046004300440033003400360031004500330046004500330034004100300045003000300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000736003300300000055000520000075000520049000017500075006500720074006F0020005200690063006F0000869736003000300030003000300030003000460030003800300036003000300030003000300030004500300036004400330046003600380030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100330030003000320031003300330042004600310043003600380043003200300030003000300030003100350042003400390034003400340031003500340033003800380044004200350039003400330044003400380034003200370031003100300043003000370046004600460041003700330045003000350041003500320032004400450032003000300034003800350034003300350042003800310034003600380033003600440034003100320034004200390034003900420035003300380033003400300034003300350039003400310030004600340030003100440031003100320031003100310031003400440030003500420039003100360042003400330036003300340030003600300035003400310038004400340031003100300038003500420035003400380041003400340031003800320036003100310046003800320038004100460031003700410031004600340044003000410041003100380033003200460046003400410036004200420045003300450045003700370037003700370030003700370032003200310034003300430033003600420037003100330036004200460038003400410043004600330034003500330030003400390031004200430032003900310042003200410042003100410037003300380038004200430039003500440044004300350041004100390037003900450030003800410044003100350035004300450042003000460031004200380043004500460038004500420034003900370033004300310031003500310039004500450042003300420033003300460045003300410032004200460043003700460036003600460042003000350034004300460037003900460035004100300033003100420030003500430036003400450031004100300034004300420045003500340035003300440037003300410044003800320036004300310045004300410038003000430038003000410036003400330046004300350034004100350037003700420045004300300045003100380035003800410036003100390031003200460038003800450034003400440032003100360030003700320043003800380031004300460032004200310031003000420043004200410043003100430037004400370033003900460044003600340039003600360038004300360041003600300045003000450042003900360039004400430034003200410038003300390046003300370038004400370037003600430039004100460030003500450033003000440039003800410033004100450039003500360032003400320036003800320030004500440032003500390030004400440039003500300046003100360038003400350031003400330035004300370038003700350033003600310043003900420046004300370039003900330037004400430031003000440038003500450035003100320045003100330031004100320046003300390039003300310046004400440045003400330041004100390041003300450041003100320034003800330032004100410032003400350033004300340034003300410030003600340041004400450033004500410035003600370034003700410030003400450044003600450034003100450041004300440043003000450046004200330037003100390037004400320030003100350030004400410030003400330042003500330032004500410036003400370036003400320034004400310031003000460033003200460042003800360036003100340031004200430043003800440043003900360043003400360035004400370034004200380032004400310030003200420046003900460035003900430043004400440038004500330039003600350044003900450031004400410030003100350042004600430032003100450043004100390045004400330038004100450046004600360030004200430033004300350038004300430038003400410037004300300046003500360030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073600330034000005510041000007510041005400000B510061007400610072000081D33600300030003000300030003000300039003000380030003600300030003000300030003000330036003300340044004300370035003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310031003000430032003200310045003700320046004400350036003900420030003000300030003000300032004100340039003400340034003100350034003200380039003100360033004600430046004600460046004600460037004600300036003200430045003000440035003900440034003700300043003200420038004100330042003100390045004500390046004200450038004300340044003900410032003000360030003200320034004200440037004100380043003100410033003000360030004600320045003800330030003100460045004500410030004100440037004600450039003800380042003400300030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073600330038000005520045000007520045005500000F5200E90075006E0069006F006E000107360034003200000552004F00000752004F005500000F52006F006D0061006E006900610000820F360030003000300030003000300030004600300038003000360030003000300030003000300045003000360044003300460036003800300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300042003200440032004500440036004600330036004300370044003000300030003000300030003300390034003900340034003400310035003400330038003800440036003300360034004400300041004500460046004300460038003000300033003500430045004500350041003700310034004300350033004500360042004400310035003300360042003900350037004300420044003900380045004200440039003800430039003800350035003500380045003800310038003100380031003800310030003900390037003000340041003500360030004400340045003000350031003800330034003700300044003100450033003500370038003400300030004400300036003000300030004400370033003000410032003200440030003400320036003300460046003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007360034003300000552005500000752005500530000255200750073007300690061006E002000460065006400650072006100740069006F006E000081D33600300030003000300030003000300046003000380030003600300030003000300030003000450030003600440033004600360038003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310037003000440033003700310033003100460035003000460039004400390030003000300030003000300032004100340039003400340034003100350034003300380038004400360033004600430046004600460046004600460037004600300036003100410030003000320036003500410031003800330041003600410033003000300041003600300036003400360030003100380038004400420043004100310036004100330030004500330037004600300036003800360044003100430038003100420041003200300036003000330030003000360034004400360030003800310034004400410036003300300045004300360030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073600340036000005520057000007520057004100000D5200770061006E00640061000084BF360030003000300030003000300030004600300038003000360030003000300030003000300045003000360044003300460036003800300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300043003200320031004200300032003900370041003200310034003000300030003000300030004500350034003900340034003400310035003400330038003800440044003500440032003300440034004500300032003500310031003800380035004500310046003700420042004400450039003900340039004400340031003000380034003600300036004300340043003000430044003100430032003500320030004100330041003100320030004400350042003600310030004600460036003800360030003500350030003500420042004100300030004400440038003000380044003700360043003600360038004100310030003100350041003500420034003800360030004300320034004600300032003300330043004300440043003400420034003300340039004600370038003500310030004300460030003200390045004500320039004300320033004200340033004600330043004300410034003400390032003200320038003000300033003500320031004600300032003600300042003500360038004300390034004500360038003100450037004600370032003100440046004400440031003400460032004500370038003900440044003500380039004600330038003200300045003300360033003800450045003800450042004500420038004100460033004300310031003400410034004100450041003400330039004300330037004200430034004300360045003300310031004100350038003800300042003200390044003100320043003800380041004200330036003000340043003200300032004200340045004500430031003400340031003500390038003500300037003700450031003600390037003800430042003200320032003000450034003300390043003100350046003800350044003500430045003100420035004200300043003300440030003400440041004100330043003000430035004200350034003600430043004300320030003200420044003100350044003500360037003100310038004600440037003800420033004600430039003000460037004600390030004400300037003300380037003200300043003600450044003300410045003700440041004300370035004400450042003400460038004200360034003800440032003300420035003500460046003700380035004200350034004100460044003800300042003600430043004600390046003100420044004600330042003800310038003700430042004200300042003600300042004600380046004600370035004200430030003600350042003000380034003400300041003800350034003300390030004600440030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073600350034000005530048000007530048004E0000195300610069006E0074002000480065006C0065006E0061000087A73600300030003000300030003000300042003000380030003600300030003000300030003000370042004600430037004400370045003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900300046003100310031003200330038004400420038004500460035003100410030003000300030003000310039004600340039003400340034003100350034003200380039003100430044003900300033004200340038003500420030003100310038003800350042004600320034004400450031003800440031003000360032003400310041003400350044003400350032003200440036004100370043003600300034003100380043003000380033004100410038003800420034004200410039004100350032004500310031003400340042004100380038004100320031003400310041003500300037003100410038004100330031003800370030004200310034003200380042003400320030003600340035004300310032003500390042003000350041003900340033003300320034003400320044003100360038004100320035003100360038004400410038004600380038004300370041004100330041003000350043003400320031003200430044004600350042004100330035004400450043003900390030004300390033003300460045004600460033003900380037003800460041003300460031003800460037004500350033003000340034004200300039004500330043004200320032003400450041003700390037003900450043004500310041004200410035004300300045003600360033004500300043003300310033003500460037003800370045003100460036004400370044003800320041003000430045003800320043004100350031003400420037003200440039003000410038003500320033004500320045003400410037004300390032003400350042004500390034003400370031003900460034004600340042003200310044003000380038003300300042004400450033003600310036004400320035004600320041003900330035003500350037003800440036004200450037003000450041003700430033003900420037003000320039003800300036003600420042004500390042004400460032004600380041003000430038004600370038003400370044003500420041003400350035003500390044003000450038004200340032004100370033003900390033004200330042003700310045003200440044004100360037003700300038003800320038004500440041004400410039003700430034004600360030004600320030004300330043003800340039004400460032003000330039003000330046004400310030003800440031003000420044003900360046003800320042004300410043003400360032003300320042003800350037004600460030003700310042003100410034003200340043003400450046004500430032004600460032004600390046004100320039003200360033004500430046003600370041004200430044004500460034003700380046003100390032003900380038004100420044003200350039004200450030004600410032003600460033004200450033003000450031003400430030003500310042003300300042003600370034003400360034003400410037004500370037003300370033003000450041004600340034003300460042003300350042003100310031003500390031004300390036004300450030003300380039003000340031003200300037003800300044003700410032003300320036004200330034003100340044003500430031003000420041004500300046004200450043003100310031003300330046003000450042003900420044003800440036003100370044003200330035003100360045003600440043003500420033004200320043004600460041003400360038003000450039003600390038003100380045003000450032004200390035003200390032003100350035003500300042003900440031004500320046004200410039004300370044003000460043003900350035003300350045003700300032003500420039003000310035004600370043003600330045003800350036003600440039004300410038003700320043004400300032004200360042003600330039003300360038004300370036003400430037004200410042003700380035003600320041004200390031003400410035003300380037003100330032004100350030003000450037004500320031004400360042003600370032003300380034004300410037003200420039003300390043004100450033003500320046004300410044004600410032003700340044004600430039003400420034003400460035004200390045003500390046003100300033003400330043003000390032003500370032004100380030003200350045003300300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000736003500390000054B004E0000074B004E004100002B5300610069006E00740020004B006900740074007300200061006E00640020004E006500760069007300008A6F360030003000300030003000300030004600300038003000360030003000300030003000300045003000360044003300460036003800300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300043003200300033003700300032003700390041004300370035003000300030003000300032003500310034003900340034003400310035003400330038003800440039004400440032003500440034003800390033003700310031003400430037004600310045004600460033003600430042003300420044004200380036003700370033003200410043004500340038004200310041003000350044004100380042004400310030003900340030004400350037003100300033003400370030003400350044003600350035003800340034003500340032003800380042004400450039003400440034003600440038003700360041003100340032004100460034003600340038003200390031003100320036003000450031003600340031003700340031003900370038004100330033003700310031003900360032003000350038003500440042003800430041003300320042003400330039004300440030003900420041003100370037003400430043004400380037004300420041003600410033003100330036003600350037003600360045003700460038003700300046004500370037004600460045003400370041003000440046003200310046003300390046003500350039003700420046003400340038003700450031003200370045004400300046003400320042004300310038003800380041003500360034004300410046004600300031003000420039003400370031003700410034004100370044003100380042004600300036003300380044003200310038004300310031004600350038003400420045004200310031003300370038004200390045003300300038003600310039004400390045004500450035004500440035003300330046003800450043004200410031003800430036003800390045003200340036003400300046003100420031003400300039004600410043004200410036004200390031004500460039003400320034004400350044003800300032004100430037003100330039004300340045003100370037003600420042003300440041003500430046003600450043004400450031004500330043004200460043004500430035003600370031003500340038004100440030003500330033004300430035004200330044004500310030003000440043004600410033003900380043004400350042004100390041004400410044004300350036003000330030003600300042003500350041003000310044003000360039003000340045004500350046004300420045003500460043003200450033004400370045004100370031003600300035003200370037003700420036004100460030003700360041004300350033003500420041003400410036003600330038003100370039003900410032004100450037003900380039004400370036004600350036003900310036003500410038004100430041004300360034003600310036003100300031003900330043003900380034004300460045003700340033003200370037003800310039004500380033003600420032004500370039004200380034004600460039004500380036003700380035003000340034003500380045004600320041003000450045003600410045004400300035003700330032004300440032004200430046003200320037003700370041003500370038003800320037003500320037003300390035003400410038003500410044004200410038004100390041003700440039004600420038003700320034003800430046004300430035004400320044004200310045004600380041003600340039004500420036003800410032004400410032003400430035004200460031003100430043003700410032004200330044003400330037003800340031003900460033004300360033003300420045003600360042003700340035004500360035003100460033003600370030004100340036003400440034004300350045003500320032003300460046003400450043004400350033004500300042004400440041003200380045004500440032003600390044004500300046003200410041003900450045003000430041003300350034004500390035003000320038003900360034003900320034004600450038004400410042003500340038003000420033003500310034003700380042003400330045003200350037004100370039003600370039004100460038003200340043004100350030003400350030003000410033003200330037004300440046003300390043003800390046004200360039004200430031004100360036003200410035003000430038004400380038003700370031003800320043003100360030004600320037003300300030004300410037003700320038003700310044004600390032003200380039004200440034003300310037003500350031004300440035004100340043004300380038003800300032003800380045003500450041003100380043003300390036003000390038004100380036003700460037003000450030004600340032003200410033004500330044003000440041004400410038004100430035003600320041003100410032004100320030003200390042004300440038003600320038003400320034004200420044003900360045003100360045003100330037003900360045003200330042003300350044003900410030004400350031003000300036003100360032004200300035003000360045003600410030004200330033003300340039003200420041003200340038004600430037003800330043004200450035004300320041003400350046004500360046003100300044003200380030004600450038003900380045004200440036003900300035003800440039003100380034004300430032003700390039003200320030003000370032003300450039003800370036003100330036003100370037003100450041003700300038003400440042003100370046003400300034003700420037003400340034004400450041003900420032003000320039003300330030003900300041003600360045003200420031003200450039004500420039003000440038004200460039004100430042003600430039003700380036003700380033003800420042003200390033003700380034004300460031004500350037004600330042003000340039003200320045004100440036003100320031004100430041004400390033003400460038004200370046004500300030003200380042003500430041003200460036003300370035003600340031003200300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000736003600320000054C00430000074C004300410000175300610069006E00740020004C0075006300690061000084BB360030003000300030003000300030004200300038003000360030003000300030003000300037004200460043003700440037004500300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003000310037003000380030003800340031003800440030003400310036003000300030003000300030004500340034003900340034003400310035003400320038003900310042003500390033003300460030004200340031003600310031003400380037003900460039003700310042004100450036004500450031003000330031003800410045004300320032004100310033003100360042004200340043003600430035003600330045004300320046004400300045003100360044003900360035003300330035003800300043004600370033003300440043003400310031003100430039003200410036003100420030003100410045004500370032003100350037003500360033003500300031003600440043\
-004600370034004400390043003300410037003500330041003700460039004500340045004200460043004500310031004500440044003500450044004300360031004600320043004100340044004100360038004300360031004600410045003600410039004100360041003600330043004500440042003000330037003000310030003900390044004600380031004500330036003100350038003800430038003700380046004200380044003500450035004500430043004200360037003800340038004100430036004400350045003400310035004100420039003400300036004100300033003700330042004500320042003800310031003200390035003800340039003600330036004600360041003200330046004300310033004300320033004600450031003400440036004400390035003100310033003900330038003600420038003000330044003100410033003000450039003200370039003800460034003100330044003800410033003000310035003900340033003000450039003600360041003600430042004100310042003100410045003500320035003900350038003200300045003400300036003300420037003200340045003500360045004400380036004100460039004500460033003700330036003300340031003000360042003800420034004500350033003700460045003600330041003400440031004400420031004200360033003000320034003200420030003500380032003600420033003100380037003700410037003100460045003900320041004600310037004500370044003400360032003400450032003000330038004600300032004100410032003900430030003900370033003700440035004200460033003800390037003000450031004600330043003700440043003000310042004100420041003300430043003800460037004200430035004400380042003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007360036003600000550004D000007530050004D0000335300610069006E0074002000500069006500720072006500200061006E00640020004D0069007100750065006C006F006E000007360037003000000556004300000756004300540000415300610069006E0074002000560069006E00630065006E007400200061006E006400200074006800650020004700720065006E006100640069006E0065007300008453360030003000300030003000300030004600300038003000360030003000300030003000300045003000360044003300460036003800300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300043003200300033003400390042003700300046004400430046003000300030003000300030004300410034003900340034003400310035003400330038003800440036003300360034003200380033004100460036003900460030003100300044003900340045004200410043003600350036003800330035003500450038004300320045003800430031003500370034004200450035003000360036004100380037004500410041003800450032003100430045003400340039003400360045003300320043003000410038004300310041003400310039004400430046004100350043003000350032004200390042003200320038003300460037003700440031003600360036004100380037004600410036004300360037003000460036004100420030003000430033004400390041004600300032003000430046003500430046004400340031003800460036003700440031003600320036003600380033003000300042003200310030003500380042004400460043004100340030003600390032003900310034003300310032003700440045004200370039003400420039003300380035003600460038003000390030003300300033003000330030003300380033003000350046003700340037003000360030004200450045003800460032003800360032004600380030003000340031003100370033004200460031004200450036003500360038003900340042004100430035004200300045004500410033003300380030003300300033003000330030003300340033004100330044003400320044003800320041004500320035004300410036003000300036003000360030003600380036003400340039003100320037003000430030004100390037003100440031003900310038003100380031003800310038003200360043003800350045003200330034003600300042003700310030003600340042004200310046004500360030003300300045003400460041003000380036003700350033004300440036003000300036003000360030003600380036003100410038003900330042004300340032004100320035004300440036003000310046003800310035003700420034003300310039003800390031003200340036003300310039003100380030003000350031003500420033003200310032003400380033003000330046004200350030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073800380032000005570053000007570053004D00000B530061006D006F0061000083CB360030003000300030003000300030004200300038003000360030003000300030003000300037004200460043003700440037004500300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300043003200300032004600310031003100350033003400320033003000300030003000300030004100380034003900340034003400310035003400320038003900310036003300360034003300300036004400460038004300460038003000300034003100380031003900310039003100380038003200390044004200340031003800440036004500450042004200430036004600300031004600340035003800360038003100450031004400320045004400320044003000430043003400300032003200360036003400300045003200460031003700310042004300330046004600460046003000430030004300310037003600450042004400360030004500300036003400360037003600350044003000350037003100350032003700440041003200300042004300300036004400420031003900430041003300330034003800380039004600320033003200440043003700390046004300380045004500310044004600420046003700460030004300330046003700450046004400320031004400420036003000310036003600340043004500440036004100330042003700310039003100380031003800310038003100380039003800390039003100380031003900390034004100340038003500310038004100450044004400370046003400440042003600430031003400430045003800300032004100430032004300340043003000430046004400340035003100450030004300420037003100460042004600320035004400420035003000300036003000360030003600300036003900360041003400370037003700370033003000300034003600460037003700330044003600330038003800460044004600300038003500320032003800330031003900320046003000390039003800460043003200370041004300380043003700340038003000310031003100340041003300300036003500330031004400300030003000300042003700370041003200390044003000320039004400360046003400390037003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007360037003400000553004D00000753004D0052000015530061006E0020004D006100720069006E006F000086833600300030003000300030003000310031003000380030003600300030003000300030003000440039004200310035004300380033003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310031003000310030004300300033003100320032003400410030003300440030003000300030003000310035003600340039003400340034003100350034003300380038004400440044004400340042004600340041004300330035003000310034004300370046003100360046004400320041003000420031003700410044003500320041003600320034003100430035003000410036004100440031003400390031003000300037003700350037003000310032003000340037003100450044004500340045003800450045003300420033003800460039003000380030004500330045003400300031004400350035004600300043004600410030003500300030003400380037003000450032004400310044003100340035003100420030003100360042003500320044003900350035004100440041003900300033003400360044003600410041004500340046003900300035003800390030003800320037003800440037003700330037004600390046003700420038003700370033003800450032003200410035003900340037003400450030004100380039004400340030004600460033003900440043004200340043004200310038004400350037004300440042004200300044003600430045004100350043004100430037003300440039003900440034003200350035003200340041003100360031003600330037003000380038004400430043004600460031004500360045004200360039004100390038004300360031004200330044003800440037003300300041003700390038003700340041003600340031003600350035003400430033003000410030003000420044004600390043004500320044003700360045003600360043003300450032003300300037003100430034003800320037004300320034003500370032004100440033003100420045004300360032003200380033003400430043004100390041003500420032004200420042004100430033003600340036003800430043004600420043003700360037003400460034003600430032004100420039003800320045003200340043003500350035003200410031003900310045003800440033003200310034004600460038003800450039003700350046003700380042003600440045003500430034004100450042004300380037003800410046004200350043004400340042003700410032004200310039003200320037004200430031003900430046004100450037003900330045004400420042003800340033003700330031004300390036003300460030003300330043004400370041004500350031003500420031003600350039003500330044003100380046003100460045004400340038004100350044004100450032003200300039004400390044004600330038003400330044003500310030003000340044003200330036003800380037003700390043003800390039004600340046003600440043003200300042004100450031004600360036003500300032003300420044003800340046003400300030004100420045004600430041003200420045004200300032003200390038003100410035004600360037003600350042004100390042004100350044003700310039004600410030003600380037003200390033004100380032003400430042004500340038004400440031004400430030003400460035003600440038004300420046004300420038003200420032003600350035003800330041003600350035003400330041003800330036003000350033004400380032004500310030003600370045003800410042003400440037004300370033003900350037003800300032004500320038003000300042003800450044003200340046004500430032003400380046004600310039004600380031004200300039003100430037004300440035003600350044003300340037004400320030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073600370038000005530054000007530054005000002B530061006F00200054006F006D006500200061006E00640020005000720069006E00630069007000650000846F36003000300030003000300030003000420030003800300036003000300030003000300030003700420046004300370044003700450030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030004300320030003200430038003800310043003600350039003900300030003000300030003000440031003400390034003400340031003500340032003800390031003600330032004300380041003300370046003800420046004300300045004600330037003000330042003500300031003500330043003200340036003100360038003600380034003400440041004300440034003300370039003800380031003800310038003100380031003100360038003600330033003500450031003200330030004600390030004600450033004200300043003700420045003600340036003000380042003700440034003900390032003000310046004600460046003300330033003000330030003300320036003200380041004200330032003000370033003700450032004500310036003600370031003000360030004600410043004200320030003100360046004600300043003400330045003100380035003900420031003000440041003400300031004400350035003700430046003100350036003000360038003600350038003600460034004300380033003900390044003000300035003500450032004500390034003600320046003800370041003800310031003700340035004500430043003500350042003000360038003600380034003700410030003800370045004600310031003600320031003300450036003300300044003000330034003300350043003200440038003400430036004500420036003200300036003000360030003600300036004200310046003800360037003000430044004300300036003900460035003100430034003200340038003400310039003100380039004100330032003100310036004300310038004200300033003700360036003600300044003800330045003800350038003100340031003500450031003200440033003600300039003400330030003600360038004200370044004300390043003000340045003600320031003800450033003000320037003000310037003200460046003000460042004300440042003000430030003800310038004600380031004500310033003100310046003500350030004300360036003800320031004200450041004600460038003700320041003000360043003200300044004100360038003500410031003000430030004300300043003000430030003000340045004600450033003900340034003700390038004300320044004600370030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073600380032000005530041000007530041005500001953006100750064006900200041007200610062006900610000866B360030003000300030003000300030004600300038003000360030003000300030003000300045003000360044003300460036003800300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300036003200460032004500450043003100440039004400410043003000300030003000300031003500300034003900340034003400310035003400330038003800440044003500390034003300420034004200300033003500310031003000380035004200460037004200330037004400390033004300380043004300460032003800380039003200320032003600300041003800320035003800380038004100440036003000360031003200370037003600370036004600450033003200460046003800340042003500390035003700360032003200320038003300360032003200320041003800320046003800430032003100380034003200360032003700340045003300390041004200380038004600440043004400440036004200360031004500390032003500390038003200320038003500410037003900430031003900330045003800360033003300380037003100310045004300410045003600410030003600320030003300390030003800450038003400300043003100300039003500330044003100390036003400390036004300390039003200340032003600340036004100330046003100350034004300300034003400360041003000340032003100300034003900440044003000320037003900440042003000350031003300410034003200430035003000410032003100300034003900450030004100460045003000360032004500360036004600330045004300320043003600450044003200460034003500410039004300440036003200460035003900320042004100450032003000300030003400420035003800350034004400410037003500390036004300360043004200460038003200410041003400310039003300380042003400380032003400460030004500320042004100370042004600310038003400360032004200320032003100440044003300460030004400450039003800430044003100350031003800420035003700330046003800320041004500300042003600460035003800430031003300420038003500380035003200460032003100310042003400330039003600420035004300330031003900370032004200440032004500450037004500310039004100440033003000380032003900440043003000340035003200300044003000360038004400430042003000430044003500340036003600390043004500440038003500300044003200430032003900360039003700410030004500410031004500450042003200330043003300310043004600380044004600330038003800310034004500360033003300310039004100440043003800320034003500320035003400330042004100460035004300420046003300460035003000310041003900450045003600420038003700360034004500420039003300330043003300340039004500440038003200370043003700410038004300420042004400360033003300460037003100460032004600300043004400390031003900310043004400460033003500380032004300350042004600430042004200310044003100300041003000300034004200340038004200360034004100450042003400430036003700320037003100310030003800330041004300410032003300380043004200410033004600310031004400340039003000420036003600430046003600450045003000460035003000370031004400340031004600330038004400320033003100460042003400460034003700430036003500450033003600390031004100360039003000430044003100330043003500370031004600460031004200460037004400320039003700460032003700390037003400410042003300440036003700460045004400460041004600460038003000360039003600310041003800360044004100430030004300360033003500440044003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007360038003600000553004E000007530045004E00000F530065006E006500670061006C000083C3360030003000300030003000300030004600300038003000360030003000300030003000300045003000360044003300460036003800300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300043003200300032003800380046003700310041003100380030003000300030003000300030004100360034003900340034003400310035003400330038003800440036003300360034003900380045003800460036003900460030003100300037003300380031004600370041004500360039003800380036004500300033003700320042003600430037003200350046003600370037003100310045004600420044003000430036003800330035003500380045003800310038003100380031003800310030003900390037003000340041003500360030004400340036003000440032003000440042004500460031003900450038004200450031004300360037004200320045004100320030004400360036003200310041003400450030004400420031004600360036003800360031003300320046004600390031003800330036003300440031003000360036003600300036003000360030003600300046003000350033003700380043004200360030003200310046004500380039003700320038003300420039003500380046004500330032004200430046004600430039004300320033003000450046004200410032003400300033003000330030003300300033003800330041004400450034003400370030003600320045003900360042004600300043003500460032003900330035003900380038003100380031003800310043003100350043004500430031003300380033003900450046003000310037003300380039004200310038003400300039003400430031004600460031003900310038003100380046003600460041003500440036003400360030003600300036003000360030003700380046003500390044003900350037004100300036004300420046003200460043004300340043004100430036003000370030003600330045004200390030004400370046003800330030003100350034003900320032003800350032004200460033003300320037003500420030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073600380038000005520053000007530052004200000D5300650072006200690061000085CF360030003000300030003000300030004600300038003000360030003000300030003000300045003000360044003300460036003800300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300043003100370030003400320044004100450036004400350037003000300030003000300031003200390034003900340034003400310035003400330038003800440042004400440034003400440034004100430033003600300031003400380035004500310046003700340042003900330041003600320034003400350036004100360039004300340038003200380041003400380039003100330041004100390042003800380030003800320033003800370034003000330038004100350033004200370045003000300045003900430042004200300031003500440038003000350033003900310032003200420038003000300036003700300035003000370034003100410038003800320044003200350041003500340036003200380039004200340036003900390033004600450032003400430036003000350033003400380038003200310041004400360037003700380030003700300046003800370037004200450031003800410042004200450041003500450043003800310043003200320043004400300033004600440031003500370036003700330030004100430044003800410043003300450042004100410034004100320030003800420044003900430030004400450038003200430036003400420043003900320035003900340033004300380032004300350034004600390045004300410036004100360043003500380038004500310041004100410042004400300031004600320041003800380044003500460037003000350030004100340036004600330034004400330030003700460032004200310036003000430031004300310043003500440034004600310036004500300044003900330044004500420030003800310041004300360046004500300045003700300034003200390037004200380038003900440044003900450034004200380046003500370037003300430042003200420031004200330042004500380032003600430041003900330038004300350036003500320034004300420034003200410046003600430031003300420034004200420042003100310041003400370045004500370038003200320032004200460034003800440033004300410035004200310038004600460038004200300046003000370034003800440035003400340036003400390030004500410042004500390033003400410032004500460041003100320046003100390031003400380043003000320036003200450030003100320046004100340031003200430033003800370032003100350039003300440036003300330039003200360042004600320036003000440042003700430037003500330041003600380041003300300036003500440042004400310041003000420031003600360031003100380034004500310044004300460042004300330043004500330042003100370036004300450037003800460037003000340044004500310041004300380043004400310041004600420041003700330037003600380043003500420035003600340033003000360031004300380046004200\
-440035003300350046003700460035003300410035003900300034003300420034003700380037003600340042003700430041004300390031004200430046003200320046004600460046003200420039003200450036003000370044004400380032003600370031003100450032003200310039004400300037003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007360039003000000553004300000753005900430000155300650079006300680065006C006C00650073000085C736003000300030003000300030003000420030003800300036003000300030003000300030003700420046004300370044003700450030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100350030003100300039003100410038003400350041003600420045004600300030003000300030003100320037003400390034003400340031003500340032003800390031003600330036003400420030003600460046004600430046003800300030003500340038004600300046004600370041004600330041003800450033003100410030003300310033004400330037004600310031003700340042003900390046003700370042004500440046003700390035003800370039003900370038003100450031004600370033004600310035003600430037004100310039003100380031003800310038003500380037003000340039003100430032004300420044003700440038003700380039004500390042004600300035004200410046003800420042003900350041004600380045004200430035003900460045004300320038003800380031003800310038003100300042003900370035004500390043003000360036003700330039004200430033004500410031003200430046004100300042004300350044003000460046004200460046004500370046003700420035003400370036004600420044004300430046003000370033004600360043004600300031003900380038004400330036003000300039004600450035004600360046003200360038003400330046003400350046003100320032003900320044003700380039003300320039003400350033003500330046003300320045003800360043003100450038003400310034003000410043004400370033003900330035003300350045004600300041004100370041003500330044004500360037003100370034003900340036003100360034003600370035003700340031003300310031003800330039003000380038003800460031003300410042004100360031003000430030004300300043004300410033003000330039004200380043003100430038003400310038003000430046004500420046003800300043003400330030003600370030003800330036003100340031003800300043004400450042004300340031003800460036004600320043004200460042004200370032003700310045003500460037004400370043004600380043003100430035003400460043003700310046003500440038003300310038003900430045003500460030004600410038003400310032004600460034004600420044003800370030003500420037003800460043003000420043003800450043004200330030003700340030003300360045004200440037003900430034004600370045004500460042003600370044003900370046004600460046004600300039003300330033003000330030003000380043003300320043003600320039003400460030003600420037004300370044003300440045003100430043004100330045003700460035003700370046003900330038003500350044003400310039003600310038003600420044004600410046004400340044003100300038004600300031003000340030003100450033004100430038003600450034004600350042004600310039003500380044003900320045003200390038003800330030003500440046004500460031003800450038004200350034003000330037003000300031003000300044003900390042004400310034003000380035003900420046004400390039003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007360039003400000553004C00000753004C004500001953006900650072007200610020004C0065006F006E0065000081D73600300030003000300030003000300046003000380030003600300030003000300030003000450030003600440033004600360038003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310031003000430032003000320034003800360043003700450044004100420030003000300030003000300032004200340039003400340034003100350034003300380038004400360033003900340044004200360041004600350039004600380031003000360038003000380039003100360038003600380045003100410038004300300032003100380046004600460046004600460033004600310041003700390034003300440034003600300034003600380036004100320036003300410033003900310033003700340034003000440030003600300030003900380043004100300038003500420039004500340045004300370043004400300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000737003000320000055300470000075300470050000013530069006E006700610070006F00720065000084933600300030003000300030003000300046003000380030003600300030003000300030003000450030003600440033004600360038003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310032003000310030003300300045004600390042003800360046004100310030003000300030003000300044004100340039003400340034003100350034003300380038004400360033003300430032003700410038004600360039004600380031003000360038003000300039004300360036003000310035003100370036003500350030003900430033003700390031003800310044003700440031003900410038003100380039003900330039003300380031003400330034003500380031003300410030003600430042003400440036004500360033004600380037003600450035003300410043003300460037003000420035003700310039003300380046003400330034003100380030003400340033004600430031003800350038003800340030003400320039003300330039003800390031003900350038003500380031004400370043003100390041004500310043004200410031003100330030004300440032004100440039003500300043003300460032004500350044003600330037003800440045003300310038003900340031004200410042003500390032003800310039003100390035003900350032004300380033003500390031003800310038003100380031003800460045004600460046004500430033004600300046003700460044003700420030003600310036003300310036003100380036003600370030004400440044003000430030003200460045003900450030004300440046003600460044004500360031003700380042004200360041003100330043003300460046004400460042004600430039003700370033003100300033003000330030003300430033004400330043003600350045003000360042003100410043003400340030003600380036004200460037004600310039003900380033003800330039003100380039003800350038003500390031003900310038003500390039003800460030004500390043003500300042003100380039003100350033003000350039003700410031003000450030003300420042003800410032003200430033003900370041003300410037003100380037004500330046003700460043003900430030003400300034003100370041003600310037004300440041004400300034004400390033004500340043003600460038004600460046004600370046004400410041003600450033003500310038003300340037003000440038003600300033003000300035003000360045003300420038003900370045003900360034003800310035003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007370030003300000553004B000007530056004B00001153006C006F00760061006B006900610000861B360030003000300030003000300030004600300038003000360030003000300030003000300045003000360044003300460036003800300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300042003100420030003500460033003500330030003400340038003000300030003000300031003300430034003900340034003400310035003400330038003800440044003500440034004200460034004100300033003400310031003000300036004600300036004600430044003500440037003200380039003800380041004300340031003200320030004100360041004300340039004300410032004100440038003500380032003800350032003000460036003900360038003200380035003800460045003000320042004600380030003600370036003800320038004100440038003800380037004600370041003800420032003800320034003100380043003900310035003000410031004500300038003200320034003400320033004100340035003200310033003800330032003600370042003100450039004500450034003900320042003100390033004200420038003800450030004100320032003900460043004200410038003100450031004200370043003300430030003200430032003300320032003400320030004200440032004400360030004100420034004100350042003000450032003200440031004100410046003300360045004300380042004300420032004600340044003500410036003200300038003600410036004600380046003900430034004300390045003500380043003600330039003900390035004300320037003900330045004200350034003400390041003600430039003800430038004500390032004300390037003500320041004100450036004400390033003600430031003400330036003700350046003000460039004300380043003600420034003800330030003900300030003800330035004200410042003000380043003500300037003900300033003800440043003400310037004500370045003000390042003900450042003000370043003400330043003700440033004600380039003600460043003700340043003500350041003100340034003300390044004500460033003000350044003400380035003800300037003500360032003400300031004200310039003400360032003000310030003900300035004200340033003300330035004300410032003300300031004100360046003000450034003400450041003100340042003500460042003400370035003800410039003200430044004300350032003100390032003200440043004600390033004200460038004100380031003800340032003500350036003900340037004500360041004100380032004300350044004400300041003900320033003900300037003800350036003700310037003800360044004200320044003000440033003300340043004500450046004200300045003600340033003900350045004300350044004500320044004300330034004200420030003000330046004400430045003100330043003600420041003800300030004300460035003400310044003800330035003300390044003800450034004200410030004600360036003900430036003300370044003700430030003100390042004100350031003800360036003200330036003500410043003500380043003700440030004500450036004500450034003200370036004500380036003000310038003000300035003500350033003800330033003700330038003800390043003600350035003100410046003000410036003900460034003500420046003800320046004600320046004600460045003800410030004600350030003500330041004200330042003500320036003500380030003200390030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073700300035000005530049000007530056004E00001153006C006F00760065006E006900610000838736003000300030003000300030003000420030003800300036003000300030003000300030003700420046004300370044003700450030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030004300320030003200320036004600410034003400380039004500300030003000300030003000390037003400390034003400340031003500340032003800390031003600330046004300460046004600460046004600370046003000360031004100300030003200360037003400380031003700460046004600310039003100380039004500420043004600420043004200460030003800460034003200450042003500380044003000300035003600430036004100350046003300300033004300460046004600430038003800340031003900430034003700390036004500310034003400410042003200340046003900300036004100460033004500460035003000330034003500340030003400360038003800390031003200310043003500350035003800370036003100430037004400390043004600300043004500380037003200320034003100390031004300330036004600390033004400380041003800300041004600450041003100460038003600370046003000430030004300300043004200460037004500460043003600320034003000390037003200330043003900360030003700340038003100440044003300370046004500330032003300430037004400460035003900340045003100450041003300420033003600300036003000360036003600420032004300440043003500330034004600380030003700330033003300420043003300420039003800460045004300310034003100390043004100430030004300300043003000430030004200320045004100430046003000320043004100340043004300300030003100310038004600460033003300330030004400300032003700310044003000460037004100380033003000310039003300390044003300300036003600450038003100450031004200300031003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007300039003000000553004200000753004C004200001F53006F006C006F006D006F006E002000490073006C0061006E00640073000085DF36003000300030003000300030003000420030003800300036003000300030003000300030003700420046004300370044003700450030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003000460031003100310034003300380038004400440034003500320039004300300030003000300030003100320044003400390034003400340031003500340032003800390031004100440044003000330031003200430030003300360031003100380038003700460031004500370046004200370041003600440043004100340032003800340039004400340034004200420044003400320030003000360036003200360042003900380043003400320030003900370031003800380039003400350036003200310030003200360038003900440035004300340036003200310034003300310037003400430030003600320045003900320041003900310038003600360038003800380035004100360038003400340041004100380041004400380033003500410031004400350031003000390032004400330042004200440037003400300034003500350041004500320041004500460031004500450044004600390033004400460046004600350033004600450044003100350044003300310046004200440041004400380033004200320046004600320046003000360043003600310036003800430044003400380036004600310042003400370042003900320032003700370038004600310036003600450034004600320039003600310033003800370043004300360034003200370034003000420039004600370041004300320032003800330042003000450034004200450033003200310045003200430037003700390045003600330037003600460042003000430035003600310037003100410043003900330036003400410036004300300044003400440041004100350045003700450030003400410032004100430038004600450036004400330033003000410033003300320031003700450039004600430036004100370031003500340033003300440041004400310043003600360030004200390034003500450036004300300034004100310036004300380042004300370036003000310030004600390037004300360032003000300042004300440039003000450038004500320038003900360032003700340032003600430041003700450046003900390038004400450035003300430030004200410035004300410041003000330030003100330031003200450044003600410045003100450030004100320038003800440046003500300030003000460034003800370039004200340038003500440039003500420030004300410038004500360042003600310046003500310039003000310034003300420033003300450031003300320031003900450043004100330033004200370037003100380044003400460032004200360032004400330031003100390032003900390030003200390033004100420035003900440037004300320039004100360035003900380030003900360039003000380036003800300030003500450041004400300046003600310036003300340030003200330034004100310038003600430034004600420042003100360044003600380038004200460030003700320042003900330030003700330041003400450033004400300042003700460030004300350037003800320046003500340043004600450033003500460043004400460043003100320046004500380043003900340045004200370044003400460033003800370037004600440044003300420036003300410046004200370037004500390042003700310032004100300034003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007370030003600000553004F00000753004F004D00000F53006F006D0061006C00690061000083933600300030003000300030003000300046003000380030003600300030003000300030003000450030003600440033004600360038003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310033003000450032004200320030004300420044003300450043003900430030003000300030003000300039004100340039003400340034003100350034003300380038004400360033003700340045004300420043004600420039004600380031003000360038003000380039003100360038003600380045003100410034004300390045004300310046003200430032004100430030004300460032004300320041004300440034003300330039003800380044003800350039003100380031003900370038003300380039004300310034003100380033003800370043003100340031003800330038003700380031003900370038003300380039003800310038004400380035003900310041003000430031003200430038003400310034003700300042003000330032003300310035003400370038003800390033003200350038003200380037003300330031003300300033003000330030003300300041003800340042004200300033003300370034003600430037004200430044004600300045004200430046003500460043004100350043004600430045003900460042003500460038003600300039004200420044004600330030004600430046003900460037003900460045003100430046004200460046004600300043003100330037003600420046003600310046003800460034003100440042004600410031003400340042003900390038003800310038003100380031003400310035003900380043003800440032003100360046004500390033003300330038004600420044003500410037003300460044003400330031004600380046003800390044003600460043003400320038003400330030003100300033003900460044004300380036004200460043003100300030003000360041003600320033003200350041003100430037004600370038003000300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000737003100300000055A00410000075A0041004600001953006F007500740068002000410066007200690063006100008867360030003000300030003000300030004600300038003000360030003000300030003000300045003000360044003300460036003800300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300041003100410030003300300032004500390046004100300042003000300030003000300031004300460034003900340034003400310035003400330038003800440042003500440034003500460034003800350033003600310031003800430037004600310045004600330039004100450046004400370031003300420045003800350034003900360030004100360044003600320030003800380045003300390031003200340034003800390031003200310035004300340030003400390037003700460045004500340032003800410034003400310044003200320030004100340032003500440031003900370039004500310038004400430031004600300041003600300032003200460038003400320038003200380042004100310032004300310031004200340031004500430041003600320045003800410041003100410042003900430031003300340044003900390038003800350044003800380041003100410035003200300046004500390039004400420043004500450039003200320037003600340038003100310033004300390045004500380042003900370042003700460033004300370043003700380037003800440046003800370035003700360030004100300035003500300031004200300031004100340044003000430044003700440046004300350037004600430035004300440036004500360030003800300041003300320046003400310046004500410035004400320034004300330035003200350038003300340039003400350032003000390045003400430033003200420039004600320039003500450030004100460034004400370043004400440046004400440038003100440046003900430034004300320042003300390030003400380045003800380032004300350031003900360046003900300035003200450042003900450031004100420043003500420038004400450030003100440045003900360037004200430044003000340039004500450043004200300039003800430039004500350032003700440031003300450046004600430033003800310043003700430035004400420037003800440044003500300034003900460046003600330032003900310031003100380038003200350045003200340043003200430038003500300038004500460045004600440032004400380046004200310038003900420036003400450037003700380033004500300034004200320041004300310039003100360030003000320035003200460034004200360034004200340043004600430036003600350037003700300045004500440041004200310045003100360030004600360043003600410034003300340045004200410043003400360038004200330039004600340036004100330043003400430046003200370038004600380038003400370042004600360039003800370035003300380037003800450035004200360036003800360046004300310032004300330044004200340035003300430044004400370030003200320032003300410038003800440046003700410045003500350046003200440043004400370038003600440044003600320042004400330038003000430045003000370032003800380042004300370041003200380038003100430042003400310036003700440034004300330035004100430043004100320030003900330041003100370030003600330030004100340043003100460032003800\
-420032004300320045004400390032004400330038003400330035003500420041003600300046003100370034004500300037003200380038003400430030004600360035004200300036004500430045004100360033004100350032004100450030004200380035004600460037003800430037003000360038003000420046004200370041003200330036003700410046003600350036003100340035003100380030004100460036003500390043004300380045003200390036003200360035003800420043003500330036003500320032003300340039003200430044003600430041004500390042003900420030004200310035003200370044003000410036004500320033003200430032003300440030003100440036004400460032004200440034004400430037004500410042003100390030003500310030004300320036003300300035003400410035004200420034003800340042003900370044003400390030004400330033004300430045003900330043003600420042003800340046003600350041003600390037004100450030003700350033004300430037004300440045004400300030004300410041003100330035003700340034004100450039004600340030004500420041004500370041003900390045004600300044003700300033003800320037003700310041003300460045003800440032004500310034004300300031003000390033004600460033004300350030004500410037003700360042004300380032004200410037004100370037004200390041003000460031004600420046004500420030003200350033004600350031004200300033004500460039004200440030003700310033003500350044004100380030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073200330039000005470053000007530047005300005953006F007500740068002000470065006F007200670069006100200061006E0064002000740068006500200053006F007500740068002000530061006E00640077006900630068002000490073006C0061006E006400730000894336003000300030003000300030003000420030003800300036003000300030003000300030003700420046004300370044003700450030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100300031003700330041003000430041004200390030003900340037004500300030003000300030003200300036003400390034003400340031003500340032003800390031004100350039003200430044003400420039003300300031003100430043003700330046004300460042003300360037003300440039004200430042003200300042003700390034003900340036003200430033004300390036003800350041004300430036003600360046003400430032003700310035003100440038003200450038003500340037003900430039003300410046003400370032003500390046003500300046004400340041003100350042003100340034003100410037004100340038003800300045003100310033003400340046003100440036004300460034003200320037003400380038003800410036003200420036003700340038004300380041004400430035004300360041004400330041003600410045003600440045003500460036004300430039003700360044003400460030003700360031004600360044003400430035004500430037004200460041004600310046004200460032004600440046003000450033004300420034004600380038003500430042004500410041004500410045004300300045004100450033004300340042004500330046003700300037004600310039004400370034004400330037004400460037003000430046003700340046004400440045003100450036004200440031003000420045003800330030004400390043003700360041004600340031003600370037003700450030003300430046004500390038004400460036003500390030003800420045003800320035003900350044003900420043003900450033004600320035003300340033003500350044003500320042004200330044003300350031004300360039003200430041003100450046004400380034004200360034003500430036003100460033003000390032004600380039003900450030003000380045003100460035003100370034004200360034003600360045003000460043004300440033004400370031003700320036003100410039004400440036003800340035004400440036003400390045003600310037003200340033004500340044004400360046004500300044004600450045003800370036004100420039004100340044004100390038003400330032003300340034003400390035004300420030003500330041003900440043003600370032003800360044004300390035004200390042003900370039003000330041003900430034003200380046004200450041003500450046003200330036003700460030003800390044004200310039004100350038003200430035003300460031004100350032004600440045004100330030003800380032003800300043003500420032003900360044004100420039003100340037004100380042003100390045003500430032003300390044003600460042004300450042003300390038003500330039003800310041003900420036003200340036004100430034003600350035003500350030003800430035003200420043003100370043003100450039004300410044003600440031003400340034003100330041003600360046004100440038004300370045003000440036004200380045003100300037004200350033004200350035003800420037003300420033003000320045004500340042003800330031003200380037003200330044003600320030003000450030003500410035003000450035004500320037004200310033004100360042003600330036003300360041004400380033004600450044003800410032003200360036003800420035004500370034003900370044003900460034003500410045004300390041003100320038003500390035004100420036004200430034003000310030003900360037004400410039003400330039004500450032003500360045004600300034003300440034004600320037003200380031003600430042004200340045004600310034004600300037003400310045003600330032003000390043004500340035003500370030003100430042004600350046004100340041004200360042003000370044004500460041004200340030003600360043003300360031003700440038004400380039003000340031004200360033004400450031004200300036003300300046004300460030003300300036003500340042003500300030003100380039003700330041003800360042003300440041003800450035003700320030003900420041004400380038004100370035003300380046003200430035003700320033004400390034003600390038004600450042003000390046003600340046004300310031003600460035004500440037003000330034004200310046003200320046004500320042003100340032003000390033003200390033003100390042003800430041003300340034004600420031003900340046003600460041003500370044003500370031004400320045004600420033003600340034003700310046003900340036003600390033003500450030003600430035003600340036003100380046004500380039003700350037003700380031004200310043003100300030004400310043004600300046003900310036003600350034004300410036003500430046004600460038003100300031003700320034003600310033003800390045003100330032003000460044004500420035003700320041003000320035003400410031003500370033003100410037004600350035003100440041004600340034004200460030003000440039003000410042003600300033003100340042003100420036004200350030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073700320034000005450053000007450053005000000B53007000610069006E000084CB3600300030003000300030003000300046003000380030003600300030003000300030003000450030003600440033004600360038003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310034003000420031003700320041004300330045003900380036003200460030003000300030003000300045003800340039003400340034003100350034003300380038004400440035004400340034003100340041004300330034003000310034003800300045003100460046003200350039003300360039004300320031003800390032003400440030004200300035004200310033003700420030004200380035003200410038004500380033004400420043003800340038003700370032004500350031003500350043003900370041003200320030003100360031003700420041003700300039004200320045004100410032003800330034003400360036003200390042003900360034003900300046004400300031003600380043003300320030004200360037004600390031003600440046004500320037004600420043003900310039003100330039004100380037003100460030003300430031003700410038003500330035003800320035003400370037003300320037004200300044003400340033003700360033003600410045004100430038003700460036004500430041004600360030004200350036004400350038003900360030003100380046003200330034003300380045003200360044003500310035003200370036003700420033004300360046003000340036004500330042004300310030004500450043003700430032004500340036003500340035003300390034004600350038004500450046003500420038004200390046003500460046003000450037004600370046003400350041003400440032003200370030004200330034003100440037004600340030003900430035004500440032003800440030003600450043003000450046003600340033004600380046003300350035003500310036003900380033003700440030004600420039004200450043004200390038003300450035004600350031003100350031003100370036004400350030004300440045003600380031004300450046003500420031003600430042003000350042004400410034004500300044003000390034004400340031004600330033004400340037003100310042004400390042004100380044003000360042003000380034003300450037003100320042004500330046004300430032003500300030003400390036004100450036003400330043004200430038003100420034003900420043003100460032003700340044004100370031003700320044003200320041003100460038003700320045004400430037004600460038003500370041004300300031003600340044003800340031004200430030003700460045004200340034003800300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000731003400340000054C004B0000074C004B004100001353007200690020004C0061006E006B0061000086F736003000300030003000300030003000420030003800300036003000300030003000300030003700420046004300370044003700450030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030004600320037003000380046003900310038004100390044003600300030003000300030003100370033003400390034003400340031003500340032003800390031004200350039003300340042003200460030003300360031003100340038003600390046004300450033003700330033004100360031003700360044003500440035004100340035004500390038003200310030003100360031003200360043004500430043003400430041004400450043003600450035003600460046003800300033004600450030004300300039003000420031004200300039003100420031003600310036004300320041003600340032004100320044003200420038003800350038004100360042003300340036003400410032003100440036003600430036003300370031003600440035003400410033003700330032003200340044004500440035003300390045003700370044004600330045003400320034003200370032003700320030004200330037003800320046003800450041003000410041003300300031003200310044004100460044003200300034004300300031003300300031004500430046003200420037004500460034003700300044003600310031003700440035003700340031003500390041003500370046004100360041004300330043003500430034003000440037003300340046003600360041003500300039004300310043004200340038003800380041004200440044003100360030004500350036004200420046003800420030003900350031004600380031003400360044003400410031003700370045003200380031004500310045003900360042003700450034004500370045004500390037003800420044003000330041003100340041003800340032003600350031003800440038004600330041003400460036003800420032003500360037004200310032003400450042003700350032003000300041003800370045004300300039003600410039003000310044003000330036003600300035003200320041003300360033003000330038003500420032003000440045003600450046003100350041004400340037003900370046004400350032003800350045003800340042003900430046004300350037003800460042004300410030003100460045003300360041004500410041003300310046003900380045003600360042003800370038003100320031003400340044003700320042003900440033003800410046004200410036003100300034004200350042003600340043003600380041003700350035003900350046003100420035003700310035003800430044004200420038003600450038003400360034004200460034003900320034003600310033003300420039003700300038003400410032003500360030004500390044003500420045004200460043003300420044003800320045003000390034003600360037003000410043003400440033003100360037004100430038004300350032004500410039003300430039004500340034003800390037003500390036003700390033004100380042004600430031004400350043003700450044003600440039003500460043004100370030003900370038004200440032003900340042003600430038003200450036003500390038003900380043004600420033004200460044004300380044003100450041004300330046004100410032004600420030004400300032003400380041004500410037003100390044003600440030003600320030004400310032004600330038004400390036004100340033004100380039003200460043003600360030004100320033004500430037003200370042003100380043003700360038003700340037004500300037003100450039004100420041003200310042004600390031004300320042003100320041003800460037003200420045003900440041004300370039003800350042004400390036003500410031004400380043003300390046003400380043003300460030003200310030004600380041004600430046004600420030003400380032003100460038003500380041003400460038004400370046004300380030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073700330036000005530044000007530044004E00000B53007500640061006E00008423360030003000300030003000300030004200300038003000360030003000300030003000300037004200460043003700440037004500300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300043003200300031004600330037004300430030003400380046003000300030003000300030004200450034003900340034003400310035003400320038003900310036003300460034004600370044003500460042003500460037004400380043003800440038003100450033003200460030003300350035003000310044003300340036004400350044004600300043003500310037004500440046003100390045004500300038004600450041003300410045004300310030004300300043003000430030004300370037003000340046004600330031003400340046003900370044003600370044003800410038004600410039004200360041003000360033003300330032003100340036003900460045003400370031003600460030003600340035003200370038003300440039003100440031004500450031004500330037003200330030004200340035003500450036003000340031003100370044003800460045004500460038003100450038003600330030003900350036004400310045003500420031003300440030004300330041003100320041004100360034003100420043004300380034003400440046003000430041003800420044004200300043003800450044003300310032003100380035004500370044003700390034003700350044003800330037003500320034003500340031003900460036003600370032004400360030003100300045003300310031003200320044004200360030003800430033003000450036003700390046004500460046004200350044003800460039004200460046003700390038004600450046004300410037003500320031003800460046004600390043003700430030004200300046003700300035004300330039003700410042003100460034003500420046003300300033003000380038003500320036003200320038004300320045003000330037003300460031003900310038004200360033004400380035004400300035003400300033004500450035003200460046003100390035003800390038004600450033003300330030003300300035003000310035003000330030003000410044004200350035003000410036003300460042003500410036004300340030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073700340030000005530052000007530055005200001153007500720069006E0061006D00650000844F360030003000300030003000300030004600300038003000360030003000300030003000300045003000360044003300460036003800300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300043003200300031004300410045004300350035003500330035003000300030003000300030004300390034003900340034003400310035003400330038003800440045004400390034004200440030004500340031003400310031003000380035004200460044004400320042003500430034003100340032003800460030003800310041003000440038003900370038003000370036004600450030003200350033003400320032003600410030003500340046004500300038004400370038003000320038003900340032003800420042003800370034003100410046004600350037003600320035003700320031003100340030004100420042003800390036004300450037003500340033003300430039003900390033003300320037003900330039003300310031003700340032004200310041003000370039003000320045003400340039004400300041003000420041004400420035003900330035003300340034003800320046003600360030003600320043003500390034003700370030003100380030004600320041004300380043003800380035003900420041003600310034003500340043004400360046003700410030003000350043003700360039004300410043004100340037004300340034003400380038004500350041004500430038004200380032003200440033004400430030003100370030003300460037003900410038003800420032003400350043004600420042004600300039004100330032003100440042003500420045003200390037004300460043004600340035003800350030004200450042003600310044003100330038003600360034004300340035003100380046003800360043003400360046003900370037004200460031004400450035003000390038003300450046003600450043003100430036003300310039003000410038003100440035003800460035003400420030003800300046003100320044003500320033004500370037003900440032003300380032003300310036004100440043004500440038003400340039003200440031003900420035003400420037004100380046004100410043004200460030004100420042004300410042003100460038004600460038004100310037003100450031003900300031003300440037003500360032004200450030004500350042003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007370034003400000553004A00000753004A004D00002D5300760061006C006200610072006400200061006E00640020004A0061006E0020004D006100790065006E000007370034003800000553005A000007530057005A0000135300770061007A0069006C0061006E006400008817360030003000300030003000300030004600300038003000360030003000300030003000300045003000360044003300460036003800300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300030003000450030004200320046003000420032003000420041003000300030003000300031004200420034003900340034003400310035003400330038003800440042003500390034004200460036004200310033003700310031003800380037003900460036004600370032003300390043004200310039003300390038004400330044004600300038004300420034004200410038003400390036004600360033004100340038004200370034003000410038003800420044003900320032003400310031003700340031003500430038004200390034004500450036003200310036004500370034004500300045004500320031004600390030004300310043003900410035003000440031003400320034004200350046004500350038003800410035003800300037003200390032003500450041003600320037003200330035003800310038004200320031003200310045003900350044003700420042004400350043004500450031004300410034003800350032003200410038003000380046003700360045003200460037004300440045004500370046004400460030004200450032004600410046004300380044004400370046003100390031003200340031004300340041003200380030003000320034003800300042004400330045004600320032003000310038004200370036003300390031004500430039003200380043003400360041003300320046003900340037004600300035003000390036004400390039004100330035003400300042004600430034003600320041003100430030004600450043004500300045004300440037003200390039003700300033003000460038003700460037003000330044003900330045003100440039004400310035003900320036003300330037003700310038003100450036004500460031003600410046004400330039003400320030003800450043003600360039003300380046004300420043004200460034004100420044003500350046003400320034003500320031003300360033003600340036004400300045004400390045004400340043003600450046004300410046003200450033004500330032003400350034003400320032003400360033003800340033003400330035004500320046003300410043004300310030004200320037004300310045003400430034003100350043003200340030004100320044003300410045004600310043003300460041003800450045003300330038003700430036003900330034003900380042003800350044003400340031004100420037003300380042003800360038003300330035004500420038003400370036003000300046004600310046003700460036003700450037003700370043003300340037004600380031003500410036004100390045003800350044003100320036004200450037003400380036003600320044003500340035003500350035003500330034003400440043003300460033003300430046004100460044003300450044003900360043003900360035003200410039003800340045003700370039004100340044003300360039004300450032004200330032004200420030004600410036004600310030004600\
-31004400440045003000370044003700340039003000350035004400430045003600440044003600300031003900300038004500330042003600430042003700410037004600380039003400420041004300310042003500440037003600460035003100380033003000330031004500310039003000360041004200380030004100450045004200420038004100450038004200360035003500390031003400380042003400350034004300440033004300340037003500350044004500340037003800390043004100460032004200320042004600340044003600310043003700430032003100410038004500360036004500410032004600350031004100440043004100320037004500440041003700310032003000300034003600360035003200450037004500410037004500450042004400340038004300390046003700340033004100370043003300330034004400310032003800390030003400390035003400410038003500370043003300450038004600440044003600410042003100420044004200340043003400360030003600330045003300340034004400420035003300350032004300340037004300300046004400350042003300460046004200450033004300300030003400460039003600460039003300300033003700430037004100450045004200370032003500390044003300350038003900430039003900410031004600350032004600350037003100310044003500310044003400420034004600390042003000460041003300450030003200320042004400410039004500350032003200300031003400370046003600380034003700450030003200440032004200450042003100360035003300340042003200420035003300410030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073700350032000005530045000007530057004500000D530077006500640065006E00008333360030003000300030003000300030004500300038003000360030003000300030003000300032004200330031004500430043004400300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300042003100380032003500450033003100300037003700340033003000300030003000300030003800320034003900340034003400310035003400330038003800440036003300360034003800380039004500460039003900460030003100300042003900300045003300460042004300380037003000320046004100330038003700380031003800310038003100380031003600310046003900330035003300440038003600440038003200440041003100440038003900340045003100300034003400430032003400410039003100450033003500390038003100430043003000390032003600410037003000300036004100420038003400310030004300370037003700330038003500420034003500460030003100440030003300320045003700350042003800300030004500330039004600380042003600320035003800350033003000350041003500380030003700360034003100390031004200390043004200310046004100420038003400310030004300370037003700380036003500360042004200350044003000430030004300300043003000430030004300410037003900460043004200330030004300430042004200360043003400430039004100430031004200330032004600390038003600300039003500390030004500330046004200300038003300370046003800430045003700420032003100300036003500430045004100370030003800310041003100390037004400430038003600390045004300310030003000370034004300440031004600310033003700410034003800390030003500340030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073700350036000005430048000007430048004500001753007700690074007A00650072006C0061006E0064000082DB34003000300030003000300030003100340030003800300036003000300030003000300030003800440038003900310044003000440030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100330030004100320046003000390045004100300034003100390032003800300030003000300030003000360043003400390034003400340031003500340033003800380044003600330042004300320031004300370046004100390046003800310038004100380030003800390039004100380036004400310043003400340030003100360034003200300041004100340041003600320044003400370045003100330046004300420038004100410034004300430034003000350045004500460036003000340032003400410035003000430030004500300030004600340033004100410031004200430038003700300034003300380045004600350033004600300043003700460044004300420030004600430033004600410039004500300045003300380036004500350046004600390031004300440031003800460043003500450041003600420041003800310038004300380034004600320042003200460041004300330035004600320038004600430039004200460032003600430037003800300044003100430046004300350045004100360037004600450031004600300037003900450042003500410039003200300043003200340031003800320039004100340038003200430031003100460038003600300030004100320039004400350031003500320037003200340046003300340034003300300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000737003600300000055300590000075300590052000029530079007200690061006E00200041007200610062002000520065007000750062006C00690063000083773600300030003000300030003000300046003000380030003600300030003000300030003000450030003600440033004600360038003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310031003100300030004400330041003400390044004500440030003300330030003000300030003000300039003300340039003400340034003100350034003300380038004400360033003300430032003700410038004600360039004600380031003000360038003000380039003100360038003600380045003100410038004300300032003100380046004600460046004600460038004600330035004600320046004500330033004600430036003700360030003600340036003000430034004100420031003900390046003100410039004300320045003900450037003300450042003100300034003100350037004500310035003500460033003100460030004200350038004600370045003000430043003700460038003600370039003000390046004600450042004300450041004400460046004600460045004600460046003300460030004300460039003700460046004600460046004600440041004600330042004200370046004500330046004300330042004300380034004600460045004200310045003900430043003100360036004300340037004600410043003400310046003100460030004300420035004200380036003700330036004600310046003300300038003800370033004600320033003300350038003800390041003900360030003700350044003000420031003500370037003700310038003500450037004500460046004300380036003000320034004100430043003000320030004300460032003300380043003200310038004600330033003800430032003900300035003800430030004300300043003000430041003300330039003600460038003800310041003000430030003000350034003100320037003300440042004500410041004400380032003300460030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073100350038000005540057000007540057004E000033540061006900770061006E002C002000500072006F00760069006E006300650020006F00660020004300680069006E00610000847B3600300030003000300030003000300046003000380030003600300030003000300030003000450030003600440033004600360038003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310031003000340030003300300046003900410043003100330032003300320030003000300030003000300044003400340039003400340034003100350034003300380038004400450044003900320042003100300041003800320035003000310034003800360042004600410042003000450032004400350039004500310036003800380033003800420032003800460034003100380032004500430045004200440034003400380046004400300042003300460034003200380030004400340045003300450034003100340033004300330031004400300034003900370030003800300032004100390039003000320030003400380042003300320044003500300043004200450041004200360034003500460046004600380043003300460044004300450045003100390045003400460043003000410032004100320031003100320031004100300036004100420035003500300033003100360042003900370034004600360032003300340038004200430039003600340038003400450033004600340034003900440033003900430046003500370041004600460033003600410038003100330031004300300034003300360034003100360030004500330037003900340033004100340033004300310030003400350031004200410032003600380041003300300034004400360045004500310033003000430030004400440037003300350030003900430033003300310044003300410039003400330031003800380045003700310035004400310033004300330044003000420041004400450042004600300036003100370043003500390035003200340043003900390031004600320030003800380030003900340034003700390032003200340041003700320038004100450034004100450030004400410035003700430034004600310031003600440046003100460042003000350041003600350039004300340045003100370045003200370038004100420030003400300035003100300034004400320042003700340035004400360030003500390033004400420032004500430034004300350039004400360044003500460038004300380038004100330039004300420037004100350033003000320033004200450035003400350045004600310031003100350033004300330030004600360046004200410038003900440046004300300046004600450036004400460030003000440038004600320045003400300034004500390033003300420032004600450032003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007370036003200000554004A00000754004A004B000015540061006A0069006B0069007300740061006E00008383360030003000300030003000300030004200300038003000360030003000300030003000300037004200460043003700440037004500300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003000310036003100340030003600340031003800300031004500370042003000300030003000300030003900360034003900340034003400310035003400320038003900310045004400390032004200310030004100300032003300310031003000340034004400460038003600370038003100320035003000350030004100430046004300300033004600440033003100420046004400360035004500390032003500320032004200450031004300340032004200450034004300320043003500420042003500420038004200460034003400390037003500390044004400330030004400430043004200430038003500360035004500340030004100430041003000320033003200340042003400300031003700300035003400420046003400460045003500450030004400440031003800420036004100310034003100300043003000320039004500320041004100450046003100330035003500320044003800370045003600300046003700430035004200420030003300420034003000360030004500430036003000370035003000300042003300320039004400360036004300450044003300320032003800330034003400370038003800420037003600430044004400310039003300340035003500350042003700350046003000440034003400310046003400330030004300370045004300430037003100360044004300300039004300430042003600300043003000450043004600460030004100380042003100440037004500390044004400440038004500390036003500380043003800380032003600420033004400370032003100460036003000390034003200420031003200330035004300460045003300420043004500460041003000310032003100340039003300320046003000350046004100460044004600460032003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007380033003400000554005A00000754005A0041000039540061006E007A0061006E00690061002C00200055006E0069007400650064002000520065007000750062006C006900630020006F0066000089A336003000300030003000300030003000460030003800300036003000300030003000300030004500300036004400330046003600380030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030004300320030003100380041003900410038003900310032004300300030003000300030003200310045003400390034003400340031003500340033003800380044003900440044003400350044003400380039003300350031003100380043003000460031004600460046004200450045003500440042004100340044004500370039004300320039004300350032004100320044003100320041003200320030003000440044003200320043003700370042003100380042003200320032003400300033003200460046003200360032003500360044003000320037003600350039004600380038003900340038003900350033003400370034004300430032003800410032004300420032003900420034003800460032004100360032003800320032003800320034003400450038003200320043003200380042003800380032004500380032004600320032003200460031003400360039003700310046003400420037003900330037004400420046003600320041004400360044004100350037003100370041003100410032004500460035003600440033004500370045004100370030004300450037003300370045004500370037003900330038003800370032003300360043004500380044004400310033003600370038003500350031003200380046004400450036004200360035003900450036004600330039004200300030003700350045004400440033003000340036003700310036003200380036003900320035004100300032003800430030004300390038004300300030003400370043003200350045003200450035004400350031004500380045003900300042004100390037003200390036003000440045003700340042003600310036004500390039003600350042004500460035003000350032003800360039003900420043003600310037003800380041003900370032004300410038004100420034004100390043003300300032003700300044003800310030004500340041004300450038004100350044003100410039004600300041003400460037003900370032004100320037003600440039003500340030003600420041004400380031003200410046004200450036004400340045003000330035003900410030003800450044003600360039003900440039003400460030003100370036003300420031003500330043004200320042004100430041004500320032004400310032004400440036004400350039004200430043004600410045004100360036003400450038004300320046004600450031003200410046004400330034004600350035004100320046004100450039004200340031003100450042004400460043003400390037004300430039003500350034004200310041003600380033004300360035004500300044003800460031003700430043004500340043003300360046003300440036003500330046004100370037003300450031003900390038003200330034003600370031003600350037004200440031003700440046003500360033003600420035003100370030003700420041003200410041003900430041004400390042003200340031004500420042003800430030004300350041003200410044003900330039003500430038003700330046003600410035004300330038003300300031003100420041003500460033003700380033003400330032004600370033004100370035003300450031004600450044003300350039003600320034004200330041003100370034003500420038003500380041003300450037004600320042003900370035004400340046004200310041003700380033003500360041003500330031003900380042004500300032004300330031003400410041004200430039004300370037004100420037003900460030004100380037004300320043003000370030003400340042003500360031004100330034003500340033004400370037003500320033003500330038003500460042003200380031004200420039003800410031004300430039003400450044003800420031003300380033003700420030004100360043004600440032003900330033003300340041003700460046003700320034004500350034003700370046004100380035003000340031003800300044003300380037003700340042004300370042003900360034004600350037003900450038004200450041003900310031004200340039003500310030003000340039003200460043003400420038003600360039004100410032003700380036003200380041004100410046003300300041003500460030003600440035003500350035004100460032003400340031004500330041003800440036003800420036003500420042003100380045003300420046003000380034003700330039003300380032004600330031003500420046004300450031004400450033004600420046003300300039003700360044003900460044003000390044003100390041003000330045003900370043003700380036003100410031004100370041003000380039003000410046003700440044003900340035003000300030004100310041004300340038003100420046004600440038003100460035003600320044004100430033003600380039003700340033003600360035004200320042003600420043003900340031003300450033004300440030004300380035003200430032003900380031004600330033003000410030004600410038003400300045004400410044003200420038004500370033003000460033003200300035003200340042003800370043004600340045003200430032004500320036004400380046004100450046003500380046004300320041003300320030003400330041003100410033003200440039004200360037003700300037003900350036003300320044003000430038003400300041003900360030004400430045004300350031004600300046003800420042003500390037004400310039004300310030003400300030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073700360034000005540048000007540048004100001154006800610069006C0061006E006400008227360030003000300030003000300030004600300038003000360030003000300030003000300045003000360044003300460036003800300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300043003200300031003400410030003100450044004400300037003000300030003000300030003300460034003900340034003400310035003400330038003800440036003300330043003200370041003800460036003900460038003100300036003800300038003900310036003800360033003200330030003300300033003000420030003800380045003700410037004400320043003400360030004300360046004600460046004600460030004600410044004100300036003000360034003500300046003300310043003500410032004500310045003300350031003800300045003800360035004500370032003600330037003900330039003700310033003600340044003000430036003600310043003700320038003500310030003000300045004400430043003100300038004300390036004200450034004500320042003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007360032003600000554004C00000754004C0053000017540069006D006F0072002D004C006500730074006500018557360030003000300030003000300030004200300038003000360030003000300030003000300037004200460043003700440037004500300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300043003200340033003500380038003100420030003800350044003000300030003000300031003000420034003900340034003400310035003400320038003900310042003500440033004200310034004100430033003500300031003400430036004600310037004600370032004300420041003500380044003700410043003500300043004400360045004100310036003800370035003000430034003200370035003000440043004300340034003100370030004500390032003000310039003000410037003100370034003800440044004400310043004500410045003200390041003200440030004600450030004100410041003800380033003500330034003000460041003000300043004500380032003200320032003200380032004200380041003800310038004300390035003200300044003800390044003700410044003200300034004500360044004500410037003900380030004400460030003700450037003700430043003700360038004100460032004100440044003500350033003600440043003600390043003600330039003000360041003000390037003100430043003900440031004300450031004300380044003200420034003100460046004500360037004200370043003300300038003000350035003300350038003800330041003700350042003600390044003400390039003200460033004100320037003400380030003000300030004500300030003400340041003500430041003600390045004600380033004500370033004300410037004200350041003700350030004300420032003600460039004100420032003600370046003200420030003900340037003500310038003400360035003500390035004300460034004500450033003900420039003700430036003700370044003600330030003200360037003400420035003200360042003800450031003600360030003000410032003100300038003800320030003000440046004600370046003100330043003800460033003400340044004200390037004500460038003600320036004400460037003800390039003700410034004100300044003600330034003900390044004600390037004400380032004400330031003100340035004300320039003800410038003200330030003000430037003100350044003900370033003800380045003500310034004100420031003600300037004600370032003700430044003800360030003700360034003600440030004200460044003500320034003600370046003900440030003300420031004600310043003400460034004100340039003900360036003500460038003900420038004100410038003500330043003700370038003600340032003400460030003000460033004300360038004300350045003200350034003200390046003000310037004600430032004600330044003600450041004600320038004400440039004400310045004600460045003700460044003000300038004200330030003600410037003100430038004200440035003200320036003000300030003000300030003000300034003900340035003400450034003400410045003400\
-3200360030003800320000073700360038000005540047000007540047004F00000954006F0067006F00008533360030003000300030003000300030004500300038003000360030003000300030003000300032004200330031004500430043004400300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300043003200300031003100440030003700340032003900380038003000300030003000300031003000320034003900340034003400310035003400330038003800440036003300420043003200340036003000460032003900460030003100300046003000380046003600310032003600350042003800320044004300300038004100340046003000390035003600430030003800340043004100360033003600320036003000310031003100330032003600440039003100300036004300380030003000350039003900430033003600330036004600430041004300300036004400360044004300340046003000420032003600350033004100350043003400430034004200460030003300330030003300390046003300300031003300380036003400360041003200300043003600360031003600450030003600330039003000450041003200390036003300450030004200310033003700360033003600300045003400450036003600300045003000440034003500360036003500370038003500360044003500430037004600300045004200460045003100330038003600310035003400450036003700310039003300380031003400420046003900330036004300330030003100330030003300300033003000330043003300440046003000460039004600310038003500450033003400340045003600310036003000310031003100320036003000360030004500360045003000360030003700380033004400360035003000390043003300410046004600420034004600340038003300360030004300430033004300350030004300300043003000430030004300410043003100320041003200300043003500460038004600390045003600330046003800460033004600360031004400300033003800370042004100310032004300330044003700410033004500370031003800310038003100380031003800310038004400360044004300390037003600320046003800460036004600330030004600430039003000360033003300430032003500320030003500380042004100380031003000430033003900460044003700450046003200300042003600380039003800420033003000460043003700390046003900380036003800310038003100380031003000410041003900300032003600360032003800300033003000330030003300440043003500300034004100300030004500330038003600320043003000440042004300450039004600380041004400450031003400460038003600330046004400430046004600340038003300370046003800460046003300390030003600420043003000360039003300300042003400380034004600410030003400340030003200310036003900330030004400370036004200340033003100460038004500430031004200300031003900410031003800340043004200330041003000300030003000300038003700420046003400340036003500390043004300350041003700330030003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007370037003200000554004B00000754004B004C00000F54006F006B0065006C00610075000007370037003600000554004F00000754004F004E00000B54006F006E00670061000083BF3600300030003000300030003000300042003000380030003600300030003000300030003000370042004600430037004400370045003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310031003000410031004100310030003800360035003700420042004400350030003000300030003000300041003500340039003400340034003100350034003200380039003100360033004600430046004600460046004600460037004600300036003200380046003800460037004500440031004200430033004400420041004400350042003100390046003800360044003600430031003800440038003200340032003500360031004300320030004300360037004600350046003400310038004200450035004500420045004300430034003000300041003600300034003200450036004600430037004500460033003800360045003100370041003500380031003800430033003900370037003300450037003400380033003200300034004100460043003100340046003200370034004300360030003300380041004200410037004300370043003000430030004300300043003000370030003300440032003200380032004500310037003600350041003100410037003500300043004500360042003500420030003600300039003000430043004300430036003400360030003600300036003000360030003100300030003900300039003600310031003000460032004600350041003500430038003600300031003600310038003800330043004600430032003800320038003100340033003400310038003100450031004600440045004500440044003000430031003200430039004300390030004300460043003300360033003600310034003100390043004300460038004100380041003300450033003300460032003100340035003400460032003700340043003600300046003800460035004500320030003500360039003000360031004600360034003600300032003000360038003300300033003900380030003800390042003000390032003500310038003300320039003000340030003000380037004200460032004200460038004100440044003700360043003600430030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073700380030000005540054000007540054004F0000275400720069006E006900640061006400200061006E006400200054006F006200610067006F000089433600300030003000300030003000300044003000380030003600300030003000300030003000410044004100350039004500360033003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310031003000430032003000300045003500440037004300320034003700440030003000300030003000320030003600340039003400340034003100350034003300380038004400390044003900320034004600340038003900330037003100310043003800370039004600370037003800320046003900310036003800330035004500340043003700380031003100440045003400450042003500320038004400380041003500310044004100320034003300420037004100380032003800310038003100350035003600320034003000430032003500430038004200310043003900360030003600310045004200320032003400380034003900310044003400410043003900340038003000430045004300310046003400410032003200410036004100420038003900320031003500420041003900380039003500330032003600420043003500300034003400310036004100430039004100410037004400310031003000360034003700420036003300360033003900420042003200420044003500420038003700360034003100300045004100340041003900460045003300300033004200460038003700320046004600430033004500340032004600340034003600370042003700310044004500370032003800300038003600430036003400360042003200440039003200430030003000390032003200340033003100330043003300380043003800330045004500460033004200420034004400370045003300360043003000370043003300460032003900330030003100300045003700420032003700370038004500460046003700320033004300420033003200300030003900410041003600370031004400410036004100360035004600320043003800340031003600340038004600310033003000340036003100450042003600310038003000450034003600340039003000440044004100440039004400430043003800440038004500360031003300360039004200300031004300380045003500370032003500430036004400360041004100320034004200460042003800390046003200450038003200450043003200380045004300410032004400380035003200420045004300360032004600350034004400380030004600430037003200390043004300320034003400310030003400370036004600330037003500460039003700360032003400340032003200310031003000300034003200410031003100300031003100370044003900350043004200460037004500450039003000390044003900410041003500390030003500440044003900350041003100380041003000390030004300450039003000460036003000350036003800360043003600420032003500350033003200330041003100410041003200410030003000450031003700300039003800450039003200460039004600420031003300440045004400300031004600350031003300460039003800340046003600430046004200300046003000350031003300320031003500440037003500420038003100440041004200360031003600340036003200410035003600370031004200420044004400450038004200410030004500380030004100320032003800420043003100390037004100430039004100450038004500350045003500320033003300460033003600350043003300380036003000440036004400420031003400380045004300350036003200370044003600310046003400420038004300460039003400360033003100310041003800440030003000340034004100330035003100380045003900440033004100430039004600370032004200370035003500340044004200320045003600430032003300420043003400360046004300430035003000380041003600450037003500450036003600300033003600460035003100310034003000350038003000350034003200410038003500460035004400430035003900430036004600360043004200440034004200360042003500360043004200410039003800420032003600310038003000440034004300430033004300390035004400370044004100300039003000450042004600430032003600320042003100300030004100300045004200330041003200450039003700380042004400420038004200300042004500430037004400440036003800350041003100410041003600410044004400420042004200460033004500360046003300330046003200300039003800440037004300360030003100410037004200460037003700440031003600390033004200460030003800380037004300330030003000410038004100410043004100340032003300320038003100450044003600310030003700320042003500330037003300310034004400320039003900460046004200460042003800310034003800460036004200430034004500410031004400330043004200450044003400380030004300370045003300320039003700390042004600440046004300460037003100410037003100440042003100460046003000310045003200320031003500330043003900360046004200430038004100370032003000380030003200460032003700350030003700450033003700420037003600450032003600430036004500320036003900370043004200300031003200300043004200330032004200450041003100320031003600410037004100300036003400380034004500300036004200370031003100350045003400330033004100370046003800360034003800440044003000390032004500440036004400370041003300360039003700460037003600320044003800410032003200460044003700440037004400310043004600440046003000380044004400460044003100310039004300440031003300320034003100330045003700410037003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007370038003800000554004E000007540055004E00000F540075006E00690073006900610000858336003000300030003000300030003000460030003800300036003000300030003000300030004500300036004400330046003600380030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310031003200300038003100350039004300460043004300440034003100300030003000300030003100310036003400390034003400340031003500340033003800380044004400350039003400420031003400410043003300360030003100340038003500420046004600430034004400390041003900410034003100350042003800320035004100370030003200430039004400310034003000410034004100440034003300410033003800460039003000360030004500450032003500320033003200380038003100340035004600430034004300390043003500410031003000340041003700350038004400430043003400440031004100350034004600360030003100310038003700380032003200320041003500370034003100340038004200350030003100410039003700410034003300310036004400450041004500360045003600340046003800390036003400460030004300430046003700370045003100430043004500330044003500430045003500310044003700330034003600300041003100320036003900340030003500330030003500410042003700330034004400360035003300320036003800390035003700350030003000410032004300450030004200340043004100370037004600300037003600420033004200350042004500340039004200300044003600320045004600310033003000300039003100350046004300320041004200390044003100310042003500390046004100340037004200380041004500430037003800410032004200380038003200440039003600450045003100310044003900440032003000350036003900370033003100450043003600330036003200330046003200300042004200350046003600350036003800310044003100300030004600330045003700450030003500340042003300330033003600450041003300360043003100350035003100330043003600360033003000410037003700320045004500310043003300320033003400320043004600330032003100420038004500330030004500410042003600440034004200310031003400410043003900360034004200340034003900440036003700420034004200440036004400380032003900420035004200460043003800420030003600420045003700330038004400350038003200420041003200390036003400420035003200420030003300340045003300340039004100460038004600350036004400390032003000420043003600460042003100370038003700390034004500460034004400410034003500420037003300360038003900440046003000360034004300370041004600440045003400380045003700440043003700360035004500310042003400300036004200390031004300410033003400330031004200370044004400370032003200300045004200460035003000430043003000320042004500450033003400410043003100440032004500330034003100340041004100440046003800350031003800320031004500430046003000370034004500410030004600460046003700320042004200450030003100360046004600340036003200410038004600340034004600460034003600380030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073700390032000005540052000007540055005200000D5400750072006B006500790000856B3600300030003000300030003000300046003000380030003600300030003000300030003000450030003600440033004600360038003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310031003000410032004500330038003000380043003800450030004400380030003000300030003000310031003000340039003400340034003100350034003300380038004400360033003700430043004300320035004600450039004600380031003000360038003000380039003100360038003600300045003800430043003100320043004600320042003200300043003600430036003600430036003000430034004300460043004600430036003400310039004300430038003200360031003900330041003000300030003800330045003000390034003100450030003600300045003400460033003700380036004500460039004200420037003300330046004300370044004600410038004300450031004600370044003500450042003000430044004600390036004100450041003200430043003600300043003100360039003700440030004300310043004300450030004500300043004100460039004300420043003100390037004500350046004200380030004300350035004300350043003200430030003600450036003100430041004600300045004200450032003600350038003600460046004400460037004600390030003600450033003000410042004200360032003600300033004100370039004600310037004300330045003700300039004400330031003000380036003300320033003000330030003300300046004300460039004300330046003000460042004600320033003500300036004100450038003800310030003000360036003600370031003500310038003600440046004400370036004500330032003700430044004600420034003800440037003800380033003500390031003400450034003100380031003800310038003100380031003800370045003500460042004200380031004100310039003000340039003400360038004100380031004200370032003000390033003800310034003500340039003900310045003100380035004200310031004400360039003200450046004500460033004500300031003100430034004500350035004100310041003100380030004100460046003300440037003900430036004600300037003900430032003700340030003600320036003700310035003100300036003500360030004400330035003800360033004600420037004500450045003000330035003900380031003100330044003800330030003800320046003900460030003700300039003600330033003700370046004400340033003000330036003300310036003400460038003700350046003100300041004300330046004600450046004400460030003900420041003100360041004200430031004400340034004100310035003100380030003600430033003000300038004200420043003200430030003300390033004200380031003800430033003900460039004200370037003100380046004500370044004600430034003800390032004100310037003800300044004100360031003400300043004200440042003200300032003000300035004500380035003600310045004400450038003300320043003800310041003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007370039003500000554004D00000754004B004D0000195400750072006B006D0065006E0069007300740061006E000087CF3600300030003000300030003000300046003000380030003600300030003000300030003000450030003600440033004600360038003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310031003000310030004300310046003000360032003500460043003700320030003000300030003000310041003900340039003400340034003100350034003300380038004400410044004400330042004400340046003500330035003100310038004300370046003100450046004200390045003700420045003500300044004100340033003400420032003000410035003900380030003600350046003100410041003900430036003800340034003100380044003800330036004300320036003100380032003700350043004600440030003300390043003400430031004300440044003900430046004400380033003900430044003500430039004100380035003100310033003600320030003700380044003200300030003800380033003400440034003500410046004200340035004300360046004300420042003900320046004500370042003800300038004500410036003000440032003400320039004600450039003100390034004500330045004600390045003500370037004600320030003800450045004100440035004100380030004400420044004600420041004400430044004600300043003900380035004500390041004100330042003700420036004300360039003300390041004500320035003100410033004300410037003100430037003300390035004300420041003800390034004600460039004400360031003900370036003200410030004100360045003500450036003400320046003000450030003000390030003800450043003300460035003700330031003700420038004200320037003000390045004500390034003200360039003700340042003800450032003200370034003400340046003500460035003100300044004600360032003800380036004100370039003800320041003200340030003000410038004100300034003000410034003000460030003800450033003100450037003700390037003500370038003600380036004400440043003300340035003000380031003800370034003300430037004500420043003500380036003700440030004400450034003600330036003400300030003800430031003700430042003900380032003400450031003300420036004300330035004400360036003400410030004100340037003000380038004300420035004300330032003700380045003100320039003700320046003000440038003100390039004300380045003800330034003600300046004600430030004300370035004100380042004300450037003200440032003300430036003700370035004500390031004100410045003200330038003700340032004600460034003900410043004200430038004300460041004100360032003500410044003000420045004100360044003400420041004600410039003000310044003800460041004400450036003100410036004100380044003800440038003600440046003300420038004600350037004100460034003200410037003200320042004600380032004300300044004500460037004600330041004400340041003400340036003600370039003300340037003800460043003200330038003200320038004300410033004100310035003100460038004100420038004100340031003200450046003900330034003900390035003200350037003400350037003600300041003000390033004100390035003200330034003100460046003400440041004300420043003800430031004200420031004300370044003700360045003400430044003300300034004200340031003600460034003700380045003000370045003200450037003900370039004200410043003800420042003700390034003300330035003900340034004300430035003200370037003200460046003500340045003100300042003400330035003900450037004300430036004100340031003400440036003700460038004100450031003900300046003200430038003500410035004400390031003700440043004200390044003400450034004200320035004200320032003700300046003300460031004300300046004200410039004300370044003900380037003200420038003400380039004300460044003500300037004300420037003400460042004300310037003800360030003200420030003400350042004300460035004100320043003200450034004500460030004500310046003900300036004500410046003700340039003100460037003700380045003300450043004600310038003900380037004400460033003100310046004400370036003900440042003200330034004600340042004300420039003100330043003100420046003000300046003000410031003900420031003000310032004100410044003400330035003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007370039003600000554004300000754004300410000315400750072006B007300200061006E006400200043006100690063006F0073002000490073006C0061006E00640073000087B336003000300030003000300030003000420030003800300036003000300030003000300030003700420046004300370044003700450030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035\
-0030003700440037003000390030004600310031003100390030003000310030003700380039003400340046003000300030003000300031004100320034003900340034003400310035003400320038003900310042003500390030003300440034003800310042003700310031004300380036003900460042004200360042004100430044003100320038003600410038003300440038003100340034003500330031003100320037003000320038004500320034003500310037003900420035003800300037004100310030003500310037004300310038004600300045003700450030004300440035003800320034003400390044003000420037003600370030003500320032004100380032003900330041003200390034003000450034003500460030003100430038003400380032003800380041003800420033004400330034003900360041003300340045003200310032004200310032003800340036003800440038004400310031004600310037004100410038003400390033004300300037003200310045003500410036003000360043003100370037004600430033004600420043004300460046004600450035003200370030003400380037004200460031004100390032004400330043003500450038003600410030004300340035003500310046003100370035004300420037003400370045004500460036003500460036004500330033003700320036003700460046003800460031004200440037004600340035003800460039004300380031004500340037003400350031004400390042003100340043004200410031003100320041003200410042004500310038003900440037003500300035004200340039003400320037004200310037003800310041003000380031004500450041003900340037003400370039003300390039004100350041004300320037003500310039003400320032004100320042003600370036003600450033003800360043003500430035003200440034003200410031004200330046003400430035004200420042003200360043003900380035004500390032003400390046003400340030003800300041004300410041003200410039003000320034003100330041004100460034004300420036003900380042003900460046004400460036004200360032003200300038003000320037003600420042003800440043003200450042003200380031003600460042003000420046003400430031003700450046003200370044003000330043003400330035003900440043003800340031003800340033004600360032003000450038003600360031003800300037004600330046003500350031004300310042004300410041003500450046004500440030004500300039004500420035004600410045004100320033003700430043004100390031004500330045003800460035004300410035004200380033003800310046003200440041003400420034004400410038003500460035003500360036003300360032003500330036003400330043003900380046003900350030003500340030004400380036003700450036003500390033004500440037003600350033003900430030004200360042003700420037003100440033003200320034003700380031003800450045003500320030003000460043004200430035003000450045003700380031003300440031004300460039004400370045003600430035003900450045003700310031004100360045003700430033003400430041004400380034003400390032003400450045003700380035003300320042003500300035003700440046004300360043003600440036003200390045004200450041003200310038004100320032004400320044004500350045003800330044003700310031003300330031003500380046003600330033003600320034004600370033003400430041003600430031003100340044003400440045003700410043004100390035003600450030004400460045003700300032003700430033003200440046003300380043004400420043003200430043004100360032003600310036004500380035003900360046004400350042003700450033004100330033003600380046004500460030003800450039003300350033003300440043003500320035003900300038003700310046003200330044003600420034003300380032003700450031004400370038004300330037004400410031003800310044004100420036003500370033003500420033003300460031003400370032004600460045003500460043003400410037003900300033004500410039004600380031004500370042003200310038004500420037003600300046003000320033003000300030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073700390038000005540056000007540055005600000D54007500760061006C00750000899B3600300030003000300030003000300042003000380030003600300030003000300030003000370042004600430037004400370045003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900300046003100310031003900300034003100370031003500350030003500360030003000300030003000320031004300340039003400340034003100350034003200380039003100390035004400320034004400340038004400330037003100310038004300300046003100450046004500460042004600460046003700460037003300390042004300440042003500460039004400360041003100450036003400420042003800330035004600350041003000300037004100310030003200360044003500440039003300450041003900300037003600410038004500380031003000310035003600310035003400410037003900320032003800310030003800410035004500310030004200410038003500310038003100380030003400390031003900370030004500300039003500440033003200450038003100300041003200350032003900370037003200360039004600330036003500350036003100420035003200450036004300420044004300370032003700330044004200370046004400420041004600340042003800340036003200320031003700420041004500430046004600330037004300370038003900450038003700340037003400430037003400330046003900310041003200430041004300350039004400440031003600350046004100350046004600410045003900330038003500410043004200390039003900450037004200460034003500440045003800450034004500310038004200370031003200450045004500440046004300310033003900420037003000390035003100450035004500320046003600430046003200380035004200380035003400440038004200310032004400330038004200350030003800450042004300380045004600320037004300330038004300430038004400460032003300380038003100430037003600440042003400330034003500350030003000370030004400300035004200430032004600380046003900440044003700340042003400370041004500380043004200390034003700330042003800370037003600430034004200440034004100450034003500420038004500450042003900380039003400440038004200320032004100360030004600390043003900320045004200390033003300320039004200320035004500390039004600410032004100300042004500300036003600310033003000360043003600380045004300330041003700450045004300390046004100300031003000390032003000360046004200370042003000320042003100330041003500340034003500320037003900450032003900340034003900440036003900460031003200310038003400410030004400380036004500410031003700340032004400380036004400310036003100320033003700390041004400310042004600420044003900370036004600340034003400380041003100460045003100320035003100360033003400330033003500320043004100430044003200300039003200440033003100350042004400300043004300450042003700420032004400370046003900390036003200460046003100360041003200320036003900320037003000300043004100420033003800340031004400350037003700440032003500310036003300440043003900380033004100300045003400460045003300370031003500380030004200420038003100320043003900440034003100300044003400420041003300390037003500440035003600380035003500370037003300390039003400440042003000430039003900300032003400310038004100460032003100390045004200310044003200310042004200430034003200320034004500440034003400320031003000370038003000450031004400360041003100440036003800450044003100440030004100460046003900430042003200330043004200370045003700460032003400460035004200350042004300420038003300300035004100350033003500360036003800310039004200310039003600300036004400450038004300380035003200370046004200330046004300450038003700340034004100440033004200420031004300460039003600390035003100330032003600440035004200410031004500430045003400380038004400350030004100320039003200350034004300450034004300300045003800350032003200360044003800350039003300310035003700440043004300410043004200410031003100320037003700410030003600330036004500460042003800340035003300380038004400300042004200380036004400390046003100390035004500360043003000360043003000410041004100450044003200420038004600440031004400460045003900350030003600450041003800410033004500330030004200320044003400380043003900320032004600300041003600300035003600310033004200380032004300420033003600380032003200300044003800300039004500330033004200320036003700440042003200370044003600420032003600360038003600310036003700440036003400410035003200310037004600350038003000380034003900340043004200370033003300420034004500300030003300450030004100410041003700300042003800370037003100390031003400370042003300390037003400380045003500300041004600450044003600450035003000350033003700330039003800360046003100390035003000430035003200350036004600300039004400420036003900440034004600330031003200410033004100300033003700330045004400320043004600460046003900380034003000440030003300450034003700330045003300360041004500420031003400410041004300380033003000420039004500410043003500410038004100340034003800450037003400430046004600410044004600440030004400340034003700350043003400450046004600410035004500440037003700390030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073800300030000005550047000007550047004100000D5500670061006E006400610000847B3600300030003000300030003000300046003000380030003600300030003000300030003000450030003600440033004600360038003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310031003000410030003700330034003400350033003800330033003100380030003000300030003000300044003400340039003400340034003100350034003300380038004400360033003600340036003000360030004600380043004600340030003000330043003000340034003000420034003300310039003100380031003800310038003500380043004100370033003600380036003300330030004500330046004600450037003400330032004300320038003100380045004600350039003700320031003000370034003300310039004200380045003300390043003300310044003500330037004200300036003700390037003100320039003000360044003600320044004300420031003900370045003500440033003900340039004400300036003000380032003200450046004500430046003200330043003000320030004400450042003500390045003600310044004600430033004400460030004300440032004500450034003900300043004500320035004400450042003100390046004500460033003000380031003000330034003900380036003500430036004400330033004600370038003100350043003800310038004100390033003200450034004600320030003900330032003300430037004200460044003900410036003100450044004400340032004500300036004600460043003000330030003800360041004400440043004100410030004300340046003600450031004500320037003600380046003800370046003700430035003800350030003500300046003000460046004200420033003700450046004600450031004600330044003700320046003400370046003700460035004400460035004600460038003700310042003500370046004300310037003100340031003400430034004100420038003700380031003800310045003100330046004300310041003000370038004600460046004500330044003800330038004600390046003000460043003300390044004200420037003700310038003300380032003400360034003100380032003200330042003200370033003100420043003700460046004600390045004100300036004200380037003600300037003200440042003100380043004200340032003100330031003700420033004500380044004500360031004100310038003500420039004200340030004200300041003000300034003100410045003500310038003600370034004600320039003300360031003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007380030003400000555004100000755004B005200000F55006B007200610069006E0065000081D7360030003000300030003000300030004600300038003000360030003000300030003000300045003000360044003300460036003800300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003200310031003200300031004200330036004500410035004600350042003000300030003000300030003200420034003900340034003400310035003400330038003800440036003300420034003200410033004400460032003900460038003100300036003800300038003900310036003800360038004500310041003300430043003400300044003600360038003900330034003500380034004600310033003800330031003900370046004400450031003500310042003400440043003700410033003000360044003300430039003600300030003000380034004500410030003600420034003500320033004100420042004400360030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073700380034000005410045000007410052004500002955006E00690074006500640020004100720061006200200045006D006900720061007400650073000082933600300030003000300030003000300042003000380030003600300030003000300030003000370042004600430037004400370045003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310031003100330031003100300032003800350045004400380042004100390030003000300030003000300035004100340039003400340034003100350034003200380039003100360033003300430032003700410038004600360039004600300031003000440044003400380037004200440033004300420030004400390046003800410033003000330042004100330038003200390038003000380039003100320043004400300033003600320033003000300042003300360034003100300037003700450038004200440046003000410033004100360041004300370041003900360045003700300041003200360031003000360041004200410030003600350038003000320035003200350030003600300046004200440033003000360036004300340039003600440043004400360043004200460030004500460035004500460045004600440033004400300046003200350030003600360033003000440045003300300042004200370036004500420031004400450046003900460039003700310038003400380035003300310030003000300036003900450031003600460042003200410039004500340032003600320030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073800320036000005470042000007470042005200001D55006E00690074006500640020004B0069006E00670064006F006D000088DF360030003000300030003000300030004200300038003000360030003000300030003000300037004200460043003700440037004500300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300042003200300031003400410035003500310043004200380032003000300030003000300031004500440034003900340034003400310035003400320038003900310039004400390033003400460034003800390033003000310031003800430036003700460044004600330037004400370042003400460035003600440039003500370033003400450037003200460044004100310034003300410043004300310039003600440034003400310034004300300038003800430043003500390030004500350043003100330039003600410031004500380043003800380031003200390032003200450032003300300036003400390038003200320030004500430045003000430031003900420038003100340039003800350030003500310039004400350037003600340038003800390043003100430038003900330034003500300034003300310031003300390041003100350038004400390038004400330036004300340045004100420042003900340043004400370036003800350046003800370043004100350043004600460035003600330045004300370046003700370039004400460045003700370039003700390035004500350045003200310044004100370034003500320044003600370042003500410035003100450044004400430043003600460030004600440035003700310043004500460030004100390031003400410032004600420033003100410034004600320045004200390043003800330039004400440030003000380038004600450034003100410043003200370036004500450035004600310039003200350041003800350044003700360039004300320046004400460045003200390043003200360034003100430042004400410037003100350046003100420041004300350034004500450032004600360035004400450032003600440045004400440038003000430032003200430039004500300032003900300032004400440038003700440031003400410043003500310034003800320041003400350036004400310044003500420032003800370046003000430031003100430043004400450033003400310043004100390042004500410033003100460036004600410030003800420044004300390032003100370036003500430031004400410033004500410039004500430038004600460031003800460043003400440042003000430043003700450039003100340036004500460031003000380032004500420043004300300044004600390046004200340030003800390034004100340039003400330046003500310036003600410031003700410037003600300036004500300045004100440043003300380036004200320042004300380043004300460045003900300046003400340041004100360043003000300045004300300045003800370037003800330037004600320032003000380046003700460046004300370043003900360030004200460045003700310033004500320045003700440035004100330031003100370032003600330044003900440046003200320046003200420046004400380034004500430044003400300043003000420032003300410033003000300036003800450041003600410035003100350036003500360031003400380043003400390030003800450042004300430030003500380035004400370038003200410032004400320031003600350037004300310041003600330035003600440042004300330041004500330046003500320035004500420033003800450044004200340042003000370037003900370039004500360043003200320034003900360041003300380030003400330041003100440039004200450041003600410046003200330032003500360034003800310042004600320046003800350031003700350032003500370037003100450034004500420033003900340043003900410045003000380032004200320032003600460034004400390044004400330038003900330034004500370038004600450044004500330045004300310031003200420039004200450037003100330042004300330045004500370036003300450031003600350038004300300031004300350037003600380045003500450037004500340036003400330042003500310031004600390041003600310046003800300046003900340033004600350039003800440043004400370033003000390042003200410042003000330041003600410031003000300035003000310034004400370046003300460030003700330034003100390039003200410035003000360030003600380032003200460030003800340037003600360031003000300032003800310034003700420032003600330046004600300045003300320044003100310038004200330033004400370044004300380035004200380044003000430036004500330034004400330045004400390046003200300042004400390038003000310046004500460043003200300035004100410039003900380032004200310044003300360037004500330037003500460036003400330033003800380043003400440042004400410042004600310036003200430046003600360046003800320036003300460046003700340041003000350034003700410039003900340036004500460044003000300046003800330035004500310046003900390036003800380043004500360039004500330045004200450030003000390045003100360044003900310043003200360031003000440034003700340030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073800340030000005550053000007550053004100001B55006E006900740065006400200053007400610074006500730000862F360030003000300030003000300030004300300038003000360030003000300030003000300036003600460039003400440043003600300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003500300043003100320033003400460039003600320033004500450039003000300030003000300031003400310034003900340034003400310035003400330038003800440042003500430045004300440034004100300032003600310030003000380035004500310037003700370034003400340043003700330031004400310043003600330031004400330039003400430034003800430032003800430034003800350038004200310036003400310044003000300035003400340044003000410041003100360044003100350044003700340030003300340031003300370044003100420041004500420036003800440031004100360032003000360038003100310036003400310034003600380041003600350036003900360033003500410039003800440033004600390039004400460044003700410036003600440043003400300034003900450044003500350039003100430031004500380045003500320044003800330043003900300031003700440037003300350046003200300042003000390031003400410039003700300037003900350042003600370037003100320045003800360035004200370031003500310037003900420032004300380046003900350044004500430031003700340046003700310031004100420035004400370046004600320034003300460031004600320037003100340044003400360039003700350042004100450034004200320030003900410032004400310032003000440035003500410039003300360043004400320034003400460035004100390031003400300045003800460039004300430033003000460043004400330036003900390041003400380039004600440033003100430030004200320036004300380043003400390039004400370036004100420034004200450033004100440038003300450045004400370037003800320045004400450037003100420035004200330045\
-003700310043003400450034004300380035003100300035003200330032003600440045004100410038003100450038003500430031003500300036003000380034004600430041003400380037003000360035004500410046003800370043003000360043003900430044003400440036004200410037003300350038004600330037004100420038003200390033003700460030003700390044004400380043003800340041003000350034003700390034003100370035004300330030003800320038004400460033003700350038003800410030003400420030003800450043004600390043004300330042004400430031003900300036004300430041003600340034003200460033004400310042003200460042003600340035003200310031003200320045003100320030004400350043003700350037004400320033003300320036003000330044004200430036003900370034004500330041003800370033003700300043003000460034003200300038003500430041003200300042003100410034003800320039003500310046004100450046004500340043003300320045004100340046004300430034003800380036003900380045003500310030003000370035003300370046003000460035003500330043003500320046003900330031003100460044003700320044004400330039003100430035004500350042004600450044003700410033004200460041003200390043004100460036004300430042004200310043003000440044003500320037003500330043004600300034003900370043003700350032004300460030003300370038003600360031003600450032003100390041004400430038004200450031003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007350038003100000555004D00000755004D004900004955006E006900740065006400200053007400610074006500730020004D0069006E006F00720020004F00750074006C00790069006E0067002000490073006C0061006E006400730000073800350038000005550059000007550052005900000F55007200750067007500610079000085A336003000300030003000300030003000460030003800300036003000300030003000300030004500300036004400330046003600380030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030004200320043003300390034004300330042004400380046004200300030003000300030003100310045003400390034003400340031003500340033003800380044004400350044003300420046003400410043003300370030003100340043003500460031004500460032004400360039004400410033003400310032004100310034003500350042003200420031004100320043003000380032003200320032004100320034003300390043003400340039003700330045003800300045003000450036003200420042003800330039004600390030004300360045004200450038003400450038004500340032003600380032003300410044003900450032003500320030003400370031004100420031003500320044003100350041004400370046003300300035003600350033003100410034004400370045004300450042004100330035003900300043003100460042003000300031004600300045003800370037003300340035003200390041003500380038004500310033003400300030004100350031003400430046004500440031004200460034003600340039003200360036004200440043004100340038003600390038003900360043003200450038004600380038003700300037003400460045003800300046004200460039003100350030004400300045004300330039003000430036004400350030003100390041003500460043003100460037003500450046003100370042003200440038003200430039003500350038003600300042003300360039004200330042003100370035004300350045004200420044003100450030003500360041003300380041004500450035003700300038004400430035003300440032003100410037003400310046004200420030003400360033003000450036003000420033004200440033003100310037003200440042003100350032003800410046003700380045003400420045003800420042003500380036003600300032003400390030003400460034004200430032004500420037003800440031004100420039004500320030003200360035004100370044003000330037003000410041003000380039003000380044003600450030003100300045004400390037003100390044004500330041003400460037004300460042003300440042003400450043003000410041003500450039003600350037003400330044004300350045004300460041003600310046003400320041003800410046003600330043004100390034004300390045004600420046004100300034003600360033004100380033003600450038004300360032003000430038004300300033003500300037003600300041003400430044003900350036004400460042003000460043003900440039004200450037003700440036003000310038003200360032003200440032003300370046003600300042003500450044004200330041003800420036003500430037004300320045003200360045003300430037003000360043003900460042003700370046004400320038004300430033003800440042003100380041004200440045003300420042004600460044003500460031003000460037003000410046003700300039003800360043003200380041003300440038003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007380036003000000555005A00000755005A004200001555007A00620065006B0069007300740061006E000083D73600300030003000300030003000300042003000380030003600300030003000300030003000370042004600430037004400370045003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310031003000430032003000300042003200440031003600440030004600320030003000300030003000300041004200340039003400340034003100350034003200380039003100440035004400300033003100300045004300310035003000310043003800300046003100450046003300440039003500310034003800440039003000310034003800330043003100360034003200310039003100420038003800340043004400440034004400350037004400390043004300310036004500420033003400380041003400340033004300460036003000370035003000300031003200380039003300340031003100300042003800320045003800450042004400460036003000390030004400380038004100330037004600380030004500460030003100420033004500430035003200340031003400380030003500310042004200430039004500390039004500420030004400380043003400310038003800310039004500450046003600310035003200340031004100310035003900310044003800450036003400340044003000330037003400410041003100450043003300350036003900440046003900330041004100360035003100370030004500390035003600340041003200340032003600300035003100310038004300390038004300430032003800380030003000330042003000330044003500460041003900420039003700390046004100370045003100390043004600430039004200310042004600440043003000300039003000380046004300380036003700360041003300430030004400320033003000300041004400350031003400410032003900380043003900310036004600420043003100370032004300460032003100420045003800330044003600440030003300420035003000410041004200360030003100360034003400330036003600300036003700350039004400430030004400360043004300300046004600460037004600380030003100320036003600380033003100440037003900390044004400360037003400460030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073500340038000005560055000007560055005400000F560061006E0075006100740075000086C736003000300030003000300030003000440030003800300036003000300030003000300030004100440041003500390045003600330030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030004300320030003000380042003400310046003800310034003800300030003000300030003100360037003400390034003400340031003500340033003800380044004100440044003200440044003200420034003300370031003000300043003600460031004500460044003900390039004200330045003300450043004300430045003600320044004400410039003200360043004200350032003800440031003200450034003800340041003900310031004200380044003700320034003700460038003000330044003400320038003200390037004600380030004300420039003500390037004100340032003400350032003800410042003400340042003200390034003500390032003700300034003300410044003500360042004200320032003700320045003100450035003800320039003400440038004100360044003500360043004600420042003900350038003700360034003100360041003600330043004600310046004600300045003900450039004500390039003100350041003800420032004300360032004300430045003400430030003600330044003400320039003600340030004300460045004100350032003800440042003200440039003700380043004200450035004600310031003400450043003600300041003000360034004200390041003800410046003000300044003400300034004600330042003200430036004300430031004500420042003900310035003900460036004100410037003500310033003600460046003000460030003600300034003800300041004500430031004600380032003000370034004200370043003200440043003200360043003400380033003300360037004300410041003900440030003600350039004600420033004200410043003600420031003200320033003500450038003500380037004100370033003400410037004100310030004600320036003800360041003000430033003000330042003300310042003900300030004100440039004600300041003900300045004400430037003200370031004600450046003000460043003900340043003600340039003300300034003900370033004200440043004300460035003500440038004100430030003500450030003200410042003000450039003300320033004400300044003600300034004600450037003500420038003000380032003900420038003000430032004100420041003200340045003700300034003100420030003100320032003300310043003100460044003700330038004100340038003200430034004400350046004100370034003200360030003200460043003100350042003000430041003600350037004300300045003900380030003900330033003500340038003800420030003400350037004200370038003900460043003100410044003700350034003100390045003800450046003500320031003800460036003200410034004300320046004300370033003900330038004600420046003800440031004600380046003800430036003000340044003500360036003200380033003600450036003000450030003300330034004400340043003900390034003500420032003500430032004400370043003900450043004300360033003300390042003700300031003800410046003800340035004500320037003300380046003200460042004600390041004600410046004400380038004600350036003600340043003000310041003400420035004500360030003100360046004500460045004500330044004400390037004600320030004300350038003500420046003200320037003300300030004200310046004100440032003200310036003000330042003000460033003500380038003600450038003700350034003200390044004600350035004600360030003100360039003600440043004100350034003200460034003300390043003100360035003200420030003800460038003900350034004600460031004300320037003000430030004300410032003900460032003800410030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073800360032000005560045000007560045004E000013560065006E0065007A00750065006C0061000083EF360030003000300030003000300030004600300038003000360030003000300030003000300045003000360044003300460036003800300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003100300042003200460030003200440036003100440036003200310043003000300030003000300030004200310034003900340034003400310035003400330038003800440036003300460043003700450035003100460043003300460030003300300044003000300031003300320044003000430031004400330035003100380030003500330030003300320031003800410046004300360031004200370039003800430038004300300043003000430039004300450043004300430030004300300036003600410030003200300043003000430030004300300043003000430031003700360045003700440036003000460038004600450046003300320046004300330037004600300032003500310034004500440030004300350044003900410031003200410030004300330041003200410046004300300043004600430033004300410043003000430046004300330043004100430030004300330041003200410046004300300043004400390041003100320041003000340035004400430043003800320034004600420032003300440034003700380037004100310036004600450039003600440038003600440037004500460037004600410032003800380044004600370046004600410039003500410031003300440034003700380037004100310037003200430041003100350039004300370041003700310030003600380035003800330042003100320038004300330039003300350037004400460031003900450045003300430046004500380032003500350041003300380041003200430030004600380033003800430031003800320037004300330038003100420033004100460034003900370033004600310041004200460037003300460031003900330045003700440046004400380044004400330034003500390046004200450046004500360036003700380046003500310045003700370034003800330032003900450031003700440031003100450043004400370039003400330044003400360030003000300031004500450034003300320042003400440045004100340039003600310032003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007370030003400000556004E00000756004E004D000011560069006500740020004E0061006D00008543360030003000300030003000300030004600300038003000360030003000300030003000300045003000360044003300460036003800300030003000300030003000300036003600320034004200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003800300031003000310031004500420039003800340046004400320033003000300030003000300031003000360034003900340034003400310035003400330038003800440042003500390032004200440034004500430033003300300031003400380035003300460043003700390031003500310039003200460032003900330041003100310033004100320031003300300032003000390044004500300031003200360044003800460042003000430046003000300038003800430036004300410043003900350046004100330034003500440046004100310030003200430039004400350030003200420035003500410038003700340041003500310033003200340036003900450033003900380032003100300032004100310031003200330037003200450036004100430045003700380045004400460042004600390039004500370033003200440039004500450033003300330034003300300033004600320039004100380030003600450030003500390036003900310034003100340036004500450045003600390043004300310046003100450044003900320041003300390042004500350045004500430031003000370035003700330039003800370044003700320042003600370042003000360046003700440033003100330030003000380042004600420034003200450037004300380038003200450035003600310038003000310037004500350043003600300046003200460032003800450043003900300035003400350032003200320041004600420038003500450044003500370030003400410037003000350032003700380046003100460045004300370035003300340036003200430044003900370032003900320030003900420037003900430043003900450035004100320034003900330036004100440033004400360032003800390032003800390043003700460038004200450043003500460042003400300046004400330039003500420030004300310034004500330042004200370044003200420037003400320033003100380034004100410042004600330037004500380038004600450036003500350037003200370046003000440036003000460033003100370039003700350030003400340045003600300038003000460030003500320045003300320039003400330033004100390035004100340035003300380039003500340036003500410044003400450044003600450035003700440041004200440044004300440035003800300043003100350046003300350045003000300043003000460031003400330034004100420042003900420046003100330041003000410033003700460036003500390039003700460037003300330046003100420039004500360046003300340035004400360044003600440036003500350031004200340035003100350041003000300045004500410030003400460045004100460031004100300033003700460030003100330035003300370035003200320031003500340030003300340042004500410030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073000390032000005560047000007560047004200002F560069007200670069006E002000490073006C0061006E00640073002C00200042007200690074006900730068000088DF3600300030003000300030003000300042003000380030003600300030003000300030003000370042004600430037004400370045003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310033003000300030004400320037003900430046003700440037003100310030003000300030003000310045004400340039003400340034003100350034003200380039003100410035003900310034004400340038003900330030003100310038004300370037004600450046003500370043004500340044003600330035004600370045004100300032003400390039004200330038003100320037004500440039004400350044004100360042003300300045003000350044004400330033003000390042003200300045003900350039003700350035003700340030004200410041003800330042003700320038003800320034004500340039003500310031004400320032004300360038003400360045003100320035003100340031004200370035004400390043003600430043004500380036003100450035004300330036003500410032004500390043003800440031003700360034003600330042003900370037004500460037004300330042003000340041003300330037003400380039003400460045004100370038003700450037004300370046003300450033003700390037003800380034004600340046003400370044003500330046003200460039004200390046003700350045003200330031004100380044003100330042004500410034003300320046003900450032003200410041004600320045003300460045003300460031004300420030003400450031003300330044004400350043003500310030004600320030004600390046004300300043003500430037003800430042003500450032003300460034004600370044004600330035003200370038003300360045004300450046003600440035003500310034003600340046003900320043004500350035004500380042003900310038003600320037004400450036003000440046004500410044003000430035003200360046003100460034004600310037004100410043004300430044003200440039003100430039003600430045004500350044004200430041003200410041004100360041003500350033004100460035003300340039004100350042003000300046003000450038003200320034003500390044003000340030003400320036004400440034004300330041003700330043004200340042003400300039004300380038004100380043004300440032003600350030004400310034003400330045004200450043004500330037004200380039004300300044003800440032003300300038003000320035004500360046003000420045004400440042003400350031003400410046003800370043004100380044003600420042003800430032004400370041003900390035003200420031003400420045003100360046003800320031004200360036003200390041003200360032003400420045003300340030003600420042004300360042003200360034004200350037003900340036003100430032004100410039003700410039003200440036003800450032003100430030004400330045003000450032003600430042003100390044004300330043003700460043003300340045004200360035003100450032004400380041003300430034004300440042003000300037003800310030003300370042003900390033003700340045003000300038003000340033003800370034003100300033004500370043004100450035003900420036003300370041004200330041003100440030003800380034003800320045003700460031004400420033004300390038003700350044004400430032004500350044003100410036003000320034004600360036004600330043004300420043004300420036003300310038003300420038004300310043003100370030003800380045003900440036003300360031003600390038003300350038003300430034003700330034003200410033003200330031003300310034004300410038003400420042003300300043003900360037003100440032003600430039003700450039004600310042003400420031004100360036004200340038003400320041004600350035003300430046003500330043003600420036003900430034004500320033003900360032003300380038003100310043003000300038003600420031003400330032003400330032003400460045003400410046004500370042003800450035003100320043004200430035003200410036004500350037003200370044004400320045003100460039004200390041004600350035003500310032004100380044003300450043003300330041003700340046004400380042003800330044004200450034003500350041003700330042003000420043004200450038003600420045003500440045003600350036004100300038003900350032004300390043003900430041004100410046003100370042004500330046004400340041003000310042004500370044003100370038003900320037003300410042003900370039003200340038004600450032004600380038003400350034004100420039003200350043003100430036003200460035003800460045003300300035003900380033003200460046004100440044003800330044003800410032003200370031004400340036003700320037004200330046003600310033003500440033003700320043004500430042004600430034004200420045003500310037004300300034003000410043003200410039004200350042003000390045003500300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000738003500300000055600490000075600490052000029560069007200670069006E002000490073006C0061006E00640073002C00200055002E0053002E00008BFF36003000300030003000300030003000460030003800300036003000300030003000300030004500300036004400330046003600380030003000300030003000300030003600360032003400\
-4200340037003400340030003000460046003000300046004600300030004600460041003000420044004100370039003300300030003000300030003000300037003700340034003900340044003400350030003700440037003000390031003000310037003000440032003200450037003400310033003900380035003000300030003000300032004200350034003900340034003400310035003400330038003800440042003500390034003400390036003800310033003700310031003800430035003700460034003900320036003300330043004400320034003300350034004400380043003100410042003700350041004100420045004400340035004100350045004500450030004400320034003300410039003000370035003100360041004200310035003500430031004600440044003400340033004600310035003000350031003000460031004500370033003900300030004100420044004100380044003000340033004400350038003300360032003300440042003800380030003200320038004100410032003600300045004400340031003500340034003400340031004100430030004200310032003200330041004400430036003200360036004400420041003200340044003300360034003300410035003900360036004600450031004500340034004100340035004100460035003200300037004400440037004600370042004400430037004500330046004200310045003900460034004400300038003200310039003800300032004400380041003700430032003700340038003200420031003300360044003000380035003100360045004400340030003100420037004500330033004500390036003000330032004600450030003800450044004500330032003100320043003300330033003300320039003900460044003100410032003200340041003300390044003600380046003100390042003000300034003800330046003000380044003300420032004300380034003400380045004100320033003800370035004100320045003600310043003800410036003700440035003200310044003400360041004400430038003100350041003900430034003500340031004400320030003300440037004600300035004200310044003600340031003200330035003100340030003700370037003600300031003600330032004100340031003300300046004200300036003700350046003900300046004100370041003100350043003500440045003400420033003600360042004100310039003400390045003900440039003800440038003300370037004200310033004500410041003200340045003400430043004200380031003600390046003400360033003400420039004400430035003100450044004200380037003100450041004500320037003900370033003300460030004300410031003100360034003000390046003400410031003000370030003000300043004200460036004200380032003200460030004400330038003400360035004100430039004100360032003300310034004600320032003600430045004500300030003900360036003900340033003700300031003600300031003300340032003800380033004200420044003500310041004100370043003500450035004500320036003300350032004100380043003500370037003800300036003500420043003800450042003100310031003600390037004300320039003500410045003300440031004300360042004600370031003100370034004500350046003800410034003200420039003400420041003700320030004300310041003000410043003700310041003000350034003700460036004200360046003300320035003000450039003600370044003200360043004100440043003100330043003400380042004200370041003300330041003200350032004100460044003200350044004600310033003800370036004400300045003100450041003700430037003300390044003300330046003400340037003900350039003200440031004400370044003500420043003800460042003500410030003800460037004400390046003100350041003700370035003800310037004600300035003000450039003900460034003100340044003400300036003600390031004300370043003300460041003800300034004300430030004200410043003700450037003100380037004300320041004500430041003400440033004600370031003000450046004600430038003300370034003600350030004300350045004500390043003600430046003100440033003700460038004100370044003100460034003300360043003200420032004500390037004500450045004200460042004500430035004500440039004500310042003400380042003600440044003300340041004600360043003600330041003100370034003800390045003300360042003600340042004300340045003100350036003100410041003600300030003900420032003000450038003100420045004200430043003000390038004600370033003000410037004600340046004400370038004300360034004400350045003800430038004300460045004400450038004100300035004300350036004500420032003200450039003500430036003100320039003500460041004400350042004200370030004100420036004500310045004600350044004400340033003900450037003300380030003700390041004200410045003300300045004500340044003400430031003000410035004100340030003400310035004400350045004400330038004300420034003300450034003700330045003300430034003700340039004400410035004600450039003200300039003300330038004500350030003200380031003400300032003200380032004400390032003500390045003200350031004600310034003800310032004300390041003100310034004400440046004400370037004600390044004300310042003600360041003500450044003100430045004100380032003300310030003600440045003000370037003000440042003100340034003600390035003300430043003100420041003100310038004300350038003200420045003700350032003300350034003800300045003900350045004200440035003600420035003000320035003000390039003700450034003600300036004500390031003400320034003000390031004200460031004600450046004400370034004500430036003400370036003300370034003700360039004600410037004100430037003000390031004600350043004200300046003200330043004200340031003200320043004600390041003100390037003900330046003800440039003900350035003100410036003500320042003500410045003900340039003600410032003400460042003200460042003300420035004600360030003900420032004500320046004500410044004400370039003300310041004600460034003000440045004300430037003300460041004500450034003900370036003200450035004200340042003200310044004300380038003500370044003500340039003600370045004300320034003600360035004400360030004400420036003000320035004400330035004400320045004400450036004500410043003900410035004300320043004600450030003100430042004200320038003400310030003400320041003400310033004400440041003200450046004500390030003600390031004600410037004100350035003800430031003900380036004400380044004300460044003500430042003400370044004500380046004400410033004500450041004600380039004600460030003700350033004600360038003400420045003000310043003600310036003500420039003000320035003300360038003800370045003000300030003000300030003000300034003900340035003400450034003400410045003400320036003000380032000007380037003600000557004600000757004C0046000023570061006C006C0069007300200061006E006400200046007500740075006E00610000073700330032000005450048000007450053004800001D5700650073007400650072006E0020005300610068006100720061000084DB36003000300030003000300030003000420030003800300036003000300030003000300030003700420046004300370044003700450030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100330031003500330032003300310032004100310030003200390045003700300030003000300030003000450043003400390034003400340031003500340032003800390031004100440044003000330031003600420043003200360030003100340038003500450031004200370036003900330045003800440035003000360043003000370036003900300032003400450031004100320038003200320030004500370035003700320037003200430044003900300044003200430031004300350039004600390031003400390045003800450038004100430039004200460046003200300042003800360035004100440045003000450041003200320039004400310043003500440031004300390034003400380034003100300032004400410043003100340039003300310036003800310043003800340033004100320038003100380046003000330042003700300039003700330042003300430046003700370030003600390034003200410034003400310038003400450043003100390034003100450034003400310039003400390037003000430032004200300030003200360044003000300035003300450039003100390037003800370044003100450039004300320037004600450036004100360042003900460043004200310041004300440039003400450035003500300046003500320036003100380030003500340041003900340034004400450046003300440030003800410034003500300030004300320043003500380032003300460044003700450035004100350035003600340033003600340042003300330043004100360044003300330037003600310045003500440041003700320033003300310045003300330041003900350036003000390038003300300030003800300037003500420046003400460035003200440037003000390031004300300037003400350038003800350038003800440041004600430032003500410041003100430030004400420036003000380030003300300030004300300030003900450036004400390042004100440045004600360033003700340033004100310043004300320033003000310036003700430046003100380041004400460034004100360045003300350036004300350038004200330044004400350033003600320031004600340042004200380030003500360046003000350042003400360044004600380032004500440046004300330039004400410033003000320046003800310039004600380041004100430033004600340035003500300045003000410041003000460036004400450041003100460035003700310036004100320043003300330034003700360032003700350036003800330037003900460034003500350033004300310030003000300030003000300030003000340039003400350034004500340034004100450034003200360030003800320000073800380037000005590045000007590045004D00000B590065006D0065006E000081D73600300030003000300030003000300046003000380030003600300030003000300030003000450030003600440033004600360038003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310031003000430031004600330041003200340031003600460041004600340030003000300030003000300032004200340039003400340034003100350034003300380038004400360033003700430041004600410044004600420039004600380031003000360038003000380039003100360038003600380045003100410038004300300032003100380046004600460046004600460033004600310041003700390034003300440034003600300034003600300036003000360038003600440031004300380031004200410032003000360030003300300030004100430037003900300037003500440041004300340044003900310034004600300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000738003900340000055A004D0000075A004D004200000D5A0061006D0062006900610000840736003000300030003000300030003000460030003800300036003000300030003000300030004500300036004400330046003600380030003000300030003000300030003600360032003400420034003700340034003000300046004600300030004600460030003000460046004100300042004400410037003900330030003000300030003000300030003700370034003400390034004400340035003000370044003700300039003100310030004300310046003300380043004100310038003900420044003800300030003000300030003000420037003400390034003400340031003500340033003800380044004500440044003000420031003000410038003200360030003100340038003600450031004600370033003700340033003100300039003200430032003000410032004300360038004400300032004400410038003200420036003800360039003600430036003900360043003600390045003900360045003800320042003600320045004100320038004200360038003600430036004300320041003500420041003300420036003200300038003300440030003500310033003300420035003400310041003200330031003500300036004100460032003100420043004600450031003700420033003800310043003600310032004300340038004600380034003100450034004100430034003500430042003000330035003300380030004100440034003000300044003700300036003400380038003600320042003000300032003000380039004600330039003600300035003700380035004500450030003500360036003300310033003400350034004200300032003300410038004600420045003000320036004200300044003200340031004500340037004400380035003100450043003000430038003000350033003300380034003900440030003400450042003100360033004300340034003800450038004200440046004200390032004200420030004100390043003200330036003800340036003300450035003300330043004600300043003400460046003700300041003600440041004600430034003400440038004500350039003300410033004500300030004300330031004500380043003300420033003900450031004300310042003900340043004600460032004100370033004400320032003200450036003800370031003400440036003900410033003000330031004400320042004400390034003100350046004500390036003000320032004500450030003300460043003200320046003300390034003700320044003700380036004200320043003800350046003200300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000737003100360000055A00570000075A005700450000115A0069006D00620061006200770065000085133600300030003000300030003000300042003000380030003600300030003000300030003000370042004600430037004400370045003000300030003000300030003000360036003200340042003400370034003400300030004600460030003000460046003000300046004600410030004200440041003700390033003000300030003000300030003000370037003400340039003400440034003500300037004400370030003900310031003000410032003300320034004100390036003700430032004400410030003000300030003000300046004100340039003400340034003100350034003200380039003100420035003900330042004400340041004300330030003000300030003800340042004600330034003100350031004300350032003700300039003000350034003100460034003100300032003300410030004200440032004100350034004500410032004500300032003800300041004200410042003800330039003200390038003800390042003400460041003000320045003100350030003200320045003400360030003200320039004200380032004100460045003800300039003300450030004500360041003600340031003700300039003000380032004500440041003000300031003000420032003500300044003400410036004200430045004300390031003700340038004400330038003300350042004200460045003100460038004300450033003800300042003400450037003500460034004200340034004400360031004600320039004200330043003600330034003800350032003100380033004500450033003900450041004600330031003300310046004400390032003200460031003800410030004600330044004500320030004100380045004600420033003300320045003700330033003500360043004100300039003100430042003700360045004500380042004100330042004400300037003400420038004100460032004500350032004100410045004400450032003900380033004600380033003800310045003300440042003400420042003500300033003900370046003100460035003400370042004500460043003500460034004300350035003600380043004600320046004500310031004600440037003900380036004100420043003600360032003700410042004400460035003700360042003600460035003900390044004200420042003200330045004100460036004400370044003900430035003400410034003300340035003500310034003400350042003200360044003500420034003000410036003100360033003100340044004100430038003500320041004400440046003800380031004400310039003100300032003300380033003300380034003600310034003800420030004200390043003100410031003900310034003000440039004300410033003600380035003200340046003500390041003600460039003800350036003000460039003400370032003500350042004600410030004500380031004400300043004200450046003100420046003100350034003900390032004500300042003900350042004100430043004500370041004600390035003900330031003100340038004600380037004600350042004300330046003300460036003900380042004300380030004400310039004100450037004100300030003000300030003000300030003400390034003500340045003400340041004500340032003600300038003200000530003100000F41006C006100620061006D006100000530003200000541004B00000D41006C00610073006B006100000536003000000530003400000F4100720069007A006F006E0061000005300035000011410072006B0061006E007300610073000005380031000019420061006B00650072002000490073006C0061006E0064000005300036000015430061006C00690066006F0072006E0069006100000530003800001143006F006C006F007200610064006F00000530003900000543005400001743006F006E006E0065006300740069006300750074000005310030000011440065006C006100770061007200650000053100310000054400430000294400690073007400720069006300740020006F006600200043006F006C0075006D00620069006100000531003200000546004C00000F46006C006F007200690064006100000536003400003D460065006400650072006100740065006400200053007400610074006500730020006F00660020004D006900630072006F006E006500730069006100000531003300000536003600000531003500000548004900000D480061007700610069006900000538003400001D48006F0077006C0061006E0064002000490073006C0061006E006400000531003600000B49006400610068006F00000531003700001149006C006C0069006E006F0069007300000531003800000F49006E006400690061006E006100000531003900000549004100000949006F0077006100000538003600001B4A00610072007600690073002000490073006C0061006E006400000536003700001D4A006F0068006E00730074006F006E002000410074006F006C006C0000053200300000054B005300000D4B0061006E0073006100730000053200310000114B0065006E007400750063006B00790000053800390000194B0069006E0067006D0061006E002000520065006500660000053200320000134C006F00750069007300690061006E006100000532003300000B4D00610069006E00650000053600380000053200340000114D006100720079006C0061006E006400000532003500001B4D0061007300730061006300680075007300650074007400730000053200360000054D00490000114D006900630068006900670061006E00000537003100001D4D00690064007700610079002000490073006C0061006E006400730000053200370000134D0069006E006E00650073006F007400610000174D00690073007300690073007300690070007000690000053200390000114D006900730073006F00750072006900000533003000000F4D006F006E00740061006E006100000537003600001D4E006100760061007300730061002000490073006C0061006E00640000053300310000114E00650062007200610073006B00610000053300320000054E005600000D4E006500760061006400610000053300330000054E004800001B4E00650077002000480061006D0070007300680069007200650000053300340000054E004A0000154E006500770020004A006500720073006500790000053300350000054E004D0000154E006500770020004D0065007800690063006F0000053300360000054E00590000114E0065007700200059006F0072006B00000533003700001D4E006F0072007400680020004300610072006F006C0069006E00610000053300380000054E00440000194E006F007200740068002000440061006B006F007400610000053600390000053300390000054F00480000094F00680069006F0000053400300000054F004B0000114F006B006C00610068006F006D00610000053400310000054F005200000D4F007200650067006F006E00000537003000000539003500001B500061006C006D007900720061002000410074006F006C006C000005340032000019500065006E006E00730079006C00760061006E00690061000005370032000005340034000005520049000019520068006F00640065002000490073006C0061006E006400000534003500001D53006F0075007400680020004300610072006F006C0069006E006100000534003600001953006F007500740068002000440061006B006F00740061000005340037000013540065006E006E0065007300730065006500000534003800000554005800000B54006500780061007300000537003400003755002E0053002E0020004D0069006E006F00720020004F00750074006C00790069006E0067002000490073006C0061006E006400730000053400390000055500540000095500740061006800000535003000000556005400000F5600650072006D006F006E0074000005350031000011560069007200670069006E00690061000005370038000035560069007200670069006E002000490073006C0061006E006400730020006F0066002000740068006500200055002E0053002E000005370039000017570061006B0065002000490073006C0061006E0064000005350033000005570041000015570061007300680069006E00670074006F006E00000535003400000557005600001B57006500730074002000560069007200670069006E0069006100000535003500000557004900001357006900730063006F006E00730069006E00000535003600000557005900000F570079006F006D0069006E006700000541004200000F41006C006200650072007400610000054200430000214200720069007400690073006800200043006F006C0075006D0062006900610000054D00420000114D0061006E00690074006F006200610000054E004200001B4E006500770020004200720075006E0073007700690063006B0000334E006500770066006F0075006E0064006C0061006E006400200061006E00640020004C00610062007200610064006F00720000054E00530000174E006F00760061002000530063006F0074006900610000054E005400002B4E006F00720074006800770065007300740020005400650072007200690074006F007200690065007300000F4E0075006E00610076007500740000054F004E00000F4F006E0074006100720069006F0000295000720069006E006300650020004500640077006100720064002000490073006C0061006E006400000551004300000D51007500650062006500630000195300610073006B0061007400630068006500770061006E00000B590075006B006F006E00004F380039003500300034004500340037003000440030004100310041003000410030003000300030003000300030004400340039003400380034003400350032003000300030003000300030003100004942006100730065004E0075006D006200650072002000630061006E006E006F00740020006200650020006C0065007300730020007400680061006E0020007A00650072006F002E00004D42006100730065004E0075006D006200650072002000630061006E006E006F0074002000620065002000670072006500610074006500720020007400680061006E0020003100370030002E00003B43006F006E007300740061006E0074004E0061006D0065002000630061006E004E004F005400200062006500200065006D007000740079002E000019730070006500650064006F0066006C006900670068007400000F670072006100760069007400790000336700720061007600690074006100740069006F006E0061006C0061006300630065006C00650072006100740069006F006E00001965006C00\
-65006300740072006F006E006D006100730073000015700072006F0074006F006E006D0061007300730000176E0065007500740072006F006E006D00610073007300001D610074006F006D00690063006D0061007300730075006E0069007400001D65006C0065006300740072006F006E00630068006100720067006500000D70006C0061006E0063006B00001362006F006C0074007A006D0061006E006E0000296D00610067006E0065007400690063007000650072006D0065006100620069006C00690074007900002D6400690065006C006500630074007200690063007000650072006D0069007400740069007600690074007900002F63006C006100730073006900630061006C0065006C0065006300740072006F006E00720061006400690075007300001B660069006E006500730074007200750063007400750072006500001562006F0068007200720061006400690075007300000F7200790064006200650072006700001766006C00750078007100750061006E00740075006D00001962006F00680072006D00610067006E00650074006F006E00002965006C0065006300740072006F006E006D00610067006E00650074006D006F006D0065006E007400001F6E00750063006C006500610072006D00610067006E00650074006F006E000025700072006F0074006F006E006D00610067006E00650074006D006F006D0065006E00740000276E0065007500740072006F006E006D00610067006E00650074006D006F006D0065006E007400003363006F006D00700074006F006E0065006C0065006300740072006F006E0077006100760065006C0065006E00670074006800002F63006F006D00700074006F006E00700072006F0074006F006E0077006100760065006C0065006E006700740068000021730074006500660061006E002D0062006F006C0074007A006D0061006E006E000111610076006F0067006100640072006F00001D69006400650061006C0067006100730076006F006C0075006D0065000007670061007300000F6600610072006100640061007900002B7100750061006E00740075006D0068006F006C00650072006500730069007300740061006E0063006500002B460072006F006D002000630061006E004E004F005400200062006500200065006D007000740079002E00002754006F002000630061006E004E004F005400200062006500200065006D007000740079002E0000057E007E00000B6D0065007400650072000015630065006E00740069006D00650074006500720000156D0069006C006C0069006D00650074006500720000136B0069006C006F006D006500740065007200000966006F006F007400000969006E006300680000096D0069006C0065000009790061007200640000156D006900630072006F006D00650074006500720000136E0061006E006F006D006500740065007200000D6B0065006C00760069006E00000F630065006C0073006900750073000015660061006800720065006E006800650069007400000F720061006E006B0069006E006500000F72006500610075006D00750072000011640069007300740061006E00630065000017740065006D0070006500720061007400750072006500002F460072006F006D002000760061006C007500650020006900730020006E006F0074002000760061006C006900640000808554006F002000760061006C007500650020006900730020006E006F0074002000760061006C00690064002C0020006F00720020006E006F0074002000760061006C0069006400200069006E00200063006F006D00620069006E006100740069006F006E00200077006900740068002000460072006F006D002000760061006C0075006500006343006F006E00760065007200740065006400560061006C00750065002000630061006E006E006F00740020006200650020006C0065007300730020007400680061006E0020004100620073006F006C0075007400650020005A00650072006F002E00005B4C006F0077006500720042006F0075006E0064002000630061006E004E004F0054002000620065002000670072006500610074006500720020007400680061006E0020005500700070006500720042006F0075006E0064002E000043590065006100720073004F0066004C006F0061006E0020006D007500730074002000620065002000310020006F007200200067007200650061007400650072002E00004B5000610079006D0065006E0074007300500065007200590065006100720020006D007500730074002000620065002000310020006F007200200067007200650061007400650072002E00005F4F007000740069006F006E0061006C00450078007400720061005000610079006D0065006E00740073002000630061006E006E006F00740020006200650020006C0065007300730020007400680061006E0020007A00650072006F002E000015690067006E006F007200650063006100730065000021630075006C00740075007200650069006E00760061007200690061006E007400001F6500780070006C0069006300690074006300610070007400750072006500002F690067006E006F00720065007000610074007400650072006E00770068006900740065007300700061006300650000136D0075006C00740069006C0069006E00650000177200690067006800740074006F006C006500660074000015730069006E0067006C0065006C0069006E0065000015650063006D00610073006300720069007000740000235200650067004500780020006F007000740069006F006E0020006F00660020002700011B2700200069007300200069006E00760061006C00690064002100013D53007400610072007400410074002000630061006E004E004F00540020006200650020006C0065007300730020007400680061006E00200031002E000009530051004C002300000761006C006C00004B4400450043004C00410052004500200040004500720072006F0072004D0065007300730061006700650020004E0056004100520043004800410052002800340030003000300029003B0000334400450043004C004100520045002000400045006E007400720079004E0075006D00620065007200200049004E0054003B0000254300520045004100540045002000500052004F0043004500440055005200450020005B000080FB5D002E005B00530051004C00730068006100720070005F0055006E0069006E007300740061006C006C005D0020004000530051004C007300680061007200700041007300730065006D0062006C00790020007300790073006E0061006D00650020003D0020004E0055004C004C0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B00530051004C00730068006100720070005D002E005B0055006E0069006E007300740061006C006C005D000080A55D002E005B00530051004C00730068006100720070005F00480065006C0070005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B00530051004C00730068006100720070005D002E005B00480065006C0070005D0000817F5D002E005B00530051004C00730068006100720070005F00530065007400530065006300750072006900740079005D00200040005000650072006D0069007300730069006F006E0053006500740020005B0069006E0074005D002C002000400041007300730065006D0062006C0079004E0061006D00650020005B006E0076006100720063006800610072005D0028003400300030003000290020003D0020004E0055004C004C002C00200040005300650074005400720075007300740077006F007200740068007900490066004E006F00550073006500720020005B006200690074005D0020003D002000300020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B00530051004C00730068006100720070005D002E005B00530065007400530065006300750072006900740079005D0000815B5D002E005B00530051004C00730068006100720070005F004700720061006E0074005000650072006D0069007300730069006F006E0073005D00200040004700720061006E00740054006F0020005B006E0076006100720063006800610072005D002800340030003000300029002C0020004000530051004C007300680061007200700053006300680065006D00610020005B006E0076006100720063006800610072005D0028003400300030003000290020003D0020004E0055004C004C0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B00530051004C00730068006100720070005D002E005B004700720061006E0074005000650072006D0069007300730069006F006E0073005D0000234300520045004100540045002000460055004E004300540049004F004E0020005B000080F95D002E005B00530051004C00730068006100720070005F004900730055007000640061007400650041007600610069006C00610062006C0065005D00280029002000520045005400550052004E00530020005B006200690074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B00530051004C00730068006100720070005D002E005B004900730055007000640061007400650041007600610069006C00610062006C0065005D000080E75D002E005B00530051004C00730068006100720070005F00560065007200730069006F006E005D00280029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028003400300030003000290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B00530051004C00730068006100720070005D002E005B00560065007200730069006F006E005D000080E75D002E005B00530051004C00730068006100720070005F0057006500620053006900740065005D00280029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028003400300030003000290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B00530051004C00730068006100720070005D002E005B0057006500620053006900740065005D000082875D002E005B00520065006700450078005F004300610070007400750072006500470072006F00750070005D0028004000450078007000720065007300730069006F006E0054006F00560061006C006900640061007400650020005B006E0076006100720063006800610072005D0028006D006100780029002C002000400052006500670075006C0061007200450078007000720065007300730069006F006E0020005B006E0076006100720063006800610072005D0028006D006100780029002C00200040004300610070007400750072006500470072006F00750070004E0075006D0062006500720020005B0069006E0074005D002C00200040004E006F00740046006F0075006E0064005200650070006C006100630065006D0065006E00740020005B006E0076006100720063006800610072005D0028006D006100780029002C0020004000530074006100720074004100740020005B0069006E0074005D002C00200040004C0065006E0067007400680020005B0069006E0074005D002C0020004000520065006700450078004F007000740069006F006E0073004C0069007300740020005B006E0076006100720063006800610072005D0028003400300030003000290029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028006D0061007800290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B00520045004700450058005D002E005B004300610070007400750072006500470072006F00750070005D000082915D002E005B00520065006700450078005F004300610070007400750072006500470072006F007500700034006B005D0028004000450078007000720065007300730069006F006E0054006F00560061006C006900640061007400650020005B006E0076006100720063006800610072005D002800340030003000300029002C002000400052006500670075006C0061007200450078007000720065007300730069006F006E0020005B006E0076006100720063006800610072005D002800340030003000300029002C00200040004300610070007400750072006500470072006F00750070004E0075006D0062006500720020005B0069006E0074005D002C00200040004E006F00740046006F0075006E0064005200650070006C006100630065006D0065006E00740020005B006E0076006100720063006800610072005D0028006D006100780029002C0020004000530074006100720074004100740020005B0069006E0074005D002C00200040004C0065006E0067007400680020005B0069006E0074005D002C0020004000520065006700450078004F007000740069006F006E0073004C0069007300740020005B006E0076006100720063006800610072005D0028003400300030003000290029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028003400300030003000290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B00520045004700450058005D002E005B004300610070007400750072006500470072006F00750070005D000081535D002E005B00520065006700450078005F004500730063006100700065005D0028004000450078007000720065007300730069006F006E0054006F0045007300630061007000650020005B006E0076006100720063006800610072005D0028006D0061007800290029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028006D0061007800290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002C002000520045005400550052004E00530020004E0055004C004C0020004F004E0020004E0055004C004C00200049004E005000550054002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B00520045004700450058005D002E005B004500730063006100700065005D000081D55D002E005B00520065006700450078005F0049006E006400650078005D0028004000450078007000720065007300730069006F006E0054006F00560061006C006900640061007400650020005B006E0076006100720063006800610072005D0028006D006100780029002C002000400052006500670075006C0061007200450078007000720065007300730069006F006E0020005B006E0076006100720063006800610072005D0028006D006100780029002C0020004000530074006100720074004100740020005B0069006E0074005D002C00200040004C0065006E0067007400680020005B0069006E0074005D002C0020004000520065006700450078004F007000740069006F006E0073004C0069007300740020005B006E0076006100720063006800610072005D0028003400300030003000290029002000520045005400550052004E00530020005B0069006E0074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B00520045004700450058005D002E005B0049006E006400650078005D000081BF5D002E005B00520065006700450078005F00490073004D0061007400630068005D0028004000450078007000720065007300730069006F006E0054006F00560061006C006900640061007400650020005B006E0076006100720063006800610072005D0028006D006100780029002C002000400052006500670075006C0061007200450078007000720065007300730069006F006E0020005B006E0076006100720063006800610072005D0028006D006100780029002C0020004000530074006100720074004100740020005B0069006E0074005D002C0020004000520065006700450078004F007000740069006F006E0073004C0069007300740020005B006E0076006100720063006800610072005D0028003400300030003000290029002000520045005400550052004E00530020005B006200690074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B00520045004700450058005D002E005B00490073004D0061007400630068005D000081C75D002E005B00520065006700450078005F00490073004D00610074006300680034006B005D0028004000450078007000720065007300730069006F006E0054006F00560061006C006900640061007400650020005B006E0076006100720063006800610072005D002800340030003000300029002C002000400052006500670075006C0061007200450078007000720065007300730069006F006E0020005B006E0076006100720063006800610072005D002800340030003000300029002C0020004000530074006100720074004100740020005B0069006E0074005D002C0020004000520065006700450078004F007000740069006F006E0073004C0069007300740020005B006E0076006100720063006800610072005D0028003400300030003000290029002000520045005400550052004E00530020005B006200690074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B00520045004700450058005D002E005B00490073004D0061007400630068005D000082A55D002E005B00520065006700450078005F004D0061007400630068005D0028004000450078007000720065007300730069006F006E0054006F00560061006C006900640061007400650020005B006E0076006100720063006800610072005D0028006D006100780029002C002000400052006500670075006C0061007200450078007000720065007300730069006F006E0020005B006E0076006100720063006800610072005D0028006D006100780029002C0020004000530074006100720074004100740020005B0069006E0074005D002C0020004000520065006700450078004F007000740069006F006E0073004C0069007300740020005B006E0076006100720063006800610072005D0028003400300030003000290029002000520045005400550052004E00530020005400410042004C004500200028005B004D0061007400630068004E0075006D005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B00560061006C00750065005D0020005B006E0076006100720063006800610072005D0028006D0061007800290020004E0055004C004C002C0020005B005300740061007200740050006F0073005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B0045006E00640050006F0073005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B004C0065006E006700740068005D0020005B0069006E0074005D0020004E0055004C004C00290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B00520045004700450058005D002E005B004D0061007400630068005D000082AD5D002E005B00520065006700450078005F004D006100740063006800650073005D0028004000450078007000720065007300730069006F006E0054006F00560061006C006900640061007400650020005B006E0076006100720063006800610072005D0028006D006100780029002C002000400052006500670075006C0061007200450078007000720065007300730069006F006E0020005B006E0076006100720063006800610072005D0028006D006100780029002C0020004000530074006100720074004100740020005B0069006E0074005D002C0020004000520065006700450078004F007000740069006F006E0073004C0069007300740020005B006E0076006100720063006800610072005D0028003400300030003000290029002000520045005400550052004E00530020005400410042004C004500200028005B004D0061007400630068004E0075006D005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B00560061006C00750065005D0020005B006E0076006100720063006800610072005D0028006D0061007800290020004E0055004C004C002C0020005B005300740061007200740050006F0073005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B0045006E00640050006F0073005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B004C0065006E006700740068005D0020005B0069006E0074005D0020004E0055004C004C00290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B00520045004700450058005D002E005B004D006100740063006800650073005D000082015D002E005B00520065006700450078005F004D0061007400630068004C0065006E006700740068005D0028004000450078007000720065007300730069006F006E0054006F00560061006C006900640061007400650020005B006E0076006100720063006800610072005D0028006D006100780029002C002000400052006500670075006C0061007200450078007000720065007300730069006F006E0020005B006E0076006100720063006800610072005D0028006D006100780029002C0020004000530074006100720074004100740020005B0069006E0074005D002C00200040004C0065006E0067007400680020005B0069006E0074005D002C0020004000520065006700450078004F007000740069006F006E0073004C0069007300740020005B006E0076006100720063006800610072005D0028003400300030003000290029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028006D0061007800290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B00520045004700450058005D002E005B004D0061007400630068004C0065006E006700740068005D000081E35D002E005B00520065006700450078005F004D006100740063006800530069006D0070006C0065005D0028004000450078007000720065007300730069006F006E0054006F00560061006C006900640061007400650020005B006E0076006100720063006800610072005D0028006D006100780029002C002000400052006500670075006C0061007200450078007000720065007300730069006F006E0020005B006E0076006100720063006800610072005D0028006D006100780029002C0020004000530074006100720074004100740020005B0069006E0074005D002C0020004000520065006700450078004F007000740069006F006E0073004C0069007300740020005B006E0076006100720063006800610072005D0028003400300030003000290029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028006D0061007800290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B00520045004700450058005D002E005B004D006100740063006800530069006D0070006C0065005D000081ED5D002E005B00520065006700450078005F004D006100740063006800530069006D0070006C00650034006B005D0028004000450078007000720065007300730069006F006E0054006F00560061006C006900640061007400650020005B006E0076006100720063006800610072005D002800340030003000300029002C002000400052006500670075006C0061007200450078007000720065007300730069006F006E0020005B006E0076006100720063006800610072005D002800340030003000300029002C0020004000530074006100720074004100740020005B0069006E0074005D002C0020004000520065006700450078004F007000740069006F006E0073004C0069007300740020005B006E0076006100720063006800610072005D0028003400300030003000290029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028003400300030003000290020005700490054\
-004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B00520045004700450058005D002E005B004D006100740063006800530069006D0070006C0065005D0000822D5D002E005B00520065006700450078005F005200650070006C006100630065005D0028004000450078007000720065007300730069006F006E0054006F00560061006C006900640061007400650020005B006E0076006100720063006800610072005D0028006D006100780029002C002000400052006500670075006C0061007200450078007000720065007300730069006F006E0020005B006E0076006100720063006800610072005D0028006D006100780029002C00200040005200650070006C006100630065006D0065006E00740020005B006E0076006100720063006800610072005D002800340030003000300029002C002000400043006F0075006E00740020005B0069006E0074005D002C0020004000530074006100720074004100740020005B0069006E0074005D002C0020004000520065006700450078004F007000740069006F006E0073004C0069007300740020005B006E0076006100720063006800610072005D0028003400300030003000290029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028006D0061007800290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B00520045004700450058005D002E005B005200650070006C006100630065005D000082375D002E005B00520065006700450078005F005200650070006C0061006300650034006B005D0028004000450078007000720065007300730069006F006E0054006F00560061006C006900640061007400650020005B006E0076006100720063006800610072005D002800340030003000300029002C002000400052006500670075006C0061007200450078007000720065007300730069006F006E0020005B006E0076006100720063006800610072005D002800340030003000300029002C00200040005200650070006C006100630065006D0065006E00740020005B006E0076006100720063006800610072005D002800340030003000300029002C002000400043006F0075006E00740020005B0069006E0074005D002C0020004000530074006100720074004100740020005B0069006E0074005D002C0020004000520065006700450078004F007000740069006F006E0073004C0069007300740020005B006E0076006100720063006800610072005D0028003400300030003000290029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028003400300030003000290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B00520045004700450058005D002E005B005200650070006C006100630065005D0000829D5D002E005B00520065006700450078005F005200650070006C00610063006500490066004D006100740063006800650064005D0028004000450078007000720065007300730069006F006E0054006F00560061006C006900640061007400650020005B006E0076006100720063006800610072005D0028006D006100780029002C002000400052006500670075006C0061007200450078007000720065007300730069006F006E0020005B006E0076006100720063006800610072005D0028006D006100780029002C00200040005200650070006C006100630065006D0065006E00740020005B006E0076006100720063006800610072005D002800340030003000300029002C00200040004E006F00740046006F0075006E0064005200650070006C006100630065006D0065006E00740020005B006E0076006100720063006800610072005D0028006D006100780029002C002000400043006F0075006E00740020005B0069006E0074005D002C0020004000530074006100720074004100740020005B0069006E0074005D002C0020004000520065006700450078004F007000740069006F006E0073004C0069007300740020005B006E0076006100720063006800610072005D0028003400300030003000290029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028006D0061007800290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B00520045004700450058005D002E005B005200650070006C00610063006500490066004D006100740063006800650064005D000082A95D002E005B00520065006700450078005F005200650070006C00610063006500490066004D0061007400630068006500640034006B005D0028004000450078007000720065007300730069006F006E0054006F00560061006C006900640061007400650020005B006E0076006100720063006800610072005D002800340030003000300029002C002000400052006500670075006C0061007200450078007000720065007300730069006F006E0020005B006E0076006100720063006800610072005D002800340030003000300029002C00200040005200650070006C006100630065006D0065006E00740020005B006E0076006100720063006800610072005D002800340030003000300029002C00200040004E006F00740046006F0075006E0064005200650070006C006100630065006D0065006E00740020005B006E0076006100720063006800610072005D002800340030003000300029002C002000400043006F0075006E00740020005B0069006E0074005D002C0020004000530074006100720074004100740020005B0069006E0074005D002C0020004000520065006700450078004F007000740069006F006E0073004C0069007300740020005B006E0076006100720063006800610072005D0028003400300030003000290029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028003400300030003000290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B00520045004700450058005D002E005B005200650070006C00610063006500490066004D006100740063006800650064005D000082C15D002E005B00520065006700450078005F00530070006C00690074005D0028004000450078007000720065007300730069006F006E0054006F00560061006C006900640061007400650020005B006E0076006100720063006800610072005D0028006D006100780029002C002000400052006500670075006C0061007200450078007000720065007300730069006F006E0020005B006E0076006100720063006800610072005D0028006D006100780029002C002000400043006F0075006E00740020005B0069006E0074005D002C0020004000530074006100720074004100740020005B0069006E0074005D002C0020004000520065006700450078004F007000740069006F006E0073004C0069007300740020005B006E0076006100720063006800610072005D0028003400300030003000290029002000520045005400550052004E00530020005400410042004C004500200028005B004D0061007400630068004E0075006D005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B00560061006C00750065005D0020005B006E0076006100720063006800610072005D0028006D0061007800290020004E0055004C004C002C0020005B005300740061007200740050006F0073005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B0045006E00640050006F0073005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B004C0065006E006700740068005D0020005B0069006E0074005D0020004E0055004C004C00290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B00520045004700450058005D002E005B00530070006C00690074005D0000815F5D002E005B00520065006700450078005F0055006E006500730063006100700065005D0028004000450078007000720065007300730069006F006E0054006F0055006E0065007300630061007000650020005B006E0076006100720063006800610072005D0028006D0061007800290029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028006D0061007800290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002C002000520045005400550052004E00530020004E0055004C004C0020004F004E0020004E0055004C004C00200049004E005000550054002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B00520045004700450058005D002E005B0055006E006500730063006100700065005D000081435D002E005B0053007400720069006E0067005F0043006F006E007400610069006E0073005D002800400053007400720069006E006700560061006C007500650020005B006E0076006100720063006800610072005D0028006D006100780029002C0020004000530065006100720063006800560061006C007500650020005B006E0076006100720063006800610072005D0028003400300030003000290029002000520045005400550052004E00530020005B006200690074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0053005400520049004E0047005D002E005B0043006F006E007400610069006E0073005D000081A35D002E005B0053007400720069006E0067005F0043006F0075006E0074005D002800400053007400720069006E006700560061006C007500650020005B006E0076006100720063006800610072005D0028006D006100780029002C002000400053006500610072006300680020005B006E0076006100720063006800610072005D0028006D006100780029002C0020004000530074006100720074004100740020005B0069006E0074005D002C002000400043006F006D00700061007200690073006F006E00540079007000650020005B0069006E0074005D002C002000400043006F0075006E0074004F007600650072006C006100700020005B006200690074005D0029002000520045005400550052004E00530020005B0069006E0074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0053005400520049004E0047005D002E005B0043006F0075006E0074005D000081735D002E005B0053007400720069006E0067005F004300750074005D002800400053007400720069006E006700560061006C007500650020005B006E0076006100720063006800610072005D0028006D006100780029002C0020004000440065006C0069006D00690074006500720020005B006E0076006100720063006800610072005D002800340030003000300029002C00200040004600690065006C006400730020005B006E0076006100720063006800610072005D0028003400300030003000290029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028006D0061007800290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0053005400520049004E0047005D002E005B004300750074005D000081715D002E005B0053007400720069006E0067005F0045006E006400730057006900740068005D002800400053007400720069006E006700560061006C007500650020005B006E0076006100720063006800610072005D0028006D006100780029002C0020004000530065006100720063006800560061006C007500650020005B006E0076006100720063006800610072005D002800340030003000300029002C002000400043006F006D00700061007200690073006F006E00540079007000650020005B0069006E0074005D0029002000520045005400550052004E00530020005B006200690074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0053005400520049004E0047005D002E005B0045006E006400730057006900740068005D0000813D5D002E005B0053007400720069006E0067005F0045007100750061006C0073005D002800400053007400720069006E006700560061006C0075006500410020005B006E0076006100720063006800610072005D0028006D006100780029002C002000400053007400720069006E006700560061006C0075006500420020005B006E0076006100720063006800610072005D0028006D0061007800290029002000520045005400550052004E00530020005B006200690074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0053005400520049004E0047005D002E005B0045007100750061006C0073005D000081935D002E005B0053007400720069006E0067005F0049006E006400650078004F0066005D002800400053007400720069006E006700560061006C007500650020005B006E0076006100720063006800610072005D0028006D006100780029002C0020004000530065006100720063006800560061006C007500650020005B006E0076006100720063006800610072005D002800340030003000300029002C00200040005300740061007200740049006E0064006500780020005B0069006E0074005D002C002000400043006F006D00700061007200690073006F006E00540079007000650020005B0069006E0074005D0029002000520045005400550052004E00530020005B0069006E0074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0053005400520049004E0047005D002E005B0049006E006400650078004F0066005D000081155D002E005B0053007400720069006E0067005F0049006E00690074004300610070005D002800400053007400720069006E006700560061006C007500650020005B006E0076006100720063006800610072005D0028006D0061007800290029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028006D0061007800290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0053005400520049004E0047005D002E005B0049006E00690074004300610070005D000081395D002E005B0053007400720069006E0067005F00490073004E0075006D0065007200690063005D002800400053007400720069006E006700560061006C007500650020005B006E0076006100720063006800610072005D002800340030003000300029002C00200040004E0075006D0062006500720054007900700065004D00610073006B0020005B0069006E0074005D0029002000520045005400550052004E00530020005B006200690074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0053005400520049004E0047005D002E005B00490073004E0075006D0065007200690063005D000081915D002E005B0053007400720069006E0067005F004A006F0069006E005D0028004000530051004C0020005B006E0076006100720063006800610072005D0028006D006100780029002C002000400053006500700061007200610074006F00720020005B006E0076006100720063006800610072005D002800340030003000300029002C00200040004A006F0069006E004F007000740069006F006E0020005B0069006E0074005D0029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028006D0061007800290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002C002000520045005400550052004E00530020004E0055004C004C0020004F004E0020004E0055004C004C00200049004E005000550054002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0053005400520049004E0047005D002E005B004A006F0069006E005D000081A35D002E005B0053007400720069006E0067005F004C0061007300740049006E006400650078004F0066005D002800400053007400720069006E006700560061006C007500650020005B006E0076006100720063006800610072005D0028006D006100780029002C0020004000530065006100720063006800560061006C007500650020005B006E0076006100720063006800610072005D002800340030003000300029002C00200040005300740061007200740049006E0064006500780020005B0069006E0074005D002C002000400043006F006D00700061007200690073006F006E00540079007000650020005B0069006E0074005D0029002000520045005400550052004E00530020005B0069006E0074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0053005400520049004E0047005D002E005B004C0061007300740049006E006400650078004F0066005D000081115D002E005B0053007400720069006E0067005F004E00650077006C0069006E0065005D002800400045004F004C00540079007000650020005B006E0076006100720063006800610072005D0028003400300030003000290029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028003400300030003000290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0053005400520049004E0047005D002E005B004E00650077006C0069006E0065005D000081E15D002E005B0053007400720069006E0067005F004E007400680049006E006400650078004F0066005D002800400053007400720069006E006700560061006C007500650020005B006E0076006100720063006800610072005D0028006D006100780029002C002000400053006500610072006300680020005B006E0076006100720063006800610072005D0028006D006100780029002C0020004000530074006100720074004100740020005B0069006E0074005D002C00200040004E00740068004F00630063007500720061006E006300650020005B0069006E0074005D002C002000400043006F006D00700061007200690073006F006E00540079007000650020005B0069006E0074005D002C002000400043006F0075006E0074004F007600650072006C006100700020005B006200690074005D0029002000520045005400550052004E00530020005B0069006E0074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0053005400520049004E0047005D002E005B004E007400680049006E006400650078004F0066005D000081B55D002E005B0053007400720069006E0067005F005000610064004C006500660074005D002800400053007400720069006E006700560061006C007500650020005B006E0076006100720063006800610072005D0028006D006100780029002C002000400053007400720069006E0067005700690064007400680020005B0069006E0074005D002C002000400050006100640043006800610072006100630074006500720020005B006E0076006100720063006800610072005D0028003400300030003000290029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028006D0061007800290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002C002000520045005400550052004E00530020004E0055004C004C0020004F004E0020004E0055004C004C00200049004E005000550054002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0053005400520049004E0047005D002E005B005000610064004C006500660074005D000081B95D002E005B0053007400720069006E0067005F00500061006400520069006700680074005D002800400053007400720069006E006700560061006C007500650020005B006E0076006100720063006800610072005D0028006D006100780029002C002000400053007400720069006E0067005700690064007400680020005B0069006E0074005D002C002000400050006100640043006800610072006100630074006500720020005B006E0076006100720063006800610072005D0028003400300030003000290029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028006D0061007800290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002C002000520045005400550052004E00530020004E0055004C004C0020004F004E0020004E0055004C004C00200049004E005000550054002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0053005400520049004E0047005D002E005B00500061006400520069006700680074005D000081B55D002E005B0053007400720069006E0067005F005200650070006C006100630065005D0028004000450078007000720065007300730069006F006E0020005B006E0076006100720063006800610072005D0028006D006100780029002C0020004000460069006E00640020005B006E0076006100720063006800610072005D0028006D006100780029002C00200040005200650070006C006100630065006D0065006E00740020005B006E0076006100720063006800610072005D0028006D0061007800290029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028006D0061007800290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002C002000520045005400550052004E00530020004E0055004C004C0020004F004E0020004E0055004C004C00200049004E005000550054002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0053005400520049004E0047005D002E005B005200650070006C006100630065005D000081CD5D002E005B0053007400720069006E0067005F00530070006C00690074005D002800400053007400720069006E006700560061006C007500650020005B006E0076006100720063006800610072005D0028006D006100780029002C002000400053006500700061007200610074006F00720020005B006E0076006100720063006800610072005D002800340030003000300029002C0020004000530070006C00690074004F007000740069006F006E0020005B0069006E0074005D0029002000520045005400550052004E00530020005400410042004C004500200028005B00530070006C00690074004E0075006D005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B00530070006C0069007400560061006C005D0020005B006E0076006100720063006800610072005D0028006D0061007800290020004E0055004C004C00290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0053005400520049004E0047005D002E005B00530070006C00690074005D000081D55D002E005B0053007400720069006E0067005F00530070006C006900740034006B005D002800400053007400720069006E006700560061006C007500650020005B006E0076006100720063006800610072005D002800340030003000300029002C002000400053006500700061007200610074006F00720020005B006E0076006100720063006800610072005D002800340030003000\
-300029002C0020004000530070006C00690074004F007000740069006F006E0020005B0069006E0074005D0029002000520045005400550052004E00530020005400410042004C004500200028005B00530070006C00690074004E0075006D005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B00530070006C0069007400560061006C005D0020005B006E0076006100720063006800610072005D0028003400300030003000290020004E0055004C004C00290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0053005400520049004E0047005D002E005B00530070006C00690074005D000081795D002E005B0053007400720069006E0067005F0053007400610072007400730057006900740068005D002800400053007400720069006E006700560061006C007500650020005B006E0076006100720063006800610072005D0028006D006100780029002C0020004000530065006100720063006800560061006C007500650020005B006E0076006100720063006800610072005D002800340030003000300029002C002000400043006F006D00700061007200690073006F006E00540079007000650020005B0069006E0074005D0029002000520045005400550052004E00530020005B006200690074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0053005400520049004E0047005D002E005B0053007400610072007400730057006900740068005D000081415D002E005B0053007400720069006E0067005F005400720069006D005D002800400053007400720069006E006700560061006C007500650020005B006E0076006100720063006800610072005D0028006D0061007800290029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028006D0061007800290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002C002000520045005400550052004E00530020004E0055004C004C0020004F004E0020004E0055004C004C00200049004E005000550054002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0053005400520049004E0047005D002E005B005400720069006D005D000081CB5D002E005B0053007400720069006E0067005F005400720079005000610072007300650054006F0049006E0074005D002800400053007400720069006E006700560061006C007500650020005B006E0076006100720063006800610072005D002800340030003000300029002C00200040005400610072006700650074004400610074006100540079007000650020005B006E0076006100720063006800610072005D0028003100350029002C0020004000430075006C00740075007200650020005B006E0076006100720063006800610072005D00280031003000290029002000520045005400550052004E00530020005B0042004900470049004E0054005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002C002000520045005400550052004E00530020004E0055004C004C0020004F004E0020004E0055004C004C00200049004E005000550054002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0053005400520049004E0047005D002E005B005400720079005000610072007300650054006F0049006E0074005D000081775D002E005B0053007400720069006E0067005F0057006F007200640057007200610070005D002800400053007400720069006E006700560061006C007500650020005B006E0076006100720063006800610072005D0028006D006100780029002C00200040004C0069006E0065005700690064007400680020005B0069006E0074005D002C002000400053006500700061007200610074006F00720020005B006E0076006100720063006800610072005D0028003400300030003000290029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028006D0061007800290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0053005400520049004E0047005D002E005B0057006F007200640057007200610070005D000080F95D002E005B005500740069006C005F00430052004300330032005D00280040004200610073006500440061007400610020005B00760061007200620069006E006100720079005D0028006D0061007800290029002000520045005400550052004E00530020005B0062006900670069006E0074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B005500540049004C004900540059005D002E005B00430052004300330032005D0000811D5D002E005B005500740069006C005F004400650066006C006100740065005D0028004000440061007400610054006F0043006F006D007000720065007300730020005B00760061007200620069006E006100720079005D0028006D0061007800290029002000520045005400550052004E00530020005B00760061007200620069006E006100720079005D0028006D0061007800290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B005500540049004C004900540059005D002E005B004400650066006C006100740065005D000082295D002E005B005500740069006C005F00470065006E00650072006100740065004400610074006500540069006D006500520061006E00670065005D0028004000530074006100720074004400610074006500540069006D00650020005B006400610074006500740069006D0065005D002C002000400045006E0064004400610074006500540069006D00650020005B006400610074006500740069006D0065005D002C0020004000530074006500700020005B0069006E0074005D002C00200040005300740065007000540079007000650020005B006E0076006100720063006800610072005D0028003400300030003000290029002000520045005400550052004E00530020005400410042004C004500200028005B004400610074006500740069006D0065004E0075006D005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B004400610074006500740069006D006500560061006C005D0020005B006400610074006500740069006D0065005D0020004E0055004C004C00290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B005500540049004C004900540059005D002E005B00470065006E00650072006100740065004400610074006500540069006D006500520061006E00670065005D000082155D002E005B005500740069006C005F00470065006E00650072006100740065004400610074006500540069006D00650073005D0028004000530074006100720074004400610074006500540069006D00650020005B006400610074006500740069006D0065005D002C002000400054006F00740061006C004400610074006500540069006D006500730020005B0069006E0074005D002C0020004000530074006500700020005B0069006E0074005D002C00200040005300740065007000540079007000650020005B006E0076006100720063006800610072005D0028003400300030003000290029002000520045005400550052004E00530020005400410042004C004500200028005B004400610074006500740069006D0065004E0075006D005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B004400610074006500740069006D006500560061006C005D0020005B006400610074006500740069006D0065005D0020004E0055004C004C00290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B005500540049004C004900540059005D002E005B00470065006E00650072006100740065004400610074006500540069006D00650073005D000081B75D002E005B005500740069006C005F00470065006E006500720061007400650046006C006F0061007400520061006E00670065005D0028004000530074006100720074004E0075006D0020005B0066006C006F00610074005D002C002000400045006E0064004E0075006D0020005B0066006C006F00610074005D002C0020004000530074006500700020005B0066006C006F00610074005D0029002000520045005400550052004E00530020005400410042004C004500200028005B0046006C006F00610074004E0075006D005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B0046006C006F0061007400560061006C005D0020005B0066006C006F00610074005D0020004E0055004C004C00290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B005500540049004C004900540059005D002E005B00470065006E006500720061007400650046006C006F0061007400520061006E00670065005D000081A95D002E005B005500740069006C005F00470065006E006500720061007400650046006C006F006100740073005D0028004000530074006100720074004E0075006D0020005B0066006C006F00610074005D002C002000400054006F00740061006C004E0075006D00730020005B0069006E0074005D002C0020004000530074006500700020005B0066006C006F00610074005D0029002000520045005400550052004E00530020005400410042004C004500200028005B0046006C006F00610074004E0075006D005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B0046006C006F0061007400560061006C005D0020005B0066006C006F00610074005D0020004E0055004C004C00290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B005500540049004C004900540059005D002E005B00470065006E006500720061007400650046006C006F006100740073005D000081975D002E005B005500740069006C005F00470065006E006500720061007400650049006E007400520061006E00670065005D0028004000530074006100720074004E0075006D0020005B0069006E0074005D002C002000400045006E0064004E0075006D0020005B0069006E0074005D002C0020004000530074006500700020005B0069006E0074005D0029002000520045005400550052004E00530020005400410042004C004500200028005B0049006E0074004E0075006D005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B0049006E007400560061006C005D0020005B0069006E0074005D0020004E0055004C004C00290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B005500540049004C004900540059005D002E005B00470065006E006500720061007400650049006E007400520061006E00670065005D0000818D5D002E005B005500740069006C005F00470065006E006500720061007400650049006E00740073005D0028004000530074006100720074004E0075006D0020005B0069006E0074005D002C002000400054006F00740061006C004E0075006D00730020005B0069006E0074005D002C0020004000530074006500700020005B0069006E0074005D0029002000520045005400550052004E00530020005400410042004C004500200028005B0049006E0074004E0075006D005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B0049006E007400560061006C005D0020005B0069006E0074005D0020004E0055004C004C00290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B005500540049004C004900540059005D002E005B00470065006E006500720061007400650049006E00740073005D000080E95D002E005B005500740069006C005F0047006500740054006F00740061006C004D0065006D006F00720079005D00280029002000520045005400550052004E00530020005B0062006900670069006E0074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B005500540049004C004900540059005D002E005B0047006500740054006F00740061006C004D0065006D006F00720079005D000081495D002E005B005500740069006C005F0047005A00690070005D0028004000440061007400610054006F0043006F006D007000720065007300730020005B00760061007200620069006E006100720079005D0028006D0061007800290029002000520045005400550052004E00530020005B00760061007200620069006E006100720079005D0028006D0061007800290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002C002000520045005400550052004E00530020004E0055004C004C0020004F004E0020004E0055004C004C00200049004E005000550054002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B005500540049004C004900540059005D002E005B0047005A00690070005D000081555D002E005B005500740069006C005F00470055006E007A00690070005D0028004000440061007400610054006F004400650063006F006D007000720065007300730020005B00760061007200620069006E006100720079005D0028006D0061007800290029002000520045005400550052004E00530020005B00760061007200620069006E006100720079005D0028006D0061007800290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002C002000520045005400550052004E00530020004E0055004C004C0020004F004E0020004E0055004C004C00200049004E005000550054002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B005500540049004C004900540059005D002E005B00470055006E007A00690070005D000081775D002E005B005500740069006C005F0048006100730068005D002800400041006C0067006F0072006900740068006D0020005B006E0076006100720063006800610072005D002800340030003000300029002C00200040004200610073006500440061007400610020005B00760061007200620069006E006100720079005D0028006D0061007800290029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028003400300030003000290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002C002000520045005400550052004E00530020004E0055004C004C0020004F004E0020004E0055004C004C00200049004E005000550054002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B005500540049004C004900540059005D002E005B0048006100730068005D000081915D002E005B005500740069006C005F004800610073006800420069006E006100720079005D002800400041006C0067006F0072006900740068006D0020005B006E0076006100720063006800610072005D002800340030003000300029002C00200040004200610073006500440061007400610020005B00760061007200620069006E006100720079005D0028006D0061007800290029002000520045005400550052004E00530020005B00760061007200620069006E006100720079005D0028003800300030003000290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002C002000520045005400550052004E00530020004E0055004C004C0020004F004E0020004E0055004C004C00200049004E005000550054002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B005500540049004C004900540059005D002E005B004800610073006800420069006E006100720079005D000081215D002E005B005500740069006C005F0049006E0066006C006100740065005D0028004000440061007400610054006F004400650063006F006D007000720065007300730020005B00760061007200620069006E006100720079005D0028006D0061007800290029002000520045005400550052004E00530020005B00760061007200620069006E006100720079005D0028006D0061007800290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B005500540049004C004900540059005D002E005B0049006E0066006C006100740065005D000081375D002E005B005500740069006C005F0049007300560061006C0069006400430043005D0028004000430043004E0075006D0062006500720020005B006E0076006100720063006800610072005D002800340030003000300029002C002000400043004300540079007000650020005B006E0076006100720063006800610072005D0028003400300030003000290029002000520045005400550052004E00530020005B006200690074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B005500540049004C004900540059005D002E005B0049007300560061006C0069006400430043005D0000814D5D002E005B005500740069006C005F0049007300560061006C006900640043006800650063006B0052006F007500740069006E0067004E0075006D006200650072005D002800400052006F007500740069006E0067004E0075006D0062006500720020005B006E0076006100720063006800610072005D0028003400300030003000290029002000520045005400550052004E00530020005B006200690074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B005500540049004C004900540059005D002E005B0049007300560061006C006900640043006800650063006B0052006F007500740069006E0067004E0075006D006200650072005D000081DD5D002E005B005500740069006C005F0049007300560061006C006900640043006F006E0076006500720074005D0028004000560061006C007500650054006F0043006F006E00760065007200740020005B006E0076006100720063006800610072005D0028006D006100780029002C002000400043006F006E00760065007200740054006F0044006100740061005400790070006500730020005B006E0076006100720063006800610072005D002800340030003000300029002C002000400044006500630069006D0061006C0050007200650063006900730069006F006E0020005B0073006D0061006C006C0069006E0074005D002C002000400044006500630069006D0061006C005300630061006C00650020005B0073006D0061006C006C0069006E0074005D0029002000520045005400550052004E00530020005B006200690074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B005500540049004C004900540059005D002E005B0049007300560061006C006900640043006F006E0076006500720074005D000081655D002E005B005500740069006C005F0049007300560061006C006900640050006F007300740061006C0043006F00640065005D002800400043006F0075006E0074007200790043006F006400650020005B006E0076006100720063006800610072005D002800340030003000300029002C002000400050006F007300740061006C0043006F006400650020005B006E0076006100720063006800610072005D0028003400300030003000290029002000520045005400550052004E00530020005B006200690074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B005500540049004C004900540059005D002E005B0049007300560061006C006900640050006F007300740061006C0043006F00640065005D000080FD5D002E005B005500740069006C005F0049007300560061006C0069006400530053004E005D0028004000530053004E0020005B006E0076006100720063006800610072005D0028003400300030003000290029002000520045005400550052004E00530020005B006200690074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B005500540049004C004900540059005D002E005B0049007300560061006C0069006400530053004E005D000081055D002E005B005500740069006C005F0054006F0057006F007200640073005D00280040004E0075006D006500720069006300560061006C007500650020005B0066006C006F00610074005D0029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028006D0061007800290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B005500540049004C004900540059005D002E005B0054006F0057006F007200640073005D0000853F5D002E005B004D006100740068005F0043006F006D0070006F0075006E00640041006D006F007200740069007A006100740069006F006E005300630068006500640075006C0065005D00280040004C006F0061006E0041006D006F0075006E00740020005B0066006C006F00610074005D002C002000400041006E006E00750061006C0049006E00740065007200650073007400520061007400650020005B0066006C006F00610074005D002C0020004000590065006100720073004F0066004C006F0061006E0020005B0069006E0074005D002C00200040005000610079006D0065006E0074007300500065007200590065006100720020005B0069006E0074005D002C00200040004C006F0061006E0053007400610072007400440061007400650020005B006400610074006500740069006D0065005D002C00200040004F007000740069006F006E0061006C00450078007400720061005000610079006D0065006E00740020005B0066006C006F00610074005D0029002000520045005400550052004E005300200020005400410042004C004500200028005B005000610079006D0065006E0074004E0075006D005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B005000610079006D0065006E00740044006100740065005D0020005B006400610074006500740069006D0065005D0020004E0055004C004C002C0020005B0042006500670069006E006E0069006E006700420061006C0061006E00630065005D0020005B0066006C006F00610074005D0020004E0055004C004C002C0020005B005300630068006500640075006C00650064005000610079006D0065006E0074005D0020005B0066006C006F00610074005D0020004E0055004C004C002C0020005B00450078007400720061005000610079006D0065006E0074005D0020005B0066006C006F00610074005D0020004E0055004C004C002C0020005B0054006F00740061006C005000610079006D0065006E0074005D0020005B0066006C006F00610074005D0020004E0055004C004C002C0020005B005000720069006E0063006900700061006C005D0020005B0066006C006F00610074005D0020004E0055004C004C002C0020005B0049006E007400650072006500730074005D0020005B0066006C\
-006F00610074005D0020004E0055004C004C002C0020005B0045006E00640069006E006700420061006C0061006E00630065005D0020005B0066006C006F00610074005D0020004E0055004C004C002C0020005B00430075006D0075006C006100740069007600650049006E007400650072006500730074005D0020005B0066006C006F00610074005D0020004E0055004C004C002C0020005B0054006F00740061006C0049006E007400650072006500730074005D0020005B0066006C006F00610074005D0020004E0055004C004C002C0020005B0054006F00740061006C005000610079006D0065006E00740073005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B005000610079006D0065006E00740073004C006500660074005D0020005B0069006E0074005D0020004E0055004C004C00290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B004D004100540048005D002E005B0043006F006D0070006F0075006E00640041006D006F007200740069007A006100740069006F006E005300630068006500640075006C0065005D000081055D002E005B004D006100740068005F0043006F006E007300740061006E0074005D002800400043006F006E007300740061006E0074004E0061006D00650020005B006E0076006100720063006800610072005D0028003400300030003000290029002000520045005400550052004E00530020005B0066006C006F00610074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B004D004100540048005D002E005B0043006F006E007300740061006E0074005D0000817F5D002E005B004D006100740068005F0043006F006E0076006500720074005D002800400042006100730065004E0075006D0062006500720020005B0066006C006F00610074005D002C0020004000460072006F006D0020005B006E0076006100720063006800610072005D002800340030003000300029002C002000400054006F0020005B006E0076006100720063006800610072005D0028003400300030003000290029002000520045005400550052004E00530020005B0066006C006F00610074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002C002000520045005400550052004E00530020004E0055004C004C0020004F004E0020004E0055004C004C00200049004E005000550054002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B004D004100540048005D002E005B0043006F006E0076006500720074005D000080DF5D002E005B004D006100740068005F0043006F00730068005D002800400042006100730065004E0075006D0062006500720020005B0066006C006F00610074005D0029002000520045005400550052004E00530020005B0066006C006F00610074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B004D004100540048005D002E005B0043006F00730068005D000081275D002E005B004D006100740068005F00430075006200650052006F006F0074005D002800400042006100730065004E0075006D0062006500720020005B0066006C006F00610074005D0029002000520045005400550052004E00530020005B0066006C006F00610074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002C002000520045005400550052004E00530020004E0055004C004C0020004F004E0020004E0055004C004C00200049004E005000550054002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B004D004100540048005D002E005B00430075006200650052006F006F0074005D000081275D002E005B004D006100740068005F0046006100630074006F007200690061006C005D002800400042006100730065004E0075006D0062006500720020005B0069006E0074005D0029002000520045005400550052004E00530020005B0066006C006F00610074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002C002000520045005400550052004E00530020004E0055004C004C0020004F004E0020004E0055004C004C00200049004E005000550054002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B004D004100540048005D002E005B0046006100630074006F007200690061006C005D000081995D002E005B004D006100740068005F0046006F0072006D006100740044006500630069006D0061006C005D00280040005400680065004E0075006D0062006500720020005B006E0075006D0065007200690063005D002800330038002C0020003100380029002C00200040004E0075006D0062006500720046006F0072006D006100740020005B006E0076006100720063006800610072005D002800340030003000300029002C0020004000430075006C00740075007200650020005B006E0076006100720063006800610072005D00280031003000290029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028003400300030003000290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B004D004100540048005D002E005B0046006F0072006D006100740044006500630069006D0061006C005D000080E95D002E005B004D006100740068005F00490073005000720069006D0065005D002800400042006100730065004E0075006D0062006500720020005B0062006900670069006E0074005D0029002000520045005400550052004E00530020005B006200690074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B004D004100540048005D002E005B00490073005000720069006D0065005D000081335D002E005B004D006100740068005F00520061006E0064006F006D00520061006E00670065005D0028004000530065006500640020005B0069006E0074005D002C00200040004C006F0077006500720042006F0075006E00640020005B0069006E0074005D002C00200040005500700070006500720042006F0075006E00640020005B0069006E0074005D0029002000520045005400550052004E00530020005B0069006E0074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B004D004100540048005D002E005B00520061006E0064006F006D00520061006E00670065005D000080DF5D002E005B004D006100740068005F00530069006E0068005D002800400042006100730065004E0075006D0062006500720020005B0066006C006F00610074005D0029002000520045005400550052004E00530020005B0066006C006F00610074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B004D004100540048005D002E005B00530069006E0068005D000080DF5D002E005B004D006100740068005F00540061006E0068005D002800400042006100730065004E0075006D0062006500720020005B0066006C006F00610074005D0029002000520045005400550052004E00530020005B0066006C006F00610074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B004D004100540048005D002E005B00540061006E0068005D0000815B5D002E005B004D006100740068005F005400720075006E0063006100740065005D002800400042006100730065004E0075006D0062006500720020005B0066006C006F00610074005D002C002000400044006500630069006D0061006C0050006C00610063006500730020005B00740069006E00790069006E0074005D0029002000520045005400550052004E00530020005B0066006C006F00610074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002C002000520045005400550052004E00530020004E0055004C004C0020004F004E0020004E0055004C004C00200049004E005000550054002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B004D004100540048005D002E005B005400720075006E0063006100740065005D000081795D002E005B0044006100740065005F004100670065005D002800400053007400610072007400440061007400650020005B006400610074006500740069006D0065005D002C002000400045006E006400440061007400650020005B006400610074006500740069006D0065005D002C00200040004C006500610070005900650061007200480061006E0064006C0069006E00670020005B006E0076006100720063006800610072005D002800340030003000300029002C002000400049006E0063006C00750064006500440061007900730020005B006200690074005D0029002000520045005400550052004E00530020005B0066006C006F00610074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0044004100540045005D002E005B004100670065005D000081875D002E005B0044006100740065005F0042007500730069006E0065007300730044006100790073005D002800400053007400610072007400440061007400650020004400410054004500540049004D0045002C002000400045006E006400440061007400650020004400410054004500540049004D0045002C00200040004500780063006C0075006400650044006100790073004D00610073006B00200042004900470049004E00540029002000520045005400550052004E005300200049004E00540020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002C002000520045005400550052004E00530020004E0055004C004C0020004F004E0020004E0055004C004C00200049004E005000550054002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0044004100540045005D002E005B0042007500730069006E0065007300730044006100790073005D0000813B5D002E005B0044006100740065005F00440061007900730049006E004D006F006E00740068005D0028004000590065006100720020005B0069006E0074005D002C00200040004D006F006E007400680020005B0069006E0074005D0029002000520045005400550052004E00530020005B0069006E0074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002C002000520045005400550052004E00530020004E0055004C004C0020004F004E0020004E0055004C004C00200049004E005000550054002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0044004100540045005D002E005B00440061007900730049006E004D006F006E00740068005D0000815B5D002E005B0044006100740065005F00440061007900730049006E004D006F006E0074006800460072006F006D004400610074006500540069006D0065005D0028004000540068006500440061007400650020005B006400610074006500740069006D0065005D0029002000520045005400550052004E005300200049004E00540020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002C002000520045005400550052004E00530020004E0055004C004C0020004F004E0020004E0055004C004C00200049004E005000550054002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0044004100540045005D002E005B00440061007900730049006E004D006F006E0074006800460072006F006D004400610074006500540069006D0065005D0000813B5D002E005B0044006100740065005F0044006100790073004C0065006600740049006E0059006500610072005D0028004000540068006500440061007400650020005B006400610074006500740069006D0065005D0029002000520045005400550052004E00530020005B0069006E0074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002C002000520045005400550052004E00530020004E0055004C004C0020004F004E0020004E0055004C004C00200049004E005000550054002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0044004100540045005D002E005B0044006100790073004C0065006600740049006E0059006500610072005D000081195D002E005B0044006100740065005F0045007800740072006100630074005D00280040004400610074006500500061007200740020005B006E0076006100720063006800610072005D002800340030003000300029002C0020004000440061007400650020005B006400610074006500740069006D0065005D0029002000520045005400550052004E00530020005B0069006E0074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0044004100540045005D002E005B0045007800740072006100630074005D000081A75D002E005B0044006100740065005F00460069007200730074004400610079004F0066004D006F006E00740068005D0028004000540068006500440061007400650020005B006400610074006500740069006D0065005D002C00200040004E006500770048006F007500720020005B0069006E0074005D002C00200040004E00650077004D0069006E0075007400650020005B0069006E0074005D002C00200040004E00650077005300650063006F006E00640020005B0069006E0074005D002C00200040004E00650077004D0069006C006C0069007300650063006F006E00640020005B0069006E0074005D0029002000520045005400550052004E00530020005B006400610074006500740069006D0065005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0044004100540045005D002E005B00460069007200730074004400610079004F0066004D006F006E00740068005D0000816F5D002E005B0044006100740065005F0046006F0072006D00610074005D0028004000540068006500440061007400650020005B006400610074006500740069006D0065005D002C00200040004400610074006500540069006D00650046006F0072006D006100740020005B006E0076006100720063006800610072005D002800340030003000300029002C0020004000430075006C00740075007200650020005B006E0076006100720063006800610072005D00280031003000290029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028003400300030003000290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0044004100540045005D002E005B0046006F0072006D00610074005D000081875D002E005B0044006100740065005F0046006F0072006D0061007400540069006D0065005300700061006E005D002800400053007400610072007400440061007400650020005B006400610074006500740069006D0065005D002C002000400045006E006400440061007400650020005B006400610074006500740069006D0065005D002C00200040004F007500740070007500740046006F0072006D006100740020005B006E0076006100720063006800610072005D0028003400300030003000290029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028003400300030003000290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0044004100540045005D002E005B0046006F0072006D0061007400540069006D0065005300700061006E005D000081395D002E005B0044006100740065005F00460072006F006D0055004E0049005800540069006D0065005D002800400055004E0049005800440061007400650020005B0066006C006F00610074005D0029002000520045005400550052004E00530020005B006400610074006500740069006D0065005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002C002000520045005400550052004E00530020004E0055004C004C0020004F004E0020004E0055004C004C00200049004E005000550054002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0044004100540045005D002E005B00460072006F006D0055004E0049005800540069006D0065005D000081515D002E005B0044006100740065005F00460075006C006C00440061007400650053007400720069006E0067005D0028004000540068006500440061007400650020005B006400610074006500740069006D0065005D0029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028003400300030003000290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002C002000520045005400550052004E00530020004E0055004C004C0020004F004E0020004E0055004C004C00200049004E005000550054002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0044004100540045005D002E005B00460075006C006C00440061007400650053007400720069006E0067005D000081515D002E005B0044006100740065005F00460075006C006C00540069006D00650053007400720069006E0067005D0028004000540068006500440061007400650020005B006400610074006500740069006D0065005D0029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028003400300030003000290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002C002000520045005400550052004E00530020004E0055004C004C0020004F004E0020004E0055004C004C00200049004E005000550054002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0044004100540045005D002E005B00460075006C006C00540069006D00650053007400720069006E0067005D0000817B5D002E005B0044006100740065005F004700650074004400610074006500540069006D006500460072006F006D0049006E007400560061006C0073005D002800400049006E007400440061007400650020005B0069006E0074005D002C002000400049006E007400540069006D00650020005B0069006E0074005D0029002000520045005400550052004E00530020005B006400610074006500740069006D0065005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002C002000520045005400550052004E00530020004E0055004C004C0020004F004E0020004E0055004C004C00200049004E005000550054002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0044004100540045005D002E005B004700650074004400610074006500540069006D006500460072006F006D0049006E007400560061006C0073005D000080F35D002E005B0044006100740065005F0047006500740049006E00740044006100740065005D0028004000540068006500440061007400650020005B006400610074006500740069006D0065005D0029002000520045005400550052004E00530020005B0069006E0074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0044004100540045005D002E005B0047006500740049006E00740044006100740065005D000080F35D002E005B0044006100740065005F0047006500740049006E007400540069006D0065005D0028004000540068006500440061007400650020005B006400610074006500740069006D0065005D0029002000520045005400550052004E00530020005B0069006E0074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0044004100540045005D002E005B0047006500740049006E007400540069006D0065005D000081295D002E005B0044006100740065005F004900730042007500730069006E006500730073004400610079005D0028004000540068006500440061007400650020004400410054004500540049004D0045002C00200040004500780063006C0075006400650044006100790073004D00610073006B00200042004900470049004E00540029002000520045005400550052004E005300200042004900540020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0044004100540045005D002E005B004900730042007500730069006E006500730073004400610079005D0000811B5D002E005B0044006100740065005F00490073004C0065006100700059006500610072005D0028004000590065006100720020005B0069006E0074005D0029002000520045005400550052004E00530020005B006200690074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002C002000520045005400550052004E00530020004E0055004C004C0020004F004E0020004E0055004C004C00200049004E005000550054002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0044004100540045005D002E005B00490073004C0065006100700059006500610072005D000081DB5D002E005B0044006100740065005F004C006100730074004400610079004F0066004D006F006E00740068005D0028004000540068006500440061007400650020005B006400610074006500740069006D0065005D002C00200040004E006500770048006F007500720020005B0069006E0074005D002C00200040004E00650077004D0069006E0075007400650020005B0069006E0074005D002C00200040004E00650077005300650063006F006E00640020005B0069006E0074005D002C00200040004E00650077004D0069006C006C0069007300650063006F006E00640020005B0069006E0074005D0029002000520045005400550052004E00530020005B006400610074006500740069006D0065005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002C002000520045005400550052004E00530020004E0055004C004C0020004F004E0020004E0055004C004C00200049004E005000550054002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0044004100540045005D002E005B004C006100730074004400610079004F0066004D006F006E00740068005D000081DB5D002E005B0044006100740065005F004E00650077004400610074006500540069006D0065005D0028004000590065006100720020005B0069006E0074005D002C00200040004D006F006E007400680020005B0069006E0074005D002C002000400044006100790020005B0069006E0074005D002C002000400048006F007500720020005B0069\
-006E0074005D002C00200040004D0069006E0075007400650020005B0069006E0074005D002C00200040005300650063006F006E00640020005B0069006E0074005D002C00200040004D0069006C006C0069007300650063006F006E00640020005B0069006E0074005D0029002000520045005400550052004E00530020005B006400610074006500740069006D0065005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002C002000520045005400550052004E00530020004E0055004C004C0020004F004E0020004E0055004C004C00200049004E005000550054002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0044004100540045005D002E005B004E00650077004400610074006500540069006D0065005D000081935D002E005B0044006100740065005F004E00740068004F006300630075007200720065006E00630065004F0066005700650065006B006400610079005D00280040004F006300630075007200720065006E006300650020005B0073006D0061006C006C0069006E0074005D002C00200040005700650065006B0064006100790020005B006E0076006100720063006800610072005D0028003100300029002C002000400053007400610072007400440061007400650020005B006400610074006500740069006D0065005D0029002000520045005400550052004E00530020005B006400610074006500740069006D0065005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0044004100540045005D002E005B004E00740068004F006300630075007200720065006E00630065004F0066005700650065006B006400610079005D0000812F5D002E005B0044006100740065005F0054006F0055004E0049005800540069006D0065005D0028004000530051004C00440061007400650020005B006400610074006500740069006D0065005D0029002000520045005400550052004E00530020005B0066006C006F00610074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002C002000520045005400550052004E00530020004E0055004C004C0020004F004E0020004E0055004C004C00200049004E005000550054002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0044004100540045005D002E005B0054006F0055004E0049005800540069006D0065005D000081275D002E005B0044006100740065005F005400720075006E0063006100740065005D00280040004400610074006500500061007200740020005B006E0076006100720063006800610072005D002800340030003000300029002C0020004000440061007400650020005B006400610074006500740069006D0065005D0029002000520045005400550052004E00530020005B006400610074006500740069006D0065005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0044004100540045005D002E005B005400720075006E0063006100740065005D000081435D002E005B0043006F006E0076006500720074005F00420069006E0061007200790054006F0048006500780053007400720069006E0067005D0028004000420069006E00610072007900560061006C007500650020005B00760061007200620069006E006100720079005D0028006D0061007800290029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028006D0061007800290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0043004F004E0056004500520054005D002E005B00420069006E0061007200790054006F0048006500780053007400720069006E0067005D0000815D5D002E005B0043006F006E0076006500720074005F004400610074006500540069006D00650054006F004D00530049006E00740044006100740065005D00280040005200650061006C00440061007400650020005B006400610074006500740069006D0065005D0029002000520045005400550052004E00530020005B0069006E0074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002C002000520045005400550052004E00530020004E0055004C004C0020004F004E0020004E0055004C004C00200049004E005000550054002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0043004F004E0056004500520054005D002E005B004400610074006500540069006D00650054006F004D00530049006E00740044006100740065005D000081295D002E005B0043006F006E0076006500720074005F00460072006F006D004200610073006500360034005D002800400045006E0063006F00640065006400560061006C007500650020005B006E0076006100720063006800610072005D0028006D0061007800290029002000520045005400550052004E00530020005B00760061007200620069006E006100720079005D0028006D0061007800290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0043004F004E0056004500520054005D002E005B00460072006F006D004200610073006500360034005D000081495D002E005B0043006F006E0076006500720074005F0048006500780053007400720069006E00670054006F00420069006E006100720079005D002800400048006500780053007400720069006E006700560061006C007500650020005B006E0076006100720063006800610072005D0028006D0061007800290029002000520045005400550052004E00530020005B00760061007200620069006E006100720079005D0028006D0061007800290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0043004F004E0056004500520054005D002E005B0048006500780053007400720069006E00670054006F00420069006E006100720079005D0000815F5D002E005B0043006F006E0076006500720074005F004D00530049006E007400440061007400650054006F004400610074006500540069006D0065005D00280040004D00530049006E007400440061007400650020005B0069006E0074005D0029002000520045005400550052004E00530020005B006400610074006500740069006D0065005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002C002000520045005400550052004E00530020004E0055004C004C0020004F004E0020004E0055004C004C00200049004E005000550054002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0043004F004E0056004500520054005D002E005B004D00530049006E007400440061007400650054006F004400610074006500540069006D0065005D0000810D5D002E005B0043006F006E0076006500720074005F0052004F005400310033005D00280040005400650078007400560061006C007500650020005B006E0076006100720063006800610072005D0028006D0061007800290029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028006D0061007800290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0043004F004E0056004500520054005D002E005B0052004F005400310033005D000081795D002E005B0043006F006E0076006500720074005F0054006F004200610073006500360034005D002800400055006E0065006E0063006F00640065006400560061006C007500650020005B00760061007200620069006E006100720079005D0028006D006100780029002C002000400042006100730065003600340046006F0072006D0061007400740069006E0067004F007000740069006F006E0020005B006E0076006100720063006800610072005D0028003400300030003000290029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028006D0061007800290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0043004F004E0056004500520054005D002E005B0054006F004200610073006500360034005D000081215D002E005B0043006F006E0076006500720074005F00550055004400650063006F00640065005D002800400045006E0063006F00640065006400560061006C007500650020005B006E0076006100720063006800610072005D0028006D0061007800290029002000520045005400550052004E00530020005B00760061007200620069006E006100720079005D0028006D0061007800290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0043004F004E0056004500520054005D002E005B00550055004400650063006F00640065005D000081255D002E005B0043006F006E0076006500720074005F005500550045006E0063006F00640065005D002800400055006E0065006E0063006F00640065006400560061006C007500650020005B00760061007200620069006E006100720079005D0028006D0061007800290029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028006D0061007800290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B0043004F004E0056004500520054005D002E005B005500550045006E0063006F00640065005D000082655D002E005B004C006F006F006B00550070005F0047006500740043006F0075006E0074007200790049006E0066006F005D002800400053006500610072006300680043006F006400650020005B006E0076006100720063006800610072005D0028003400300030003000290029002000520045005400550052004E005300200020005400410042004C004500200028005B004E0075006D00650072006900630043006F00640065005D0020005B006E0063006800610072005D0028003300290020004E0055004C004C002C0020005B00540077006F004C006500740074006500720043006F00640065005D0020005B006E0063006800610072005D0028003200290020004E0055004C004C002C0020005B00540068007200650065004C006500740074006500720043006F00640065005D0020005B006E0063006800610072005D0028003300290020004E0055004C004C002C0020005B004E0061006D0065005D0020005B006E0076006100720063006800610072005D00280035003000290020004E0055004C004C002C0020005B0046006C006100670049006D006100670065005D0020005B00760061007200620069006E006100720079005D0028006D0061007800290020004E0055004C004C00290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B004C006F006F006B00550070005D002E005B0047006500740043006F0075006E0074007200790049006E0066006F005D000082935D002E005B004C006F006F006B00550070005F004700650074005300740061007400650049006E0066006F005D002800400053006500610072006300680043006F006400650020005B006E0076006100720063006800610072005D002800340030003000300029002C002000400043006F0075006E0074007200790043006F006400650020005B006E0076006100720063006800610072005D0028003400300030003000290029002000520045005400550052004E005300200020005400410042004C004500200028005B004E0075006D00650072006900630043006F00640065005D0020005B006E0063006800610072005D0028003200290020004E0055004C004C002C0020005B00540077006F004C006500740074006500720043006F00640065005D0020005B006E0063006800610072005D0028003200290020004E0055004C004C002C0020005B004E0061006D0065005D0020005B006E0076006100720063006800610072005D00280035003000290020004E0055004C004C002C0020005B0046006C006100670049006D006100670065005D0020005B00760061007200620069006E006100720079005D0028006D0061007800290020004E0055004C004C002C0020005B0043006F0075006E0074007200790043006F00640065005D0020005B006E0063006800610072005D0028003200290020004E0055004C004C00290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023005D002E005B004C006F006F006B00550070005D002E005B004700650074005300740061007400650049006E0066006F005D00002F730071006C0023002E007400790070006500730061006E0064006100670067007200650067006100740065007300001B4300520045004100540045002000540059005000450020005B0000809B5D002E005B0054007900700065005F0046006C006F0061007400410072007200610079005D002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E005400790070006500730041006E00640041006700670072006500670061007400650073005D002E005B0054007900700065005F0046006C006F0061007400410072007200610079005D000080975D002E005B0054007900700065005F0048006100730068005400610062006C0065005D002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E005400790070006500730041006E00640041006700670072006500670061007400650073005D002E005B0054007900700065005F0048006100730068005400610062006C0065005D000080A75D002E005B0054007900700065005F004E005600610072006300680061007200410072007200610079005D002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E005400790070006500730041006E00640041006700670072006500670061007400650073005D002E005B0054007900700065005F004E005600610072006300680061007200410072007200610079005D000025430052004500410054004500200041004700470052004500470041005400450020005B000080E15D002E005B004100670067005F00470065006F006D00650074007200690063004100760067005D00200028004000560061006C007500650020005B0066006C006F00610074005D0029002000520045005400550052004E00530020005B0066006C006F00610074005D002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E005400790070006500730041006E00640041006700670072006500670061007400650073005D002E005B004100670067005F00470065006F006D00650074007200690063004100760067005D000080E55D002E005B004100670067005F004A006F0069006E005D00200028004000760061006C007500650020005B006E0076006100720063006800610072005D0028003400300030003000290029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D002800340030003000300029002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E005400790070006500730041006E00640041006700670072006500670061007400650073005D002E005B004100670067005F004A006F0069006E005D000080C95D002E005B004100670067005F004D0065006400690061006E005D00200028004000760061006C007500650020005B0066006C006F00610074005D0029002000520045005400550052004E00530020005B0066006C006F00610074005D002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E005400790070006500730041006E00640041006700670072006500670061007400650073005D002E005B004100670067005F004D0065006400690061006E005D000080C95D002E005B004100670067005F00520061006E0064006F006D005D00200028004000760061006C007500650020005B0066006C006F00610074005D0029002000520045005400550052004E00530020005B0066006C006F00610074005D002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E005400790070006500730041006E00640041006700670072006500670061007400650073005D002E005B004100670067005F00520061006E0064006F006D005D000080DD5D002E005B004100670067005F0052006F006F0074004D00650061006E005300710072005D00200028004000560061006C007500650020005B0066006C006F00610074005D0029002000520045005400550052004E00530020005B0066006C006F00610074005D002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E005400790070006500730041006E00640041006700670072006500670061007400650073005D002E005B004100670067005F0052006F006F0074004D00650061006E005300710072005D00002F530051004C0023002E005400790070006500730041006E00640041006700670072006500670061007400650073000019730071006C0023002E006E006500740077006F0072006B0000812D5D002E005B0049004E00450054005F00410064006400720065007300730054006F004E0075006D006200650072005D002800400049005000410064006400720065007300730020005B006E0076006100720063006800610072005D0028003400300030003000290029002000520045005400550052004E00530020005B0062006900670069006E0074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E004E006500740077006F0072006B005D002E005B0049004E00450054005D002E005B00410064006400720065007300730054006F004E0075006D006200650072005D000081295D002E005B0049004E00450054005F00480054004D004C004400650063006F00640065005D002800400045006E0063006F00640065006400480054004D004C0020005B006E0076006100720063006800610072005D0028006D0061007800290029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028006D0061007800290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E004E006500740077006F0072006B005D002E005B0049004E00450054005D002E005B00480054004D004C004400650063006F00640065005D000081AB5D002E005B0049004E00450054005F00480054004D004C0045006E0063006F00640065005D00280040004400650063006F00640065006400480054004D004C0020005B006E0076006100720063006800610072005D0028006D006100780029002C00200040005700680069007400650053007000610063006500480061006E0064006C0069006E00670020005B006E0076006100720063006800610072005D002800340030003000300029002C002000400043006F006E00740069006E0075006F007500730045006E0063006F00640069006E00670020005B006200690074005D0029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028006D0061007800290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E004E006500740077006F0072006B005D002E005B0049004E00450054005D002E005B00480054004D004C0045006E0063006F00640065005D0000812B5D002E005B0049004E00450054005F0049007300560061006C00690064004900500041006400640072006500730073005D002800400049005000410064006400720065007300730020005B006E0076006100720063006800610072005D0028003400300030003000290029002000520045005400550052004E00530020005B006200690074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E004E006500740077006F0072006B005D002E005B0049004E00450054005D002E005B0049007300560061006C00690064004900500041006400640072006500730073005D0000812B5D002E005B0049004E00450054005F004E0075006D0062006500720054006F0041006400640072006500730073005D0028004000490050004E0075006D0062006500720020005B0062006900670069006E0074005D0029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028003400300030003000290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E004E006500740077006F0072006B005D002E005B0049004E00450054005D002E005B004E0075006D0062006500720054006F0041006400640072006500730073005D000081275D002E005B0049004E00450054005F005500520049004400650063006F00640065005D002800400045006E0063006F0064006500640055005200490020005B006E0076006100720063006800610072005D0028003400300030003000290029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028003400300030003000290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E004E006500740077006F0072006B005D002E005B0049004E00450054005D002E005B005500520049004400650063006F00640065005D000081275D002E005B0049004E00450054005F0055005200490045006E0063006F00640065005D00280040004400650063006F0064006500640055005200490020005B006E0076006100720063006800610072005D0028003400300030003000290029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028003400300030003000290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E004E006500740077006F0072006B005D002E005B0049004E00450054005D002E005B0055005200490045006E0063006F00640065005D0000813F5D002E005B0049004E00450054005F0055005200490045006E0063006F006400650044006100740061005D00280040004400650063006F00640065006400550052004900440061007400610020005B006E0076006100720063006800610072005D0028003400300030003000290029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028003400300030003000290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E004E006500740077006F0072006B005D002E005B0049004E00450054005D002E005B0055005200490045006E0063006F006400650044006100740061005D000086175D002E005B0049004E00450054005F0055005200490047006500740049006E0066006F005D002800400055005200490020005B006E0076006100720063006800610072005D0028003400300030003000290029002000520045005400550052004E005300200020005400410042004C004500200028005B004100620073006F006C0075007400650050006100740068005D0020005B006E0076006100720063006800610072005D0028003400300030003000\
-290020004E0055004C004C002C0020005B004100620073006F006C007500740065005500720069005D0020005B006E0076006100720063006800610072005D0028003400300030003000290020004E0055004C004C002C0020005B0041007500740068006F0072006900740079005D0020005B006E0076006100720063006800610072005D0028003400300030003000290020004E0055004C004C002C0020005B0044006E007300530061006600650048006F00730074005D0020005B006E0076006100720063006800610072005D0028003400300030003000290020004E0055004C004C002C0020005B0046007200610067006D0065006E0074005D0020005B006E0076006100720063006800610072005D0028003400300030003000290020004E0055004C004C002C0020005B00480061007300680043006F00640065005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B0048006F00730074005D0020005B006E0076006100720063006800610072005D0028003400300030003000290020004E0055004C004C002C0020005B0048006F00730074004E0061006D00650054007900700065005D0020005B006E0076006100720063006800610072005D00280035003000290020004E0055004C004C002C0020005B00490073004100620073006F006C007500740065005500720069005D0020005B006200690074005D0020004E0055004C004C002C0020005B0049007300440065006600610075006C00740050006F00720074005D0020005B006200690074005D0020004E0055004C004C002C0020005B0049007300460069006C0065005D0020005B006200690074005D0020004E0055004C004C002C0020005B00490073004C006F006F0070006200610063006B005D0020005B006200690074005D0020004E0055004C004C002C0020005B004900730055006E0063005D0020005B006200690074005D0020004E0055004C004C002C0020005B0049007300570065006C006C0046006F0072006D00650064004F0072006900670069006E0061006C0053007400720069006E0067005D0020005B006200690074005D0020004E0055004C004C002C0020005B004C006F00630061006C0050006100740068005D0020005B006E0076006100720063006800610072005D0028003400300030003000290020004E0055004C004C002C0020005B00500061007400680041006E006400510075006500720079005D0020005B006E0076006100720063006800610072005D0028003400300030003000290020004E0055004C004C002C0020005B0050006F00720074005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B00510075006500720079005D0020005B006E0076006100720063006800610072005D0028003400300030003000290020004E0055004C004C002C0020005B0053006300680065006D0065005D0020005B006E0076006100720063006800610072005D00280035003000290020004E0055004C004C002C0020005B00550073006500720045007300630061007000650064005D0020005B006200690074005D0020004E0055004C004C002C0020005B00550073006500720049006E0066006F005D0020005B006E0076006100720063006800610072005D0028003400300030003000290020004E0055004C004C00290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E004E006500740077006F0072006B005D002E005B0049004E00450054005D002E005B0055005200490047006500740049006E0066006F005D000081615D002E005B0049004E00450054005F005500520049004700650074004C0065006600740050006100720074005D002800400055005200490020005B006E0076006100720063006800610072005D002800340030003000300029002C00200040005000610072007400690061006C00540079007000650020005B006E0076006100720063006800610072005D00280035003000290029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028003400300030003000290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E004E006500740077006F0072006B005D002E005B0049004E00450054005D002E005B004700650074004C0065006600740050006100720074005D000019530051004C0023002E004E006500740077006F0072006B00000F730071006C0023002E00640062000083915D002E005B00440042005F00420075006C006B0043006F00700079005D002000400053006F007500720063006500540079007000650020005B006E0076006100720063006800610072005D0028003400300030003000290020003D0020004E0055004C004C002C002000400053006F00750072006300650043006F006E006E0065006300740069006F006E0020005B006E0076006100720063006800610072005D0028003400300030003000290020003D0020004E0055004C004C002C002000400053006F0075007200630065005100750065007200790020005B006E0076006100720063006800610072005D002800340030003000300029002C0020004000440065007300740069006E006100740069006F006E0043006F006E006E0065006300740069006F006E0020005B006E0076006100720063006800610072005D0028003400300030003000290020003D0020004E0055004C004C002C0020004000440065007300740069006E006100740069006F006E005400610062006C0065004E0061006D00650020005B006E0076006100720063006800610072005D002800340030003000300029002C002000400042006100740063006800530069007A00650020005B0069006E0074005D002C00200040004E006F0074006900660079004100660074006500720052006F007700730020005B0069006E0074005D002C0020004000540069006D0065004F007500740020005B0069006E0074005D002C002000400043006F006C0075006D006E004D0061007000700069006E006700730020005B006E0076006100720063006800610072005D0028003400300030003000290020003D0020004E0055004C004C002C0020004000420075006C006B0043006F00700079004F007000740069006F006E0073004C0069007300740020005B006E0076006100720063006800610072005D0028003400300030003000290020003D0020004E0055004C004C002C002000400052006F007700730043006F007000690065006400200042004900470049004E00540020003D0020002D00310020004F005500540050005500540020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E00440042005D002E005B00440042005D002E005B00420075006C006B0043006F00700079005D000180EF5D002E005B00440042005F0058004F0052005D0028004000560061006C00750065004F006E00650020005B006200690074005D002C0020004000560061006C0075006500540077006F0020005B006200690074005D0029002000520045005400550052004E00530020005B006200690074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E00440042005D002E005B00440042005D002E005B0058004F0052005D00000F530051004C0023002E0044004200001F730071006C0023002E00730067006D006C007200650061006400650072000081AF5D002E005B0043006F006E0076006500720074005F00480074006D006C0054006F0058006D006C005D002800400044006F00630075006D0065006E00740020005B006E0076006100720063006800610072005D0028006D006100780029002C002000400044006F00630075006D0065006E00740055007200690020005B006E0076006100720063006800610072005D002800340030003000300029002C0020004000430061007300650046006F006C00640069006E00670020005B006E0076006100720063006800610072005D00280035003000290029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028006D0061007800290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E00530067006D006C005200650061006400650072005D002E005B00530047004D004C005200650061006400650072005D002E005B00480074006D006C0054006F0058006D006C005D00001F530051004C0023002E00530067006D006C00520065006100640065007200000F730071006C0023002E006F0073000086015D002E005B004F0053005F004500760065006E0074004C006F00670052006500610064005D00280040004C006F0067004E0061006D00650020005B006E0076006100720063006800610072005D002800340030003000300029002C00200040004D0061006300680069006E0065004E0061006D00650020005B006E0076006100720063006800610072005D002800340030003000300029002C002000400053006F00750072006300650020005B006E0076006100720063006800610072005D002800340030003000300029002C002000400045006E00740072007900540079007000650020005B006E0076006100720063006800610072005D002800340030003000300029002C002000400049006E007300740061006E00630065004900440020005B006E0076006100720063006800610072005D002800340030003000300029002C0020004000430061007400650067006F007200790020005B006E0076006100720063006800610072005D002800340030003000300029002C002000400055007300650072004E0061006D00650020005B006E0076006100720063006800610072005D002800340030003000300029002C00200040004D0065007300730061006700650020005B006E0076006100720063006800610072005D002800340030003000300029002C0020004000540069006D006500470065006E0065007200610074006500640042006500670069006E0020005B006400610074006500740069006D0065005D002C0020004000540069006D006500470065006E0065007200610074006500640045006E00640020005B006400610074006500740069006D0065005D002C002000400049006E0064006500780042006500670069006E0020005B0069006E0074005D002C002000400049006E0064006500780045006E00640020005B0069006E0074005D002C0020004000520065006700450078004F007000740069006F006E0073004C0069007300740020005B006E0076006100720063006800610072005D0028003400300030003000290029002000520045005400550052004E00530020005400410042004C004500200028005B0049006E006400650078005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B00430061007400650067006F00720079005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0045006E0074007200790054007900700065005D0020005B006E0076006100720063006800610072005D00280035003000290020004E0055004C004C002C0020005B0049006E007300740061006E0063006500490064005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B0053006F0075007200630065005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B00540069006D006500470065006E006500720061007400650064005D0020005B006400610074006500740069006D0065005D0020004E0055004C004C002C0020005B00540069006D0065005700720069007400740065006E005D0020005B006400610074006500740069006D0065005D0020004E0055004C004C002C0020005B0055007300650072004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B004D006500730073006100670065005D0020005B006E0076006100720063006800610072005D0028006D0061007800290020004E0055004C004C002C0020005B0044006100740061005D0020005B00760061007200620069006E006100720079005D0028006D0061007800290020004E0055004C004C00290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E004F0053005D002E005B004F0053005D002E005B004500760065006E0074004C006F00670052006500610064005D0000828F5D002E005B004F0053005F004500760065006E0074004C006F006700570072006900740065005D00280040004C006F0067004E0061006D00650020005B006E0076006100720063006800610072005D002800340030003000300029002C00200040004D0061006300680069006E0065004E0061006D00650020005B006E0076006100720063006800610072005D002800340030003000300029002C002000400053006F00750072006300650020005B006E0076006100720063006800610072005D002800340030003000300029002C002000400045006E00740072007900540079007000650020005B006E0076006100720063006800610072005D002800340030003000300029002C002000400049006E007300740061006E00630065004900440020005B0069006E0074005D002C0020004000430061007400650067006F007200790020005B0073006D0061006C006C0069006E0074005D002C00200040004D0065007300730061006700650020005B006E0076006100720063006800610072005D0028006D006100780029002C0020004000420069006E00610072007900440061007400610020005B00760061007200620069006E006100720079005D0028003800300030003000290029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028003400300030003000290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E004F0053005D002E005B004F0053005D002E005B004500760065006E0074004C006F006700570072006900740065005D0000812B5D002E005B004F0053005F00470065006E006500720061007400650054006F006E0065005D00280040004600720065007100750065006E006300790020005B0069006E0074005D002C00200040004400750072006100740069006F006E0020005B0069006E0074005D0029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028003400300030003000290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E004F0053005D002E005B004F0053005D002E005B00470065006E006500720061007400650054006F006E0065005D000080E55D002E005B004F0053005F004D0061006300680069006E0065004E0061006D0065005D00280029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028003400300030003000290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E004F0053005D002E005B004F0053005D002E005B004D0061006300680069006E0065004E0061006D0065005D000080BB5D002E005B004F0053005F0055007000740069006D0065005D00280029002000520045005400550052004E00530020005B0069006E0074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E004F0053005D002E005B004F0053005D002E005B0055007000740069006D0065005D00000F530051004C0023002E004F0053000021730071006C0023002E00740077006900740074006500720069007A006500720000863D5D002E005B0054007700690074007400650072005F0042006C006F0063006B0055007300650072005D002800400043006F006E00730075006D00650072004B006500790020005B006E0076006100720063006800610072005D00280031003000300029002C002000400043006F006E00730075006D006500720053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C0020004000530063007200650065006E004E0061006D00650020005B006E0076006100720063006800610072005D00280032003000290029002000520045005400550052004E00530020005400410042004C00450020002800550073006500720049004400200042004900470049004E0054002C002000530063007200650065006E004E0061006D00650020004E005600410052004300480041005200280031003000300029002C00200055007300650072004E0061006D00650020004E005600410052004300480041005200280031003000300029002C00200049007300500072006F0074006500630074006500640020004200490054002C002000490073005600650072006900660069006500640020004200490054002C0020004400650073006300720069007000740069006F006E0020004E0056004100520043004800410052002800340030003000300029002C00200043007200650061007400650064004F006E0020004400410054004500540049004D0045002C0020004C006F0063006100740069006F006E0020004E005600410052004300480041005200280035003000300029002C002000540069006D0065005A006F006E00650020004E005600410052004300480041005200280031003000300029002C0020005500540043004F0066006600730065007400200049004E0054002C002000500072006F00660069006C00650049006D0061006700650055007200690020004E0056004100520043004800410052002800320030003400380029002C002000500072006F00660069006C00650055007200690020004E0056004100520043004800410052002800320030003400380029002C00200046007200690065006E006400730043006F0075006E007400200049004E0054002C0020004E0075006D006200650072004F00660046006F006C006C006F007700650072007300200049004E0054002C0020004E0075006D006200650072004F00660053007400610074007500730065007300200049004E0054002C002000530074006100740075007300540065007800740020004E005600410052004300480041005200280033003000300029002C00200052006100740065004C0069006D0069007400200049004E0054002C00200052006100740065004C0069006D0069007400520065006D00610069006E0069006E006700200049004E0054002C00200052006100740065004C0069006D00690074005200650073006500740020004400410054004500540049004D0045002C0020004C0061006E006700750061006700650020004E00560041005200430048004100520028003500300029002C0020004E0075006D006200650072004F0066005000750062006C00690063004C006900730074004D0065006D0062006500720073006800690070007300200049004E0054002C00200049007300470065006F0045006E00610062006C006500640020004200490054002C00200046006F006C006C006F00770069006E00670020004200490054002C0020004D007500740069006E0067002000420049005400290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E00540077006900740074006500720069007A00650072005D002E005B0054005700490054005400450052005D002E005B0042006C006F0063006B0055007300650072005D0000880B5D002E005B0054007700690074007400650072005F004300720065006100740065004600610076006F0072006900740065005D002800400043006F006E00730075006D00650072004B006500790020005B006E0076006100720063006800610072005D00280031003000300029002C002000400043006F006E00730075006D006500720053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C00200040005300740061007400750073004900440020005B0062006900670069006E0074005D0029002000520045005400550052004E005300200020005400410042004C004500200028005B00530074006100740075007300490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B0043007200650061007400650064005D0020005B006400610074006500740069006D0065005D0020004E0055004C004C002C0020005B0049006E005200650070006C00790054006F00530074006100740075007300490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B0049006E005200650070006C00790054006F005500730065007200490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B00490073004600610076006F00720069007400650064005D0020005B006200690074005D0020004E0055004C004C002C0020005B00490073005400720075006E00630061007400650064005D0020005B006200690074005D0020004E0055004C004C002C0020005B0053006F0075007200630065005D0020005B006E0076006100720063006800610072005D002800320030003000290020004E0055004C004C002C0020005B0053007400610074007500730054006500780074005D0020005B006E0076006100720063006800610072005D002800330030003000290020004E0055004C004C002C0020005B0052006500630069007000690065006E007400490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B00540069006D0065005A006F006E0065005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B00530063007200650065006E004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B0055007300650072004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B005500730065007200490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B004C006F0063006100740069006F006E005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B0050006C00610063006500490044005D0020005B006E0076006100720063006800610072005D00280035003000290020004E0055004C004C002C0020005B0050006C006100630065004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C00610063006500460075006C006C004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C0061006300650054007900700065005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C0061006300650043006F0075006E007400720079005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C006100630065004C0061007400690074007500640065005D0020005B0066006C006F00610074005D0020004E0055004C004C002C0020005B0050006C006100630065004C006F006E006700690074007500640065005D0020005B0066006C006F00610074005D0020004E0055004C004C002C0020005B0052006100740065004C0069006D00690074005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B0052006100740065004C0069006D0069007400520065006D00610069006E0069006E0067005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B0052006100740065004C0069006D0069007400520065007300650074005D0020005B006400610074006500740069006D0065005D0020004E0055004C004C00290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B\
-00530051004C0023002E00540077006900740074006500720069007A00650072005D002E005B0054005700490054005400450052005D002E005B004300720065006100740065004600610076006F0072006900740065005D000082555D002E005B0054007700690074007400650072005F00440065007300740072006F0079004400690072006500630074004D006500730073006100670065005D002800400043006F006E00730075006D00650072004B006500790020005B006E0076006100720063006800610072005D00280031003000300029002C002000400043006F006E00730075006D006500720053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C00200040005300740061007400750073004900440020005B0062006900670069006E0074005D0029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028003400300030003000290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E00540077006900740074006500720069007A00650072005D002E005B0054005700490054005400450052005D002E005B00440065007300740072006F0079004400690072006500630074004D006500730073006100670065005D0000880F5D002E005B0054007700690074007400650072005F00440065007300740072006F0079004600610076006F0072006900740065005D002800400043006F006E00730075006D00650072004B006500790020005B006E0076006100720063006800610072005D00280031003000300029002C002000400043006F006E00730075006D006500720053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C00200040005300740061007400750073004900440020005B0062006900670069006E0074005D0029002000520045005400550052004E005300200020005400410042004C004500200028005B00530074006100740075007300490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B0043007200650061007400650064005D0020005B006400610074006500740069006D0065005D0020004E0055004C004C002C0020005B0049006E005200650070006C00790054006F00530074006100740075007300490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B0049006E005200650070006C00790054006F005500730065007200490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B00490073004600610076006F00720069007400650064005D0020005B006200690074005D0020004E0055004C004C002C0020005B00490073005400720075006E00630061007400650064005D0020005B006200690074005D0020004E0055004C004C002C0020005B0053006F0075007200630065005D0020005B006E0076006100720063006800610072005D002800320030003000290020004E0055004C004C002C0020005B0053007400610074007500730054006500780074005D0020005B006E0076006100720063006800610072005D002800330030003000290020004E0055004C004C002C0020005B0052006500630069007000690065006E007400490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B00540069006D0065005A006F006E0065005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B00530063007200650065006E004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B0055007300650072004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B005500730065007200490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B004C006F0063006100740069006F006E005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B0050006C00610063006500490044005D0020005B006E0076006100720063006800610072005D00280035003000290020004E0055004C004C002C0020005B0050006C006100630065004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C00610063006500460075006C006C004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C0061006300650054007900700065005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C0061006300650043006F0075006E007400720079005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C006100630065004C0061007400690074007500640065005D0020005B0066006C006F00610074005D0020004E0055004C004C002C0020005B0050006C006100630065004C006F006E006700690074007500640065005D0020005B0066006C006F00610074005D0020004E0055004C004C002C0020005B0052006100740065004C0069006D00690074005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B0052006100740065004C0069006D0069007400520065006D00610069006E0069006E0067005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B0052006100740065004C0069006D0069007400520065007300650074005D0020005B006400610074006500740069006D0065005D0020004E0055004C004C00290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E00540077006900740074006500720069007A00650072005D002E005B0054005700490054005400450052005D002E005B00440065007300740072006F0079004600610076006F0072006900740065005D000082395D002E005B0054007700690074007400650072005F00440065007300740072006F0079005300740061007400750073005D002800400043006F006E00730075006D00650072004B006500790020005B006E0076006100720063006800610072005D00280031003000300029002C002000400043006F006E00730075006D006500720053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C00200040005300740061007400750073004900440020005B0062006900670069006E0074005D0029002000520045005400550052004E00530020005B006E0076006100720063006800610072005D0028003400300030003000290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E00540077006900740074006500720069007A00650072005D002E005B0054005700490054005400450052005D002E005B00440065007300740072006F0079005300740061007400750073005D000086415D002E005B0054007700690074007400650072005F0046006F006C006C006F00770055007300650072005D002800400043006F006E00730075006D00650072004B006500790020005B006E0076006100720063006800610072005D00280031003000300029002C002000400043006F006E00730075006D006500720053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C0020004000530063007200650065006E004E0061006D00650020005B006E0076006100720063006800610072005D00280032003000290029002000520045005400550052004E00530020005400410042004C00450020002800550073006500720049004400200042004900470049004E0054002C002000530063007200650065006E004E0061006D00650020004E005600410052004300480041005200280031003000300029002C00200055007300650072004E0061006D00650020004E005600410052004300480041005200280031003000300029002C00200049007300500072006F0074006500630074006500640020004200490054002C002000490073005600650072006900660069006500640020004200490054002C0020004400650073006300720069007000740069006F006E0020004E0056004100520043004800410052002800340030003000300029002C00200043007200650061007400650064004F006E0020004400410054004500540049004D0045002C0020004C006F0063006100740069006F006E0020004E005600410052004300480041005200280035003000300029002C002000540069006D0065005A006F006E00650020004E005600410052004300480041005200280031003000300029002C0020005500540043004F0066006600730065007400200049004E0054002C002000500072006F00660069006C00650049006D0061006700650055007200690020004E0056004100520043004800410052002800320030003400380029002C002000500072006F00660069006C00650055007200690020004E0056004100520043004800410052002800320030003400380029002C00200046007200690065006E006400730043006F0075006E007400200049004E0054002C0020004E0075006D006200650072004F00660046006F006C006C006F007700650072007300200049004E0054002C0020004E0075006D006200650072004F00660053007400610074007500730065007300200049004E0054002C002000530074006100740075007300540065007800740020004E005600410052004300480041005200280033003000300029002C00200052006100740065004C0069006D0069007400200049004E0054002C00200052006100740065004C0069006D0069007400520065006D00610069006E0069006E006700200049004E0054002C00200052006100740065004C0069006D00690074005200650073006500740020004400410054004500540049004D0045002C0020004C0061006E006700750061006700650020004E00560041005200430048004100520028003500300029002C0020004E0075006D006200650072004F0066005000750062006C00690063004C006900730074004D0065006D0062006500720073006800690070007300200049004E0054002C00200049007300470065006F0045006E00610062006C006500640020004200490054002C00200046006F006C006C006F00770069006E00670020004200490054002C0020004D007500740069006E0067002000420049005400290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E00540077006900740074006500720069007A00650072005D002E005B0054005700490054005400450052005D002E005B0046006F006C006C006F00770055007300650072005D000086055D002E005B0054007700690074007400650072005F0047006500740042006C006F0063006B0073005D002800400043006F006E00730075006D00650072004B006500790020005B006E0076006100720063006800610072005D00280031003000300029002C002000400043006F006E00730075006D006500720053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0053006500630072006500740020005B006E0076006100720063006800610072005D002800310030003000290029002000520045005400550052004E00530020005400410042004C00450020002800550073006500720049004400200042004900470049004E0054002C002000530063007200650065006E004E0061006D00650020004E005600410052004300480041005200280031003000300029002C00200055007300650072004E0061006D00650020004E005600410052004300480041005200280031003000300029002C00200049007300500072006F0074006500630074006500640020004200490054002C002000490073005600650072006900660069006500640020004200490054002C0020004400650073006300720069007000740069006F006E0020004E0056004100520043004800410052002800340030003000300029002C00200043007200650061007400650064004F006E0020004400410054004500540049004D0045002C0020004C006F0063006100740069006F006E0020004E005600410052004300480041005200280035003000300029002C002000540069006D0065005A006F006E00650020004E005600410052004300480041005200280031003000300029002C0020005500540043004F0066006600730065007400200049004E0054002C002000500072006F00660069006C00650049006D0061006700650055007200690020004E0056004100520043004800410052002800320030003400380029002C002000500072006F00660069006C00650055007200690020004E0056004100520043004800410052002800320030003400380029002C00200046007200690065006E006400730043006F0075006E007400200049004E0054002C0020004E0075006D006200650072004F00660046006F006C006C006F007700650072007300200049004E0054002C0020004E0075006D006200650072004F00660053007400610074007500730065007300200049004E0054002C002000530074006100740075007300540065007800740020004E005600410052004300480041005200280033003000300029002C00200052006100740065004C0069006D0069007400200049004E0054002C00200052006100740065004C0069006D0069007400520065006D00610069006E0069006E006700200049004E0054002C00200052006100740065004C0069006D00690074005200650073006500740020004400410054004500540049004D0045002C0020004C0061006E006700750061006700650020004E00560041005200430048004100520028003500300029002C0020004E0075006D006200650072004F0066005000750062006C00690063004C006900730074004D0065006D0062006500720073006800690070007300200049004E0054002C00200049007300470065006F0045006E00610062006C006500640020004200490054002C00200046006F006C006C006F00770069006E00670020004200490054002C0020004D007500740069006E0067002000420049005400290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E00540077006900740074006500720069007A00650072005D002E005B0054005700490054005400450052005D002E005B0047006500740042006C006F0063006B0073005D0000815F5D002E005B0054007700690074007400650072005F004700650074004600610076006F00720069007400650073005D002800400043006F006E00730075006D00650072004B006500790020005B006E0076006100720063006800610072005D00280031003000300029002C002000400043006F006E00730075006D006500720053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C00200040004F007000740069006F006E0061006C0050006100720061006D006500740065007200730020005B000086CD5D002E005B0054007900700065005F0048006100730068005400610062006C0065005D0029002000520045005400550052004E00530020005400410042004C004500200028005B00530074006100740075007300490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B0043007200650061007400650064005D0020005B006400610074006500740069006D0065005D0020004E0055004C004C002C0020005B0049006E005200650070006C00790054006F00530074006100740075007300490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B0049006E005200650070006C00790054006F005500730065007200490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B00490073004600610076006F00720069007400650064005D0020005B006200690074005D0020004E0055004C004C002C0020005B00490073005400720075006E00630061007400650064005D0020005B006200690074005D0020004E0055004C004C002C0020005B0053006F0075007200630065005D0020005B006E0076006100720063006800610072005D002800320030003000290020004E0055004C004C002C0020005B0053007400610074007500730054006500780074005D0020005B006E0076006100720063006800610072005D002800330030003000290020004E0055004C004C002C0020005B0052006500630069007000690065006E007400490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B00540069006D0065005A006F006E0065005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B00530063007200650065006E004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B0055007300650072004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B005500730065007200490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B004C006F0063006100740069006F006E005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B0050006C00610063006500490044005D0020005B006E0076006100720063006800610072005D00280035003000290020004E0055004C004C002C0020005B0050006C006100630065004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C00610063006500460075006C006C004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C0061006300650054007900700065005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C0061006300650043006F0075006E007400720079005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C006100630065004C0061007400690074007500640065005D0020005B0066006C006F00610074005D0020004E0055004C004C002C0020005B0050006C006100630065004C006F006E006700690074007500640065005D0020005B0066006C006F00610074005D0020004E0055004C004C002C0020005B0052006100740065004C0069006D00690074005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B0052006100740065004C0069006D0069007400520065006D00610069006E0069006E0067005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B0052006100740065004C0069006D0069007400520065007300650074005D0020005B006400610074006500740069006D0065005D0020004E0055004C004C00290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E00540077006900740074006500720069007A00650072005D002E005B0054005700490054005400450052005D002E005B004700650074004600610076006F00720069007400650073005D000086135D002E005B0054007700690074007400650072005F0047006500740046006F006C006C006F0077006500720073005D002800400043006F006E00730075006D00650072004B006500790020005B006E0076006100720063006800610072005D00280031003000300029002C002000400043006F006E00730075006D006500720053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0053006500630072006500740020005B006E0076006100720063006800610072005D002800310030003000290029002000520045005400550052004E00530020005400410042004C00450020002800550073006500720049004400200042004900470049004E0054002C002000530063007200650065006E004E0061006D00650020004E005600410052004300480041005200280031003000300029002C00200055007300650072004E0061006D00650020004E005600410052004300480041005200280031003000300029002C00200049007300500072006F0074006500630074006500640020004200490054002C002000490073005600650072006900660069006500640020004200490054002C0020004400650073006300720069007000740069006F006E0020004E0056004100520043004800410052002800340030003000300029002C00200043007200650061007400650064004F006E0020004400410054004500540049004D0045002C0020004C006F0063006100740069006F006E0020004E005600410052004300480041005200280035003000300029002C002000540069006D0065005A006F006E00650020004E005600410052004300480041005200280031003000300029002C0020005500540043004F0066006600730065007400200049004E0054002C002000500072006F00660069006C00650049006D0061006700650055007200690020004E0056004100520043004800410052002800320030003400380029002C002000500072006F00660069006C00650055007200690020004E0056004100520043004800410052002800320030003400380029002C00200046007200690065006E006400730043006F0075006E007400200049004E0054002C0020004E0075006D006200650072004F00660046006F006C006C006F007700650072007300200049004E0054002C0020004E0075006D006200650072004F00660053007400610074007500730065007300200049004E0054002C002000530074006100740075007300540065007800740020004E005600410052004300480041005200280033003000300029002C00200052006100740065004C0069006D0069007400200049004E0054002C00200052006100740065004C0069006D0069007400520065006D00610069006E0069006E006700200049004E0054002C00200052006100740065004C0069006D00690074005200650073006500740020004400410054004500540049004D0045002C0020004C0061006E006700750061006700650020004E00560041005200430048004100520028003500300029002C0020004E0075006D006200650072004F0066005000750062006C00690063004C006900730074004D0065006D0062006500720073006800690070007300200049004E0054002C00200049007300470065006F0045006E00610062006C006500640020004200490054002C00200046006F006C006C006F00770069006E00670020004200490054002C0020004D007500740069006E0067002000420049005400290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C004500520020\
-004100530020002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E00540077006900740074006500720069007A00650072005D002E005B0054005700490054005400450052005D002E005B0047006500740046006F006C006C006F0077006500720073005D000086095D002E005B0054007700690074007400650072005F0047006500740046007200690065006E00640073005D002800400043006F006E00730075006D00650072004B006500790020005B006E0076006100720063006800610072005D00280031003000300029002C002000400043006F006E00730075006D006500720053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0053006500630072006500740020005B006E0076006100720063006800610072005D002800310030003000290029002000520045005400550052004E00530020005400410042004C00450020002800550073006500720049004400200042004900470049004E0054002C002000530063007200650065006E004E0061006D00650020004E005600410052004300480041005200280031003000300029002C00200055007300650072004E0061006D00650020004E005600410052004300480041005200280031003000300029002C00200049007300500072006F0074006500630074006500640020004200490054002C002000490073005600650072006900660069006500640020004200490054002C0020004400650073006300720069007000740069006F006E0020004E0056004100520043004800410052002800340030003000300029002C00200043007200650061007400650064004F006E0020004400410054004500540049004D0045002C0020004C006F0063006100740069006F006E0020004E005600410052004300480041005200280035003000300029002C002000540069006D0065005A006F006E00650020004E005600410052004300480041005200280031003000300029002C0020005500540043004F0066006600730065007400200049004E0054002C002000500072006F00660069006C00650049006D0061006700650055007200690020004E0056004100520043004800410052002800320030003400380029002C002000500072006F00660069006C00650055007200690020004E0056004100520043004800410052002800320030003400380029002C00200046007200690065006E006400730043006F0075006E007400200049004E0054002C0020004E0075006D006200650072004F00660046006F006C006C006F007700650072007300200049004E0054002C0020004E0075006D006200650072004F00660053007400610074007500730065007300200049004E0054002C002000530074006100740075007300540065007800740020004E005600410052004300480041005200280033003000300029002C00200052006100740065004C0069006D0069007400200049004E0054002C00200052006100740065004C0069006D0069007400520065006D00610069006E0069006E006700200049004E0054002C00200052006100740065004C0069006D00690074005200650073006500740020004400410054004500540049004D0045002C0020004C0061006E006700750061006700650020004E00560041005200430048004100520028003500300029002C0020004E0075006D006200650072004F0066005000750062006C00690063004C006900730074004D0065006D0062006500720073006800690070007300200049004E0054002C00200049007300470065006F0045006E00610062006C006500640020004200490054002C00200046006F006C006C006F00770069006E00670020004200490054002C0020004D007500740069006E0067002000420049005400290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E00540077006900740074006500720069007A00650072005D002E005B0054005700490054005400450052005D002E005B0047006500740046007200690065006E00640073005D000081655D002E005B0054007700690074007400650072005F0047006500740048006F006D006500540069006D0065006C0069006E0065005D002800400043006F006E00730075006D00650072004B006500790020005B006E0076006100720063006800610072005D00280031003000300029002C002000400043006F006E00730075006D006500720053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C00200040004F007000740069006F006E0061006C0050006100720061006D006500740065007200730020005B000086D55D002E005B0054007900700065005F0048006100730068005400610062006C0065005D0029002000520045005400550052004E00530020005400410042004C004500200028005B00530074006100740075007300490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B0043007200650061007400650064005D0020005B006400610074006500740069006D0065005D0020004E0055004C004C002C0020005B0049006E005200650070006C00790054006F00530074006100740075007300490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B0049006E005200650070006C00790054006F005500730065007200490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B00490073004600610076006F00720069007400650064005D0020005B006200690074005D0020004E0055004C004C002C0020005B00490073005400720075006E00630061007400650064005D0020005B006200690074005D0020004E0055004C004C002C0020005B0053006F0075007200630065005D0020005B006E0076006100720063006800610072005D002800320030003000290020004E0055004C004C002C0020005B0053007400610074007500730054006500780074005D0020005B006E0076006100720063006800610072005D002800330030003000290020004E0055004C004C002C0020005B0052006500630069007000690065006E007400490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B00540069006D0065005A006F006E0065005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B00530063007200650065006E004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B0055007300650072004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B005500730065007200490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B004C006F0063006100740069006F006E005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B0050006C00610063006500490044005D0020005B006E0076006100720063006800610072005D00280035003000290020004E0055004C004C002C0020005B0050006C006100630065004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C00610063006500460075006C006C004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C0061006300650054007900700065005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C0061006300650043006F0075006E007400720079005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C006100630065004C0061007400690074007500640065005D0020005B0066006C006F00610074005D0020004E0055004C004C002C0020005B0050006C006100630065004C006F006E006700690074007500640065005D0020005B0066006C006F00610074005D0020004E0055004C004C002C0020005B0052006100740065004C0069006D00690074005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B0052006100740065004C0069006D0069007400520065006D00610069006E0069006E0067005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B0052006100740065004C0069006D0069007400520065007300650074005D0020005B006400610074006500740069006D0065005D0020004E0055004C004C002000290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E00540077006900740074006500720069007A00650072005D002E005B0054005700490054005400450052005D002E005B0047006500740048006F006D006500540069006D0065006C0069006E0065005D0000815D5D002E005B0054007700690074007400650072005F004700650074004D0065006E00740069006F006E0073005D002800400043006F006E00730075006D00650072004B006500790020005B006E0076006100720063006800610072005D00280031003000300029002C002000400043006F006E00730075006D006500720053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C00200040004F007000740069006F006E0061006C0050006100720061006D006500740065007200730020005B000086CB5D002E005B0054007900700065005F0048006100730068005400610062006C0065005D0029002000520045005400550052004E00530020005400410042004C004500200028005B00530074006100740075007300490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B0043007200650061007400650064005D0020005B006400610074006500740069006D0065005D0020004E0055004C004C002C0020005B0049006E005200650070006C00790054006F00530074006100740075007300490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B0049006E005200650070006C00790054006F005500730065007200490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B00490073004600610076006F00720069007400650064005D0020005B006200690074005D0020004E0055004C004C002C0020005B00490073005400720075006E00630061007400650064005D0020005B006200690074005D0020004E0055004C004C002C0020005B0053006F0075007200630065005D0020005B006E0076006100720063006800610072005D002800320030003000290020004E0055004C004C002C0020005B0053007400610074007500730054006500780074005D0020005B006E0076006100720063006800610072005D002800330030003000290020004E0055004C004C002C0020005B0052006500630069007000690065006E007400490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B00540069006D0065005A006F006E0065005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B00530063007200650065006E004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B0055007300650072004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B005500730065007200490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B004C006F0063006100740069006F006E005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B0050006C00610063006500490044005D0020005B006E0076006100720063006800610072005D00280035003000290020004E0055004C004C002C0020005B0050006C006100630065004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C00610063006500460075006C006C004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C0061006300650054007900700065005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C0061006300650043006F0075006E007400720079005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C006100630065004C0061007400690074007500640065005D0020005B0066006C006F00610074005D0020004E0055004C004C002C0020005B0050006C006100630065004C006F006E006700690074007500640065005D0020005B0066006C006F00610074005D0020004E0055004C004C002C0020005B0052006100740065004C0069006D00690074005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B0052006100740065004C0069006D0069007400520065006D00610069006E0069006E0067005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B0052006100740065004C0069006D0069007400520065007300650074005D0020005B006400610074006500740069006D0065005D0020004E0055004C004C00290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E00540077006900740074006500720069007A00650072005D002E005B0054005700490054005400450052005D002E005B004700650074004D0065006E00740069006F006E0073005D0000815D5D002E005B0054007700690074007400650072005F004700650074004D0065007300730061006700650073005D002800400043006F006E00730075006D00650072004B006500790020005B006E0076006100720063006800610072005D00280031003000300029002C002000400043006F006E00730075006D006500720053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C00200040004F007000740069006F006E0061006C0050006100720061006D006500740065007200730020005B000086CB5D002E005B0054007900700065005F0048006100730068005400610062006C0065005D0029002000520045005400550052004E00530020005400410042004C004500200028005B00530074006100740075007300490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B0043007200650061007400650064005D0020005B006400610074006500740069006D0065005D0020004E0055004C004C002C0020005B0049006E005200650070006C00790054006F00530074006100740075007300490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B0049006E005200650070006C00790054006F005500730065007200490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B00490073004600610076006F00720069007400650064005D0020005B006200690074005D0020004E0055004C004C002C0020005B00490073005400720075006E00630061007400650064005D0020005B006200690074005D0020004E0055004C004C002C0020005B0053006F0075007200630065005D0020005B006E0076006100720063006800610072005D002800320030003000290020004E0055004C004C002C0020005B0053007400610074007500730054006500780074005D0020005B006E0076006100720063006800610072005D002800330030003000290020004E0055004C004C002C0020005B0052006500630069007000690065006E007400490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B00540069006D0065005A006F006E0065005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B00530063007200650065006E004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B0055007300650072004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B005500730065007200490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B004C006F0063006100740069006F006E005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B0050006C00610063006500490044005D0020005B006E0076006100720063006800610072005D00280035003000290020004E0055004C004C002C0020005B0050006C006100630065004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C00610063006500460075006C006C004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C0061006300650054007900700065005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C0061006300650043006F0075006E007400720079005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C006100630065004C0061007400690074007500640065005D0020005B0066006C006F00610074005D0020004E0055004C004C002C0020005B0050006C006100630065004C006F006E006700690074007500640065005D0020005B0066006C006F00610074005D0020004E0055004C004C002C0020005B0052006100740065004C0069006D00690074005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B0052006100740065004C0069006D0069007400520065006D00610069006E0069006E0067005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B0052006100740065004C0069006D0069007400520065007300650074005D0020005B006400610074006500740069006D0065005D0020004E0055004C004C00290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E00540077006900740074006500720069007A00650072005D002E005B0054005700490054005400450052005D002E005B004700650074004D0065007300730061006700650073005D000087975D002E005B0054007700690074007400650072005F00470065007400520065007400770065006500740065006400420079005D002800400043006F006E00730075006D00650072004B006500790020005B006E0076006100720063006800610072005D00280031003000300029002C002000400043006F006E00730075006D006500720053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C00200040005300740061007400750073004900440020005B0062006900670069006E0074005D0029002000520045005400550052004E00530020005400410042004C004500200028005B005500730065007200490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B00530063007200650065006E004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B0055007300650072004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B0049007300500072006F007400650063007400650064005D0020005B006200690074005D0020004E0055004C004C002C0020005B0049007300560065007200690066006900650064005D0020005B006200690074005D0020004E0055004C004C002C0020005B004400650073006300720069007000740069006F006E005D0020005B006E0076006100720063006800610072005D0028003400300030003000290020004E0055004C004C002C0020005B0043007200650061007400650064004F006E005D0020005B006400610074006500740069006D0065005D0020004E0055004C004C002C0020005B004C006F0063006100740069006F006E005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B00540069006D0065005A006F006E0065005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B005500540043004F00660066007300650074005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B00500072006F00660069006C00650049006D006100670065005500720069005D0020005B006E0076006100720063006800610072005D0028003200300034003800290020004E0055004C004C002C0020005B00500072006F00660069006C0065005500720069005D0020005B006E0076006100720063006800610072005D0028003200300034003800290020004E0055004C004C002C0020005B0046007200690065006E006400730043006F0075006E0074005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B004E0075006D006200650072004F00660046006F006C006C006F0077006500720073005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B004E0075006D006200650072004F006600530074006100740075007300650073005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B0053007400610074007500730054006500780074005D0020005B006E0076006100720063006800610072005D002800330030003000290020004E0055004C004C002C0020005B0052006100740065004C0069006D00690074005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B0052006100740065004C0069006D0069007400520065006D00610069006E0069006E0067005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B0052006100740065004C0069006D0069007400520065007300650074005D0020005B006400610074006500740069006D0065005D0020004E0055004C004C002C0020004C0061006E006700750061006700650020004E00560041005200430048004100520028003500300029002C0020004E0075006D006200650072004F0066005000750062006C00690063004C006900730074004D0065006D0062006500720073006800690070007300200049004E0054002C00200049007300470065006F0045006E00610062006C006500640020004200490054002C00200046006F006C006C006F00770069006E00670020004200490054002C0020004D007500740069006E0067002000420049005400290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E00540077006900740074006500720069007A00650072005D002E005B0054005700490054005400450052005D002E005B00470065007400520065007400770065006500740065006400420079005D000081855D002E005B0054007700690074007400650072005F00470065007400520065007400770065006500740073005D002800400043006F006E00730075006D00650072004B006500790020005B006E0076006100720063006800\
-610072005D00280031003000300029002C002000400043006F006E00730075006D006500720053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C00200040005300740061007400750073004900440020005B0062006900670069006E0074005D002C00200040004F007000740069006F006E0061006C0050006100720061006D006500740065007200730020005B000086CB5D002E005B0054007900700065005F0048006100730068005400610062006C0065005D0029002000520045005400550052004E00530020005400410042004C004500200028005B00530074006100740075007300490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B0043007200650061007400650064005D0020005B006400610074006500740069006D0065005D0020004E0055004C004C002C0020005B0049006E005200650070006C00790054006F00530074006100740075007300490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B0049006E005200650070006C00790054006F005500730065007200490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B00490073004600610076006F00720069007400650064005D0020005B006200690074005D0020004E0055004C004C002C0020005B00490073005400720075006E00630061007400650064005D0020005B006200690074005D0020004E0055004C004C002C0020005B0053006F0075007200630065005D0020005B006E0076006100720063006800610072005D002800320030003000290020004E0055004C004C002C0020005B0053007400610074007500730054006500780074005D0020005B006E0076006100720063006800610072005D002800330030003000290020004E0055004C004C002C0020005B0052006500630069007000690065006E007400490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B00540069006D0065005A006F006E0065005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B00530063007200650065006E004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B0055007300650072004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B005500730065007200490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B004C006F0063006100740069006F006E005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B0050006C00610063006500490044005D0020005B006E0076006100720063006800610072005D00280035003000290020004E0055004C004C002C0020005B0050006C006100630065004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C00610063006500460075006C006C004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C0061006300650054007900700065005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C0061006300650043006F0075006E007400720079005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C006100630065004C0061007400690074007500640065005D0020005B0066006C006F00610074005D0020004E0055004C004C002C0020005B0050006C006100630065004C006F006E006700690074007500640065005D0020005B0066006C006F00610074005D0020004E0055004C004C002C0020005B0052006100740065004C0069006D00690074005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B0052006100740065004C0069006D0069007400520065006D00610069006E0069006E0067005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B0052006100740065004C0069006D0069007400520065007300650074005D0020005B006400610074006500740069006D0065005D0020004E0055004C004C00290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E00540077006900740074006500720069007A00650072005D002E005B0054005700490054005400450052005D002E005B00470065007400520065007400770065006500740073005D000081655D002E005B0054007700690074007400650072005F00470065007400520065007400770065006500740073004F0066004D0065005D002800400043006F006E00730075006D00650072004B006500790020005B006E0076006100720063006800610072005D00280031003000300029002C002000400043006F006E00730075006D006500720053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C00200040004F007000740069006F006E0061006C0050006100720061006D006500740065007200730020005B000086D35D002E005B0054007900700065005F0048006100730068005400610062006C0065005D0029002000520045005400550052004E00530020005400410042004C004500200028005B00530074006100740075007300490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B0043007200650061007400650064005D0020005B006400610074006500740069006D0065005D0020004E0055004C004C002C0020005B0049006E005200650070006C00790054006F00530074006100740075007300490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B0049006E005200650070006C00790054006F005500730065007200490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B00490073004600610076006F00720069007400650064005D0020005B006200690074005D0020004E0055004C004C002C0020005B00490073005400720075006E00630061007400650064005D0020005B006200690074005D0020004E0055004C004C002C0020005B0053006F0075007200630065005D0020005B006E0076006100720063006800610072005D002800320030003000290020004E0055004C004C002C0020005B0053007400610074007500730054006500780074005D0020005B006E0076006100720063006800610072005D002800330030003000290020004E0055004C004C002C0020005B0052006500630069007000690065006E007400490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B00540069006D0065005A006F006E0065005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B00530063007200650065006E004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B0055007300650072004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B005500730065007200490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B004C006F0063006100740069006F006E005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B0050006C00610063006500490044005D0020005B006E0076006100720063006800610072005D00280035003000290020004E0055004C004C002C0020005B0050006C006100630065004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C00610063006500460075006C006C004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C0061006300650054007900700065005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C0061006300650043006F0075006E007400720079005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C006100630065004C0061007400690074007500640065005D0020005B0066006C006F00610074005D0020004E0055004C004C002C0020005B0050006C006100630065004C006F006E006700690074007500640065005D0020005B0066006C006F00610074005D0020004E0055004C004C002C0020005B0052006100740065004C0069006D00690074005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B0052006100740065004C0069006D0069007400520065006D00610069006E0069006E0067005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B0052006100740065004C0069006D0069007400520065007300650074005D0020005B006400610074006500740069006D0065005D0020004E0055004C004C00290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E00540077006900740074006500720069007A00650072005D002E005B0054005700490054005400450052005D002E005B00470065007400520065007400770065006500740073004F0066004D0065005D000081655D002E005B0054007700690074007400650072005F00470065007400530065006E0074004D0065007300730061006700650073005D002800400043006F006E00730075006D00650072004B006500790020005B006E0076006100720063006800610072005D00280031003000300029002C002000400043006F006E00730075006D006500720053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C00200040004F007000740069006F006E0061006C0050006100720061006D006500740065007200730020005B000086D35D002E005B0054007900700065005F0048006100730068005400610062006C0065005D0029002000520045005400550052004E00530020005400410042004C004500200028005B00530074006100740075007300490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B0043007200650061007400650064005D0020005B006400610074006500740069006D0065005D0020004E0055004C004C002C0020005B0049006E005200650070006C00790054006F00530074006100740075007300490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B0049006E005200650070006C00790054006F005500730065007200490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B00490073004600610076006F00720069007400650064005D0020005B006200690074005D0020004E0055004C004C002C0020005B00490073005400720075006E00630061007400650064005D0020005B006200690074005D0020004E0055004C004C002C0020005B0053006F0075007200630065005D0020005B006E0076006100720063006800610072005D002800320030003000290020004E0055004C004C002C0020005B0053007400610074007500730054006500780074005D0020005B006E0076006100720063006800610072005D002800330030003000290020004E0055004C004C002C0020005B0052006500630069007000690065006E007400490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B00540069006D0065005A006F006E0065005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B00530063007200650065006E004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B0055007300650072004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B005500730065007200490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B004C006F0063006100740069006F006E005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B0050006C00610063006500490044005D0020005B006E0076006100720063006800610072005D00280035003000290020004E0055004C004C002C0020005B0050006C006100630065004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C00610063006500460075006C006C004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C0061006300650054007900700065005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C0061006300650043006F0075006E007400720079005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C006100630065004C0061007400690074007500640065005D0020005B0066006C006F00610074005D0020004E0055004C004C002C0020005B0050006C006100630065004C006F006E006700690074007500640065005D0020005B0066006C006F00610074005D0020004E0055004C004C002C0020005B0052006100740065004C0069006D00690074005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B0052006100740065004C0069006D0069007400520065006D00610069006E0069006E0067005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B0052006100740065004C0069006D0069007400520065007300650074005D0020005B006400610074006500740069006D0065005D0020004E0055004C004C00290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E00540077006900740074006500720069007A00650072005D002E005B0054005700490054005400450052005D002E005B00470065007400530065006E0074004D0065007300730061006700650073005D000087F55D002E005B0054007700690074007400650072005F004700650074005300740061007400750073005D002800400043006F006E00730075006D00650072004B006500790020005B006E0076006100720063006800610072005D00280031003000300029002C002000400043006F006E00730075006D006500720053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C00200040005300740061007400750073004900440020005B0062006900670069006E0074005D0029002000520045005400550052004E00530020005400410042004C004500200028005B00530074006100740075007300490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B0043007200650061007400650064005D0020005B006400610074006500740069006D0065005D0020004E0055004C004C002C0020005B0049006E005200650070006C00790054006F00530074006100740075007300490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B0049006E005200650070006C00790054006F005500730065007200490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B00490073004600610076006F00720069007400650064005D0020005B006200690074005D0020004E0055004C004C002C0020005B00490073005400720075006E00630061007400650064005D0020005B006200690074005D0020004E0055004C004C002C0020005B0053006F0075007200630065005D0020005B006E0076006100720063006800610072005D002800320030003000290020004E0055004C004C002C0020005B0053007400610074007500730054006500780074005D0020005B006E0076006100720063006800610072005D002800330030003000290020004E0055004C004C002C0020005B0052006500630069007000690065006E007400490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B00540069006D0065005A006F006E0065005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B00530063007200650065006E004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B0055007300650072004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B005500730065007200490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B004C006F0063006100740069006F006E005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B0050006C00610063006500490044005D0020005B006E0076006100720063006800610072005D00280035003000290020004E0055004C004C002C0020005B0050006C006100630065004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C00610063006500460075006C006C004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C0061006300650054007900700065005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C0061006300650043006F0075006E007400720079005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C006100630065004C0061007400690074007500640065005D0020005B0066006C006F00610074005D0020004E0055004C004C002C0020005B0050006C006100630065004C006F006E006700690074007500640065005D0020005B0066006C006F00610074005D0020004E0055004C004C002C0020005B0052006100740065004C0069006D00690074005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B0052006100740065004C0069006D0069007400520065006D00610069006E0069006E0067005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B0052006100740065004C0069006D0069007400520065007300650074005D0020005B006400610074006500740069006D0065005D0020004E0055004C004C00290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E00540077006900740074006500720069007A00650072005D002E005B0054005700490054005400450052005D002E005B004700650074005300740061007400750073005D000086455D002E005B0054007700690074007400650072005F0047006500740055007300650072005D002800400043006F006E00730075006D00650072004B006500790020005B006E0076006100720063006800610072005D00280031003000300029002C002000400043006F006E00730075006D006500720053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C00200040005500730065007200490044006F007200530063007200650065006E004E0061006D00650020005B006E0076006100720063006800610072005D00280032003000290029002000520045005400550052004E00530020005400410042004C00450020002800550073006500720049004400200042004900470049004E0054002C002000530063007200650065006E004E0061006D00650020004E005600410052004300480041005200280031003000300029002C00200055007300650072004E0061006D00650020004E005600410052004300480041005200280031003000300029002C00200049007300500072006F0074006500630074006500640020004200490054002C002000490073005600650072006900660069006500640020004200490054002C0020004400650073006300720069007000740069006F006E0020004E0056004100520043004800410052002800340030003000300029002C00200043007200650061007400650064004F006E0020004400410054004500540049004D0045002C0020004C006F0063006100740069006F006E0020004E005600410052004300480041005200280035003000300029002C002000540069006D0065005A006F006E00650020004E005600410052004300480041005200280031003000300029002C0020005500540043004F0066006600730065007400200049004E0054002C002000500072006F00660069006C00650049006D0061006700650055007200690020004E0056004100520043004800410052002800320030003400380029002C002000500072006F00660069006C00650055007200690020004E0056004100520043004800410052002800320030003400380029002C00200046007200690065006E006400730043006F0075006E007400200049004E0054002C0020004E0075006D006200650072004F00660046006F006C006C006F007700650072007300200049004E0054002C0020004E0075006D006200650072004F00660053007400610074007500730065007300200049004E0054002C002000530074006100740075007300540065007800740020004E005600410052004300480041005200280033003000300029002C00200052006100740065004C0069006D0069007400200049004E0054002C00200052006100740065004C0069006D0069007400520065006D00610069006E0069006E006700200049004E0054002C00200052006100740065004C0069006D00690074005200650073006500740020004400410054004500540049004D0045002C0020004C0061006E006700750061006700650020004E00560041005200430048004100520028003500300029002C0020004E0075006D006200650072004F0066005000750062006C00690063004C006900730074004D0065006D0062006500720073006800690070007300200049004E0054002C00200049007300470065006F0045006E00610062006C006500640020004200490054002C00200046006F006C006C006F00770069006E00670020004200490054002C0020004D007500740069006E0067002000420049005400290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E00540077006900740074006500720069007A00650072005D002E005B0054005700490054005400450052005D002E005B0047006500740055007300650072005D000081655D002E005B0054007700690074007400650072005F004700650074005500730065007200540069006D0065006C0069006E0065005D002800400043006F006E00730075006D00650072004B006500790020005B006E007600610072006300\
-6800610072005D00280031003000300029002C002000400043006F006E00730075006D006500720053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C00200040004F007000740069006F006E0061006C0050006100720061006D006500740065007200730020005B000086D35D002E005B0054007900700065005F0048006100730068005400610062006C0065005D0029002000520045005400550052004E00530020005400410042004C004500200028005B00530074006100740075007300490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B0043007200650061007400650064005D0020005B006400610074006500740069006D0065005D0020004E0055004C004C002C0020005B0049006E005200650070006C00790054006F00530074006100740075007300490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B0049006E005200650070006C00790054006F005500730065007200490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B00490073004600610076006F00720069007400650064005D0020005B006200690074005D0020004E0055004C004C002C0020005B00490073005400720075006E00630061007400650064005D0020005B006200690074005D0020004E0055004C004C002C0020005B0053006F0075007200630065005D0020005B006E0076006100720063006800610072005D002800320030003000290020004E0055004C004C002C0020005B0053007400610074007500730054006500780074005D0020005B006E0076006100720063006800610072005D002800330030003000290020004E0055004C004C002C0020005B0052006500630069007000690065006E007400490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B00540069006D0065005A006F006E0065005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B00530063007200650065006E004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B0055007300650072004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B005500730065007200490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B004C006F0063006100740069006F006E005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B0050006C00610063006500490044005D0020005B006E0076006100720063006800610072005D00280035003000290020004E0055004C004C002C0020005B0050006C006100630065004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C00610063006500460075006C006C004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C0061006300650054007900700065005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C0061006300650043006F0075006E007400720079005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C006100630065004C0061007400690074007500640065005D0020005B0066006C006F00610074005D0020004E0055004C004C002C0020005B0050006C006100630065004C006F006E006700690074007500640065005D0020005B0066006C006F00610074005D0020004E0055004C004C002C0020005B0052006100740065004C0069006D00690074005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B0052006100740065004C0069006D0069007400520065006D00610069006E0069006E0067005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B0052006100740065004C0069006D0069007400520065007300650074005D0020005B006400610074006500740069006D0065005D0020004E0055004C004C00290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E00540077006900740074006500720069007A00650072005D002E005B0054005700490054005400450052005D002E005B004700650074005500730065007200540069006D0065006C0069006E0065005D000087ED5D002E005B0054007700690074007400650072005F0052006500740077006500650074005D002800400043006F006E00730075006D00650072004B006500790020005B006E0076006100720063006800610072005D00280031003000300029002C002000400043006F006E00730075006D006500720053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C00200040005300740061007400750073004900440020005B0062006900670069006E0074005D0029002000520045005400550052004E00530020005400410042004C004500200028005B00530074006100740075007300490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B0043007200650061007400650064005D0020005B006400610074006500740069006D0065005D0020004E0055004C004C002C0020005B0049006E005200650070006C00790054006F00530074006100740075007300490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B0049006E005200650070006C00790054006F005500730065007200490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B00490073004600610076006F00720069007400650064005D0020005B006200690074005D0020004E0055004C004C002C0020005B00490073005400720075006E00630061007400650064005D0020005B006200690074005D0020004E0055004C004C002C0020005B0053006F0075007200630065005D0020005B006E0076006100720063006800610072005D002800320030003000290020004E0055004C004C002C0020005B0053007400610074007500730054006500780074005D0020005B006E0076006100720063006800610072005D002800330030003000290020004E0055004C004C002C0020005B0052006500630069007000690065006E007400490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B00540069006D0065005A006F006E0065005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B00530063007200650065006E004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B0055007300650072004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B005500730065007200490044005D0020005B0062006900670069006E0074005D0020004E0055004C004C002C0020005B004C006F0063006100740069006F006E005D0020005B006E0076006100720063006800610072005D002800310030003000290020004E0055004C004C002C0020005B0050006C00610063006500490044005D0020005B006E0076006100720063006800610072005D00280035003000290020004E0055004C004C002C0020005B0050006C006100630065004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C00610063006500460075006C006C004E0061006D0065005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C0061006300650054007900700065005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C0061006300650043006F0075006E007400720079005D0020005B006E0076006100720063006800610072005D002800350030003000290020004E0055004C004C002C0020005B0050006C006100630065004C0061007400690074007500640065005D0020005B0066006C006F00610074005D0020004E0055004C004C002C0020005B0050006C006100630065004C006F006E006700690074007500640065005D0020005B0066006C006F00610074005D0020004E0055004C004C002C0020005B0052006100740065004C0069006D00690074005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B0052006100740065004C0069006D0069007400520065006D00610069006E0069006E0067005D0020005B0069006E0074005D0020004E0055004C004C002C0020005B0052006100740065004C0069006D0069007400520065007300650074005D0020005B006400610074006500740069006D0065005D0020004E0055004C004C00290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E00540077006900740074006500720069007A00650072005D002E005B0054005700490054005400450052005D002E005B0052006500740077006500650074005D0000827B5D002E005B0054007700690074007400650072005F00530065006E0064004400690072006500630074004D006500730073006100670065005D002800400043006F006E00730075006D00650072004B006500790020005B006E0076006100720063006800610072005D00280031003000300029002C002000400043006F006E00730075006D006500720053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C00200040004D0065007300730061006700650020005B006E0076006100720063006800610072005D00280031003400300029002C002000400052006500630069007000690065006E00740020005B006E0076006100720063006800610072005D00280032003000290029002000520045005400550052004E00530020005B0062006900670069006E0074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E00540077006900740074006500720069007A00650072005D002E005B0054005700490054005400450052005D002E005B00530065006E0064004400690072006500630074004D006500730073006100670065005D000086455D002E005B0054007700690074007400650072005F0055006E0042006C006F0063006B0055007300650072005D002800400043006F006E00730075006D00650072004B006500790020005B006E0076006100720063006800610072005D00280031003000300029002C002000400043006F006E00730075006D006500720053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C0020004000530063007200650065006E004E0061006D00650020005B006E0076006100720063006800610072005D00280032003000290029002000520045005400550052004E00530020005400410042004C00450020002800550073006500720049004400200042004900470049004E0054002C002000530063007200650065006E004E0061006D00650020004E005600410052004300480041005200280031003000300029002C00200055007300650072004E0061006D00650020004E005600410052004300480041005200280031003000300029002C00200049007300500072006F0074006500630074006500640020004200490054002C002000490073005600650072006900660069006500640020004200490054002C0020004400650073006300720069007000740069006F006E0020004E0056004100520043004800410052002800340030003000300029002C00200043007200650061007400650064004F006E0020004400410054004500540049004D0045002C0020004C006F0063006100740069006F006E0020004E005600410052004300480041005200280035003000300029002C002000540069006D0065005A006F006E00650020004E005600410052004300480041005200280031003000300029002C0020005500540043004F0066006600730065007400200049004E0054002C002000500072006F00660069006C00650049006D0061006700650055007200690020004E0056004100520043004800410052002800320030003400380029002C002000500072006F00660069006C00650055007200690020004E0056004100520043004800410052002800320030003400380029002C00200046007200690065006E006400730043006F0075006E007400200049004E0054002C0020004E0075006D006200650072004F00660046006F006C006C006F007700650072007300200049004E0054002C0020004E0075006D006200650072004F00660053007400610074007500730065007300200049004E0054002C002000530074006100740075007300540065007800740020004E005600410052004300480041005200280033003000300029002C00200052006100740065004C0069006D0069007400200049004E0054002C00200052006100740065004C0069006D0069007400520065006D00610069006E0069006E006700200049004E0054002C00200052006100740065004C0069006D00690074005200650073006500740020004400410054004500540049004D0045002C0020004C0061006E006700750061006700650020004E00560041005200430048004100520028003500300029002C0020004E0075006D006200650072004F0066005000750062006C00690063004C006900730074004D0065006D0062006500720073006800690070007300200049004E0054002C00200049007300470065006F0045006E00610062006C006500640020004200490054002C00200046006F006C006C006F00770069006E00670020004200490054002C0020004D007500740069006E0067002000420049005400290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E00540077006900740074006500720069007A00650072005D002E005B0054005700490054005400450052005D002E005B0055006E0042006C006F0063006B0055007300650072005D0000866D5D002E005B0054007700690074007400650072005F0055006E0046006F006C006C006F00770055007300650072005D002800400043006F006E00730075006D00650072004B006500790020005B006E0076006100720063006800610072005D00280031003000300029002C002000400043006F006E00730075006D006500720053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C0020004000530063007200650065006E004E0061006D00650020005B006E0076006100720063006800610072005D0028003200300029002C002000400055007300650072004900440020005B0062006900670069006E0074005D0029002000520045005400550052004E00530020005400410042004C00450020002800550073006500720049004400200042004900470049004E0054002C002000530063007200650065006E004E0061006D00650020004E005600410052004300480041005200280031003000300029002C00200055007300650072004E0061006D00650020004E005600410052004300480041005200280031003000300029002C00200049007300500072006F0074006500630074006500640020004200490054002C002000490073005600650072006900660069006500640020004200490054002C0020004400650073006300720069007000740069006F006E0020004E0056004100520043004800410052002800340030003000300029002C00200043007200650061007400650064004F006E0020004400410054004500540049004D0045002C0020004C006F0063006100740069006F006E0020004E005600410052004300480041005200280035003000300029002C002000540069006D0065005A006F006E00650020004E005600410052004300480041005200280031003000300029002C0020005500540043004F0066006600730065007400200049004E0054002C002000500072006F00660069006C00650049006D0061006700650055007200690020004E0056004100520043004800410052002800320030003400380029002C002000500072006F00660069006C00650055007200690020004E0056004100520043004800410052002800320030003400380029002C00200046007200690065006E006400730043006F0075006E007400200049004E0054002C0020004E0075006D006200650072004F00660046006F006C006C006F007700650072007300200049004E0054002C0020004E0075006D006200650072004F00660053007400610074007500730065007300200049004E0054002C002000530074006100740075007300540065007800740020004E005600410052004300480041005200280033003000300029002C00200052006100740065004C0069006D0069007400200049004E0054002C00200052006100740065004C0069006D0069007400520065006D00610069006E0069006E006700200049004E0054002C00200052006100740065004C0069006D00690074005200650073006500740020004400410054004500540049004D0045002C0020004C0061006E006700750061006700650020004E00560041005200430048004100520028003500300029002C0020004E0075006D006200650072004F0066005000750062006C00690063004C006900730074004D0065006D0062006500720073006800690070007300200049004E0054002C00200049007300470065006F0045006E00610062006C006500640020004200490054002C00200046006F006C006C006F00770069006E00670020004200490054002C0020004D007500740069006E0067002000420049005400290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E00540077006900740074006500720069007A00650072005D002E005B0054005700490054005400450052005D002E005B0055006E0046006F006C006C006F00770055007300650072005D000082A15D002E005B0054007700690074007400650072005F005500700064006100740065005D002800400043006F006E00730075006D00650072004B006500790020005B006E0076006100720063006800610072005D00280031003000300029002C002000400043006F006E00730075006D006500720053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0020005B006E0076006100720063006800610072005D00280031003000300029002C002000400041006300630065007300730054006F006B0065006E0053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C00200040004D0065007300730061006700650020005B006E0076006100720063006800610072005D00280031003400300029002C002000400049006E005200650070006C00790054006F005300740061007400750073004900440020005B0062006900670069006E0074005D002C00200040004C00610074006900740075006400650020005B0066006C006F00610074005D002C00200040004C006F006E0067006900740075006400650020005B0066006C006F00610074005D0029002000520045005400550052004E00530020005B0062006900670069006E0074005D0020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E00540077006900740074006500720069007A00650072005D002E005B0054005700490054005400450052005D002E005B005500700064006100740065005D0000824D5D002E005B0054007700690074007400650072005F00780041007500740068005D002800400043006F006E00730075006D00650072004B006500790020005B006E0076006100720063006800610072005D00280031003000300029002C002000400043006F006E00730075006D006500720053006500630072006500740020005B006E0076006100720063006800610072005D00280031003000300029002C002000400055007300650072004E0061006D00650020005B006E0076006100720063006800610072005D00280031003000300029002C0020004000500061007300730077006F007200640020005B006E0076006100720063006800610072005D002800310030003000290029002000520045005400550052004E00530020005400410042004C004500200028005B0041006300630065007300730054006F006B0065006E005D0020005B006E0076006100720063006800610072005D00280031003000300029002C0020005B0041006300630065007300730054006F006B0065006E005300650063007200650074005D0020005B006E0076006100720063006800610072005D0028003100300030002900290020005700490054004800200045005800450043005500540045002000410053002000430041004C004C00450052002000410053002000450058005400450052004E0041004C0020004E0041004D00450020005B00530051004C0023002E00540077006900740074006500720069007A00650072005D002E005B0054005700490054005400450052005D002E005B00780041007500740068005D000021530051004C0023002E00540077006900740074006500720069007A0065007200003B0A000A007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E000A0000390A007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E000A0000077E007E007E00002B20002A002A002A002000530051004C00230020002800530051004C007300680061007200700029002000002B200068006100730020006200650065006E00200069006E007300740061006C006C006500640021002100002B2000200020006E006F007700200079006F0075002000630061006E002000450058004500430020005B0000655D002E00530051004C00730068006100720070005F00480065006C007000200074006F0020006700650074002000610020006C0069007300740020006F00660020007700680061007400200069007300200069006E0063006C0075006400650064002E0000808D2000200020002D002D0020004E004F00540045003A00200049006600200079006F0075002000770061006E007400200074006F0020007500730065002000660075006E006300740069006F006E00730020007400680061007400200061006300630065007300730020007200650073006F007500720063006500730020006F0075007400730069006400650001808B2000200020002D002D0020002000200020002000200020006F00660020007400680065002000640061007400610062006100730065002C0020007300750063006800200061007300200049006E007400650072006E006500740020006F0072002000460069006C006500530079007300740065006D002C00200079006F00750020006D007500730074000125200020002000200020002000200020002000200020002000450058004500430020005B00005D5D002E00530051004C00730068006100720070005F00530065007400530065006300750072006900740079002000320020007C002000330020005B002C002000400041007300730065006D0062006C0079004E\
-0061006D0065005D00005B4D0075007300740020007000610073007300200069006E0020006100200063006F006D006D0061002D0073006500700061007200610074006500640020006C0069007300740020006F0066002000750073006500720073002E00013363006F006E007400650078007400200063006F006E006E0065006300740069006F006E0020003D002000740072007500650000474400450043004C00410052004500090040004F0062006A006500630074004E0061006D006500090009004E005600410052004300480041005200280031003200380029002C00003B09000900090040004F0062006A006500630074005400790070006500090009004E00560041005200430048004100520028003100300029002C00003909000900090040004700720061006E00740054006F00090009004E0056004100520043004800410052002800310030003000300029002C0000410900090009004000530051004C007300680061007200700053006300680065006D00610009004E005600410052004300480041005200280031003000300029000021530045005400200040004700720061006E00740054006F0020003D002000270001032700012F53004500540020004000530051004C007300680061007200700053006300680065006D00610020003D00200027000153530045005400200040004700720061006E00740054006F0020003D0020005200450050004C00410043004500280040004700720061006E00740054006F002C00200027002F0027002C0020002700270029000153530045005400200040004700720061006E00740054006F0020003D0020005200450050004C00410043004500280040004700720061006E00740054006F002C00200027002A0027002C0020002700270029000153530045005400200040004700720061006E00740054006F0020003D0020005200450050004C00410043004500280040004700720061006E00740054006F002C00200027003B0027002C0020002700270029000153530045005400200040004700720061006E00740054006F0020003D0020005200450050004C00410043004500280040004700720061006E00740054006F002C00200027002D0027002C00200027002700290001574400450043004C0041005200450020006300750072005F006F0062006A006500630074007300200043005500520053004F005200200046004100530054005F0046004F0052005700410052004400200046004F00520000310900530045004C00450043005400090073006F002E006E0061006D0065002C00200073006F002E00740079007000650000490900460052004F004D0009007300790073002E006D006F00640075006C0065005F0061007300730065006D0062006C0079005F0075007300610067006500730020006D00610075000043090049004E004E004500520020004A004F0049004E0009007300790073002E0061007300730065006D0062006C006900650073002000610073006D0062006C00790000550900090009004F004E000900610073006D0062006C0079002E0061007300730065006D0062006C0079005F006900640020003D0020006D00610075002E0061007300730065006D0062006C0079005F00690064000081AD09000900090041004E0044000900610073006D0062006C0079002E006E0061006D006500200049004E00200028002700530051004C00230027002C0020002700530051004C0023002E004F00530027002C0020002700530051004C0023002E00540077006900740074006500720069007A006500720027002C0020002700530051004C0023002E00530067006D006C0052006500610064006500720027002C0020002700530051004C0023002E0044006F0074004E00650074005A006900700027002C0020002700530051004C0023002E0049006D0061006700650027002C0020002700530051004C0023002E004400420027002C0020002700530051004C0023002E00460069006C006500530079007300740065006D0027002C0020002700530051004C0023002E004E006500740077006F0072006B0027002C0020002700530051004C0023002E005400790070006500730041006E006400410067006700720065006700610074006500730027002C0020004E002700530051004C0023002E004A0073006F006E004600780027002C0020004E002700530051004C0023002E0058004D004C00270029000135090049004E004E004500520020004A004F0049004E0009007300790073002E006F0062006A006500630074007300200073006F0000450900090009004F004E00090073006F002E006F0062006A006500630074005F006900640020003D0020006D00610075002E006F0062006A006500630074005F0069006400004909000900090041004E004400090073006F002E007400790070006500200049004E002000280027004600540027002C00200027004600530027002C0020002700500043002700290001813709000900090041004E004400090073006F002E006E0061006D00650020004E004F005400200049004E00200028002700530051004C00730068006100720070005F005300650074007500700027002C0020002700530051004C00730068006100720070005F00550070006400610074006500270020002C002700530051004C00730068006100720070005F0055006E0069006E007300740061006C006C0027002C0020002700530051004C00730068006100720070005F005300650074005300650063007500720069007400790027002C0020002700530051004C00730068006100720070005F004700720061006E0074005000650072006D0069007300730069006F006E00730027002C0020002700530051004C00730068006100720070005F0044006F0077006E006C006F00610064002700290001214F00500045004E0020006300750072005F006F0062006A00650063007400730000154600450054004300480009004E004500580054000021460052004F004D0009006300750072005F006F0062006A006500630074007300003B49004E0054004F00090040004F0062006A006500630074004E0061006D0065002C00200040004F0062006A00650063007400540079007000650000355700480049004C0045002000280040004000460045005400430048005F0053005400410054005500530020003D00200030002900000B42004500470049004E0000430900490046002000280040004F0062006A006500630074005400790070006500200049004E002000280027004600530027002C002000270050004300270029002900010D090042004500470049004E000080B3090009004500580045004300280027004700520041004E0054002000450058004500430055005400450020004F004E0020005B00270020002B0020004000530051004C007300680061007200700053006300680065006D00610020002B00200027005D002E005B00270020002B00200040004F0062006A006500630074004E0061006D00650020002B00200027005D00200054004F002000270020002B00200040004700720061006E00740054006F0029000109090045004E004400000B090045004C00530045000080B1090009004500580045004300280027004700520041004E0054002000530045004C0045004300540020004F004E0020005B00270020002B0020004000530051004C007300680061007200700053006300680065006D00610020002B00200027005D002E005B00270020002B00200040004F0062006A006500630074004E0061006D00650020002B00200027005D00200054004F002000270020002B00200040004700720061006E00740054006F002900011709004600450054004300480009004E0045005800540000230900460052004F004D0009006300750072005F006F0062006A006500630074007300003D090049004E0054004F00090040004F0062006A006500630074004E0061006D0065002C00200040004F0062006A006500630074005400790070006500000745004E004400002343004C004F005300450020006300750072005F006F0062006A006500630074007300002D4400450041004C004C004F00430041005400450020006300750072005F006F0062006A006500630074007300004F5000650072006D0069007300730069006F006E005300650074002000630061006E0020006F006E006C007900200062006500200030002C00200031002C00200032002C0020006F00720020003300003D4400450043004C0041005200450009004000440042004E0061006D00650020004E005600410052004300480041005200280031003200380029002C000029090009004000530051004C0020004E00560041005200430048004100520028003200350036002900002F53004500540020004000440042004E0061006D00650020003D002000440042005F004E0041004D00450028002900001F49004600200028004E004F005400200045005800490053005400530028000080AB0900090009000900530045004C004500430054000900730061002E002A002C00200027002D002D002D00270020004100530020005B002D002D002D005D002C0020007500730072002E002A002C00200027002D002D002D00270020004100530020005B002D002D002D005D002C0020006C0067006E002E002A002C00200027002D002D002D00270020004100530020005B002D002D002D005D002C0020007000650072006D002E002A0001350900090009000900460052004F004D0009007300790073002E0061007300730065006D0062006C006900650073002000730061000055090009000900090049004E004E004500520020004A004F0049004E0020007300790073002E00640061007400610062006100730065005F007000720069006E0063006900700061006C007300200075007300720000570900090009000900090009004F004E0009007500730072002E007000720069006E0063006900700061006C005F006900640020003D002000730061002E007000720069006E0063006900700061006C005F00690064000063090009000900090049004E004E004500520020004A004F0049004E0020005B006D00610073007400650072005D002E007300790073002E007300650072007600650072005F007000720069006E0063006900700061006C00730020006C0067006E00003D0900090009000900090009004F004E0009006C0067006E002E005B007300690064005D0020003D0020007500730072002E005B007300690064005D000067090009000900090049004E004E004500520020004A004F0049004E0020005B006D00610073007400650072005D002E007300790073002E007300650072007600650072005F007000650072006D0069007300730069006F006E00730020007000650072006D00006B0900090009000900090009004F004E0009007000650072006D002E006700720061006E007400650065005F007000720069006E0063006900700061006C005F006900640020003D0020006C0067006E002E007000720069006E0063006900700061006C005F006900640000370900090009000900570048004500520045000900730061002E006E0061006D00650020003D0020004E002700530051004C00230027000147090009000900090041004E004400090009007000650072006D002E0063006C0061007300730020003D00200031003000300020002D002D002000530045005200560045005200014B090009000900090041004E004400090009007000650072006D002E005B00730074006100740065005D0020003D0020004E0027004700270020002D002D0020004700520041004E0054000133090009000900090041004E004400090009007000650072006D002E005B0074007900700065005D00200049004E0020002800005909000900090009000900090009000900090009004E0027005800410027002C0020002D002D002000450058005400450052004E0041004C002000410043004300450053005300200041005300530045004D0042004C005900014509000900090009000900090009000900090009004E00270058005500270020002D002D00200055004E005300410046004500200041005300530045004D0042004C00590001170900090009000900090009000900090009000900290000090900090009002900000509002900000B09004900460020002800003B09000900090028000900530045004C004500430054000900690073005F007400720075007300740077006F0072007400680079005F006F006E00002D0900090009000900460052004F004D0009007300790073002E00640061007400610062006100730065007300003109000900090009005700480045005200450009006E0061006D00650020003D0020004000440042004E0061006D0065000011090009000900290020003D002000300000070900090029000080810900090053004500540020004000530051004C0020003D002000270041004C005400450052002000440041005400410042004100530045002000270020002B0020004000440042004E0061006D00650020002B0020002700200053004500540020005400520055005300540057004F00520054004800590020004F004E002700011909000900450058004500430028004000530051004C002900005B090009005000520049004E005400200027004300680061006E0067006500640020004400420020006F007000740069006F006E0020005400520055005300540057004F005200540048005900200074006F0020004F004E0027000180D10900090052004100490053004500520052004F00520028004E00270041007300730065006D0062006C00790020006F0077006E0065007200200064006F006500730020006E006F0074002000680061007600650020007000650072006D0069007300730069006F006E00200061006E006400200040005300650074005400720075007300740077006F007200740068007900490066004E006F00550073006500720020007700610073002000730065007400200074006F00200030002E0027002C002000310036002C002000310029000151090009005000520049004E005400200027005400520055005300540057004F005200540048005900200061006C00720065006100640079002000730065007400200074006F0020004F004E002E002700015F530045004C004500430054000900640062002E00690073005F007400720075007300740077006F0072007400680079005F006F006E002C0020006100730073002E007000650072006D0069007300730069006F006E005F00730065007400002D460052004F004D00090009007300790073002E00640061007400610062006100730065007300200064006200003B49004E004E004500520020004A004F0049004E0009007300790073002E0061007300730065006D0062006C006900650073002000610073007300003D090009004F004E0009000900640062002E00640061007400610062006100730065005F006900640020003D002000440042005F00490044002800290000270900090041004E004400090009006100730073002E006E0061006D00650020003D0020002700012141004C00540045005200200041005300530045004D0042004C00590020005B0000315D002000570049005400480020005000450052004D0049005300530049004F004E005F0053004500540020003D00200000095300410046004500001153004100460045002000280031002900001F450058005400450052004E0041004C005F004100430043004500530053000027450058005400450052004E0041004C005F004100430043004500530053002000280032002900000D55004E005300410046004500002155004E005200450053005400520049004300540045004400200028003300290000375300750063006300650073007300660075006C006C0079002000730065007400200041007300730065006D0062006C00790020005B00002B5D0020005300650063007500720069007400790020004C006500760065006C00200074006F003A00200000574400450043004C004100520045000900400044006500700065006E00640065006E00740041007300730065006D0062006C0069006500730020004E00560041005200430048004100520028004D004100580029002C00003909000900400041007300730065006D0062006C00790054006F00520065006D006F007600650020007300790073006E0061006D0065003B0000355300450054002000400041007300730065006D0062006C00790054006F00520065006D006F007600650020003D0020004E002700010527003B00013D5300450054002000400044006500700065006E00640065006E00740041007300730065006D0062006C0069006500730020003D002000270027003B0001435000520049004E0054002000270020002A002A002A00200043006800650063006B0020004500780069007300740065006E006300650020002A002A002A0027003B000117090009000900530045004C0045004300540009002A000033090009000900460052004F004D0009007300790073002E0061007300730065006D0062006C006900650073002000730061000049090009000900570048004500520045000900730061002E006E0061006D00650020003D002000400041007300730065006D0062006C00790054006F00520065006D006F0076006500000909000900290029000077090052004100490053004500520052004F00520028004E00270025007300200064006F006500730020006E006F0074002000650078006900730074002E0027002C00200030002C00200030002C002000400041007300730065006D0062006C00790054006F00520065006D006F007600650029003B0001110900520045005400550052004E003B00000945004E0044003B0000495000520049004E0054002000270020002A002A002A00200043006800650063006B00200044006500700065006E00640065006E00630069006500730020002A002A002A0027003B000180F9530045004C004500430054000900400044006500700065006E00640065006E00740041007300730065006D0062006C0069006500730020003D0020002800400044006500700065006E00640065006E00740041007300730065006D0062006C0069006500730020002B002000430041005300450020005700480045004E002000400044006500700065006E00640065006E00740041007300730065006D0062006C0069006500730020003D0020002700270020005400480045004E00200027002700200045004C005300450020004E0027002C0020002700200045004E00440020002B0020007300610031002E006E0061006D00650029000141460052004F004D0009007300790073002E0061007300730065006D0062006C0079005F007200650066006500720065006E006300650073002000730061007200003B49004E004E004500520020004A004F0049004E0009007300790073002E0061007300730065006D0062006C006900650073002000730061003100004D090009004F004E0009007300610031002E0061007300730065006D0062006C0079005F006900640020003D0020007300610072002E0061007300730065006D0062006C0079005F0069006400003B49004E004E004500520020004A004F0049004E0009007300790073002E0061007300730065006D0062006C0069006500730020007300610032000063090009004F004E0009007300610032002E0061007300730065006D0062006C0079005F006900640020003D0020007300610072002E007200650066006500720065006E006300650064005F0061007300730065006D0062006C0079005F006900640000455700480045005200450009007300610032002E006E0061006D00650020003D002000400041007300730065006D0062006C00790054006F00520065006D006F007600650000254F00520044004500520020004200590009007300610031002E006E0061006D0065003B00003F4900460020002800400044006500700065006E00640065006E00740041007300730065006D0062006C0069006500730020003C003E00200027002700290001810B090052004100490053004500520052004F00520028004E002700430061006E006E006F007400200075006E0069006E007300740061006C006C002000250073002000610073002000690074002000690073002000720065007100750069007200650064002000620079002000740068006500200066006F006C006C006F00770069006E006700200041007300730065006D0062006C006900650073003A0020002500730027002C002000310036002C00200031002C002000400041007300730065006D0062006C00790054006F00520065006D006F00760065002C002000400044006500700065006E00640065006E00740041007300730065006D0062006C0069006500730029003B00016F5000520049004E0054002000270020002A002A002A0020005300740061007200740069006E006700200074006F00200055004E0069006E007300740061006C006C002000530051004C00230020002800530051004C0073006800610072007000290020002A002A002A0027003B0001394400450043004C00410052004500090040004F0062006A006500630074004E0061006D00650009007300790073006E0061006D0065002C0000370900090040004F0062006A00650063007400540079007000650020004E00560041005200430048004100520028003100300029002C00002D09000900400053006300680065006D0061004E0061006D00650020007300790073006E0061006D0065003B0000634400450043004C0041005200450020006300750072005F006F0062006A006500630074007300200043005500520053004F00520020004C004F00430041004C00200046004100530054005F0046004F0052005700410052004400200046004F0052000080870900530045004C00450043005400090073006F002E006E0061006D0065002C00200073006F002E0074007900700065002C00200053004300480045004D0041005F004E0041004D004500280073006F002E0073006300680065006D0061005F0069006400290020004100530020005B0053006300680065006D0061004E0061006D0065005D00003B0900460052004F004D0009007300790073002E0061007300730065006D0062006C0079005F006D006F00640075006C0065007300200061006D0000530900090009004F004E000900610073006D0062006C0079002E0061007300730065006D0062006C0079005F006900640020003D00200061006D002E0061007300730065006D0062006C0079005F006900640000821B09000900090041004E0044000900610073006D0062006C0079002E006E0061006D006500200049004E00200028004E002700530051004C007300680061007200700027002C0020004E002700530051004C00230027002C0020004E002700530051004C0023002E004F00530027002C0020004E002700530051004C0023002E00540077006900740074006500720069007A006500720027002C0020004E002700530051004C0023002E00530067006D006C0052006500610064006500720027002C0020004E002700530051004C0023002E0044006F0074004E00650074005A006900700027002C0020004E002700530051004C0023002E0049006D0061006700650027002C0020004E002700530051004C0023002E004400420027002C0020004E002700530051004C0023002E00460069006C006500530079007300740065006D0027002C0020004E002700530051004C0023002E004E006500740077006F0072006B0027002C0020004E002700530051004C0023002E005400790070006500730041006E006400410067006700720065006700610074006500730027002C0020004E002700530051004C0023002E004A0073006F006E004600780027002C0020004E002700530051004C0023002E0058004D004C0027002C0020004E002700530051004C0023002E005400790070006500730041006E006400410067006700720065006700610074006500730050006C007500730027002900014D09000900090041004E0044000900610073006D0062006C0079002E006E0061006D00650020003D002000400041007300730065006D0062006C00790054006F00520065006D006F007600650000430900090009004F004E00090073006F002E006F0062006A006500630074005F006900640020003D00200061006D002E006F0062006A006500630074005F00690064000080A509005700480045005200450009004F0042004A004500430054005F004E0041004D004500280061006D002E006F0062006A006500630074005F0069006400290020004E004F005400200049004E00200028004E002700530051004C00730068006100720070005F0055006E0069006E007300740061006C006C0027002C0020004E002700530051004C00730068006100720070005F005300650074007500700027002900010D090055004E0049004F004E0000809B0900530045004C004500430054000900610074002E006E0061006D0065002C0020004E0027005400590050004500270020004100530020005B0074007900700065005D002C00200053004300480045004D0041005F004E0041004D0045002800610074002E0073006300680065006D0061005F0069006400290020004100530020005B0053006300680065006D0061004E0061006D0065005D0001370900460052004F004D0009007300790073002E0061007300730065006D0062006C0079005F007400790070006500730020006100740000530900090009004F004E000900610073006D0062006C0079002E0061007300730065006D0062006C0079005F006900640020003D002000610074002E0061007300730065006D0062006C0079005F00690064000080D109000900090041004E0044000900610073006D0062006C0079002E006E0061006D006500200049004E00200028004E002700530051004C007300680061007200700027002C0020004E002700530051004C00230027002C0020004E002700530051004C0023002E005400790070006500730041006E006400410067006700720065006700610074006500730027002C0020004E002700530051004C0023002E005400790070006500730041006E006400410067006700720065006700610074006500730050006C007500730027002900012109004F0052004400450052002000420059002000320020004100530043003B00001342004500470049004E00200054005200590000234F00500045004E0020006300750072005F006F0062006A0065006300740073003B00005749004E0054004F00090040004F0062006A006500630074004E0061006D0065002C00200040004F0062006A0065006300740054007900700065002C002000400053006300680065006D0061004E0061006D0065003B0000470900490046002000280040004F0062006A006500630074005400790070006500200049004E00200028004E0027004600530027002C0020004E00270046005400270029002900016F090009005000520049004E00540020002700440072006F007000700069006E0067002000460075006E006300740069\
-006F006E003A002000270020002B00200040004F0062006A006500630074004E0061006D00650020002B002000270020002E0020002E0020002E0027003B00017F09000900450058004500430028004E002700440052004F0050002000460055004E004300540049004F004E0020005B00270020002B002000400053006300680065006D0061004E0061006D00650020002B0020004E0027005D002E00270020002B00200040004F0062006A006500630074004E0061006D00650029003B000125090009005000520049004E00540020002700440072006F00700070006500640027003B00010B090045004E0044003B0000330900490046002000280040004F0062006A00650063007400540079007000650020003D0020004E00270050004300270029000171090009005000520049004E00540020002700440072006F007000700069006E0067002000500072006F006300650064007500720065003A002000270020002B00200040004F0062006A006500630074004E0061006D00650020002B002000270020002E0020002E0020002E0027003B0001808109000900450058004500430028004E002700440052004F0050002000500052004F0043004500440055005200450020005B00270020002B002000400053006300680065006D0061004E0061006D00650020002B0020004E0027005D002E00270020002B00200040004F0062006A006500630074004E0061006D00650029003B0001330900490046002000280040004F0062006A00650063007400540079007000650020003D0020004E0027004100460027002900016F090009005000520049004E00540020002700440072006F007000700069006E00670020004100670067007200650067006100740065003A002000270020002B00200040004F0062006A006500630074004E0061006D00650020002B002000270020002E0020002E0020002E002700017F09000900450058004500430028004E002700440052004F005000200041004700470052004500470041005400450020005B00270020002B002000400053006300680065006D0061004E0061006D00650020002B0020004E0027005D002E00270020002B00200040004F0062006A006500630074004E0061006D00650029000123090009005000520049004E00540020002700440072006F007000700065006400270001370900490046002000280040004F0062006A00650063007400540079007000650020003D0020004E0027005400590050004500270029000165090009005000520049004E00540020002700440072006F007000700069006E006700200054007900700065003A002000270020002B00200040004F0062006A006500630074004E0061006D00650020002B002000270020002E0020002E0020002E002700017509000900450058004500430028004E002700440052004F0050002000540059005000450020005B00270020002B002000400053006300680065006D0061004E0061006D00650020002B0020004E0027005D002E00270020002B00200040004F0062006A006500630074004E0061006D00650029000157090049004E0054004F00090040004F0062006A006500630074004E0061006D0065002C00200040004F0062006A0065006300740054007900700065002C002000400053006300680065006D0061004E0061006D006500000F45004E0044002000540052005900001742004500470049004E0020004300410054004300480000610900490046002000280043005500520053004F0052005F00530054004100540055005300280027006C006F00630061006C0027002C00200027006300750072005F006F0062006A0065006300740073002700290020003E003D0020003000290001270900090043004C004F005300450020006300750072005F006F0062006A0065006300740073000031090009004400450041004C004C004F00430041005400450020006300750072005F006F0062006A006500630074007300004909004400450043004C00410052004500200040004500720072006F0072004D0065007300730061006700650020004E00560041005200430048004100520028004D004100580029000080BB0900530045005400200040004500720072006F0072004D0065007300730061006700650020003D0020004E0027004D00730067002000270020002B00200043004F004E0056004500520054002800560041005200430048004100520028003200300029002C0020004500520052004F0052005F004E0055004D0042004500520028002900290020002B0020004E0027003A002000270020002B0020004500520052004F0052005F004D00450053005300410047004500280029000141090052004100490053004500520052004F005200280040004500720072006F0072004D006500730073006100670065002C002000310036002C00200031002900000F0900520045005400550052004E00001345004E00440020004300410054004300480000808F5000520049004E00540020002700440072006F007000700069006E0067002000500072006F0063006500640075007200650073003A002000530051004C00730068006100720070005F0055006E0049006E007300740061006C006C00200061006E0064002000530051004C00730068006100720070005F00530065007400750070002E0020002E0020002E002700017F450058004500430028002700440052004F0050002000500052004F0043004500440055005200450020005B00270020002B002000400053006300680065006D0061004E0061006D00650020002B00200027005D002E00530051004C00730068006100720070005F0055006E0069006E007300740061006C006C00270029000177450058004500430028002700440052004F0050002000500052004F0043004500440055005200450020005B00270020002B002000400053006300680065006D0061004E0061006D00650020002B00200027005D002E00530051004C00730068006100720070005F0053006500740075007000270029000180872F002A0020006E006F00770020007400680061007400200074006800650020006F0062006A0065006300740073002000610072006500200067006F006E0065002000770065002000630061006E002000640072006F0070002000740068006500200061007300730065006D0062006C007900200069007400730065006C00660020002A002F0000808349004600200045005800490053005400530020002800530045004C00450043005400200031002000460052004F004D0020007300790073002E0061007300730065006D0062006C0069006500730020005700480045005200450020006E0061006D00650020003D0020004E002700530051004C007300680061007200700027002900015509005000520049004E00540020002700440072006F007000700069006E006700200041007300730065006D0062006C0079003A002000530051004C007300680061007200700020002E0020002E0020002E00270001330900440052004F005000200041005300530045004D0042004C00590020005B00530051004C00730068006100720070005D00002109005000520049004E00540020002700440072006F00700070006500640027000115730071006C0023002E0069006D0061006700650000808749004600200045005800490053005400530020002800530045004C00450043005400200031002000460052004F004D0020007300790073002E0061007300730065006D0062006C0069006500730020005700480045005200450020006E0061006D00650020003D0020004E002700530051004C0023002E0049006D0061006700650027002900015909005000520049004E00540020002700440072006F007000700069006E006700200041007300730065006D0062006C0079003A002000530051004C0023002E0049006D0061006700650020002E0020002E0020002E00270001370900440052004F005000200041005300530045004D0042004C00590020005B00530051004C0023002E0049006D006100670065005D000011730071006C0023002E0078006D006C0000808349004600200045005800490053005400530020002800530045004C00450043005400200031002000460052004F004D0020007300790073002E0061007300730065006D0062006C0069006500730020005700480045005200450020006E0061006D00650020003D0020004E002700530051004C0023002E0058004D004C0027002900015509005000520049004E00540020002700440072006F007000700069006E006700200041007300730065006D0062006C0079003A002000530051004C0023002E0058004D004C0020002E0020002E0020002E00270001330900440052004F005000200041005300530045004D0042004C00590020005B00530051004C0023002E0058004D004C005D00001D730071006C0023002E0064006F0074006E00650074007A006900700000808F49004600200045005800490053005400530020002800530045004C00450043005400200031002000460052004F004D0020007300790073002E0061007300730065006D0062006C0069006500730020005700480045005200450020006E0061006D00650020003D0020004E002700530051004C0023002E0044006F0074004E00650074005A006900700027002900016109005000520049004E00540020002700440072006F007000700069006E006700200041007300730065006D0062006C0079003A002000530051004C0023002E0044006F0074004E00650074005A006900700020002E0020002E0020002E002700013F0900440052004F005000200041005300530045004D0042004C00590020005B00530051004C0023002E0044006F0074004E00650074005A00690070005D0000809149004600200045005800490053005400530020002800530045004C00450043005400200031002000460052004F004D0020007300790073002E0061007300730065006D0062006C0069006500730020005700480045005200450020006E0061006D00650020003D0020004E002700530051004C0023002E00530067006D006C0052006500610064006500720027002900016309005000520049004E00540020002700440072006F007000700069006E006700200041007300730065006D0062006C0079003A002000530051004C0023002E00530067006D006C0052006500610064006500720020002E0020002E0020002E00270001410900440052004F005000200041005300530045004D0042004C00590020005B00530051004C0023002E00530067006D006C005200650061006400650072005D0000809349004600200045005800490053005400530020002800530045004C00450043005400200031002000460052004F004D0020007300790073002E0061007300730065006D0062006C0069006500730020005700480045005200450020006E0061006D00650020003D0020004E002700530051004C0023002E00540077006900740074006500720069007A006500720027002900016509005000520049004E00540020002700440072006F007000700069006E006700200041007300730065006D0062006C0079003A002000530051004C0023002E00540077006900740074006500720069007A006500720020002E0020002E0020002E00270001430900440052004F005000200041005300530045004D0042004C00590020005B00530051004C0023002E00540077006900740074006500720069007A00650072005D0000808149004600200045005800490053005400530020002800530045004C00450043005400200031002000460052004F004D0020007300790073002E0061007300730065006D0062006C0069006500730020005700480045005200450020006E0061006D00650020003D0020004E002700530051004C0023002E004F00530027002900015309005000520049004E00540020002700440072006F007000700069006E006700200041007300730065006D0062006C0079003A002000530051004C0023002E004F00530020002E0020002E0020002E00270001310900440052004F005000200041005300530045004D0042004C00590020005B00530051004C0023002E004F0053005D0000808149004600200045005800490053005400530020002800530045004C00450043005400200031002000460052004F004D0020007300790073002E0061007300730065006D0062006C0069006500730020005700480045005200450020006E0061006D00650020003D0020004E002700530051004C0023002E004400420027002900015309005000520049004E00540020002700440072006F007000700069006E006700200041007300730065006D0062006C0079003A002000530051004C0023002E004400420020002E0020002E0020002E00270001310900440052004F005000200041005300530045004D0042004C00590020005B00530051004C0023002E00440042005D00001F730071006C0023002E00660069006C006500730079007300740065006D0000809149004600200045005800490053005400530020002800530045004C00450043005400200031002000460052004F004D0020007300790073002E0061007300730065006D0062006C0069006500730020005700480045005200450020006E0061006D00650020003D0020004E002700530051004C0023002E00460069006C006500530079007300740065006D0027002900016309005000520049004E00540020002700440072006F007000700069006E006700200041007300730065006D0062006C0079003A002000530051004C0023002E00460069006C006500530079007300740065006D0020002E0020002E0020002E00270001410900440052004F005000200041005300530045004D0042004C00590020005B00530051004C0023002E00460069006C006500530079007300740065006D005D0000808B49004600200045005800490053005400530020002800530045004C00450043005400200031002000460052004F004D0020007300790073002E0061007300730065006D0062006C0069006500730020005700480045005200450020006E0061006D00650020003D0020004E002700530051004C0023002E004E006500740077006F0072006B0027002900015D09005000520049004E00540020002700440072006F007000700069006E006700200041007300730065006D0062006C0079003A002000530051004C0023002E004E006500740077006F0072006B0020002E0020002E0020002E002700013B0900440052004F005000200041005300530045004D0042004C00590020005B00530051004C0023002E004E006500740077006F0072006B005D000017730071006C0023002E006A0073006F006E006600780000808949004600200045005800490053005400530020002800530045004C00450043005400200031002000460052004F004D0020007300790073002E0061007300730065006D0062006C0069006500730020005700480045005200450020006E0061006D00650020003D0020004E002700530051004C0023002E004A0073006F006E004600780027002900015B09005000520049004E00540020002700440072006F007000700069006E006700200041007300730065006D0062006C0079003A002000530051004C0023002E004A0073006F006E004600780020002E0020002E0020002E00270001390900440052004F005000200041005300530045004D0042004C00590020005B00530051004C0023002E004A0073006F006E00460078005D000080A149004600200045005800490053005400530020002800530045004C00450043005400200031002000460052004F004D0020007300790073002E0061007300730065006D0062006C0069006500730020005700480045005200450020006E0061006D00650020003D0020004E002700530051004C0023002E005400790070006500730041006E0064004100670067007200650067006100740065007300270029000175090009005000520049004E00540020002700440072006F007000700069006E006700200041007300730065006D0062006C0079003A002000530051004C0023002E005400790070006500730041006E006400410067006700720065006700610074006500730020002E0020002E0020002E002700015309000900440052004F005000200041005300530045004D0042004C00590020005B00530051004C0023002E005400790070006500730041006E00640041006700670072006500670061007400650073005D000037730071006C0023002E007400790070006500730061006E006400610067006700720065006700610074006500730070006C00750073000080A949004600200045005800490053005400530020002800530045004C00450043005400200031002000460052004F004D0020007300790073002E0061007300730065006D0062006C0069006500730020005700480045005200450020006E0061006D00650020003D0020004E002700530051004C0023002E005400790070006500730041006E006400410067006700720065006700610074006500730050006C007500730027002900017D090009005000520049004E00540020002700440072006F007000700069006E006700200041007300730065006D0062006C0079003A002000530051004C0023002E005400790070006500730041006E006400410067006700720065006700610074006500730050006C007500730020002E0020002E0020002E002700015B09000900440052004F005000200041005300530045004D0042004C00590020005B00530051004C0023002E005400790070006500730041006E006400410067006700720065006700610074006500730050006C00750073005D00007B49004600200045005800490053005400530020002800530045004C00450043005400200031002000460052004F004D0020007300790073002E0061007300730065006D0062006C0069006500730020005700480045005200450020006E0061006D00650020003D0020004E002700530051004C00230027002900014D09005000520049004E00540020002700440072006F007000700069006E006700200041007300730065006D0062006C0079003A002000530051004C00230020002E0020002E0020002E002700012B0900440052004F005000200041005300530045004D0042004C00590020005B00530051004C0023005D00006B2F002A0020006C006100730074006C0079002000770065002000640072006F0070002000740068006500200053006300680065006D006100200074006800610074002000680065006C006400200074006800650020006F0062006A00650063007400730020002A002F000055490046002000280053004300480045004D0041005F00490044002800400053006300680065006D0061004E0061006D006500290020004900530020004E004F00540020004E0055004C004C00200041004E0044000080AB09004E004F00540020004500580049005300540053002800530045004C00450043005400200031002000460052004F004D0020007300790073002E006F0062006A006500630074007300200073006F00200057004800450052004500200073006F002E0073006300680065006D0061005F006900640020003D00200053004300480045004D0041005F00490044002800400053006300680065006D0061004E0061006D00650029002900006709005000520049004E00540020002700440072006F007000700069006E006700200053006300680065006D0061003A002000270020002B002000400053006300680065006D0061004E0061006D00650020002B002000270020002E0020002E0020002E00270001550900450058004500430028002700440052004F005000200053004300480045004D00410020005B00270020002B002000400053006300680065006D0061004E0061006D00650020002B00200027005D002700290001115000520049004E00540020002700270001808D5000520049004E0054002000270020002A002A002A002000530051004C00230020002800530051004C0073006800610072007000290020006900730020006E006F007700200075006E0069006E007300740061006C006C00650064002E002000200048006100760065002000610020006E0069006300650020006400610079002E0020002A002A002A002700010B20002A002A002A002000001F530051004C00230020002800530051004C00730068006100720070002900003320006900730020006E006F007700200075006E0069006E007300740061006C006C00650064002E00200020002A002A002A00007168007400740070003A002F002F007700770077002E00730071006C00730068006100720070002E0063006F006D002F007500740069006C006900740079002F00630075007200720065006E0074005F00760065007200730069006F006E005F0066007200650065002E0070006800700000754400610074006100200066006F0072002000630075007200720065006E0074002000760065007200730069006F006E0020006900730020006E006F007400200063006F00720072006500630074002E0020002000540072007900200061006700610069006E0020006C0061007400650072002E00005D530051004C00230020002800530051004C0073006800610072007000290020002800630029002000320030003000360020002D0020003200300031003000200053006F006C006F006D006F006E0020005200750074007A006B00790001592A002A002A00200052006500670075006C00610072002000450078007000720065007300730069006F006E00200028005200650067004500780029002000460075006E006300740069006F006E00730020002A002A002A00008103520065006700450078005F00490073004D0061007400630068002800450078007000720065007300730069006F006E0054006F00560061006C006900640061007400650020004E00560041005200430048004100520028004D004100580029002C00200052006500670075006C0061007200450078007000720065007300730069006F006E0020004E0056004100520043004800410052002800340030003000300029002C0020005300740061007200740041007400200049004E0054002C002000520065006700450078004F007000740069006F006E0073004C0069007300740020004E00560041005200430048004100520028003400300030003000290029000019520045005400550052004E0053003A00200042004900540000274E004F005400450053003A002000530074006100720074004100740020003E003D00200030000080FF520065006700450078005F004D0061007400630068002800450078007000720065007300730069006F006E0054006F00560061006C006900640061007400650020004E00560041005200430048004100520028004D004100580029002C00200052006500670075006C0061007200450078007000720065007300730069006F006E0020004E0056004100520043004800410052002800340030003000300029002C0020005300740061007200740041007400200049004E0054002C002000520065006700450078004F007000740069006F006E0073004C0069007300740020004E00560041005200430048004100520028003400300030003000290029000080B3520045005400550052004E0053003A0020005400410042004C004500200028004D0061007400630068004E0075006D00200049004E0054002C002000560061006C007500650020004E0056004100520043004800410052002800340030003000300029002C0020005300740061007200740050006F007300200049004E0054002C00200045006E00640050006F007300200049004E0054002C0020004C0065006E00670074006800200049004E0054002900008103520065006700450078005F004D006100740063006800650073002800450078007000720065007300730069006F006E0054006F00560061006C006900640061007400650020004E00560041005200430048004100520028004D004100580029002C00200052006500670075006C0061007200450078007000720065007300730069006F006E0020004E0056004100520043004800410052002800340030003000300029002C0020005300740061007200740041007400200049004E0054002C002000520065006700450078004F007000740069006F006E0073004C0069007300740020004E0056004100520043004800410052002800340030003000300029002900008123520065006700450078005F004D0061007400630068004C0065006E006700740068002800450078007000720065007300730069006F006E0054006F00560061006C006900640061007400650020004E00560041005200430048004100520028004D004100580029002C00200052006500670075006C0061007200450078007000720065007300730069006F006E0020004E0056004100520043004800410052002800340030003000300029002C0020005300740061007200740041007400200049004E0054002C0020004C0065006E00670074006800200049004E0054002C002000520065006700450078004F007000740069006F006E0073004C0069007300740020004E0056004100520043004800410052002800340030003000300029002900002D520045005400550052004E0053003A0020004E00560041005200430048004100520028004D0041005800290000810B520065006700450078005F004D006100740063006800530069006D0070006C0065002800450078007000720065007300730069006F006E0054006F00560061006C006900640061007400650020004E00560041005200430048004100520028004D004100580029002C00200052006500670075006C0061007200450078007000720065007300730069006F006E0020004E0056004100520043004800410052002800340030003000300029002C0020005300740061007200740041007400200049004E0054002C002000520065006700450078004F007000740069006F006E0073004C0069007300740020004E0056004100520043004800410052002800340030003000300029002900008151520065006700450078005F005200650070006C006100630065002800450078007000720065007300730069006F006E0054006F00560061006C006900640061007400650020004E00560041005200430048004100520028004D004100580029002C00200052006500670075006C0061007200450078007000720065007300730069006F006E0020004E0056004100520043004800410052002800340030003000300029002C0020005200650070006C006100630065006D0065006E00740020004E0056004100520043004800410052002800340030003000300029002C00200043006F0075006E007400200049004E0054002C0020005300740061007200740041007400200049004E0054002C002000520065006700450078004F007000740069006F006E0073004C0069007300740020004E0056004100520043004800410052002800340030003000300029002900008115520065006700450078005F00530070006C0069007400280045007800700072006500\
-7300730069006F006E0054006F00560061006C006900640061007400650020004E00560041005200430048004100520028004D004100580029002C00200052006500670075006C0061007200450078007000720065007300730069006F006E0020004E0056004100520043004800410052002800340030003000300029002C00200043006F0075006E007400200049004E0054002C0020005300740061007200740041007400200049004E0054002C002000520065006700450078004F007000740069006F006E0073004C0069007300740020004E005600410052004300480041005200280034003000300030002900290000312A002A002A00200053007400720069006E0067002000460075006E006300740069006F006E00730020002A002A002A0000808D53007400720069006E0067005F0043006F006E007400610069006E007300280053007400720069006E006700560061006C007500650020004E00560041005200430048004100520028004D004100580029002C002000530065006100720063006800560061006C007500650020004E0056004100520043004800410052002800340030003000300029002900002B4E004F005400450053003A00200043006100730065002D00530065006E007300690074006900760065000180EB53007400720069006E0067005F0043006F0075006E007400280053007400720069006E006700560061006C007500650020004E00560041005200430048004100520028004D004100580029002C002000530065006100720063006800560061006C007500650020004E00560041005200430048004100520028004D004100580029002C0020005300740061007200740041007400200049004E0054002C00200043006F006D00700061007200690073006F006E005400790070006500200049004E0054002C00200043006F0075006E0074004F007600650072006C0061007000200042004900540029000019520045005400550052004E0053003A00200049004E00540000274E004F005400450053003A002000530074006100720074004100740020003E003D00200031000080854E004F005400450053003A00200043006F006D00700061007200690073006F006E00540079007000650020003D00200031002000280063006100730065002D00730065006E00730069007400690076006500290020006F007200200032002000280063006100730065002D0049004E00730065006E0073006900740069007600650029000180AD53007400720069006E0067005F00430075007400280053007400720069006E006700560061006C007500650020004E00560041005200430048004100520028004D004100580029002C002000440065006C0069006D00690074006500720020004E0056004100520043004800410052002800340030003000300029002C0020004600690065006C006400730020004E00560041005200430048004100520028003400300030003000290029000080A94E004F005400450053003A0020004600690065006C006400730020003D0020005B0042006500670069006E004600690065006C0064002D005D0020007C0020005B002D0045006E0064004600690065006C0064005D0020007C0020005B0042006500670069006E004600690065006C0064002D0045006E0064004600690065006C0064005D0020007C0020005B004600690065006C0064004E0075006D005D0020005B002C005D000180B753007400720069006E0067005F0045006E00640073005700690074006800280053007400720069006E006700560061006C007500650020004E0056004100520043004800410052002800340030003000300029002C002000530065006100720063006800560061006C007500650020004E0056004100520043004800410052002800340030003000300029002C00200043006F006D00700061007200690073006F006E005400790070006500200049004E005400290000808B53007400720069006E0067005F0045007100750061006C007300280053007400720069006E006700560061006C0075006500410020004E00560041005200430048004100520028004D004100580029002C00200053007400720069006E006700560061006C0075006500420020004E00560041005200430048004100520028004D0041005800290029000080D353007400720069006E0067005F0049006E006400650078004F006600280053007400720069006E006700560061006C007500650020004E00560041005200430048004100520028004D004100580029002C002000530065006100720063006800560061006C007500650020004E0056004100520043004800410052002800340030003000300029002C0020005300740061007200740049006E00640065007800200049004E0054002C00200043006F006D00700061007200690073006F006E005400790070006500200049004E0054002900002D4E004F005400450053003A0020005300740061007200740049006E0064006500780020003E003D0020003100005353007400720069006E0067005F0049006E0069007400430061007000280053007400720069006E006700560061006C007500650020004E00560041005200430048004100520028004D00410058002900290000809753007400720069006E0067005F004A006F0069006E002800530051004C0020004E00560041005200430048004100520028004D004100580029002C00200053006500700061007200610074006F00720020004E0056004100520043004800410052002800340030003000300029002C00200043006F006D00620069006E0065004F007000740069006F006E00200049004E0054002900005B4E004F005400450053003A00200053006500700061007200610074006F0072002000630061006E0020006200650020006D006F007200650020007400680061006E002000310020006300680061007200610063007400650072000080954E004F005400450053003A00200043006F006D00620069006E0065004F007000740069006F006E003A002000310020003D00200066006F00720020004B00650065007000200045006D00700074007900200045006E00740072006900650073003B002000320020003D002000520065006D006F0076006500200045006D00700074007900200045006E00740072006900650073000080DB53007400720069006E0067005F004C0061007300740049006E006400650078004F006600280053007400720069006E006700560061006C007500650020004E00560041005200430048004100520028004D004100580029002C002000530065006100720063006800560061006C007500650020004E0056004100520043004800410052002800340030003000300029002C0020005300740061007200740049006E00640065007800200049004E0054002C00200043006F006D00700061007200690073006F006E005400790070006500200049004E00540029000080A74E004F005400450053003A0020005300740061007200740049006E0064006500780020003E003D00200031003B00200043006F006D00700061007200690073006F006E00540079007000650020003D00200031002000280063006100730065002D00730065006E00730069007400690076006500290020006F007200200032002000280063006100730065002D0049004E00730065006E007300690074006900760065002900017B53007400720069006E0067005F004E00650077006C0069006E006500280045004F004C00540079007000650020004E00560041005200430048004100520028003400300030003000290029002000520045005400550052004E00530020004E0056004100520043004800410052002800340030003000300029000080B54E004F005400450053003A00200045004F004C00540079007000650020003D002000630072006C0066002C00770069006E002C00770069006E0064006F00770073002C0064006F0073002C006F0073002F00320020003B0020006C0066002C0075006E006900780020003B002000630072002C006D006100630020003B0020006600660020003B0020006E0065006C002C003300390030002C006F0073002F003300390030002C0065006200630064006900630000810F53007400720069006E0067005F004E007400680049006E006400650078004F006600280053007400720069006E006700560061006C007500650020004E00560041005200430048004100520028004D004100580029002C00200053006500610072006300680020004E00560041005200430048004100520028004D004100580029002C0020005300740061007200740041007400200049004E0054002C0020004E00740068004F00630063007500720061006E0063006500200049004E0054002C00200043006F006D00700061007200690073006F006E005400790070006500200049004E0054002C00200043006F0075006E0074004F007600650072006C0061007000200042004900540029000080B153007400720069006E0067005F005000610064004C00650066007400280053007400720069006E006700560061006C007500650020004E0056004100520043004800410052002800340030003000300029002C00200053007400720069006E00670057006900640074006800200049004E0054002C00200050006100640043006800610072006100630074006500720020004E0056004100520043004800410052002800340030003000300029002900002F520045005400550052004E0053003A0020004E005600410052004300480041005200280034003000300030002900004D4E004F005400450053003A00200053007400720069006E0067005700690064007400680020003E003D0020004C0045004E00280053007400720069006E006700560061006C007500650029000080B353007400720069006E0067005F0050006100640052006900670068007400280053007400720069006E006700560061006C007500650020004E0056004100520043004800410052002800340030003000300029002C00200053007400720069006E00670057006900640074006800200049004E0054002C00200050006100640043006800610072006100630074006500720020004E00560041005200430048004100520028003400300030003000290029000080A553007400720069006E0067005F00530070006C0069007400280053007400720069006E006700560061006C007500650020004E00560041005200430048004100520028004D004100580029002C00200053006500700061007200610074006F00720020004E0056004100520043004800410052002800340030003000300029002C002000530070006C00690074004F007000740069006F006E00200049004E0054002900006D520045005400550052004E0053003A0020005400410042004C00450020002800530070006C00690074004E0075006D00200049004E0054002C002000530070006C0069007400560061006C0020004E00560041005200430048004100520028003400300030003000290029000080914E004F005400450053003A002000530070006C00690074004F007000740069006F006E003A002000310020003D00200066006F00720020004B00650065007000200045006D00700074007900200045006E00740072006900650073003B002000320020003D002000520065006D006F0076006500200045006D00700074007900200045006E007400720069006500730000809953007400720069006E0067005F00530070006C006900740049006E0074006F004600690065006C0064007300200040005100750065007200790020004E0056004100520043004800410052002800340030003000300029002C002000400052006500670045007800440065006C0069006D00690074006500720020004E0056004100520043004800410052002800340030003000300029000080CF500052004F0043003A00200052006500730075006C007400200073006500740020006900730020004E00560041005200430048004100520028004D0041005800290020006600690065006C0064002000730070006500630069006600690065006400200069006E0020004000510075006500720079002000620072006F006B0065006E00200069006E0074006F0020006600690065006C006400730020006200610073006500640020006F006E002000400052006500670045007800440065006C0069006D0069007400650072000080BB53007400720069006E0067005F005300740061007200740073005700690074006800280053007400720069006E006700560061006C007500650020004E0056004100520043004800410052002800340030003000300029002C002000530065006100720063006800560061006C007500650020004E0056004100520043004800410052002800340030003000300029002C00200043006F006D00700061007200690073006F006E005400790070006500200049004E0054002900004D53007400720069006E0067005F005400720069006D00280053007400720069006E006700560061006C007500650020004E00560041005200430048004100520028004D0041005800290029000080A753007400720069006E0067005F0057006F00720064005700720061007000280053007400720069006E006700560061006C007500650020004E00560041005200430048004100520028004D004100580029002C0020004C0069006E00650057006900640074006800200049004E0054002C00200053006500700061007200610074006F00720020004E005600410052004300480041005200280034003000300030002900290000332A002A002A0020005500740069006C006900740079002000460075006E006300740069006F006E00730020002A002A002A0000475500740069006C005F00430052004300330032002800420061007300650044006100740061002000560041005200420049004E0041005200590028004D004100580029002900001F520045005400550052004E0053003A00200042004900470049004E00540000575500740069006C005F004400650066006C006100740065002800440061007400610054006F0043006F006D00700072006500730073002000560041005200420049004E0041005200590028004D004100580029002900002D520045005400550052004E0053002000560041005200420049004E0041005200590028004D004100580029000080D75500740069006C005F00470065006E00650072006100740065004400610074006500540069006D006500520061006E00670065002800530074006100720074004400610074006500540069006D00650020004400410054004500540049004D0045002C00200045006E0064004400610074006500540069006D00650020004400410054004500540049004D0045002C0020005300740065007000200049004E0054002C0020005300740065007000540079007000650020004E0056004100520043004800410052002800340030003000300029002900006D520045005400550052004E0053003A0020005400410042004C004500200028004400610074006500740069006D0065004E0075006D00200049004E0054002C0020004400610074006500740069006D006500560061006C0020004400410054004500540049004D00450029000080C54E004F005400450053003A002000530074006500700020003C003E00200030003B00200053007400650070005400790070006500200049004E002000280079006500610072002C0020006D006F006E00740068002C0020006400610079002C00200068006F00750072002C0020006D0069006E007500740065002C0020007300650063006F006E0064002C0020006D0069006C006C0069007300650063006F006E0064002C00200071007500610072007400650072002C0020007700650065006B0029000080CB5500740069006C005F00470065006E00650072006100740065004400610074006500540069006D00650073002800530074006100720074004400610074006500540069006D00650020004400410054004500540049004D0045002C00200054006F00740061006C004400610074006500540069006D0065007300200049004E0054002C0020005300740065007000200049004E0054002C0020005300740065007000540079007000650020004E00560041005200430048004100520028003400300030003000290029000080EF4E004F005400450053003A002000530074006500700020003C003E00200030003B00200054006F00740061006C004400610074006500540069006D006500730020003E003D00200030003B00200053007400650070005400790070006500200049004E002000280079006500610072002C0020006D006F006E00740068002C0020006400610079002C00200068006F00750072002C0020006D0069006E007500740065002C0020007300650063006F006E0064002C0020006D0069006C006C0069007300650063006F006E0064002C00200071007500610072007400650072002C0020007700650065006B0029000080835500740069006C005F00470065006E006500720061007400650046006C006F0061007400520061006E00670065002800530074006100720074004E0075006D00200046004C004F00410054002C00200045006E0064004E0075006D00200046004C004F00410054002C0020005300740065007000200046004C004F00410054002900005B520045005400550052004E0053003A0020005400410042004C0045002000280046006C006F00610074004E0075006D00200049004E0054002C00200046006C006F0061007400560061006C00200046004C004F0041005400290000214E004F005400450053003A002000530074006500700020003C003E0020003000007D5500740069006C005F00470065006E006500720061007400650046006C006F006100740073002800530074006100720074004E0075006D00200046004C004F00410054002C00200054006F00740061006C004E0075006D007300200049004E0054002C0020005300740065007000200046004C004F0041005400290000414E004F005400450053003A002000530074006500700020003C003E00200030003B00200054006F00740061006C004E0075006D00730020003E003D002000300000735500740069006C005F00470065006E006500720061007400650049006E007400520061006E00670065002800530074006100720074004E0075006D00200049004E0054002C00200045006E0064004E0075006D00200049004E0054002C0020005300740065007000200049004E0054002900004F520045005400550052004E0053003A0020005400410042004C0045002000280049006E0074004E0075006D00200049004E0054002C00200049006E007400560061006C00200049004E005400290000715500740069006C005F00470065006E006500720061007400650049006E00740073002800530074006100720074004E0075006D00200049004E0054002C00200054006F00740061006C004E0075006D007300200049004E0054002C0020005300740065007000200049004E005400290000595500740069006C005F00470055006E007A00690070002800440061007400610054006F004400650063006F006D00700072006500730073002000560041005200420049004E0041005200590028004D00410058002900290000515500740069006C005F0047005A00690070002800440061007400610054006F0043006F006D00700072006500730073002000560041005200420049004E0041005200590028004D00410058002900290000795500740069006C005F004800610073006800280041006C0067006F0072006900740068006D0020004E0056004100520043004800410052002800340030003000300029002C002000420061007300650044006100740061002000560041005200420049004E0041005200590028004D004100580029002900006F4E004F005400450053003A00200041006C0067006F0072006900740068006D0020003D0020004D00440035002C00200053004800410031002C0020005300480041003200350036002C0020005300480041003300380034002C0020006F0072002000530048004100350031003200005B5500740069006C005F0049006E0066006C006100740065002800440061007400610054006F004400650063006F006D00700072006500730073002000560041005200420049004E0041005200590028004D004100580029002900007D5500740069006C005F0049007300560061006C0069006400430043002800430043004E0075006D0062006500720020004E0056004100520043004800410052002800340030003000300029002C00200043004300540079007000650020004E0056004100520043004800410052002800340030003000300029002900006B4E004F005400450053003A00200043004300540079007000650020003D0020006D0063002C00200076006900730061002C00200064006900730063002C00200061006D00650078002C002000640069006E006500720073002C0020007B0065006D007000740079007D0000795500740069006C005F0049007300560061006C006900640043006800650063006B0052006F007500740069006E0067004E0075006D00620065007200280052006F007500740069006E0067004E0075006D0062006500720020004E005600410052004300480041005200280034003000300030002900290000809B5500740069006C005F0049007300560061006C006900640050006F007300740061006C0043006F0064006500280043006F0075006E0074007200790043006F006400650020004E0056004100520043004800410052002800340030003000300029002C00200050006F007300740061006C0043006F006400650020004E00560041005200430048004100520028003400300030003000290029000080B14E004F005400450053003A00200043006F0075006E0074007200790043006F006400650020003D002000760061006C0069006400200032002000630068006100720061006300740065007200200043006F0075006E00740072007900200043006F006400650020002800630075007200720065006E0074006C00790020006F006E006C007900200055005300200061006E006400200043004100200073007500700070006F007200740065006400290000475500740069006C005F0049007300560061006C0069006400530053004E002800530053004E0020004E005600410052004300480041005200280034003000300030002900290000415500740069006C005F0054006F0057006F0072006400730028004E0075006D006500720069006300560061006C0075006500200046004C004F0041005400290000774E004F005400450053003A0020004200650074007700650065006E0020002D003900390039002C003900390039002C003900390039002C003900390039002C00390039003900200061006E00640020003900390039002C003900390039002C003900390039002C003900390039002C00390039003900012D2A002A002A0020004D006100740068002000460075006E006300740069006F006E00730020002A002A002A00003D4D006100740068005F0046006100630074006F007200690061006C00280042006100730065004E0075006D00620065007200200049004E005400290000474E004F005400450053003A00200042006100730065004E0075006D0062006500720020004200450054005700450045004E0020003000200061006E006400200031003700300000554D006100740068005F0043006F006E007300740061006E007400280043006F006E007300740061006E0074004E0061006D00650020004E0056004100520043004800410052002800340030003000300029002900001D520045005400550052004E0053003A00200046004C004F0041005400005B4E004F005400450053003A002000530065006500200064006F00630075006D0065006E0074006100740069006F006E00200066006F007200200061006C006C00200033003000200043006F006E007300740061006E007400730000808D4D006100740068005F0043006F006E007600650072007400280042006100730065004E0075006D00620065007200200046004C004F00410054002C002000460072006F006D0020004E0056004100520043004800410052002800340030003000300029002C00200054006F0020004E0056004100520043004800410052002800340030003000300029002900005B4E004F005400450053003A002000530065006500200064006F00630075006D0065006E0074006100740069006F006E00200066006F007200200061006C006C00200063006F006D00620069006E006100740069006F006E00730000374D006100740068005F0043006F0073006800280042006100730065004E0075006D00620065007200200046004C004F00410054002900003F4D006100740068005F00490073005000720069006D006500280042006100730065004E0075006D00620065007200200042004900470049004E0054002900004D4E004F005400450053003A002000300020003D0020004E006F0074002000610020005000720069006D0065002C002000310020003D002000490053002000610020005000720069006D00650000754D006100740068005F00520061006E0064006F006D00520061006E006700650028005300650065006400200049004E0054002C0020004C006F0077006500720042006F0075006E006400200049004E0054002C0020005500700070006500720042006F0075006E006400200049004E0054002900002F4E004F005400450053003A00200053006500650064002000630061006E0020006200650020004E0055004C004C0000374D006100740068005F00530069006E006800280042006100730065004E0075006D00620065007200200046004C004F0041005400290000374D006100740068005F00540061006E006800280042006100730065004E0075006D00620065007200200046004C004F0041005400290000814F4D006100740068005F0043006F006D0070006F0075006E00640041006D006F007200740069007A006100740069006F006E005300630068006500640075006C00650028004C006F0061006E0041006D006F0075006E007400200046004C004F00410054002C00200041006E006E00750061006C0049006E007400650072006500730074005200610074006500200046004C004F00410054002C002000590065006100720073004F0066004C006F0061006E00200049004E0054002C0020005000610079006D0065006E00740073005000650072005900650061007200200049004E0054002C0020004C006F0061006E0053007400610072007400440061007400650020004400410054004500540049004D0045002C0020004F007000740069006F006E0061006C00450078007400720061005000610079006D0065006E007400200046004C004F0041005400290000822F520045005400550052004E0053003A0020005400410042004C004500200028005000610079006D0065006E0074004E0075006D00200049004E0054002C0020005000610079006D0065006E00740044006100\
-7400650020004400410054004500540049004D0045002C00200042006500670069006E006E0069006E006700420061006C0061006E0063006500200046004C004F00410054002C0020005300630068006500640075006C00650064005000610079006D0065006E007400200046004C004F00410054002C002000450078007400720061005000610079006D0065006E007400200046004C004F00410054002C00200054006F00740061006C005000610079006D0065006E007400200046004C004F00410054002C0020005000720069006E0063006900700061006C00200046004C004F00410054002C00200049006E00740065007200650073007400200046004C004F00410054002C00200045006E00640069006E006700420061006C0061006E0063006500200046004C004F00410054002C002000430075006D0075006C006100740069007600650049006E00740065007200650073007400200046004C004F00410054002C00200054006F00740061006C0049006E00740065007200650073007400200046004C004F00410054002C00200054006F00740061006C005000610079006D0065006E0074007300200049004E0054002C0020005000610079006D0065006E00740073004C00650066007400200049004E0054002900002D2A002A002A00200044006100740065002000460075006E006300740069006F006E00730020002A002A002A000080C144006100740065005F00410067006500280053007400610072007400440061007400650020004400410054004500540049004D0045002C00200045006E006400440061007400650020004400410054004500540049004D0045002C0020004C006500610070005900650061007200480061006E0064006C0069006E00670020004E0056004100520043004800410052002800340030003000300029002C00200049006E0063006C0075006400650044006100790073002000420049005400290000810B4E004F005400450053003A0020004C006500610070005900650061007200480061006E0064006C0069006E0067003A0020003200380020002F002000460020002F00200046006500620020003D00200046006500620020003200390074006800200069006E0020006E006F006E002D004C00650061007000200059006500610072002000690073002000460065006200200032003800740068003B002000310020002F0020004D0020002F0020004D00610072006300680020003D00200046006500620020003200390074006800200069006E0020006E006F006E002D004C006500610070002000590065006100720020006900730020004D00610072006300680020003100730074000180FB4E004F005400450053003A00200049006E0063006C00750064006500440061007900730020003D00200031002000770069006C006C002000720065007400750072006E0020006E0075006D0062006500720020006F0066002000640061007900730020006200650074007700650065006E002000700072006500760069006F0075007300200061006E006E006900760065007200730061007200790020006400610074006500200061006E006400200045006E0064004400610074006500200061007300200064006500630069006D0061006C002C00200065006C00730065002000720065007400750072006E00730020002E0030003000300000809944006100740065005F0042007500730069006E006500730073004400610079007300280053007400610072007400440061007400650020004400410054004500540049004D0045002C00200045006E006400440061007400650020004400410054004500540049004D0045002C0020004500780063006C0075006400650044006100790073004D00610073006B00200049004E005400290000374E004F005400450053003A00200053007400610072007400440061007400650020003C003D00200045006E006400440061007400650000594E004F005400450053003A00200053006500650020006D0061006E00750061006C00200066006F00720020004500780063006C0075006400650044006100790073004D00610073006B002000760061006C00750065007300004D44006100740065005F00440061007900730049006E004D006F006E00740068005D0028005900650061007200200049004E0054002C0020004D006F006E0074006800200049004E0054002900004D44006100740065005F0044006100790073004C0065006600740049006E0059006500610072005D002800540068006500440061007400650020004400410054004500540049004D0045002900006944006100740065005F00450078007400720061006300740028004400610074006500500061007200740020004E0056004100520043004800410052002800340030003000300029002C002000440061007400650020004400410054004500540049004D00450029000080B34E004F005400450053003A0020004400610074006500500061007200740020003D00200044006500630061006400650020002F002000430065006E00740075007200790020002F0020004D0069006C006C0065006E006E00690075006D0020002F002000490053004F0044004F00570020007C002000490053004F005700650065006B0044006100790020002F002000490053004F00590065006100720020002F002000490053004F005700650065006B000080CD44006100740065005F00460069007200730074004400610079004F0066004D006F006E00740068005D002800540068006500440061007400650020004400410054004500540049004D0045002C0020004E006500770048006F0075007200200049004E0054002C0020004E00650077004D0069006E00750074006500200049004E0054002C0020004E00650077005300650063006F006E006400200049004E0054002C0020004E00650077004D0069006C006C0069007300650063006F006E006400200049004E00540029000023520045005400550052004E0053003A0020004400410054004500540049004D0045000080AD44006100740065005F0046006F0072006D0061007400540069006D0065005300700061006E00280053007400610072007400440061007400650020004400410054004500540049004D0045002C00200045006E006400440061007400650020004400410054004500540049004D0045002C0020004F007500740070007500740046006F0072006D006100740020004E0056004100520043004800410052002800340030003000300029002900002D520045005400550052004E00530020004E00560041005200430048004100520028003400300030003000290000614E004F005400450053003A00200053006500650020006D0061006E00750061006C00200066006F00720020004F007500740070007500740046006F0072006D00610074002000730070006500630069006600690063006100740069006F006E00004344006100740065005F00460072006F006D0055004E0049005800540069006D006500280055004E00490058004400610074006500200046004C004F00410054002900004D44006100740065005F00460075006C006C00440061007400650053007400720069006E0067005D002800540068006500440061007400650020004400410054004500540049004D0045002900004D44006100740065005F00460075006C006C00540069006D00650053007400720069006E0067005D002800540068006500440061007400650020004400410054004500540049004D0045002900007344006100740065005F004900730042007500730069006E006500730073004400610079002800540068006500440061007400650020004400410054004500540049004D0045002C0020004500780063006C0075006400650044006100790073004D00610073006B00200049004E0054002900003344006100740065005F00490073004C00650061007000590065006100720028005900650061007200200049004E00540029000080C944006100740065005F004C006100730074004400610079004F0066004D006F006E00740068002800540068006500440061007400650020004400410054004500540049004D0045002C0020004E006500770048006F0075007200200049004E0054002C0020004E00650077004D0069006E00750074006500200049004E0054002C0020004E00650077005300650063006F006E006400200049004E0054002C0020004E00650077004D0069006C006C0069007300650063006F006E006400200049004E00540029000080B544006100740065005F004E00740068004F006300630075007200720065006E00630065004F0066005700650065006B0064006100790028004F006300630075007200720065006E0063006500200053004D0041004C004C0049004E0054002C0020005700650065006B0064006100790020004E00560041005200430048004100520028003100300029002C00200053007400610072007400440061007400650020004400410054004500540049004D0045002900004344006100740065005F0054006F0055004E0049005800540069006D0065002800530051004C00440061007400650020004400410054004500540049004D0045002900006B44006100740065005F005400720075006E00630061007400650028004400610074006500500061007200740020004E0056004100520043004800410052002800340030003000300029002C002000440061007400650020004400410054004500540049004D00450029000080DD4E004F005400450053003A0020004400610074006500500061007200740020003D0020004D0069006C006C0065006E006E00690075006D0020002F002000430065006E00740075007200790020002F00200044006500630061006400650020002F002000590065006100720020002F002000510075006100720074006500720020002F0020004D006F006E007400680020002F0020005700650065006B0020002F00200044006100790020002F00200048006F007500720020002F0020004D0069006E0075007400650020002F0020005300650063006F006E00640000352A002A002A00200049006E007400650072006E00650074002000460075006E006300740069006F006E00730020002A002A002A00005D49004E00450054005F00410064006400720065007300730054006F004E0075006D00620065007200280049005000410064006400720065007300730020004E0056004100520043004800410052002800340030003000300029002900005549004E00450054005F00480054004D004C004400650063006F0064006500280045006E0063006F00640065006400480054004D004C0020004E00560041005200430048004100520028004D0041005800290029000080CB49004E00450054005F00480054004D004C0045006E0063006F006400650028004400650063006F00640065006400480054004D004C0020004E00560041005200430048004100520028004D004100580029002C0020005700680069007400650053007000610063006500480061006E0064006C0069006E00670020004E0056004100520043004800410052002800340030003000300029002C00200043006F006E00740069006E0075006F007500730045006E0063006F00640069006E0067002000420049005400290000754E004F005400450053003A0020005700680069007400650053007000610063006500480061006E0064006C0069006E00670020003D00200053007000610063006500730020002F002000520065007400750072006E00730020002F00200042006F007400680020002F0020004E006F006E006500005F49004E00450054005F0049007300560061006C0069006400490050004100640064007200650073007300280049005000410064006400720065007300730020004E0056004100520043004800410052002800340030003000300029002900004B49004E00450054005F004E0075006D0062006500720054006F0041006400640072006500730073002800490050004E0075006D00620065007200200042004900470049004E0054002900005349004E00450054005F005500520049004400650063006F0064006500280045006E0063006F0064006500640055005200490020004E0056004100520043004800410052002800340030003000300029002900005349004E00450054005F0055005200490045006E0063006F006400650028004400650063006F0064006500640055005200490020004E0056004100520043004800410052002800340030003000300029002900006349004E00450054005F0055005200490045006E0063006F0064006500440061007400610028004400650063006F00640065006400550052004900440061007400610020004E005600410052004300480041005200280034003000300030002900290000808349004E00450054005F005500520049004700650074004C006500660074005000610072007400280055005200490020004E0056004100520043004800410052002800340030003000300029002C0020005000610072007400690061006C00540079007000650020004E00560041005200430048004100520028003500300029002900006D4E004F005400450053003A0020005000610072007400690061006C00540079007000650020003D00200041007500740068006F00720069007400790020002F002000500061007400680020002F0020005100750065007200790020002F00200053006300680065006D006500004749004E00450054005F0055005200490047006500740049006E0066006F00280055005200490020004E00560041005200430048004100520028003400300030003000290029000083B1520045005400550052004E0053003A0020005400410042004C004500200028004100620073006F006C00750074006500500061007400680020004E0056004100520043004800410052002800340030003000300029002C0020004100620073006F006C0075007400650055007200690020004E0056004100520043004800410052002800340030003000300029002C00200041007500740068006F00720069007400790020004E0056004100520043004800410052002800340030003000300029002C00200044006E007300530061006600650048006F007300740020004E0056004100520043004800410052002800340030003000300029002C00200046007200610067006D0065006E00740020004E0056004100520043004800410052002800340030003000300029002C002000480061007300680043006F0064006500200049004E0054002C00200048006F007300740020004E0056004100520043004800410052002800340030003000300029002C00200048006F00730074004E0061006D006500540079007000650020004E00560041005200430048004100520028003500300029002C002000490073004100620073006F006C0075007400650055007200690020004200490054002C00200049007300440065006600610075006C00740050006F007200740020004200490054002C00200049007300460069006C00650020004200490054002C002000490073004C006F006F0070006200610063006B0020004200490054002C0020004900730055006E00630020004200490054002C00200049007300570065006C006C0046006F0072006D00650064004F0072006900670069006E0061006C0053007400720069006E00670020004200490054002C0020004C006F00630061006C00500061007400680020004E0056004100520043004800410052002800340030003000300029002C002000500061007400680041006E0064005100750065007200790020004E0056004100520043004800410052002800340030003000300029002C00200050006F0072007400200049004E0054002C0020005100750065007200790020004E0056004100520043004800410052002800340030003000300029002C00200053006300680065006D00650020004E00560041005200430048004100520028003500300029002C0020005500730065007200450073006300610070006500640020004200490054002C002000550073006500720049006E0066006F0020004E005600410052004300480041005200280034003000300030002900290000352A002A002A002000440061007400610062006100730065002000460075006E006300740069006F006E00730020002A002A002A00008233440042005F00420075006C006B0043006F007000790020005B00400053006F00750072006300650043006F006E006E0065006300740069006F006E0020004E0056004100520043004800410052002800340030003000300029002C005D002000400053006F0075007200630065005100750065007200790020004E0056004100520043004800410052002800340030003000300029002C0020005B004000440065007300740069006E006100740069006F006E0043006F006E006E0065006300740069006F006E0020004E0056004100520043004800410052002800340030003000300029002C005D0020004000440065007300740069006E006100740069006F006E005400610062006C0065004E0061006D00650020004E0056004100520043004800410052002800340030003000300029002C002000400042006100740063006800530069007A006500200049004E0054002C00200040004E006F0074006900660079004100660074006500720052006F0077007300200049004E0054002C0020004000540069006D0065004F0075007400200049004E00540020005B002C002000400043006F006C0075006D006E004D0061007000700069006E006700730020004E0056004100520043004800410052002800340030003000300029005D0020005B002C0020004000420075006C006B0043006F00700079004F007000740069006F006E0073004C0069007300740020004E0056004100520043004800410052002800340030003000300029005D000065500052004F0043003A00200049006D0070006F007200740073002000640061007400610020006C0069006B00650020004200430050002C00200053005300490053002C00200061006E0064002000420055004C004B00200049004E0053004500520054000082D5440042005F00420075006C006B004500780070006F0072007400200040005100750065007200790020004E0056004100520043004800410052002800340030003000300029002C002000400054006500780074005100750061006C006900660069006500720020004E0056004100520043004800410052002800340030003000300029002C002000400054006500780074005100750061006C0069006600790041006C006C0043006F006C0075006D006E00730020004200490054002C002000400043006F006C0075006D006E00480065006100640065007200480061006E0064006C0069006E00670020004E00560041005200430048004100520028003100300029002C0020004000420069007400480061006E0064006C0069006E00670020004E00560041005200430048004100520028003100300029002C00200040004600690072007300740052006F007700200049004E0054002C00200040004C0061007300740052006F007700200049004E0054002C00200040004F0075007400700075007400460069006C006500500061007400680020004E0056004100520043004800410052002800340030003000300029002C00200040004600690065006C0064005400650072006D0069006E00610074006F00720020004E0056004100520043004800410052002800340030003000300029002C002000400052006F0077005400650072006D0069006E00610074006F00720020004E0056004100520043004800410052002800340030003000300029002C0020004000460069006C00650045006E0063006F00640069006E00670020004E00560041005200430048004100520028003200300029002C002000400041007000700065006E006400460069006C006500200042004900540020003D00200030002C002000400052006F00770073004500780070006F007200740065006400200049004E00540020003D0020002D00310020004F00550054005000550054000149500052004F0043003A0020004500780070006F007200740073002000640061007400610020006C0069006B0065002000420043005000200061006E00640020005300530049005300006F4E004F005400450053003A0020004000420069007400480061006E006C00640069006E00670020003D00200057006F007200640020002800440065006600610075006C00740029002C0020004C00650074007400650072002C0020006F00720020004E0075006D006200650072000081F3440042005F0046006F007200450061006300680020005B004000440042005000610074007400650072006E0020004E0056004100520043004800410052002800340030003000300029002C005D0020005B004000440042004500780063006C007500640065005000610074007400650072006E0020004E0056004100520043004800410052002800340030003000300029002C005D0020005B0040005400610062006C0065005000610074007400650072006E0020004E0056004100520043004800410052002800340030003000300029002C005D0020005B0040005400610062006C0065004500780063006C007500640065005000610074007400650072006E0020004E0056004100520043004800410052002800340030003000300029002C005D0020005B0040005000720065005400610062006C0065005100750065007200790020004E0056004100520043004800410052002800340030003000300029002C005D0020005B00400046006F00720045006100630068005400610062006C0065005100750065007200790020004E0056004100520043004800410052002800340030003000300029002C005D0020005B00400050006F00730074005400610062006C0065005100750065007200790020004E0056004100520043004800410052002800340030003000300029005D000080C3500052004F0043003A00200057006F0072006B00730020006C0069006B00650020004D0053005F0046006F00720045006100630068004400420020006200750074002000630061006E00200061006C0073006F0020006900740074006500720061007400650020006F0076006500720020007400610062006C00650073002000770069007400680020007000720065002D00200061006E006400200070006F00730074002D005400610062006C006500200063006F006D006D0061006E006400730001842F440042005F00480054004D004C004500780070006F007200740028005100750065007200790020004E0056004100520043004800410052002800340030003000300029002C00200043006F006C0075006D006E00480065006100640065007200480061006E0064006C0069006E00670020004E0056004100520043004800410052002800340030003000300029002C002000420069007400480061006E0064006C0069006E00670020004E0056004100520043004800410052002800340030003000300029002C0020004E0075006C006C005200650070006C006100630065006D0065006E00740020004E0056004100520043004800410052002800340030003000300029002C0020004600690072007300740052006F007700200049004E0054002C0020004C0061007300740052006F007700200049004E0054002C0020005000720065005400610062006C00650020004E00560041005200430048004100520028004D004100580029002C00200050007200650048006500610064006500720052006F00770020004E0056004100520043004800410052002800340030003000300029002C00200050007200650048006500610064006500720043006F006C0075006D006E0020004E0056004100520043004800410052002800340030003000300029002C00200050006F007300740048006500610064006500720043006F006C0075006D006E0020004E0056004100520043004800410052002800340030003000300029002C00200050006F007300740048006500610064006500720052006F00770020004E0056004100520043004800410052002800340030003000300029002C002000500072006500440061007400610052006F00770020004E0056004100520043004800410052002800340030003000300029002C002000500072006500440061007400610043006F006C0075006D006E0020004E0056004100520043004800410052002800340030003000300029002C00200050006F0073007400440061007400610043006F006C0075006D006E0020004E0056004100520043004800410052002800340030003000300029002C00200050006F0073007400440061007400610052006F00770020004E0056004100520043004800410052002800340030003000300029002C00200050006F00730074005400610062006C00650020004E00560041005200430048004100520028004D004100580029002C0020004F0075007400700075007400460069006C006500500061007400680020004E0056004100520043004800410052002800340030003000300029002C002000460069006C00650045006E0063006F00640069006E00670020004E0056004100520043004800410052002800340030003000300029002C00200045006E0063006F0064006500480054004D004C0020004E00560041005200430048004100520028003400300030003000290029000045440042005F0058004F0052002800560061006C00750065004F006E00650020004200490054002C002000560061006C0075006500540077006F002000420049005400290000332A002A002A00200043006F006E0076006500720074002000460075006E006300740069006F006E00730020002A002A002A00006B43006F006E0076006500720074005F00420069006E0061007200790054006F0048006500780053007400720069006E0067002800420069006E00610072007900560061006C00750065002000560041005200420049004E0041005200590028004D004100580029002900005D43006F006E0076006500720074005F00460072006F006D00420061007300650036003400280045006E0063006F00640065006400560061006C007500650020004E00560041005200430048004100520028004D004100580029002900002F520045005400550052004E0053003A002000560041005200420049004E0041005200590028004D00410058002900006F43006F006E0076006500720074005F0048006500780053007400720069006E00670054006F00420069006E00610072007900280048006500780053007400720069006E006700560061006C007500650020004E00560041005200430048004100520028004D0041005800290029000080BF43006F006E0076006500720074005F00480074006D006C0054006F0058006D006C00280044006F00630075006D0065006E00740020004E00560041005200430048004100520028004D004100580029002C00200044006F00630075006D0065006E00740055007200690020004E005600410052004300480041005200280031\
-0030003200340029002C002000430061007300650046006F006C00640069006E00670020004E00560041005200430048004100520028003500300029002900004D43006F006E0076006500720074005F0052004F0054003100330028005400650078007400560061006C007500650020004E00560041005200430048004100520028004D0041005800290029000080AD43006F006E0076006500720074005F0054006F00420061007300650036003400280055006E0065006E0063006F00640065006400560061006C00750065002000560041005200420049004E0041005200590028004D004100580029002C00200042006100730065003600340046006F0072006D0061007400740069006E0067004F007000740069006F006E0020004E005600410052004300480041005200280034003000300030002900290000714E004F005400450053003A00200042006100730065003600340046006F0072006D0061007400740069006E0067004F007000740069006F006E0020003D00200049006E0073006500720074004C0069006E00650042007200650061006B00730020006F00720020004E006F006E006500005943006F006E0076006500720074005F00550055004400650063006F0064006500280045006E0063006F00640065006400560061006C007500650020004E00560041005200430048004100520028004D004100580029002900005F43006F006E0076006500720074005F005500550045006E0063006F0064006500280055006E0065006E0063006F00640065006400560061006C00750065002000560041005200420049004E0041005200590028004D00410058002900290000312A002A002A0020004C006F006F006B00550070002000460075006E006300740069006F006E00730020002A002A002A0000614C006F006F006B00550070005F0047006500740043006F0075006E0074007200790049006E0066006F00280053006500610072006300680043006F006400650020004E005600410052004300480041005200280034003000300030002900290000811D520045005400550052004E0053003A0020005400410042004C004500200028005B004E0075006D00650072006900630043006F00640065005D0020004E0043004800410052002800330029002C0020005B00540077006F004C006500740074006500720043006F00640065005D0020004E0043004800410052002800320029002C0020005B00540068007200650065004C006500740074006500720043006F00640065005D0020004E0043004800410052002800330029002C0020005B004E0061006D0065005D0020004E00560041005200430048004100520028003500300029002C0020005B0046006C006100670049006D006100670065005D002000560041005200420049004E0041005200590028004D00410058002900290000811B4E004F005400450053003A00200053006500610072006300680043006F00640065002000630061006E002000620065002000650069007400680065007200200074006800650020004E0075006D0065007200690063002C002000540077006F004C006500740074006500720043006F00640065002C0020006F0072002000540068007200650065004C006500740074006500720043006F00640065003B0020006900660020006500690074006800650072002000540077006F0020006F00720020005400680072006500650020004C006500740074006500720043006F00640065002C0020007400680065006E0020006900730020004E004F005400200063006100730065002D00730065006E007300690074006900760065000180874E004F005400450053003A00200049006600200053006500610072006300680043006F0064006500200069007300200065006D0070007400790020002700270020006F00720020004E0055004C004C0020007400680065006E002000720065007400750072006E007300200061006C006C00200043006F0075006E00740072006900650073000180954C006F006F006B00550070005F004700650074005300740061007400650049006E0066006F00280053006500610072006300680043006F006400650020004E0056004100520043004800410052002800340030003000300029002C00200043006F0075006E0074007200790043006F006400650020004E0056004100520043004800410052002800340030003000300029002900008115520045005400550052004E0053003A0020005400410042004C004500200028005B004E0075006D00650072006900630043006F00640065005D0020004E0043004800410052002800320029002C0020005B00540077006F004C006500740074006500720043006F00640065005D0020004E0043004800410052002800320029002C0020005B004E0061006D0065005D0020004E00560041005200430048004100520028003500300029002C0020005B0046006C006100670049006D006100670065005D002000560041005200420049004E0041005200590028004D004100580029002C0020005B0043006F0075006E0074007200790043006F00640065005D0020004E00430048004100520028003200290029000080D54E004F005400450053003A00200053006500610072006300680043006F00640065002000630061006E002000620065002000650069007400680065007200200074006800650020004E0075006D00650072006900630020006F0072002000540077006F004C006500740074006500720043006F00640065003B002000690066002000540077006F004C006500740074006500720043006F00640065002C0020007400680065006E0020006900730020004E004F005400200063006100730065002D00730065006E007300690074006900760065000180AB4E004F005400450053003A00200049006600200053006500610072006300680043006F0064006500200069007300200065006D0070007400790020002700270020006F00720020004E0055004C004C0020007400680065006E002000720065007400750072006E007300200061006C006C00200053007400610074006500730020006200610073006500640020006F006E00200043006F0075006E0074007200790043006F006400650001734E004F005400450053003A00200043006F0075006E0074007200790043006F006400650020003D00200065006D007000740079002000270027002000280069002E0065002E0020006E006F002000660069006C0074006500720029002C002000550053002C0020006F0072002000430041000180F12A002A002A0020004F00530020002F002000530079007300740065006D002000460075006E006300740069006F006E007300200028004500760065006E0074004C006F0067002C002000470065006E006500720061007400650054006F006E0065002C00200061006E0064002000500072006F0063006500730073002000660075006E006300740069006F006E00730020007200650071007500690072006500200055004E00520045005300540052004900430054004500440020007000650072006D0069007300730069006F006E00730020002F0020004C006500760065006C0020003300290020002A002A002A000082BB4F0053005F004500760065006E0074004C006F0067005200650061006400280040004C006F0067004E0061006D00650020004E0056004100520043004800410052002800340030003000300029002C00200040004D0061006300680069006E0065004E0061006D00650020004E0056004100520043004800410052002800340030003000300029002C002000400053006F00750072006300650020004E0056004100520043004800410052002800340030003000300029002C002000400045006E00740072007900540079007000650020004E0056004100520043004800410052002800340030003000300029002C002000400049006E007300740061006E00630065004900440020004E0056004100520043004800410052002800340030003000300029002C0020004000430061007400650067006F007200790020004E0056004100520043004800410052002800340030003000300029002C002000400055007300650072004E0061006D00650020004E0056004100520043004800410052002800340030003000300029002C00200040004D0065007300730061006700650020004E0056004100520043004800410052002800340030003000300029002C0020004000540069006D006500470065006E0065007200610074006500640042006500670069006E0020004400410054004500540049004D0045002C0020004000540069006D006500470065006E0065007200610074006500640045006E00640020004400410054004500540049004D0045002C002000400049006E0064006500780042006500670069006E00200049004E0054002C002000400049006E0064006500780045006E006400200049004E0054002C0020004000520065006700450078004F007000740069006F006E0073004C0069007300740020004E00560041005200430048004100520028003400300030003000290029000081F5520045005400550052004E0053003A0020005400410042004C004500200028005B0049006E006400650078005D00200049004E0054002C0020005B00430061007400650067006F00720079005D0020004E005600410052004300480041005200280035003000300029002C0020005B0045006E0074007200790054007900700065005D0020004E00560041005200430048004100520028003500300029002C0020005B0049006E007300740061006E0063006500490064005D00200042004900470049004E0054002C0020005B0053006F0075007200630065005D0020004E005600410052004300480041005200280035003000300029002C0020005B00540069006D006500470065006E006500720061007400650064005D0020004400410054004500540049004D0045002C0020005B00540069006D0065005700720069007400740065006E005D0020004400410054004500540049004D0045002C0020005B0055007300650072004E0061006D0065005D0020004E005600410052004300480041005200280031003000300029002C0020005B004D006500730073006100670065005D0020004E0056004100520043004800410052002800340030003000300029002C0020005B0044006100740061005D002000560041005200420049004E0041005200590028004D0041005800290029000080994E004F005400450053003A0020004500760065006E007400540079007000650020003D0020004500720072006F0072002C00200049006E0066006F0072006D006100740069006F006E002C0020005700610072006E0069006E0067002C0020004600610069006C007500720065002000410075006400690074002C00200053007500630063006500730073002000410075006400690074000081A94F0053005F004500760065006E0074004C006F00670057007200690074006500280040004C006F0067004E0061006D00650020004E0056004100520043004800410052002800340030003000300029002C00200040004D0061006300680069006E0065004E0061006D00650020004E0056004100520043004800410052002800340030003000300029002C002000400053006F00750072006300650020004E0056004100520043004800410052002800340030003000300029002C002000400045006E00740072007900540079007000650020004E0056004100520043004800410052002800340030003000300029002C002000400049006E007300740061006E006300650049004400200049004E0054002C0020004000430061007400650067006F0072007900200053004D0041004C004C0049004E0054002C00200040004D0065007300730061006700650020004E0056004100520043004800410052002800340030003000300029002C0020004000420069006E0061007200790044006100740061002000560041005200420049004E00410052005900280038003000300030002900290000594F0053005F00470065006E006500720061007400650054006F006E00650028004600720065007100750065006E0063007900200049004E0054002C0020004400750072006100740069006F006E00200049004E005400290000214F0053005F004D0061006300680069006E0065004E0061006D0065002800290000174F0053005F0055007000740069006D0065002800290000332A002A002A00200054007700690074007400650072002000460075006E006300740069006F006E00730020002A002A002A000080AB54007700690074007400650072005F00440065007300740072006F0079004D00650073007300610067006500280055007300650072004E0061006D00650020004E0056004100520043004800410052002800340030003000300029002C002000500061007300730077006F007200640020004E0056004100520043004800410052002800340030003000300029002C00200053007400610074007500730049004400200049004E00540000809954007700690074007400650072005F0047006500740046007200690065006E0064007300540069006D0065006C0069006E006500280055007300650072004E0061006D00650020004E0056004100520043004800410052002800340030003000300029002C002000500061007300730077006F007200640020004E0056004100520043004800410052002800340030003000300029002900001D520045005400550052004E0053003A0020005400410042004C00450000808B54007700690074007400650072005F004700650074004D006500730073006100670065007300280055007300650072004E0061006D00650020004E0056004100520043004800410052002800340030003000300029002C002000500061007300730077006F007200640020004E005600410052004300480041005200280034003000300030002900290000809754007700690074007400650072005F004700650074005000750062006C0069006300540069006D0065006C0069006E006500280055007300650072004E0061006D00650020004E0056004100520043004800410052002800340030003000300029002C002000500061007300730077006F007200640020004E005600410052004300480041005200280034003000300030002900290000808954007700690074007400650072005F004700650074005200650070006C00690065007300280055007300650072004E0061006D00650020004E0056004100520043004800410052002800340030003000300029002C002000500061007300730077006F007200640020004E0056004100520043004800410052002800340030003000300029002900001B520045005400550052004E00530020005400410042004C00450000809354007700690074007400650072005F00470065007400530065006E0074004D006500730073006100670065007300280055007300650072004E0061006D00650020004E0056004100520043004800410052002800340030003000300029002C002000500061007300730077006F007200640020004E005600410052004300480041005200280034003000300030002900290000809354007700690074007400650072005F004700650074005500730065007200540069006D0065006C0069006E006500280055007300650072004E0061006D00650020004E0056004100520043004800410052002800340030003000300029002C002000500061007300730077006F007200640020004E00560041005200430048004100520028003400300030003000290029000080F954007700690074007400650072005F00530065006E0064004400690072006500630074004D00650073007300610067006500280055007300650072004E0061006D00650020004E0056004100520043004800410052002800340030003000300029002C002000500061007300730077006F007200640020004E0056004100520043004800410052002800340030003000300029002C0020004D0065007300730061006700650020004E005600410052004300480041005200280031003400300029002C00200052006500630069007000690065006E00740020004E00560041005200430048004100520028003400300030003000290029000080DD54007700690074007400650072005F00550070006400610074006500280055007300650072004E0061006D00650020004E0056004100520043004800410052002800340030003000300029002C002000500061007300730077006F007200640020004E0056004100520043004800410052002800340030003000300029002C0020004D0065007300730061006700650020004E005600410052004300480041005200280031003400300029002C00200049006E005200650070006C00790054006F0053007400610074007500730049004400200049004E0054002900002D2A002A002A002000530051004C0023002000460075006E006300740069006F006E00730020002A002A002A00001D530051004C00730068006100720070005F0053006500740075007000004D500052004F0043003A00200043007200650061007400650073002000460075006E006300740069006F006E007300200061006E0064002000500072006F0063006500640075007200650073000035530051004C00730068006100720070005F004900730055007000640061007400650041007600610069006C00610062006C00650000674E004F005400450053003A002000520065007100750069007200650073002000730065006300750072006900740079002000730065007400740069006E00670020006F0066002000450058005400450052004E0041004C005F004100430043004500530053000063530051004C00730068006100720070005F004700720061006E0074005000650072006D0069007300730069006F006E007300200040004700720061006E00740054006F0020004E00560041005200430048004100520028003400300030003000290000809F500052004F0043003A0020004700720061006E007400730020005000650072006D0069007300730069006F006E007300200066006F0072002000530051004C0023002000460075006E006300740069006F006E007300200061006E0064002000500072006F006300650064007500720065007300200074006F002000730070006500630069006600690065006400200075007300650072002800730029000080E74E004F005400450053003A0020004500780063006500700074003A002000530051004C00730068006100720070005F00530065007400750070002C002000530051004C00730068006100720070005F005500700064006100740065002C002000530051004C00730068006100720070005F0055006E0069006E007300740061006C006C002C002000530051004C00730068006100720070005F00530065007400530065006300750072006900740079002C002000530051004C00730068006100720070005F004700720061006E0074005000650072006D0069007300730069006F006E00730000774E004F005400450053003A002000540068006500200066006F006C006C006F00770069006E0067002000630068006100720061006300740065007200730020006100720065002000720065006D006F007600650064003A0020002A002C0020002F002C0020002D002C00200061006E00640020003B00011B530051004C00730068006100720070005F00480065006C007000008091500052004F0043003A00200044006900730070006C0061007900730020006C0069007300740020006F006600200064006500660069006E006900740069006F006E007300200066006F007200200061006C006C002000530051004C0023002000460075006E006300740069006F006E007300200061006E0064002000500072006F006300650064007500720065007300008091530051004C00730068006100720070005F0053006500740053006500630075007200690074007900200040005000650072006D0069007300730069006F006E00530065007400200049004E00540020005B002C002000400041007300730065006D0062006C0079004E0061006D00650020004E0056004100520043004800410052002800340030003000300029005D00008087500052004F0043003A002000530065007400730020004400420020005400720075007300740077006F0072007400680079002000280066006F0072002000320020006F007200200033002900200061006E006400200041007300730065006D0062006C00790020005000450052004D0049005300530049004F004E005F005300450054002E000080AD4E004F005400450053003A002000300020003D00200044006900730070006C00610079002000630075007200720065006E0074002000730065007400740069006E0067002C002000310020003D00200053004100460045002C002000320020003D002000450058005400450052004E0041004C005F004100430043004500530053002C0020006F0072002000330020003D00200055004E0052004500530054005200490043005400450044000025530051004C00730068006100720070005F0055006E0069006E007300740061006C006C000080A1500052004F0043003A002000440072006F0070007300200061006C006C002000530051004C0023002000460075006E006300740069006F006E007300200061006E0064002000500072006F006300650064007500720065007300200061006E0064002000660069006E0061006C006C00790020007400680065002000530051004C0073006800610072007000200041007300730065006D0062006C0079002E000025530051004C00730068006100720070005F00560065007200730069006F006E00280029000025530051004C00730068006100720070005F00570065006200530069007400650028002900003F2A002A002A00200055007300650072002D0044006500660069006E00650064002000410067006700720065006700610074006500730020002A002A002A00012F4100670067005F00470065006F006D0065007400720069006300410076006700280046004C004F0041005400290000254100670067005F004A006F0069006E0028004E00560041005200430048004100520029000023520045005400550052004E0053003A0020004E00560041005200430048004100520000234100670067005F004D0065006400690061006E00280046004C004F0041005400290000234100670067005F00520061006E0064006F006D00280046004C004F00410054002900002D4100670067005F0052006F006F0074004D00650061006E00530071007200280046004C004F0041005400290000352A002A002A00200055007300650072002D0044006500660069006E006500640020005400790070006500730020002A002A002A00011F54007900700065005F0046006C006F00610074004100720072006100790000574E004F005400450053003A0020004900730020006100200031002D0062006100730065006400200069006E006400650078006500640020006100720072006100790020006F006600200046004C004F00410054007300011D54007900700065005F0048006100730068005400610062006C00650000414E004F005400450053003A002000490073002000610020006B00650079002F00760061006C007500650020007000610069007200200061007200720061007900002554007900700065005F004E0056006100720063006800610072004100720072006100790000694E004F005400450053003A0020004900730020006100200031002D0062006100730065006400200069006E006400650078006500640020006100720072006100790020006F00660020004E0056004100520043004800410052002800340030003000300029007300014920002D002D002D002D002D002D002D002000200065006E00640020006F0066002000680065006C007000200069006E0066006F00200020002D002D002D002D002D002D002D002000010969006E0066006F00003168007400740070003A002F002F007700770077002E00730071006C00730068006100720070002E0063006F006D002F00001909004900460020002800450058004900530054005300280000190900090009000900530045004C0045004300540009002A00002F0900090009000900460052004F004D0009007300790073002E0061007300730065006D0062006C00690065007300002B09000900090009005700480045005200450009005B006E0061006D0065005D0020003D0020004E0027000127090009005000520049004E0054002000270009004300720065006100740069006E0067002000011D20004F0062006A00650063007400730020002E002E002E0027003B00012B090009005300450054002000400045006E007400720079004E0075006D0062006500720020003D00200000033B000011090009004500580045004300280027000107270029003B000180910900090052004100490053004500520052004F00520028004E002700090009002500640020004F0062006A00650063007400280073002900200063007200650061007400650064002E0027002C00200030002C00200030002C002000400045006E007400720079004E0075006D0062006500720029002000570049005400480020004E004F0057004100490054003B000180870900530045005400200040004500720072006F0072004D0065007300730061006700650020003D0020004E0027004C0069006E0065002000270020002B00200043004F004E00560045005200540028004E00560041005200430048004100520028003300300029002C0020004500520052004F0052005F004C0049004E0045002800290029000180A7090009002B0020004E0027002000280045006E00740072007900200023002000270020002B00200043004F004E00560045005200540028004E00560041005200430048004100520028003300300029002C002000400045006E007400720079004E0075006D00620065007200290020002B0020004E00270029003A002000270020002B0020004500520052004F0052005F004D00450053005300410047004500280029003B00011B090052004100490053004500520052004F005200280027005B00014F5D00200041007300730065006D0062006C0079003A0020002500730027002C002000310036002C00200031002C00200040004500720072006F0072004D0065007300730061006700650029003B00011545004E0044002000430041005400430048003B0000052C007C00000322000059220020006900730020006E006F007400200061002000760061006C0069006400200053007400720069006E00670043006F006D0070006100720065004F007000740069006F006E0073002000760061006C00750065002E00002B400053007400720069006E00670043006F006D0070006100720065004F007000740069006F006E00730000435300740061007200740049006E006400650078002000630061006E004E004F00540020006200650020006C0065007300730020007400680061006E00200031002E0000\
-7553007400720069006E006700570069006400740068002000630061006E004E004F00540020006200650020006C0065007300730020007400680061006E00200074006800650020006C0065006E0067007400680020006F006600200053007400720069006E006700560061006C00750065002E00003353006500700061007200610074006F0072002000630061006E004E004F005400200062006500200065006D00700074007900005F3100200061006E00640020003200200061007200650020006F006E006C0079002000760061006C006900640020006F007000740069006F006E007300200066006F0072002000530070006C00690074004F007000740069006F006E002E000029530051004C002000630061006E004E004F005400200062006500200065006D007000740079002E0000414C0069006E006500570069006400740068002000630061006E004E004F00540020006200650020006C0065007300730020007400680061006E00200031002E00002D5300650061007200630068002000630061006E004E004F005400200062006500200065006D00700074007900004343006F006D00700061007200690073006F006E0054007900700065002000630061006E0020006F006E006C0079002000620065002000310020006F00720020003200003B53007400610072007400410074002000630061006E004E004F00540020006200650020006C0065007300730020007400680061006E0020003100007153007400610072007400410074002000630061006E004E004F0054002000620065002000670072006500610074006500720020007400680061006E00200074006800650020006C0065006E0067007400680020006F006600200053007400720069006E006700560061006C00750065000009630072006C0066000007770069006E00000F770069006E0064006F0077007300000764006F00730000096F0073002F00320000056C006600000975006E006900780000056300720000076D006100630000056600660000076E0065006C000007330039003000000D6F0073002F00330039003000000D6500620063006400690063000009680074006D006C00000B7800680074006D006C0000030A0000030D0000030C000003850001093C00420052003E00000D3C006200720020002F003E00001945004F004C00540079007000650020006F0066003A002000001B20006900730020006E006F0074002000760061006C006900640000454E00740068004F00630063007500720061006E00630065002000630061006E004E004F00540020006200650020006C0065007300730020007400680061006E002000310000755E0028005B002B005D007C005B002D005D0029003F0028005C0064007B0030002C007D0029003F0028005B002E005D005C0064007B0030002C007D0029003F0028005B0045006500440064005D0028005B002B005D007C005B002D005D0029003F005C0064007B0031002C007D0029003F00240001755E0028005B002B005D007C005B002D005D0029003F0028005C0064007B0030002C007D0029003F0028005B002C005D005C0064007B0030002C007D0029003F0028005B0045006500440064005D0028005B002B005D007C005B002D005D0029003F005C0064007B0031002C007D0029003F00240001810B28002800A20029007C002800A30029007C002800A40029007C002800A50029007C002800F20929007C002800F30929007C0028003F0E29007C002800DB1729007C002800A02029007C002800A12029007C002800A22029007C002800A32029007C002800A42029007C002800A52029007C002800A62029007C002800A72029007C002800A82029007C002800A92029007C002800AA2029007C002800AB2029007C002800AC2029007C002800AD2029007C002800AE2029007C002800AF2029007C002800B02029007C002800B12029007C002800FCFD29007C00280069FE29007C00280004FF29007C002800E0FF29007C002800E1FF29007C002800E5FF29007C002800E6FF29002900010324000080A55E002800280028005B002B005D007C005B002D005D0029003F005B0024005D003F0029007C0028005B0024005D003F0028005B002B005D007C005B002D005D0029003F00290029003F00280028005C0064007B0031002C0033007D0028005B002C005D005C0064007B0033007D0029002A0029007C0028005C0064007B0030002C007D00290029003F0028005B002E005D005C0064007B0030002C007D0029003F0024000180A55E002800280028005B002B005D007C005B002D005D0029003F005B0024005D003F0029007C0028005B0024005D003F0028005B002B005D007C005B002D005D0029003F00290029003F00280028005C0064007B0031002C0033007D0028005B002E005D005C0064007B0033007D0029002A0029007C0028005C0064007B0030002C007D00290029003F0028005B002C005D005C0064007B0030002C007D0029003F0024000180A55E002800280028005B002B005D007C005B002D005D0029003F005B0024005D003F0029007C0028005B0024005D003F0028005B002B005D007C005B002D005D0029003F00290029003F00280028005C0064007B0031002C0033007D0028005B0020005D005C0064007B0033007D0029002A0029007C0028005C0064007B0030002C007D00290029003F0028005B002E005D005C0064007B0030002C007D0029003F0024000180A55E002800280028005B002B005D007C005B002D005D0029003F005B0024005D003F0029007C0028005B0024005D003F0028005B002B005D007C005B002D005D0029003F00290029003F00280028005C0064007B0031002C0033007D0028005B0020005D005C0064007B0033007D0029002A0029007C0028005C0064007B0030002C007D00290029003F0028005B002C005D005C0064007B0030002C007D0029003F00240001809B49006E00760061006C00690064002000540061007200670065007400440061007400610054007900700065002E002000560061006C00690064002000760061006C0075006500730020006100720065003A002000540049004E00590049004E0054002C00200053004D0041004C004C0049004E0054002C00200049004E0054002C00200061006E006400200042004900470049004E0054002E00001D54006100720067006500740044006100740061005400790070006500002753007400650070002000630061006E004E004F00540020006200650020007A00650072006F00007953007400650070002000630061006E004E004F00540020006200650020006E00650067006100740069007600650020007700680065006E00200045006E0064004E0075006D0020003E002000530074006100720074004E0075006D002000280063006F0075006E00740069006E0067002000750070002900007D53007400650070002000630061006E004E004F005400200062006500200070006F0073006900740069007600650020007700680065006E00200045006E0064004E0075006D0020003C002000530074006100720074004E0075006D002000280063006F0075006E00740069006E006700200064006F0077006E002900003954006F00740061006C004E0075006D0073002000630061006E004E004F00540020006200650020006E0065006700610074006900760065000009790079007900790000036D000003640000036E000003730000057700770000057100710000037100002749006E00760061006C00690064002000530074006500700054007900700065003A00200028000080BF29000A005300740065007000540079007000650020006D0075007300740020006200650020006F006E00650020006F0066003A002000280079006500610072002C0020006D006F006E00740068002C0020006400610079002C00200068006F00750072002C0020006D0069006E007500740065002C0020007300650063006F006E0064002C0020006D0069006C006C0069007300650063006F006E0064002C00200071007500610072007400650072002C0020007700650065006B00290000808D53007400650070002000630061006E004E004F00540020006200650020006E00650067006100740069007600650020007700680065006E00200045006E0064004400610074006500540069006D00650020003E002000530074006100720074004400610074006500540069006D0065002000280063006F0075006E00740069006E006700200075007000290000809153007400650070002000630061006E004E004F005400200062006500200070006F0073006900740069007600650020007700680065006E00200045006E0064004400610074006500540069006D00650020003C002000530074006100720074004400610074006500540069006D0065002000280063006F0075006E00740069006E006700200064006F0077006E002900004354006F00740061006C004400610074006500540069006D00650073002000630061006E004E004F00540020006200650020006E006500670061007400690076006500005F560061006C00750065002000630061006E006E006F00740020006200650020006C006100720067006500720020007400680061006E0020003900390039002C003900390039002C003900390039002C003900390039002C0039003900390000134E0065006700610074006900760065002000000B200061006E00640020000005300030000003300000033100000332000003330000033400000335000003360000033700000338000003390000174F006E0065002000480075006E0064007200650064000017540077006F002000480075006E006400720065006400001B540068007200650065002000480075006E006400720065006400001946006F00750072002000480075006E006400720065006400001946006900760065002000480075006E00640072006500640000175300690078002000480075006E006400720065006400001B53006500760065006E002000480075006E006400720065006400001B450069006700680074002000480075006E00640072006500640000194E0069006E0065002000480075006E006400720065006400000D5400770065006E0074007900000D540068006900720074007900000B46006F00720074007900000B46006900660074007900000B53006900780074007900000F53006500760065006E0074007900000D450069006700680074007900000D4E0069006E006500740079000007540065006E00000D45006C006500760065006E00000D5400770065006C0076006500001154006800690072007400650065006E00001146006F00750072007400650065006E00000F4600690066007400650065006E00000F5300690078007400650065006E00001353006500760065006E007400650065006E00001145006900670068007400650065006E0000114E0069006E0065007400650065006E0000074F006E0065000007540077006F00000B54006800720065006500000946006F0075007200000946006900760065000007530069007800000B53006500760065006E00000B4500690067006800740000094E0069006E00650000052C00200000132000540068006F007500730061006E006400001120004D0069006C006C0069006F006E0000112000420069006C006C0069006F006E00001320005400720069006C006C0069006F006E0000172000510075006100720069006C006C0069006F006E00001720004200720061007A0069006C006C00690061006E0000095A00650072006F0000032D00010F5E005C0064007B0039007D00240000135E0034005C0064007B00310035007D002400001D5E0035005B0031002D0035005D005C0064007B00310034007D00240001195E0036003000310031005C0064007B00310032007D002400001D5E0033005B0034002C0037005D005C0064007B00310033007D00240000215E0033005B0030002C0036002C0038005D005C0064007B00310032007D0024000009760069007300610000056D00630000096400690073006300000961006D0065007800000D640069006E00650072007300002149006E00760061006C006900640020004300430054007900700065003A00200000076D006400350000097300680061003100000D730068006100320035003600000D730068006100330038003400000D730068006100350031003200002749006E00760061006C0069006400200041006C0067006F0072006900740068006D003A00200000753B002000760061006C006900640020006F007000740069006F006E00730020006100720065003A0020004D00440035002C00200053004800410031002C0020005300480041003200350036002C0020005300480041003300380034002C00200061006E006400200053004800410035003100320000057500730000056300610000275E005C0064007B0035007D0028005B002D005D003F005C0064007B0034007D0029003F0024000180D95E005B0061002D0063002C00200065002C00200067002D0068002C0020006A002D006E002C00200070002C00200072002D0074002C00200076002C00200078002D0079005D005C0064005B0061002D0063002C00200065002C00200067002D0068002C0020006A002D006E002C00200070002C00200072002D0074002C00200076002D007A005D005B0020005D003F005C0064005B0061002D0063002C00200065002C00200067002D0068002C0020006A002D006E002C00200070002C00200072002D0074002C00200076002D007A005D005C0064002400014743006F006E00760065007200740054006F004400610074006100540079007000650073002000630061006E006E006F00740020006200650020004E0055004C004C002100210000374400450043004C0041005200450020004000530051004C007300680061007200700043006F006E00760065007200740054006F00200000473B00200053004500540020004000530051004C007300680061007200700043006F006E00760065007200740054006F0020003D00200043004F004E0056004500520054002800001572006F007700760065007200730069006F006E00001B4400610074006100540079007000650020006F00660020002700010742004900540000072C0020002700010F540049004E00590049004E005400001153004D0041004C004C0049004E005400000749004E005400000D42004900470049004E005400000F44004500430049004D0041004C00000B4D004F004E0045005900001553004D0041004C004C004D004F004E004500590000095200450041004C00000B46004C004F0041005400001B53004D0041004C004C004400410054004500540049004D00450000114400410054004500540049004D00450000134400410054004500540049004D0045003200000944004100540045000009540049004D004500001D4400410054004500540049004D0045004F0046004600530045005400000758004D004C00002155004E0049005100550045004900440045004E00540049004600490045005200001552004F005700560045005200530049004F004E0000136200690074007E007E006200790074006500001B6200690074007E007E006B0069006C006F006200790074006500001B6200690074007E007E006D006500670061006200790074006500001B6200690074007E007E0067006900670061006200790074006500001B6200690074007E007E0074006500720061006200790074006500001B6200690074007E007E0070006500740061006200790074006500001362007900740065007E007E00620069007400001D62007900740065007E007E006B0069006C006F006200790074006500001D62007900740065007E007E006D006500670061006200790074006500001D62007900740065007E007E0067006900670061006200790074006500001D62007900740065007E007E0074006500720061006200790074006500001D62007900740065007E007E0070006500740061006200790074006500001B6B0069006C006F0062007900740065007E007E00620069007400001D6B0069006C006F0062007900740065007E007E00620079007400650000256B0069006C006F0062007900740065007E007E006D00650067006100620079007400650000256B0069006C006F0062007900740065007E007E006700690067006100620079007400650000256B0069006C006F0062007900740065007E007E007400650072006100620079007400650000256B0069006C006F0062007900740065007E007E0070006500740061006200790074006500001B6D0065006700610062007900740065007E007E00620069007400001D6D0065006700610062007900740065007E007E00620079007400650000256D0065006700610062007900740065007E007E006B0069006C006F00620079007400650000256D0065006700610062007900740065007E007E006700690067006100620079007400650000256D0065006700610062007900740065007E007E007400650072006100620079007400650000256D0065006700610062007900740065007E007E0070006500740061006200790074006500001B670069006700610062007900740065007E007E00620069007400001D670069006700610062007900740065007E007E0062007900740065000025670069006700610062007900740065007E007E006B0069006C006F0062007900740065000025670069006700610062007900740065007E007E006D0065006700610062007900740065000025670069006700610062007900740065007E007E00740065007200610062007900740065000025670069006700610062007900740065007E007E0070006500740061006200790074006500001B740065007200610062007900740065007E007E00620069007400001D740065007200610062007900740065007E007E0062007900740065000025740065007200610062007900740065007E007E006B0069006C006F0062007900740065000025740065007200610062007900740065007E007E006D0065006700610062007900740065000025740065007200610062007900740065007E007E00670069006700610062007900740065000025740065007200610062007900740065007E007E0070006500740061006200790074006500001B700065007400610062007900740065007E007E00620069007400001D700065007400610062007900740065007E007E0062007900740065000025700065007400610062007900740065007E007E006B0069006C006F0062007900740065000025700065007400610062007900740065007E007E006D0065006700610062007900740065000025700065007400610062007900740065007E007E00670069006700610062007900740065000025700065007400610062007900740065007E007E0074006500720061006200790074006500000000007F23115449CA884D920C5A88E166DABC0008B77A5C561934E0890600011D051D030500010E1D050400010E08070003011D030206090004011D0302061D030320000102060E0206020206080206060320000E070615121101120C0520010112150A200115121101120C12150620030E0E0E0E072002121908111D052001121908042000122108000212251229112D060001122912250600011225122503061D05060001122512290306113106000111351139060001113911350600020211310A0600020E1D0E0E0E0005113511351139113911391139080002113911391139060001113D1139060001112D11350A00031139113511351141080002113D113511410A0003112D11351135112D06000111351145060001114511350C0004114511351135112D113D0800021139112D11350800021135112D11350A000311351149112D1135080002113511391139120007113511391139113911391139113911390A0003112D1135112D112D080000151211011220130006011C10112D10112D10112D10112D101229060001124D112D080000151211011228130006011C10112D10112D10112D10122910112D080002124D112D112D072004010E0E0E0E082005010E0E0E0E0E060001114511390600011145112D0A000311451145112D112D060001113D11410A000311391139113911392B000E011C101139101135101145101145101145101145101145101145101145101145101145101139101139100006124D1145114511391139113511450600011145114502060D0800021145114511510A0003112D1155112D112D46790079007900790027002D0027004D004D0027002D0027006400640020004800480027003A0027006D006D0027003A002700730073002E0066006600660066006600660066003E790079007900790027002D0027004D004D0027002D0027006400640020004800480027003A0027006D006D0027003A002700730073002E0066006600660005000111590E0C0004113D1225112D1139112D0C0004112D1225112D1139112D0E0005112D1225112D11391139112D130006011C1011391012251011391011391011390C0004124D1225112D1139112D0C0004124D112D112D1139112D100006112D1225112D112D11391139112D0E0005124D112D112D11391139112D120007112D1225112D1139112D11391139112D060001112D112D0E00051139112D112D11391139112D120007112D112D112D112D112D11391139112D0300000E7068007400740070003A002F002F007700770077002E00730071006C00730068006100720070002E0063006F006D002F007500740069006C006900740079002F00630075007200720065006E0074005F00760065007200730069006F006E005F0066007200650065002E007000680070006868007400740070003A002F002F007700770077002E00730071006C00730068006100720070002E0063006F006D002F007500740069006C006900740079002F00630075007200720065006E0074005F0061007300730065006D0062006C0079002E007000680070003068007400740070003A002F002F007700770077002E00730071006C00730068006100720070002E0063006F006D002F0009000301112D112D113D07000201112D112D090003011139112D113D05000101112D040000113D03000001040000112D0600020E0E125D05000111610E0C000411391225112D11391139080002113D1225112D0A0003113D1225112D11390A0003112D112D1139112D0A0003011C10113910112D0A0003124D1225112D11390A000312251225112D11390A0003122512251139112D080002113D122512250E000511391225122511391139113D100006113912251225113911391139113D0A000312251225112D112D080002113D112D11390A0003112D112D112D112D0A00031141112D112D112D0A0003011C1011391011390A0003124D1139113911390A0003011C1011391011450A0003124D1145114511450A0003124D1145113911450A0003011C10113910113508000311311131080E0C0004124D113511351139112D0C0004124D113511391139112D060001112D114506000112291229060001113D112D080002113D112D112D060001114112290700021D050E1D05080002112D112D12290800021165112D12290C0004113D112D112D1149114904000011410306116C040100000004020000000404000000040800000004100000000706151269020E0D12010001005408074D617853697A650A0000002001000200540809507265636973696F6E260000005408055363616C651200000012010001005408074D617853697A65FFFFFFFF12010001005408074D617853697A658000000012010001005408074D617853697A650F000000042001010E0420010102042001010880A0002400000480000094000000060200000024000052534131000400000100010033237E60D1AF2429EE4E6DABE42A2C8A8893EBD630506BA491C63FBFC5D6D0416C540D47A1244C1689482BC752CBAA4E0B95552751626957D1C0BD356D2C5E728A3EA0244C7AC9CC3D4CFB363802B0401245A79C4C7038E7E3901F3C727EC901AF72DAC23D4C6E2CAF8802EDDC1388C628430979DAC9AF0D307CD9527F1FDDC60500020E1C1C050002050E080507021D05080420010E0E0620011280BD0E0907041280BD051D05080520020103080500020E0E0E052002010E08032000080920031280BD1D0308080500001280C5052001081D030520020E0808050002020E0E0720021280BD080812070A0E1280BD080808081D031D031D031D030706151269020E0806151269020E0807200201130013010820020213001013010620011280BD060707031280BD0E080615121101120C0520001280D50520001280DD0320001C0420011C0E0300000A04061280ED0520010113000320000213070515121101120C120C1280E11280DD1280F10520011300080600030E0E0E0E0600020E0E1D0E0507021D0E08092000151180F501130007151180F501120C04200013001107051D0E1280BD08120C151180F501120C072003010E111D0A082004010E111D0505062002010E111D06070312190E08062001011D12190607021D1219083C01000300540E044E616D6510436F6E766572745F546F42617365363454020F497344657465726D696E6973746963015402094973507265636973650104000012250420001D050800020E1D051181050420001D03052001011D030607021181050E3E01000300540E044E616D6512436F6E766572745F46726F6D42617365363454020F497344657465726D696E6973746963015402094973507265636973650104000012290800031D051D030808052001011D053901000300540E044E616D650D436F6E766572745F524F54313354020F497344657465726D696E69737469630154020949735072656369736501040001060304000103080607031D0306083C01000300540E044E616D6510436F6E766572745F5555456E636F646554020F497344657465726D696E697374696301540209497350726563697365010620011280BD030D0709081280BD080808050505083C01000300540E044E616D6510436F6E766572745F55554465636F646554020F497344657465726D696E69737469630154020949735072656369736501040001050804000105030420010105062001011281110F070B0A12810D0A0A05050505080A084501000300540E044E616D6519436F6E766572745F486578537472696E67546F42696E61727954020F497344657465726D696E697374696301540209497350726563697365010320000A0407011D054501000300540E044E616D6519436F6E766572745F42696E617279546F486578537472696E6754020F497344657465726D696E697374696301540209497350726563697365014701000300540E044E616D651B436F6E766572745F4D53496E7444617465546F4461746554696D6554020F497344657465726D696E6973746963015402094973507265636973650105200111310D0600011135113104070111314701000300540E044E616D651B436F6E766572745F4461746554696D65546F4D53496E744461746554020F497344657465726D696E69737469630154020949735072656369736501042000113107200111811511310500011139080707021131118115030611780900020112811D1181210620030108080805200011812505200102113134072E080808080808\
-08080808080808080808080808080808080808080808080808080808080808080808080811311131113111310520020E0E0E0400010A0E07000212812D0E0E05200012813506200112813908040001080E0520020E08030807040E12812D080A4001000300540E044E616D6514446174655F46697273744461794F664D6F6E746854020F497344657465726D696E697374696301540209497350726563697365010400010D080A2007010808080808080D060702113111313F01000300540E044E616D6513446174655F4C6173744461794F664D6F6E746854020F497344657465726D696E697374696301540209497350726563697365010500020808080A070411311131113111313C01000300540E044E616D6510446174655F44617973496E4D6F6E746854020F497344657465726D696E697374696301540209497350726563697365013F01000300540E044E616D6513446174655F446179734C656674496E5965617254020F497344657465726D696E69737469630154020949735072656369736501040001020807070308113111313B01000300540E044E616D650F446174655F49734C6561705965617254020F497344657465726D696E69737469630154020949735072656369736501050001113D023F01000300540E044E616D6513446174655F46756C6C44617465537472696E6754020F497344657465726D696E69737469630154020949735072656369736501050001112D0E3F01000300540E044E616D6513446174655F46756C6C54696D65537472696E6754020F497344657465726D696E697374696301540209497350726563697365013D01000300540E044E616D6511446174655F427573696E6573734461797354020F497344657465726D696E69737469630154020949735072656369736501070002081131113116070B11311131080811311131113111311131113111313E01000300540E044E616D6512446174655F4973427573696E65737344617954020F497344657465726D696E697374696301540209497350726563697365013F01000300540E044E616D6513446174655F466F726D617454696D655370616E54020F497344657465726D696E69737469630154020949735072656369736501052002080E080520020803080920021D0E1D0E11813D1D07160E0A0A0A0A0A0A0A0A0A0A0A08080E1D0E1D0E113111311D0E0E083D01000300540E044E616D6511446174655F46726F6D554E495854696D6554020F497344657465726D696E69737469630154020949735072656369736501092006010808080808080320000D3B01000300540E044E616D650F446174655F546F554E495854696D6554020F497344657465726D696E6973746963015402094973507265636973650105000111450D090703113111811511313401000300540E044E616D6508446174655F41676554020F497344657465726D696E69737469630154020949735072656369736500042001020E2307120D11311181150808021131113111311131113111311131113111311131113111313801000300540E044E616D650C446174655F4578747261637454020F497344657465726D696E69737469630154020949735072656369736501030611390400010D0D040001080D060001118149080B0002118149118149118149080001118149118149060001081181496D073B0808080808080808080E081131113111311131113111311131113111311131113111311131113111311131113111311131113111311131113111311131113111311131113111311131113111311131113111311131113111311131113111311131113111311131113111313901000300540E044E616D650D446174655F5472756E6361746554020F497344657465726D696E69737469630154020949735072656369736501030611350A200701080808080808081F071308080808080811310811311131113111311131113111310E08113111314701000300540E044E616D651B446174655F4E74684F6363757272656E63654F665765656B64617954020F497344657465726D696E697374696301540209497350726563697365010320000609070411311181250E084701000300540E044E616D651B446174655F4765744461746554696D6546726F6D496E7456616C7354020F497344657465726D696E6973746963015402094973507265636973650108070511310E0E08083B01000300540E044E616D650F446174655F476574496E744461746554020F497344657465726D696E69737469630154020949735072656369736501090704081131113111313B01000300540E044E616D650F446174655F476574496E7454696D6554020F497344657465726D696E697374696301540209497350726563697365013C01000300540E044E616D6510446174655F4E65774461746554696D6554020F497344657465726D696E697374696301540209497350726563697365013701000300540E044E616D650B446174655F466F726D617454020F497344657465726D696E697374696301540209497350726563697365010600011281510E0720020E0E1281550707030E113111314801000300540E044E616D651C446174655F44617973496E4D6F6E746846726F6D4461746554696D6554020F497344657465726D696E69737469630154020949735072656369736501061512110112200A07021512110112201220040701112480F201000500540E1146696C6C526F774D6574686F644E616D6516434F554E545259434F44454461746146696C6C526F77540E0F5461626C65446566696E6974696F6E734E756D65726963436F6465204E434841522833292C2054776F4C6574746572436F6465204E434841522832292C2054687265654C6574746572436F6465204E434841522833292C204E616D65204E56415243484152283530292C20466C6167496D6167652056415242494E415259284D415829540E044E616D65154C6F6F6B55705F476574436F756E747279496E666F54020F497344657465726D696E697374696301540209497350726563697365010306112D0520010212200615128159011C061512815D011C0820001512815D011C0920001512815D01130002061C03061124030612200806151281610112200306127C0806151180F50112200328001C05000012816905070112808007151180F50112200715128161011220052002011C180B2001130015128161011300040702020803070108061512110112280A07021512110112281228040701112C80EA01000500540E1146696C6C526F774D6574686F644E616D65145354415445434F44454461746146696C6C526F77540E0F5461626C65446566696E6974696F6E6F4E756D65726963436F6465204E434841522832292C2054776F4C6574746572436F6465204E434841522832292C204E616D65204E56415243484152283530292C20466C6167496D6167652056415242494E415259284D4158292C20436F756E747279436F6465204E43484152283229540E044E616D65134C6F6F6B55705F4765745374617465496E666F54020F497344657465726D696E697374696301540209497350726563697365010520010212280306112C07061512110112280306122808061512816101122804061280840806151180F501122805070112808807151281610112280F20011512110113001512816101130007151180F5011228062001011181753A01000300540E044E616D650E4D6174685F466163746F7269616C54020F497344657465726D696E697374696301540209497350726563697365000407020D083901000300540E044E616D650D4D6174685F436F6E7374616E7454020F497344657465726D696E697374696301540209497350726563697365010507030E0E083801000300540E044E616D650C4D6174685F436F6E7665727454020F497344657465726D696E6973746963015402094973507265636973650006151269020E0D0B07090D0E0D0E080E0E080E3801000300540E044E616D650C4D6174685F49735072696D6554020F497344657465726D696E697374696301540209497350726563697365010407020A0D3C01000300540E044E616D65104D6174685F52616E646F6D52616E676554020F497344657465726D696E697374696300540209497350726563697365010520020808080407011134819B01000500540E1146696C6C526F774D6574686F644E616D651F4D415448416D6F7274697A6174696F6E5363686564756C6546696C6C526F77540E0F5461626C65446566696E6974696F6E81065061796D656E744E756D20494E542C205061796D656E7444617465204441544554494D452C20426567696E6E696E6742616C616E636520464C4F41542C205363686564756C65645061796D656E7420464C4F41542C2045787472615061796D656E7420464C4F41542C20546F74616C5061796D656E7420464C4F41542C205072696E636970616C20464C4F41542C20496E74657265737420464C4F41542C20456E64696E6742616C616E636520464C4F41542C2043756D756C6174697665496E74657265737420464C4F41542C20546F74616C496E74657265737420464C4F41542C20546F74616C5061796D656E747320494E542C205061796D656E74734C65667420494E54540E044E616D65214D6174685F436F6D706F756E64416D6F7274697A6174696F6E5363686564756C6554020F497344657465726D696E69737469630154020949735072656369736500061512110111340500020D0D080500020D0D0D0800030D0D0811817D0520011131081A07101512110111341D1134081131080D0D0D0D0D0D0D080D0D083501000300540E044E616D65094D6174685F436F736854020F497344657465726D696E697374696301540209497350726563697365003501000300540E044E616D65094D6174685F53696E6854020F497344657465726D696E697374696301540209497350726563697365003501000300540E044E616D65094D6174685F54616E6854020F497344657465726D696E697374696301540209497350726563697365003901000300540E044E616D650D4D6174685F43756265526F6F7454020F497344657465726D696E697374696301540209497350726563697365003901000300540E044E616D650D4D6174685F5472756E6361746554020F497344657465726D696E69737469630154020949735072656369736500032000050307010D3E01000300540E044E616D65124D6174685F466F726D6174446563696D616C54020F497344657465726D696E697374696301540209497350726563697365010520001181490907030E1181491181490620011D0E1D0314070F115902020202020202020E1D031D0E080E083901000300540E044E616D650D52656745785F49734D6174636854020F497344657465726D696E69737469630154020949735072656369736501062002010E1159052002020E080807030E11591281293D01000300540E044E616D651152656745785F4D6174636853696D706C6554020F497344657465726D696E6973746963015402094973507265636973650107200212812D0E083D01000300540E044E616D651152656745785F4D617463684C656E67746854020F497344657465726D696E6973746963015402094973507265636973650108200312812D0E080805200101112D040701114080B701000500540E044E616D650B52656745785F4D61746368540E1146696C6C526F774D6574686F644E616D651152454745584D6174636846696C6C526F7754020F497344657465726D696E69737469630154020949735072656369736501540E0F5461626C65446566696E6974696F6E474D617463684E756D20494E542C2056616C7565204E56415243484152284D4158292C205374617274506F7320494E542C20456E64506F7320494E542C204C656E67746820494E54061512110111401307060E1159151211011140114012812D12812980B901000500540E1146696C6C526F774D6574686F644E616D651152454745584D6174636846696C6C526F77540E0F5461626C65446566696E6974696F6E474D617463684E756D20494E542C2056616C7565204E56415243484152284D4158292C205374617274506F7320494E542C20456E64506F7320494E542C204C656E67746820494E54540E044E616D650D52656745785F4D61746368657354020F497344657465726D696E6973746963015402094973507265636973650103061159030611400406128181040612812905070112808C0720021281810E0806200112812D083901000300540E044E616D650D52656745785F5265706C61636554020F497344657465726D696E697374696301540209497350726563697365010720040E0E0E0808070702115912812980B701000500540E044E616D650B52656745785F53706C6974540E1146696C6C526F774D6574686F644E616D651152454745584D6174636846696C6C526F7754020F497344657465726D696E69737469630154020949735072656369736501540E0F5461626C65446566696E6974696F6E474D617463684E756D20494E542C2056616C7565204E56415243484152284D4158292C205374617274506F7320494E542C20456E64506F7320494E542C204C656E67746820494E540507011280903E01000300540E044E616D651252656745785F4361707475726547726F757054020F497344657465726D696E6973746963015402094973507265636973650108070311591281290E3801000300540E044E616D650C52656745785F45736361706554020F497344657465726D696E697374696301540209497350726563697365010400010E0E3A01000300540E044E616D650E52656745785F556E65736361706554020F497344657465726D696E697374696301540209497350726563697365013701000300540E044E616D650B52656745785F496E64657854020F497344657465726D696E697374696301540209497350726563697365014201000300540E044E616D651652656745785F5265706C61636549664D61746368656454020F497344657465726D696E697374696301540209497350726563697365010500010E1D0E0707041D0E08080805000012818505200012818905200012818D1A01000100540E044E616D650E53514C73686172705F5365747570042001081C062001011281950720021280BD080E1D070E0E0E125D1280BD1281991D0E1D0E1D0E1D0E1D0E1D0E1D0E1D0E082501000100540E044E616D651953514C73686172705F4772616E745065726D697373696F6E73072002010E12819D0C07040E12819D1280BD1281952001000100540E044E616D651453514C73686172705F53657453656375726974790620010112819D05000102113D0520001281A9062001011281A90700040E0E0E0E0E0520001181B11A070A12819D1281A90E1281951280BD0E1280F912819D1281A9081E01000100540E044E616D651253514C73686172705F556E696E7374616C6C0C070412819D0E1280BD1281954601000300540E044E616D651A53514C73686172705F4973557064617465417661696C61626C6554020F497344657465726D696E697374696300540209497350726563697365010600011281B50E0500001281C1062001011281C10520001281C50520001281110500001281CD092002011281111281CD1407080E1D0E021281B91281C91281111281D11D031901000100540E044E616D650D53514C73686172705F48656C700520010112210420011C0805200201080E0D0705125D1D121912211280C5083C01000300540E044E616D651053514C73686172705F56657273696F6E54020F497344657465726D696E697374696301540209497350726563697365010307010E3C01000300540E044E616D651053514C73686172705F5765625369746554020F497344657465726D696E697374696301540209497350726563697365010620011280BD080607021280BD080920021D0E1D0311813D0800011281DD1181E10800031C1281DD0E02052002010E0E08070411610E1D0E083E01000300540E044E616D6512537472696E675F4C617374496E6465784F6654020F497344657465726D696E69737469630154020949735072656369736501082003080E081181E5050703080E083A01000300540E044E616D650E537472696E675F496E6465784F6654020F497344657465726D696E697374696301540209497350726563697365013701000300540E044E616D650B537472696E675F5472696D54020F497344657465726D696E697374696301540209497350726563697365013B01000300540E044E616D650F537472696E675F436F6E7461696E7354020F497344657465726D696E697374696301540209497350726563697365013B01000300540E044E616D650F537472696E675F456E64735769746854020F497344657465726D696E69737469630154020949735072656369736501072002020E1181E50507030E02083D01000300540E044E616D6511537472696E675F5374617274735769746854020F497344657465726D696E697374696301540209497350726563697365013A01000300540E044E616D650E537472696E675F5061644C65667454020F497344657465726D696E69737469630154020949735072656369736501040001030E0407020E033B01000300540E044E616D650F537472696E675F506164526967687454020F497344657465726D696E697374696301540209497350726563697365010407011154808D01000500540E1146696C6C526F774D6574686F644E616D6513535452494E4753706C69747346696C6C526F77540E0F5461626C65446566696E6974696F6E1A4E756D20494E542C2056616C204E56415243484152284D415829540E044E616D650C537472696E675F53706C697454020F497344657465726D696E69737469630154020949735072656369736501030612250306115403061D0E040611813D05070112809407070402081D0E08815901000500540E044E616D650B537472696E675F4A6F696E54020F497344657465726D696E697374696300540209497350726563697365015455794D6963726F736F66742E53716C5365727665722E5365727665722E446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038390A446174614163636573730100000054557F4D6963726F736F66742E53716C5365727665722E5365727665722E53797374656D446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038391053797374656D446174614163636573730100000004200102081107070E0E1280BD1281951281A912819D083B01000300540E044E616D650F537472696E675F576F72645772617054020F497344657465726D696E6973746963015402094973507265636973650104200108030A07060E1280BD08080E083A01000300540E044E616D650E537472696E675F496E697443617054020F497344657465726D696E697374696301540209497350726563697365010420010E080507030E080E3901000300540E044E616D650D537472696E675F457175616C7354020F497344657465726D696E697374696301540209497350726563697365010407020E0E3801000300540E044E616D650C537472696E675F436F756E7454020F497344657465726D696E69737469630154020949735072656369736501080002113D11391139080002113D113D113D0707050E0E0808083A01000300540E044E616D650E537472696E675F4E65776C696E6554020F497344657465726D696E697374696301540209497350726563697365013D01000300540E044E616D6511537472696E675F4E7468496E6465784F6654020F497344657465726D696E697374696301540209497350726563697365013601000300540E044E616D650A537472696E675F43757454020F497344657465726D696E69737469630154020949735072656369736501040001060E1A070F0E1280BD1D0E1D0E1D0E1D0E020E0808081D0E1D0E081D033C01000300540E044E616D6510537472696E675F49734E756D6572696354020F497344657465726D696E697374696301540209497350726563697365011807081281291281291281290E1281291281291281291281293A01000300540E044E616D650E537472696E675F5265706C61636554020F497344657465726D696E697374696301540209497350726563697365014001000300540E044E616D6514537472696E675F5472795061727365546F496E7454020F497344657465726D696E697374696301540209497350726563697365010500001281510C0004020E1181E9128155100A0C0004020E1181E912815510080C0004020E1181E912815510060C0004020E1181E9128155100505000111410A030611410B0707021281510A0806050E0407011160809101000500540E1146696C6C526F774D6574686F644E616D65125554494C495459496E747346696C6C526F77540E0F5461626C65446566696E6974696F6E16496E744E756D20494E542C20496E7456616C20494E54540E044E616D65155574696C5F47656E6572617465496E7452616E676554020F497344657465726D696E6973746963015402094973507265636973650103061160050701128098808D01000500540E1146696C6C526F774D6574686F644E616D65125554494C495459496E747346696C6C526F77540E0F5461626C65446566696E6974696F6E16496E744E756D20494E542C20496E7456616C20494E54540E044E616D65115574696C5F47656E6572617465496E747354020F497344657465726D696E6973746963015402094973507265636973650105070112809C0407011164809B01000500540E1146696C6C526F774D6574686F644E616D65145554494C495459466C6F61747346696C6C526F77540E0F5461626C65446566696E6974696F6E1C466C6F61744E756D20494E542C20466C6F617456616C20464C4F4154540E044E616D65175574696C5F47656E6572617465466C6F617452616E676554020F497344657465726D696E6973746963015402094973507265636973650103061145030611640507011280A0809701000500540E1146696C6C526F774D6574686F644E616D65145554494C495459466C6F61747346696C6C526F77540E0F5461626C65446566696E6974696F6E1C466C6F61744E756D20494E542C20466C6F617456616C20464C4F4154540E044E616D65135574696C5F47656E6572617465466C6F61747354020F497344657465726D696E697374696301540209497350726563697365010507011280A4040701116806070311310E0880AA01000500540E1146696C6C526F774D6574686F644E616D65175554494C4954594461746554696D657346696C6C526F77540E0F5461626C65446566696E6974696F6E254461746554696D654E756D20494E542C204461746554696D6556616C204441544554494D45540E044E616D651A5574696C5F47656E65726174654461746554696D6552616E676554020F497344657465726D696E69737469630154020949735072656369736501030611680507011280A8070002021131113180A601000500540E1146696C6C526F774D6574686F644E616D65175554494C4954594461746554696D657346696C6C526F77540E0F5461626C65446566696E6974696F6E254461746554696D654E756D20494E542C204461746554696D6556616C204441544554494D45540E044E616D65165574696C5F47656E65726174654461746554696D657354020F497344657465726D696E697374696301540209497350726563697365010507011280AC3801000300540E044E616D650C5574696C5F546F576F72647354020F497344657465726D696E69737469630154020949735072656369736501080002113D11451145080002114511451145042001080E1507130E0E0E0E08080E0E0E080E080E080E080E08083501000300540E044E616D65095574696C5F475A697054020F497344657465726D696E697374696301540209497350726563697365010A2003011281111181F102072003011D05080813070612810D1281ED1D051280F912810D1281ED3701000300540E044E616D650B5574696C5F47556E7A697054020F497344657465726D696E69737469630154020949735072656369736501092002011281111181F10E070512810D1281ED12810D0812293801000300540E044E616D650C5574696C5F4465666C61746554020F497344657465726D696E697374696301540209497350726563697365010C070412810D1281F51D0512293801000300540E044E616D650C5574696C5F496E666C61746554020F497344657465726D696E697374696301540209497350726563697365010E070512810D1281F512810D0812293B01000300540E044E616D650F5574696C5F497356616C696453534E54020F497344657465726D696E69737469630154020949735072656369736501070003020E0E11590607040E0808083A01000300540E044E616D650E5574696C5F497356616C6964434354020F497344657465726D696E6973746963015402094973507265636973650118070C0E128129128129128129128129128129080808080E083601000300540E044E616D650A5574696C5F435243333254020F497344657465726D696E69737469630154020949735072656369736501042001050A0B07081D09090909080908050500001281FD0620011D051D0505000012820505000012820905000012820D0500001282110507021D050E3501000300540E044E616D65095574696C5F4861736854020F497344657465726D696E697374696301540209497350726563697365010807031D051280BD083B01000300540E044E616D650F5574696C5F4861736842696E61727954020F497344657465726D696E6973746963015402094973507265636973650106000111651D054A01000300540E044E616D651E5574696C5F497356616C6964436865636B526F7574696E674E756D62657254020F497344657465726D696E697374696301540209497350726563697365010C070A0E0808080808080808084201000300540E044E616D65165574696C5F497356616C6964506F7374616C436F646554020F497344657465726D696E697374696301540209497350726563697365010306113D80CA01000400540E044E616D65135574696C5F497356616C6964436F6E766572745455794D6963726F736F66742E53716C5365727665722E5365727665722E446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038390A446174614163636573730100000054020F497344657465726D696E69737469630154020949735072656369736501060002020E1008062001011182190600030E1C1C1C41072312819D128195020E080E0E1D0E0E0E1D031D0E080E0812819D1D0E1D0E1D0E1D0E1D0E1D0E1D0E1D0E1D0E1D0E1D0E1D0E1D0E1D0E1D0E1D0E1D0E1D0E\
-1D0E3F01000300540E044E616D65135574696C5F476574546F74616C4D656D6F727954020F497344657465726D696E697374696300540209497350726563697365010400010A020901000453514C230000150100107777772E53514C73686172702E636F6D00000501000000001501001053716C205175616E74756D204C65617000004201003D436F7079726967687420C2A920323030362D323031342053716C205175616E74756D204C6561702E20416C6C205269676874732052657365727665642E00000B010006332E332E383300000801000800000000001E01000100540216577261704E6F6E457863657074696F6E5468726F77730100C4F808000000000000000000DEF80800002000000000000000000000000000000000000000000000D0F80800000000000000000000005F436F72446C6C4D61696E006D73636F7265652E646C6C0000000000FF250020001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001001000000018000080000000000000000000000000000001000100000030000080000000000000000000000000000001000000000048000000580009006C03000000000000000000006C0334000000560053005F00560045005200530049004F004E005F0049004E0046004F0000000000BD04EFFE00000100030003000000530003000300000053003F000000000000000400000002000000000000000000000000000000440000000100560061007200460069006C00650049006E0066006F00000000002400040000005400720061006E0073006C006100740069006F006E00000000000000B004CC020000010053007400720069006E006700460069006C00650049006E0066006F000000A802000001003000300030003000300034006200300000003C001100010043006F006D006D0065006E007400730000007700770077002E00530051004C00730068006100720070002E0063006F006D000000000044001100010043006F006D00700061006E0079004E0061006D00650000000000530071006C0020005100750061006E00740075006D0020004C0065006100700000000000340005000100460069006C0065004400650073006300720069007000740069006F006E0000000000530051004C00230000000000300007000100460069006C006500560065007200730069006F006E000000000033002E0033002E00380033000000000034000900010049006E007400650072006E0061006C004E0061006D0065000000530051004C0023002E0064006C006C0000000000A0003D0001004C006500670061006C0043006F007000790072006900670068007400000043006F0070007900720069006700680074002000A900200032003000300036002D0032003000310034002000530071006C0020005100750061006E00740075006D0020004C006500610070002E00200041006C006C0020005200690067006800740073002000520065007300650072007600650064002E00000000003C00090001004F0072006900670069006E0061006C00460069006C0065006E0061006D0065000000530051004C0023002E0064006C006C00000000002C0005000100500072006F0064007500630074004E0061006D00650000000000530051004C00230000000000340007000100500072006F006400750063007400560065007200730069006F006E00000033002E0033002E0038003300000000003C000900010041007300730065006D0062006C0079002000560065007200730069006F006E00000033002E0033002E00380033002E0030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F008000C000000F03800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
- WITH PERMISSION_SET = SAFE;
- ');
- PRINT 'SQL# Assembly Created.';
- PRINT '';
-
-
- IF (@InstallSQL#TypesAndAggregates = 1 OR @InstallSQL#Twitterizer = 1 OR @InstallSQL#Network = 1)
- BEGIN
- PRINT 'Creating SQL#.TypesAndAggregates Assembly ...';
- EXEC(N'
- CREATE ASSEMBLY [SQL#.TypesAndAggregates]
- AUTHORIZATION [' + @SQLsharpLogin + N']
-FROM 0x4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000504500004C0103007C2168540000000000000000E00002210B010B000048000000080000000000003E67000000200000008000000000001000200000000200000400000000000000040000000000000000C000000002000037A60000030040850000100000100000000010000010000000000000100000000000000000000000F06600004B00000000800000300400000000000000000000000000000000000000A000000C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000080000000000000000000000082000004800000000000000000000002E7465787400000044470000002000000048000000020000000000000000000000000000200000602E72737263000000300400000080000000060000004A0000000000000000000000000000400000402E72656C6F6300000C00000000A000000002000000500000000000000000000000000000400000420000000000000000000000000000000020670000000000004800000002000500C041000030250000090000000000000000000000000000005020000080000000000000000000000000000000000000000000000000000000000000000000000079A7F532311507575258ADFFCA27F09415552860B475A2077298592B04EB87E90E5F9BB7C5DC6CFDAAAC76CFEFD4C51ADFEF27562892F179A7BB103B1320DB6080636589B6358B7FB6FCD8E1AFC859A868B411C95865B6BEFF9E44F42099273D24FC99AF12C4DA204F4E5167C5BFE5421F86D674FB9A52DA9613A82AE14C84313202731100000A7D010000042A960F01281200000A2C012A027B010000040F01281300000A6F1400000A1F2C6F1500000A262A4E027B01000004037B010000046F1600000A262A001330040042000000010000117E1700000A0A027B010000042C28027B010000046F1800000A16311A027B0100000416027B010000046F1800000A17596F1900000A0A066F1A00000A731B00000A2A00001B300200940000000200001103036F1C00000A6F1D00000A281E00000A6F1F00000A732000000A0B0716732100000A0C732200000A0D086F2300000A13042B11091104D26F2400000A086F2300000A130411041533EA09732500000A0A066F1C00000A166A6F2600000A02066F2700000A732800000A7D01000004DE0A092C06096F2900000ADCDE0A082C06086F2900000ADCDE0A072C06076F2900000ADC2A0128000002002A004771000A0000000002002400597D000A0000000002001C006D89000A000000001B3004006700000003000011732200000A0A06732A00000A0B07027B010000046F2B00000A6F2C00000A732200000A0C081717732D00000A0D066F2E00000A13040911041611048E696F2F00000ADE0A092C06096F2900000ADC03086F2E00000A6F3000000ADE0A082C06086F2900000ADC2A00011C000002002D001744000A0000000002002400385C000A000000001E02283100000A2A3202733200000A7D020000042A760F01283300000A2C012A027B020000040F01283400000A6F3500000A2A4A027B02000004037B020000046F3600000A2A0000133004008A000000040000112300000000000000000A160B027B020000046F3700000A027B020000046F3800000A0B0716315D07185D2D2E027B0200000407185B17596F3900000A6C027B0200000407185B6F3900000A6C582300000000000000405B0A2B23027B02000004076C2300000000000000405B283A00000A283B00000A6F3900000A6C0A06733C00000A2A7E3D00000A2A00001B300200BF0000000500001103036F1C00000A6F1D00000A281E00000A6F1F00000A732000000A0B0716732100000A0C732200000A0D086F2300000A13042B11091104D26F2400000A086F2300000A130411041533EA09732500000A0A066F1C00000A166A6F2600000A066F3E00000A1305110515312F021105733F00000A7D020000041613062B17027B02000004066F4000000A6F3500000A1106175813061106110532E3DE0A092C06096F2900000ADCDE0A082C06086F2900000ADCDE0A072C06076F2900000ADC2A000128000002002A00729C000A000000000200240084A8000A0000000002001C0098B4000A000000001B300400AE00000006000011732200000A0A06732A00000A0B07027B020000046F3800000A6F4100000A027B020000046F3700000A027B020000046F4200000A13062B101206284300000A6C0C07086F4400000A1206284500000A2DE7DE0E1206FE160200001B6F2900000ADC732200000A0D091717732D00000A1304066F2E00000A1305110411051611058E696F2F00000ADE0C11042C0711046F2900000ADC03096F2E00000A6F3000000ADE0A092C06096F2900000ADC2A000001280000020036001D53000E00000000020071001889000C00000000020067003CA3000A000000001E02283100000A2A7202167D030000040223000000000000F03F284700000A7D040000042AAE0F01283300000A2C012A02257B0300000417587D0300000402257B0400000403284800000A7D040000042AB602257B030000040F017B03000004587D0300000402257B040000040F017B04000004284800000A7D040000042A9E027C04000004283400000A23000000000000F03F027B030000046C5B284900000A733C00000A2A7202167D0500000402230000000000000000284700000A7D060000042A0330040045000000000000000F01283300000A2C012A02257B0500000417587D0500000402257B060000040F01283400000A230000000000000040284900000A6C284700000A284A00000A7D060000042AB602257B050000040F017B05000004587D0500000402257B060000040F017B06000004284A00000A7D060000042A7A027C06000004283400000A027B050000046C5B284B00000A733C00000A2A3202733200000A7D070000042A760F01283300000A2C012A027B070000040F01283400000A6F3500000A2A4A027B07000004037B070000046F3600000A2A133003003200000007000011160A160B734C00000A0C027B070000046F3800000A0B0816076F4D00000A0A027B07000004066F3900000A6C733C00000A2A00001B300200BF0000000500001103036F1C00000A6F1D00000A281E00000A6F1F00000A732000000A0B0716732100000A0C732200000A0D086F2300000A13042B11091104D26F2400000A086F2300000A130411041533EA09732500000A0A066F1C00000A166A6F2600000A066F3E00000A1305110515312F021105733F00000A7D070000041613062B17027B07000004066F4000000A6F3500000A1106175813061106110532E3DE0A092C06096F2900000ADCDE0A082C06086F2900000ADCDE0A072C06076F2900000ADC2A000128000002002A00729C000A000000000200240084A8000A0000000002001C0098B4000A000000001B300400AE00000006000011732200000A0A06732A00000A0B07027B070000046F3800000A6F4100000A027B070000046F3700000A027B070000046F4200000A13062B101206284300000A6C0C07086F4400000A1206284500000A2DE7DE0E1206FE160200001B6F2900000ADC732200000A0D091717732D00000A1304066F2E00000A1305110411051611058E696F2F00000ADE0C11042C0711046F2900000ADC03096F2E00000A6F3000000ADE0A092C06096F2900000ADC2A000001280000020036001D53000E00000000020071001889000C00000000020067003CA3000A000000001E02283100000A2A2A027B0800000414FE012A00133001000A000000080000111200FE1507000002062A00001330040091000000090000110F00281200000A2C06281F0000062A1200FE15070000020F00281300000A7E1700000A6F4F00000A2C0E1200735000000A7D080000042B570F00281300000A178D2F0000010D09161F2C9D096F5100000A0B1200078E69735200000A7D080000040713041613052B1E110411059A0C12007B08000004086F5300000A6F5400000A110517581305110511048E6932DA062A00000013300400380100000A0000110F01285600000A027B080000046F5700000A1758313972010000700F01285600000A13041204285800000A7286000070027B080000046F5700000A13051205285800000A285900000A735A00000A7A0F01285600000A162F2072A00000700F01285600000A13061206285800000A285B00000A735A00000A7A02281E0000062C0B02735000000A7D080000040F02281300000A178D2F00000113071107161F2C9D11076F5100000A0A0316285C00000A285D00000A285E00000A2C2F0613081613092B1D110811099A0B027B08000004076F5300000A6F5400000A110917581309110911088E6932DB2B46068E69735200000A0C06130A16130B2B18110A110B9A0D08096F5300000A6F5400000A110B1758130B110B110A8E6932E0027B080000040F01285600000A1759086F5F00000A0271070000022A133003005D0000000B0000110F01285600000A027B080000046F5700000A31067E6000000A2A0F01285600000A172F1F72EE0000700F01285600000A0A1200285800000A285B00000A735A00000A7A027B080000040F01285600000A17596F6100000A286200000A2A4A027B080000046F6300000A0271070000022A62027B080000040F01281300000A6F6400000A736500000A2A0000001B300300A30000000C0000110F02286600000A2D48027B080000046F6700000A0D2B211203286800000A0A060F01281300000A17286900000A2C0917286A00000A0CDE691203286B00000A2DD6DE571203FE160400001B6F2900000ADC027B080000046F6700000A13042B211204286800000A0B070F01281300000A16286900000A2C0917286A00000A0CDE201204286B00000A2DD6DE0E1204FE160400001B6F2900000ADC16286A00000A2A082A00011C0000020015002E43000E0000000002005E002E8C000E000000007E02281E0000062C067E6C00000A2A027B080000046F5700000A285C00000A2ABA02281E0000062C067E6C00000A2A723C010070027B080000046F6D00000A286E00000A6F6F00000A285C00000A2A0013300400970000000D0000110F02285600000A027B080000046F5700000A3137723E0100700F02285600000A0A1200285800000A7286000070027B080000046F5700000A0B1201285800000A285900000A735A00000A7A0F02285600000A172F1F72EE0000700F02285600000A0C1202285800000A285B00000A735A00000A7A027B080000040F01281300000A0F02285600000A17596F7000000A1758285C00000A2A00133004000B0100000E0000110F02285600000A027B080000046F5700000A3137723E0100700F02285600000A0C1202285800000A7286000070027B080000046F5700000A0D1203285800000A285900000A735A00000A7A0F02285600000A172F2072EE0000700F02285600000A13041204285800000A285B00000A735A00000A7A0F03286600000A2D440F02285600000A17590A2B28027B08000004066F6100000A0F01281300000A17286900000A2C09061758285C00000A2A0617580A06027B080000046F5700000A32CA2B420F02285600000A17590B2B28027B08000004076F6100000A0F01281300000A16286900000A2C09071758285C00000A2A0717580B07027B080000046F5700000A32CA16285C00000A2A00133004008F0000000D0000110F01285600000A027B080000046F5700000A3137723E0100700F01285600000A0A1200285800000A7286000070027B080000046F5700000A0B1201285800000A285900000A735A00000A7A0F01285600000A172F1F72EE0000700F01285600000A0C1202285800000A285B00000A735A00000A7A027B080000040F01285600000A17596F7100000A0271070000022A6A027B080000040F01281300000A6F7200000A260271070000022A000013300400960000000D0000110F01285600000A027B080000046F5700000A3137723E0100700F01285600000A0A1200285800000A7286000070027B080000046F5700000A0B1201285800000A285900000A735A00000A7A0F01285600000A172F1F72EE0000700F01285600000A0C1202285800000A285B00000A735A00000A7A027B080000040F01285600000A17590F02285600000A6F7300000A0271070000022A4A027B080000046F7400000A0271070000022A4A027B080000046F7500000A0271070000022A9202281E0000062C067E1700000A2A72B4010070027B080000046F6D00000A286E00000A2A0000001B300200BF0000000500001103036F1C00000A6F1D00000A281E00000A6F1F00000A732000000A0B0716732100000A0C732200000A0D086F2300000A13042B11091104D26F2400000A086F2300000A130411041533EA09732500000A0A066F1C00000A166A6F2600000A066F3E00000A1305110515312F021105735200000A7D080000041613062B17027B08000004066F2700000A6F5400000A1106175813061106110532E3DE0A092C06096F2900000ADCDE0A082C06086F2900000ADCDE0A072C06076F2900000ADC2A000128000002002A00729C000A000000000200240084A8000A0000000002001C0098B4000A000000001B300400B30000000F000011732200000A0A06732A00000A0B02281E0000062C0907156F4100000A2B4807027B080000046F5700000A6F4100000A027B080000046F6700000A13062B0F1206286800000A0C07086F2C00000A1206286B00000A2DE8DE0E1206FE160400001B6F2900000ADC732200000A0D091717732D00000A1304066F2E00000A1305110411051611058E696F2F00000ADE0C11042C0711046F2900000ADC03096F2E00000A6F3000000ADE0A092C06096F2900000ADC2A000128000002003C001C58000E0000000002007600188E000C0000000002006C003CA8000A000000002A027B0900000414FE012A00133001000A000000100000111200FE1508000002062A00001330040096000000110000110F00281200000A2C0628330000062A1200FE15080000020F00281300000A7E1700000A6F4F00000A2C0E1200733200000A7D090000042B5C0F00281300000A178D2F0000010D09161F2C9D096F5100000A0B1200078E69733F00000A7D090000040713041613052B23110411059A0C12007B09000004086F5300000A287600000A6F3500000A110517581305110511048E6932D5062A00001B30020053000000120000112300000000000000000A027B090000046F4200000A0C2B0D1202284300000A6C0B0607580A1202284500000A2DEADE0E1202FE160200001B6F2900000ADC06027B090000046F3800000A6C5B6C284700000A2A0001100000020016001A30000E000000001330040042010000130000110F01285600000A027B090000046F3800000A1758313972010000700F01285600000A13041204285800000A7286000070027B090000046F3800000A13051205285800000A285900000A735A00000A7A0F01285600000A162F2072A00000700F01285600000A13061206285800000A285B00000A735A00000A7A0228320000062C0B02733200000A7D090000040F02281300000A178D2F00000113071107161F2C9D11076F5100000A0A0316285C00000A285D00000A285E00000A2C340613081613092B22110811099A0B027B09000004076F5300000A287600000A6F3500000A110917581309110911088E6932D62B4B068E69733F00000A0C06130A16130B2B1D110A110B9A0D08096F5300000A287600000A6F3500000A110B1758130B110B110A8E6932DB027B090000040F01285600000A1759086F7700000A0271080000022A0000133003005F0000000B0000110F01285600000A027B090000046F3800000A31067E3D00000A2A0F01285600000A172F1F72EE0000700F01285600000A0A1200285800000A285B00000A735A00000A7A027B090000040F01285600000A17596F3900000A6C6C284700000A2A4A027B090000046F7800000A0271080000022A62027B090000040F01283400000A6F7900000A736500000A2A7E0228320000062C067E6C00000A2A027B090000046F3800000A285C00000A2A0013300400970000000D0000110F02285600000A027B090000046F3800000A3137723E0100700F02285600000A0A1200285800000A7286000070027B090000046F3800000A0B1201285800000A285900000A735A00000A7A0F02285600000A172F1F72EE0000700F02285600000A0C1202285800000A285B00000A735A00000A7A027B090000040F01283400000A0F02285600000A17596F7A00000A1758285C00000A2A00133004008F0000000D0000110F01285600000A027B090000046F3800000A3137723E0100700F01285600000A0A1200285800000A7286000070027B090000046F3800000A0B1201285800000A285900000A735A00000A7A0F01285600000A172F1F72EE0000700F01285600000A0C1202285800000A285B00000A735A00000A7A027B090000040F01285600000A17596F7B00000A0271080000022A6A027B090000040F01283400000A6F7C00000A260271080000022A000013300400960000000D0000110F01285600000A027B090000046F3800000A3137723E0100700F01285600000A0A1200285800000A7286000070027B090000046F3800000A0B1201285800000A285900000A735A00000A7A0F01285600000A172F1F72EE0000700F01285600000A0C1202285800000A285B00000A735A00000A7A027B090000040F01285600000A17590F02285600000A6F7D00000A0271080000022A4A027B090000046F7E00000A0271080000022A4A027B090000046F3700000A0271080000022A1B30020046000000120000112300000000000000000A027B090000046F4200000A0C2B0D1202284300000A6C0B0607580A1202284500000A2DEADE0E1202FE160200001B6F2900000ADC066C284700000A2A000001100000020016001A30000E000000001B3002006D000000140000110228320000062C067E1700000A2A027B090000046F3800000A735200000A0A027B090000046F4200000A0C2B161202284300000A6C0B061201287F00000A6F5400000A1202284500000A2DE1DE0E1202FE160200001B6F2900000ADC72B4010070066F6D00000A286E00000A2A0000000110000002002B00234E000E000000001330040080000000040000112300000000000000000A160B027B090000046F3700000A027B090000046F3800000A0B07185D2D2E027B0900000407185B17596F3900000A6C027B0900000407185B6F3900000A6C582300000000000000405B0A2B23027B09000004076C2300000000000000405B283A00000A283B00000A6F3900000A6C0A06733C00000A2A1B300200BF0000000500001103036F1C00000A6F1D00000A281E00000A6F1F00000A732000000A0B0716732100000A0C732200000A0D086F2300000A13042B11091104D26F2400000A086F2300000A130411041533EA09732500000A0A066F1C00000A166A6F2600000A066F3E00000A1305110515312F021105733F00000A7D090000041613062B17027B09000004066F4000000A6F3500000A1106175813061106110532E3DE0A092C06096F2900000ADCDE0A082C06086F2900000ADCDE0A072C06076F2900000ADC2A000128000002002A00729C000A000000000200240084A8000A0000000002001C0098B4000A000000001B300400B400000006000011732200000A0A06732A00000A0B0228320000062C0907156F4100000A2B4907027B090000046F3800000A6F4100000A027B090000046F4200000A13062B101206284300000A6C0C07086F4400000A1206284500000A2DE7DE0E1206FE160200001B6F2900000ADC732200000A0D091717732D00000A1304066F2E00000A1305110411051611058E696F2F00000ADE0C11042C0711046F2900000ADC03096F2E00000A6F3000000ADE0A092C06096F2900000ADC2A0128000002003C001D59000E0000000002007700188F000C0000000002006D003CA9000A000000002A027B0A00000414FE012A00133001000A000000150000111200FE1509000002062A000013300400BF000000160000110F00281200000A2C0628470000062A1200FE15090000020F00281300000A7E1700000A6F4F00000A2C111200738000000A7D0A00000438820000000F00281300000A178D2F00000113041104161F269D11046F5100000A0B1200078E69738100000A7D0A000004188D210000010C0713051613062B3F110511069A0D09178D2F00000113071107161F3D9D11076F5100000A0C12007B0A00000408169A6F5300000A08179A6F5300000A6F8200000A110617581306110611058E6932B9062A001330040089000000170000110228460000062C0B02738000000A7D0A0000040F01281300000A178D2F0000010D09161F269D096F5100000A0A188D210000010B0613041613052B3E110411059A0C08178D2F00000113061106161F3D9D11066F5100000A0B027B0A00000407169A6F5300000A07179A6F5300000A6F8200000A110517581305110511048E6932BA0271090000022ACE0228460000062C0B02738000000A7D0A000004027B0A0000040F01281300000A0F02281300000A6F8200000A0271090000022A4A027B0A0000046F8300000A0271090000022A62027B0A0000040F01281300000A6F8400000A736500000A2A62027B0A0000040F01281300000A6F8500000A736500000A2A7E0228460000062C067E6C00000A2A027B0A0000046F8600000A285C00000A2A76027B0A0000040F01281300000A6F8700000A7421000001286200000A2A1B300300E4000000180000110F02286600000A2D69027B0A0000046F8800000A6F8900000A0D2B38096F8A00000A74210000010A060F01281300000A17286900000A2C1C027B0A000004066F8700000A7421000001286200000A0CDD8E000000096F8B00000A2DC0DE7E097527000001130411042C0711046F2900000ADC027B0A0000046F8800000A6F8900000A13052B3611056F8A00000A74210000010B070F01281300000A16286900000A2C19027B0A000004076F8700000A7421000001286200000A0CDE2611056F8B00000A2DC1DE1511057527000001130611062C0711066F2900000ADC7E6000000A2A082A011C000002001A00445E0014000000000200840043C700150000000066027B0A0000040F01281300000A6F8C00000A0271090000022A00001B300300AA000000190000110228460000062D0D027B0A0000046F8600000A2D067E1700000A2A723C010070732800000A0A027B0A0000046F8800000A6F8900000A0C2B3F086F8A00000A74210000010B06076F1400000A260672B80100706F1400000A2606027B0A000004076F8700000A6F1600000A260672BC0100706F1400000A26086F8B00000A2DB9DE110875270000010D092C06096F2900000ADC06066F1800000A1759176F8D00000A26066F2B00000A2A000001100000020037004B820011000000001B3002006C000000190000110228460000062C067E6C00000A2A723C010070732800000A0A027B0A0000046F8E00000A6F8900000A0C2B14086F8A00000A74210000010B06076F1400000A26086F8B00000A2DE4DE110875270000010D092C06096F2900000ADC066F2B00000A6F6F00000A285C00000A2A0110000002002A00204A0011000000001E027B0A0000042A1B300300C50000000500001103036F1C00000A6F1D00000A281E00000A6F1F00000A732000000A0B0716732100000A0C732200000A0D086F2300000A13042B11091104D26F2400000A086F2300000A130411041533EA09732500000A0A066F1C00000A166A6F2600000A066F3E00000A13051105153135021105738100000A7D0A0000041613062B1D027B0A000004066F2700000A066F2700000A6F8200000A1106175813061106110532DDDE0A092C06096F2900000ADCDE0A082C06086F2900000ADCDE0A072C06076F2900000ADC2A0000000128000002002A0078A2000A00000000020024008AAE000A0000000002001C009EBA000A000000001B300400DB0000001A000011732200000A0A06732A00000A0B0228460000062C0907156F4100000A2B7007027B0A0000046F8600000A6F4100000A027B0A0000046F8800000A6F8900000A13062B2B11066F8A00000A74210000010C07086F2C00000A07027B0A000004086F8700000A74210000016F2C00000A11066F8B00000A2DCCDE1511067527000001130711072C0711076F2900000ADC732200000A0D091717732D00000A1304066F2E00000A1305110411051611058E696F2F00000ADE0C11042C0711046F2900000ADC03096F2E00000A6F3000000ADE0A092C06096F2900000ADC2A000128000002004100387900150000000002009E0018B6000C00000000020094003CD0000A000000001A288F00000A2A0042534A4201000100000000000C00000076322E302E35303732370000000005006C000000D00D0000237E00003C0E0000C809000023537472696E67730000000004180000C001000023555300C4190000100000002347554944000000D41900005C0B000023426C6F6200000000000000020000015717A2090900000000FA2533001600000100000038000000090000000A000000570000003B000000090000008F000000190000001A000000030000000C0000000C00000004000000010000000300000000000A000100000000000600A800A1000A00D600BB000600E700A1000A000601F10006001C0110010A004201F1000A005D01F10006007A01700106008C0170010600C001A5010A00D101F1000A002E02F1000A004B02F10006001C0309030A009A03F1000600C204B0040600D904B0040600F604B00406001505B00406002E05B00406004705B00406006205B00406007D05B0040600B50596050600C905B0040600E205B00406000F06FF050600550635060600750635060600AB06A1000A00C106BB000A00E206BB000600FA06A10006001E07700106003407A10006004E0770010E0071075B070E007F075B070600BA07A1000600DA07A5010600FA07A1002B001A08000006004808960506005E08960506009608A1000A00A208BB000600C508A1000A00D508BB000600E808A1000A00F508F1000E004E092F090E0054092F0906008609A10006008D0909030600A20909030600AE09090300000000010000000000010001000120100026000000050001000100012010002F000000050002000800092110003A0000000D0003000F00092110004B0000000D0005001300012010005B00000005000700170009211000660000000D0008001E0009211000790000000D000900320009211000890000000D000A00460001002A010A000100C7012F000100DB0147000100E9014A000100DB0147000100FA014A000100C7012F00010009026000010009022F00010009022B01D0200000000086003D010E000100DD200000000086004C01120001000321000000008600570118000200182100000000860066011E000300682100000000E601870123000300302200000000E601990129000400C0220000000086189F010E000500C8220000000086003D010E000500D5220000000086004C\
-0136000500F32200000000860057013C0006000823000000008600660142000700A02300000000E601870123000700942400000000E60199012900080078250000000086189F010E00090080250000000086003D010E0009009D250000000086004C0136000900C92500000000860057014E000A00F725000000008600660142000B001F260000000086003D010E000B003C260000000086004C0136000B008D26000000008600570154000C00BB26000000008600660142000D00DA260000000086003D010E000D00E7260000000086004C0136000D00052700000000860057015A000E001827000000008600660142000F00582700000000E601870123000F004C2800000000E60199012900100030290000000086189F010E001100382900000000E60914026700110044290000000096081F026B0011005C29000000009600280270001100FC29000000008600370277001200402B0000000086003F0280001400A92B000000008600450287001500BC2B00000000860056028C001500D82B000000008600630293001600A42C00000000860873029C001800C42C0000000086087D029C001800F42C0000000086008C02A1001800982D0000000086009802AA001A00B02E000000008600A702B5001D004B2F000000008600B002BC001E00682F000000008600BB02C3001F000A30000000008600C702870021001D30000000008600CF0287002100303000000000C600D402CC002100583000000000E6018701230021004C3100000000E601990129002200343200000000E60914026700230040320000000096081F02DE00230058320000000096002802E3002300FC32000000008600FA02420024006C330000000086003702EA002400BC340000000086003F02F300260027350000000086004502FA0027003A350000000086005602FF002700533500000000860873029C00280074350000000086008C02060128001836000000008600A7020F012A00B336000000008600B00216012B00D036000000008600BB021D012C007237000000008600C702FA002E008537000000008600CF02FA002E009837000000008600FE0242002E00FC3700000000C600D402CC002E008838000000008600020342002E00143900000000E601870123002E00083A00000000E601990129002F00F03A00000000E609140267003000FC3A0000000096081F022F013000143B000000009600280234013000E03B00000000860037023B013100753C000000008600260342013200A93C00000000860045024B013400BC3C0000000086002E038C003400D53C0000000086003A038C003500EE3C00000000860873029C0036000E3D0000000086004803500136002C3D000000008600510357013700383E00000000860066033B013900543E00000000C600D402CC003A001C3F00000000860871039C003A00A43F000000008608860360013A00AC3F00000000E601870123003A00A84000000000E601990129003B00B841000000008600A10365013C0000000100CE0300000100D40300000100DA0300000100E50300000100CE0300000100D40300000100DA0300000100E50300000100F40300000100FA0300000100F40300000100FA0300000100CE0300000100D40300000100DA0300000100E503000001000304000001000E04000002001404000001000E04000001002104000001002E04000002003C04000001002104000002000E04000001002E04000002000E04000003003C04000001000E04000001004A04000001000E0400000200E902000001005604000001006504000001000304000001000E04000002001404000001000E04000001007404000001007404000002000E04000001000E04000001008104000001000E0400000200E902000001005604000001006504000001000304000001008D0400000100980400000200A10400000100210400000100210400000100AC04000001002E04000002003C0400000100980400000100560400000100650402000900030009000600090007001100070009000800110008000900090011000900090081009F01740189009F01740191009F01740199009F017401A1009F017401A9009F017401B1009F017401B9009F017401C1009F017901C9009F017401D1009F017401D9009F010E00E1009F017E01E9009F010E00F1009F010E00F9009F01250229009F010E003100140267003100E906CC002900F3069E022900F306A4022900F306AA0209010107B00229000707B3022900D402B70209011207BD0239009F01C20241002507CC0211010707D20219013C07D60241004407DB0221019F01E10229019F01E70221019F010E0011018F07B30211019807F10241009F01F6021101A207FD024100AF07CC0029009F0174013901C6070E0049009F01F6020900D402CC0049009901740129019F0111032101CE071C0311019901210349009901E10209009F010E000C009F010E005900140267005900E906C5030C00D607C9030C00E807CF030C00CF020E000C007302B3020C00F107DA034901FF07E00319013C07E50359009F01EA035900E4024A0041000508B3020C009F017E0141000F08C503490099017E010C002508050414003308160449009901EA0314003F08670059019F01AB0459006908B20459007508B80449018108C10459008508B80449019108E00369019F010E0069019D08C50571019F0125020901BE082F061C009F010E000901CA083A061C009F017E010901D008CC001C00D607C90381019F010E006100E906B3021C007302B3028901D402CC000901EE08880691019F0174010901EE089006610069089606610006099C0669001209A5061C001A09AB063100E402CE061C00F107DA0331006908D2061C0045020E001C002609DC0669009F0179016900E90667001C002508050424003308160499016109E90669006908F20624003F0867006100E4020B071C00CE070F0709016909150709010707B3021C006E091C071C00A7027E011C007609DC061C00BB0231071C00C7020E001C00CF020E0019017D09A7070C001A09AB060C0045020E000C002609DC060C006E091C070C00A7027E010C007609DC060C00BB0231070C00C7020E00A901D402CC0071009F010E0071009F017E017100D6074208710045020E0071002E03A20871003A03A20871007302B3027100F107A70871009909AC08B9012508B208C1013308B808C1013F08670071007609CF0829007609D4087100BA09AC0879001F02810A2E006B00330B2E0073003C0B2E0063002E0B2E000B00860A2E001300A30A2E001B00B90A2E002300BF0A2E002B00D50A2E003300DF0A2E003B00B90A2E004B00B90A2E005B00220B430083002C02630083003903830083003204A3008300C704C30083003F05E3007302D305030173024E0723017302EA072004AB024E06C006AB024E062009AB0259084009AB025908E00AAB02FE08C80202032903EF03F4031B04CB052A064106B706D806F806230729073707A207AC07B907C407DB073D0848089308BC08DB08E7080700010008000500090008000000DD02D0000000E402D4000000E902D9000000EF02D9000000DD02D0000000E40226010000E902D9000000DD02D0000000E4026A010000E902D9000000AD03D9000000BE036F0102001E00030002001F000500020026000700020027000900020032000B00020033000D0002003A000F0002004600110002004700130002004E001500020053001700020054001900BF030F043406E2060480000003000300530000000100000083019306000002000000000000000000000001009800000000000200000000000000000000000100AF00000000000200000000000000000000000100A100000000000000003C4D6F64756C653E0053514C232E5479706573416E64416767726567617465732E646C6C004167675F4A6F696E004167675F4D656469616E004167675F47656F6D6574726963417667004167675F526F6F744D65616E537172004167675F52616E646F6D00547970655F4E56617263686172417272617900547970655F466C6F6174417272617900547970655F486173685461626C65006D73636F726C69620053797374656D004F626A6563740053797374656D2E44617461004D6963726F736F66742E53716C5365727665722E536572766572004942696E61727953657269616C697A650056616C7565547970650053797374656D2E446174612E53716C547970657300494E756C6C61626C650053797374656D2E5465787400537472696E674275696C64657200696E7465726D656469617465526573756C7400496E69740053716C537472696E6700416363756D756C617465004D657267650053716C4368617273005465726D696E6174650053797374656D2E494F0042696E61727952656164657200526561640042696E617279577269746572005772697465002E63746F720053797374656D2E436F6C6C656374696F6E732E47656E65726963004C69737460310056616C75654C6973740053716C446F75626C65005F5F436F756E7456616C756573005F5F43757272656E7441766572616765005F5F43757272656E7456616C7565005F5F5468654172726179006765745F49734E756C6C006765745F4E756C6C0050617273650053716C496E743332004164644461746100476574417400436C6561720053716C426F6F6C65616E00436F6E7461696E734974656D00436F6E7461696E735061747465726E006765745F436F756E74006765745F446174614C656E67746800496E6465784F664974656D00496E6465784F665061747465726E0052656D6F766541740052656D6F76654974656D0052656D6F766552616E6765005265766572736500536F727400546F537472696E670049734E756C6C004E756C6C00436F756E7400446174614C656E677468004176670053756D004D656469616E0053797374656D2E436F6C6C656374696F6E7300486173687461626C65004164644974656D00436F6E7461696E734B657900436F6E7461696E7356616C75650047657456616C75650047657456616C756542794B65795061747465726E0052656D6F766550616972006765745F56616C756573446174614C656E677468006765745F4E6174697665486173687461626C650053716C586D6C004765745461626C65584D4C0056616C756573446174614C656E677468004E6174697665486173687461626C650076616C7565006F746865720053657269616C697A656400546F426553657269616C697A65640056616C7565004F7468657241676700496E6974537472696E6700496E64657800496E707574537472696E677300536561726368537472696E67005365617263685061747465726E004361736553656E73697469766500496E707574537472696E670045787465726E616C5265616465720045787465726E616C57726974657200536561726368446F75626C6500496E707574446F75626C6500496E707574506169727300496E7075744B657900496E70757456616C7565004B65790053797374656D2E5265666C656374696F6E00417373656D626C795469746C6541747472696275746500417373656D626C794465736372697074696F6E41747472696275746500417373656D626C79436F6E66696775726174696F6E41747472696275746500417373656D626C79436F6D70616E7941747472696275746500417373656D626C7950726F6475637441747472696275746500417373656D626C79436F7079726967687441747472696275746500417373656D626C7954726164656D61726B41747472696275746500417373656D626C7943756C747572654174747269627574650053797374656D2E52756E74696D652E496E7465726F70536572766963657300436F6D56697369626C6541747472696275746500417373656D626C7956657273696F6E41747472696275746500417373656D626C7946696C6556657273696F6E4174747269627574650053797374656D2E536563757269747900416C6C6F775061727469616C6C795472757374656443616C6C6572734174747269627574650053797374656D2E52756E74696D652E436F6D70696C6572536572766963657300436F6D70696C6174696F6E52656C61786174696F6E734174747269627574650052756E74696D65436F6D7061746962696C6974794174747269627574650053514C232E5479706573416E64416767726567617465730053657269616C697A61626C654174747269627574650053716C55736572446566696E656441676772656761746541747472696275746500466F726D6174006765745F56616C756500417070656E6400537472696E6700456D707479006765745F4C656E67746800546F4368617241727261790053747265616D006765745F4261736553747265616D00436F6E7665727400546F496E74333200526561644279746573004D656D6F727953747265616D0053797374656D2E494F2E436F6D7072657373696F6E004465666C61746553747265616D00436F6D7072657373696F6E4D6F646500526561644279746500577269746542797465007365745F506F736974696F6E0052656164537472696E670049446973706F7361626C6500446973706F736500546F4172726179004164640049456E756D657261626C6560310041646452616E6765006765745F4974656D004D61746800466C6F6F720052656164496E7433320052656164446F75626C6500456E756D657261746F7200476574456E756D657261746F72006765745F43757272656E74004D6F76654E657874005374727563744C61796F7574417474726962757465004C61796F75744B696E64006F705F496D706C69636974006F705F4D756C7469706C7900506F77006F705F4164646974696F6E00537172740052616E646F6D004E6578740053716C55736572446566696E65645479706541747472696275746500457175616C7300436861720053706C6974005472696D0053716C4D6574686F6441747472696275746500496E74333200436F6E6361740053716C54797065457863657074696F6E006F705F457175616C697479006F705F5472756500496E7365727452616E676500436F6E7461696E730053797374656D2E546578742E526567756C617245787072657373696F6E730052656765780052656765784F7074696F6E730049734D61746368004A6F696E00496E6465784F660052656D6F766500546F446F75626C6500446F75626C650049436F6C6C656374696F6E006765745F4B6579730049456E756D657261626C650049456E756D657261746F72006765745F56616C75657300000000008083400049006E006400650078002000630061006E006E006F0074002000620065002000670072006500610074006500720020007400680061006E002000740068006500200043006F0075006E007400200070006C0075007300200031003B002000400049006E006400650078002000750073006500640020007700610073003A00200000192C00200043006F0075006E0074002000690073003A002000004D400049006E0064006500780020006D0075007300740020006200650020003E003D00200030003B002000400049006E006400650078002000750073006500640020007700610073003A002000004D400049006E0064006500780020006D0075007300740020006200650020003E003D00200031003B002000400049006E006400650078002000750073006500640020007700610073003A00200000010075400049006E006400650078002000630061006E006E006F0074002000620065002000670072006500610074006500720020007400680061006E002000740068006500200043006F0075006E0074003B002000400049006E006400650078002000750073006500640020007700610073003A00200000032C0000033D0000032600006AD403685DE29B4ABB3D1B3527566B7F0008B77A5C561934E0890306121503200001052001011119052001011208042000121D0520010112210520010112250606151229010D05200101112D05200101120C042000112D0206080306112D0520010111100520010111140520010112180606151229010E03200002040000111C060001111C1119082002111C1131111906200111191131042000111C0620011135111908200211351119113504200011310820021131111911310A20031131111911311135062001111C1131062001111C1119082002111C113111310320000E03280002040800111C0428001131040000112006000111201119082002112011311119062001112D113104200011200620011135112D0820021131112D1131062001112011310620011120112D082002112011311131040800112003061239040000112406000111241119062001112411190820021124111911190420001124062001111911190820021119111911350420001239042000123D04080011240428001239042001010E0420010102042001010880A0002400000480000094000000060200000024000052534131000400000100010033237E60D1AF2429EE4E6DABE42A2C8A8893EBD630506BA491C63FBFC5D6D0416C540D47A1244C1689482BC752CBAA4E0B95552751626957D1C0BD356D2C5E728A3EA0244C7AC9CC3D4CFB363802B0401245A79C4C7038E7E3901F3C727EC901AF72DAC23D4C6E2CAF8802EDDC1388C628430979DAC9AF0D307CD9527F1FDDC6062001011180817101000200000005005402124973496E76617269616E74546F4E756C6C73015402174973496E76617269616E74546F4475706C696361746573005402124973496E76617269616E74546F4F726465720054080B4D61784279746553697A65401F0000540E044E616D65084167675F4A6F696E05200112150E05200112150305200112151C02060E032000080520020E08080420001D03052001011D030307010E0520001280890320000A040001080A0520011D0508052001011D0509200201128089118099042001010506200101128089042001010A0E07051221128091128095128091080A200301128089118099020420001D05072003011D0508080F070512809112251280911280951D05808401000200000006005402124973496E76617269616E74546F4E756C6C73015402174973496E76617269616E74546F4475706C696361746573005402124973496E76617269616E74546F4F726465720154020D49734E756C6C4966456D7074790154080B4D61784279746553697A65401F0000540E044E616D650A4167675F4D656469616E05151229010D0320000D0520010113000A200101151280A10113000520011300080400010D0D040001080D042001010D0407020D081007071221128091128095128091080808092000151180A901130006151180A9010D042000130016070712809112250D1280911280951D05151180A9010D7801000100000005005402124973496E76617269616E74546F4E756C6C73015402174973496E76617269616E74546F4475706C696361746573005402124973496E76617269616E74546F4F726465720054020D49734E756C6C4966456D70747901540E044E616D65104167675F47656F6D6574726963417667062001011180B1050001112D0D080002112D112D112D0500020D0D0D7701000100000005005402124973496E76617269616E74546F4E756C6C73015402174973496E76617269616E74546F4475706C696361746573005402124973496E76617269616E74546F4F726465720054020D49734E756C6C4966456D70747901540E044E616D650F4167675F526F6F744D65616E537172808401000200000006005402124973496E76617269616E74546F4E756C6C73015402174973496E76617269616E74546F4475706C696361746573005402124973496E76617269616E74546F4F726465720054020D49734E756C6C4966456D7074790154080B4D61784279746553697A65401F0000540E044E616D650A4167675F52616E646F6D05200208080807070308081280B5560100020000000400540E044E616D6512547970655F4E56617263686172417272617954020D4973427974654F7264657265640154020D497346697865644C656E6774680054080B4D61784279746553697A65401F0000040701111C042001020E05151229010E0620011D0E1D030C0706111C1D0E0E1D031D0E0839010003005402094973507265636973650154020A4F6E4E756C6C43616C6C00540216496E766F6B654966526563656976657249734E756C6C010700040E0E0E0E0E0500020E0E0E0500011131080800021135113111310500010211350B20020108151280A101130016070C1D0E0E151229010E0E0808081D031D0E081D0E080306111905000111190E0307010805200102130006151180A9010E080003020E0E1180D10500011135021207050E0E1135151180A9010E151180A9010E030611310520001D13000600020E0E1D0E06200208130008050703080808070705080808080805200201080816070712809112250E1280911280951D05151180A9010E530100020000000400540E044E616D650F547970655F466C6F6174417272617954020D4973427974654F7264657265640154020D497346697865644C656E6774680054080B4D61784279746553697A65401F000004070111200400010D0E0C070611201D0E0E1D031D0E080A07030D0D151180A9010D16070C1D0E0E151229010D0E0808081D031D0E081D0E080E0703151229010E0D151180A9010D520100020000000400540E044E616D650E547970655F486173685461626C6554020D4973427974654F7264657265640154020D497346697865644C656E6774680054080B4D61784279746553697A65401F00000407011124052002011C1C10070811241D0E1D0E0E1D031D0E081D033901000300540216496E766F6B654966526563656976657249734E756C6C015402094973507265636973650154020A4F6E4E756C6C43616C6C000E07071D0E1D0E0E1D031D0E081D03042001021C0420011C1C0520001280D90520001280E10320001C1207070E0E11191280E112809D1280E112809D042001011C062002121508080B070412150E1280E112809D16070812809112250E1280911280951D051280E112809D818101000700540E044E616D650B4765745461626C65584D4C5455794D6963726F736F66742E53716C5365727665722E5365727665722E446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038390A446174614163636573730000000054557F4D6963726F736F66742E53716C5365727665722E5365727665722E53797374656D446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038391053797374656D446174614163636573730000000054020A4F6E4E756C6C43616C6C00540216496E766F6B654966526563656976657249734E756C6C0054020F497344657465726D696E69737469630054020949735072656369736501040000123D1C01001753514C232E5479706573416E64416767726567617465730000150100107777772E53514C73686172702E636F6D00000501000000001501001053716C205175616E74756D204C65617000000901000453514C2300004201003D436F7079726967687420C2A920323030362D323031342053716C205175616E74756D204C6561702E20416C6C205269676874732052657365727665642E00000B010006332E332E3833000004010000000801000800000000001E01000100540216577261704E6F6E457863657074696F6E5468726F777301001867000000000000000000002E670000002000000000000000000000000000000000000000000000206700000000000000005F436F72446C6C4D61696E006D73636F7265652E646C6C0000000000FF2500200010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100100000001800008000000000000000000000000000000100010000003000008000000000000000000000000000000100000000004800000058800000D80300000000000000000000D80334000000560053005F00560045005200530049004F004E005F0049004E0046004F0000000000BD04EFFE00000100030003000000530003000300000053003F000000000000000400000002000000000000000000000000000000440000000100560061007200460069006C00650049006E0066006F00000000002400040000005400720061006E0073006C006100740069006F006E00000000000000B00438030000010053007400720069006E006700460069006C00650049006E0066006F0000001403000001003000300030003000300034006200300000003C001100010043006F006D006D0065006E007400730000007700770077002E00530051004C00730068006100720070002E0063006F006D000000000044001100010043006F006D00700061006E0079004E0061006D00650000000000530071006C0020005100750061006E00740075006D0020004C0065006100700000000000580018000100460069006C0065004400650073006300720069007000740069006F006E0000000000530051004C0023002E005400790070006500730041006E00640041006700670072006500670061007400650073000000300007000100460069006C006500560065007200730069006F006E000000000033002E0033002E00380033000000000058001C00010049006E007400650072006E0061006C004E0061006D0065000000530051004C0023002E005400790070006500730041006E00640041006700670072006500670061007400650073002E0064006C006C000000A0003D0001004C006500670061006C0043006F007000790072006900670068007400000043006F0070007900720069006700680074002000A900200032003000300036002D0032003000310034002000530071006C0020005100750061006E00740075006D0020004C006500610070002E00200041006C006C0020005200690067006800740073002000520065007300650072007600650064002E000000000060001C0001004F0072006900670069006E0061006C00460069006C0065006E0061006D0065000000530051004C0023002E005400790070006500730041006E00640041006700670072006500670061007400650073002E0064006C006C0000002C0005000100500072006F0064007500630074004E0061006D00650000000000530051004C00230000000000340007000100500072006F006400750063007400560065007200730069006F006E00000033002E0033002E0038003300000000003C000900010041007300730065006D0062006C0079002000560065007200730069006F006E00000033002E0033\
-002E00380033002E003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000C000000403700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
- WITH PERMISSION_SET = SAFE;
- ');
- PRINT 'SQL#.TypesAndAggregates Assembly Created.';
- END;
- ELSE
- BEGIN
- PRINT 'Skipping install of SQL#.TypesAndAggregates Assembly.';
- END;
- PRINT '';
-
-
- IF (@InstallSQL#JsonFx = 1 OR @InstallSQL#Twitterizer = 1)
- BEGIN
- PRINT 'Creating SQL#.JsonFx Assembly ...';
- EXEC(N'
- CREATE ASSEMBLY [SQL#.JsonFx]
- AUTHORIZATION [' + @SQLsharpLogin + N']
-FROM 0x4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000504500004C0103007C2168540000000000000000E00002210B010B0000E0020000080000000000006EFF02000020000000000300000000100020000000020000040000000000000004000000000000000040030000020000ED49030003004085000010000010000000001000001000000000000010000000000000000000000014FF020057000000000003007804000000000000000000000000000000000000002003000C000000DCFD02001C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000080000000000000000000000082000004800000000000000000000002E7465787400000074DF02000020000000E0020000020000000000000000000000000000200000602E7273726300000078040000000003000006000000E20200000000000000000000000000400000402E72656C6F6300000C000000002003000002000000E80200000000000000000000000000400000420000000000000000000000000000000050FF020000000000480000000200050024680100B89501000900000000000000000000000000000050200000800000000000000000000000000000000000000000000000000000000000000000000000886198188F81FBC268568D058B1FE2C550D053535126662DC739B9FD3DEAE2D41F9DD21106F633824E43B2BD4B529D84B8BD914146BD7D701C0875DC466585D9E7303D0C79BE9449EE2599BE1C731CDCA9E0480D239AFC90C899C257FFF7E0DC945AAB67F5E6A037549C0BD7DFDE11EFA8C3BE099473193A3FD63FEE3DE9863E13300200220100000100001102282500000A032D0B7201000070732600000A7A036F2700000A0A02036F2800000A7D0300000402066F2900000A7D0200000402066F2A00000A7D0400000403D03D000001282B00000A282C00000A753D0000010B02072D077E2D00000A2B06076F2E00000A7D0600000403D039000001282B00000A282C00000A75390000010C02082D077E2D00000A2B06086F2F00000A7D0800000403D038000001282B00000A282C00000A75380000010D02092D077E2D00000A2B06096F3000000A7D0700000403D03B000001282B00000A282C00000A753B00000113040211042D077E2D00000A2B0711046F3100000A7D0900000403D03A000001282B00000A282C00000A753A00000113050211052D077E2D00000A2B0711056F3200000A7D050000042A6AD002000002282B00000A6F3300000A730100000680010000042A5E20B207000017171616161617733500000A80320000042A1E02282500000A2A0000001B3003003100000002000011032D0B7213000070732600000A7A733600000A0A0203062808000006066F3700000A0BDE0A062C06066F1300000ADC072A00000001100000020014001125000A000000001B3003004D00000003000011042D0B7221000070732600000A7A032D0B7213000070732600000A7A04283800000A733900000A0A03283A00000A0B076F3B00000A2D09020607280900000626DE0A062C06066F1300000ADC2A00000001100000020028001A42000A00000000133005006501000004000011046F3C00000A0A046F3B00000A2D090614283D00000A2C0C06722F000070733E00000A7A067B3F00000A193304170B2B29067B3F00000A173304160B2B1C06725B000070067B3F00000A8C20000002284000000A733E00000A7A046F4100000A26036F4200000A6F4300000A0C1B0D031A176F4400000A26046F3C00000A0A1613043890000000072C15067B3F00000A1A331E046F4100000A26388C000000067B3F00000A183309046F4100000A262B7A072C101204284500000A284600000A13052B39067B3F00000A1B2E1C06725B000070067B3F00000A8C20000002284000000A733E00000A7A067B4700000A7B5D0100041305046F4100000A26090203041105280A000006580D046F3C00000A0A110417581304046F3B00000A2D0C0614284800000A3A5CFFFFFF03166F4900000A036F4200000A6F4300000A1306030811065969176F4400000A2603096F4A00000A03110608591A6A5969176F4400000A26092A000000133004009703000005000011046F3C00000A0A046F3B00000A2D090614283D00000A2C0C06722F000070733E00000A7A067B3F00000A130E110E175945030000000B0000001D00000007000000110E1C2E0A2B161A0B2B2E190B2B2A067B4B00000A280E0000060B2B1C06725B000070067B3F00000A8C20000002284000000A733E00000A7A03076F4900000A170C08030517280B000006580C067B4B00000A75130000020D092C10080902036F4C00000A580C38E802000007130F110F175945120000001A0000003B0000005700000057000000670000006F0200007D0000009F000000CF0000006F0200001F010000C50100003B0000003B0000000D020000330200005102000051020000110F1F7F3B66020000110F20FF0000003B5A020000385E020000046F4100000A2603067B4B00000AA5520000016F4D00000A081E580C3859020000046F4100000A260803066F4E00000A16280B000006580C383D020000080203042809000006580C382D020000046F4100000A26080306280C000006580C3817020000046F4100000A2603067B4B00000A742400001B6F4F00000A081F0C580C38F5010000046F4100000A261713101210067B4B00000A285000000A13040311042D03162B01176F4900000A0817580C38C5010000046F4100000A26067B4B00000AA50800000113051205285100000A1833091205285200000A130512057E32000004285300000A13061206285400000A6A13070311076F5500000A081E580C3875010000046F4100000A26067B4B00000A751F00000113081108393E01000011086F5600000A13090803110917280B000006580C16130A110A2D0772890000702B05728B000070130B11086F5700000A195F13111111175945030000000200000012000000220000002B2E110B728F000070285800000A130B2B1E110B7293000070285800000A130B2B0E110B7297000070285800000A130B0803110B17280B000006580C38CF000000046F4100000A26067B4B00000A750F000002130C110C39980000000803110C6F3800000616280B000006580C03110C6F3A00000628450000066F4F00000A081F0C580C3887000000046F4100000A26067B4B00000A750C000002130D110D2C53080203110D280D000006580C2B61046F4100000A2603067B4B00000AA5500000016F4A00000A081A580C2B43046F4100000A2603067B4B00000AA5560000016F5500000A081E580C2B25046F4100000A262B1C06725B000070067B3F00000A8C20000002284000000A733E00000A7A082A00133003003600000006000011170A283800000A036F5900000A0B042D0F02078E6917586F4A00000A061A580A02076F4F00000A06078E69580A02166F4900000A062A0000133002003A00000007000011037B4B00000A280F0000060A02066F510000066F4A00000A02066F4F0000066F4900000A02066F4E0000066F4F00000A1F09066F51000006582A0000133004006C00000008000011036F4200000A6F4300000A0A1A0B031A176F4400000A260703046F29000006282F00000616280B000006580B070203046F2B0000062809000006580B036F4200000A6F4300000A0C0306085969176F4400000A2603076F4A00000A030806591A6A5969176F4400000A26072A133001000701000009000011022C08026F5A00000A2B01140A06285B00000A0B0745130000000C000000140000000C000000020000000700000004000000040000000400000004000000040000001100000011000000110000000F0000000F0000000F0000000900000014000000070000002B121E2A1F102A182A1F092A1F0A2A172A1F102A0275130000022C0C0274130000026F600000062A0275540000012C031F112A02751F0000012C031F0B2A0275190000012D1802752400001B2D100275110000022D0802750B0000022C021B2A0275100000022C021D2A02750E0000022C031F0E2A02750D0000022C031F0D2A02750C0000022C031F0F2A02750F0000022C031F0C2A729D000070735C00000A7A0013300200660000000A0000110275110000020A062C02062A02750B0000022C151B02A5190000010B1201285D00000A734D0000062A0275190000012C151902A5190000010C1202285D00000A734D0000062A02752400001B2C0D1602742400001B734D0000062A72DB000070735C00000A7A1E02282500000A2A1E02282500000A2A46027B350000046F5E00000A6F4300000A2A13300300790000000B000011036F5F00000A162F012A036F5E00000A6F4300000A0A036F6000000A0B02042D077E570000042B057E560000046F6100000A2B080203042817000006036F5E00000A6F4300000A06590717596A32E5036F6200000A2C0C722F0000700673C40200067A02042D077E520000042B057E510000046F6100000A2A00000013300300E00200000C000011036F6200000A0A03281A0000060B042D0C020728860000066F6100000A0613171117175945120000001A000000330000008700000090000000990000006E020000A1000000C3000000E80000006E02000012010000950100004700000067000000D7010000FC010000170200003202000011171F7F3B65020000111720FF0000003B590200003833020000036F6300000A0C02088C5200000128880000066F6100000A2A0328190000060D020928880000066F6100000A2A032819000006283000000613040211048C0D00000228880000066F6100000A2A032819000006283500000613050211058C0E00000228880000066F6100000A2A02031628160000062A02031728160000062A020328180000062A031F0C6F6400000A1306021106733D0000068C1000000228880000066F6100000A2A036F6200000A16FE0116FE0113070211072D077E540000042B057E550000046F6100000A2A7E3200000413181218036F6500000A6C286600000A13080211088C0800000128880000066F6100000A2A03281A000006130903281A000006130A2000010000130B110A6F6700000A1759130C2B41110A110C6F6800000A130D110D131911191F6759450300000016000000160000000800000011191F6D2E0A2B0E110B1760130B2B06110B1860130B110C1759130C110C162FBA1109110B736900000A130E02110E28880000066F6100000A2A032819000006130F031F0C6F6400000A1310733C00000613121112110F6F3900000611121110733D0000066F3B0000061112131102111128880000066F6100000A2A036F6000000A26032819000006131302111328880000066F6100000A02031628160000062A036F6000000A13140211148C5000000128880000066F6100000A2A036F6500000A13150211158C5600000128880000066F6100000A2A036F6500000A13160211168C5600000128880000066F6100000A2A7217010070068C03000002284000000A036F5E00000A6F4300000A73C40200067A2A13300500A40000000D000011036F6000000A0A036F6200000A0B03066F6400000A0C071305110545060000005700000057000000310000001E000000570000000B000000110520800000002E4E2B4C061F1033470873230000068C0B0000020D2B41061F10333408736A00000A8C190000010D2B2E0816286B00000A0A068D590000011304081A11041606286C00000A161104734D0000060D2B080708734D0000060D020928880000066F6100000A2A133004001A0000000E000011026F6000000A0A02066F6D00000A0B0716061759736E00000A2A000013300200210000000F000011736F00000A0A2B0806076F7000000A26026F7100000A250B2DEE066F5600000A2A82032D0B7221000070732600000A7A0203283800000A737200000A281D0000062A72032D0B7253010070732600000A7A020316737300000A281B0000062A001B3003004000000010000011032D0B725F010070732600000A7A02037D35000004030C737400000A0A0603162816000006027E340000047D35000004060BDE0A082C06086F1300000ADC072A01100000020017001D34000A000000003A02176F1F00000602287500000A2A3E032C0B027B350000046F1300000A2A567E7600000A283800000A737200000A80340000042A4A027E340000047D3500000402282500000A2A360203737800000A7D360000042A360203736A00000A7D360000042A2202037D360000042A220F007B360000042A1E0273240000062A0000133001001500000011000011027B360000040A1200FE16190000016F5600000A2A46287900000A027B360000046F7A00000A2A1E027B370000042A2202037D370000042A1E027B380000042A2202037D380000042A1E02282500000A2A2202037D390000042A220F007B390000042A1E02732E0000062A1E027B390000042A46287C00000A027B390000046F7D00000A2A2202037D3A0000042A220F007B3A0000042A1E0273330000062A1E027B3A0000042A46287C00000A027B3A0000046F7D00000A2A1E027B3B0000042A2202037D3B0000042A1E027B3C0000042A2202037D3C0000042A1E02282500000A2AB6032D0B7253010070732600000A7A038E691F0C2E10726D0100707253010070737E00000A7A02037D3E0000042A000000133004009700000012000011021F0C8D590000017D3E0000040F017E32000004285300000A0B1201287F00000A690A061632080620FFFF0000311F72A301007020FFFF00008C600000017207020070288000000A738100000A7A027B3E00000416061F186320FF0000005DD29C027B3E00000417061F106320FF0000005DD29C027B3E00000418061E6320FF0000005DD29C027B3E000004190620FF0000005DD29C2A00133003003C00000013000011027B3E00000416911F1862027B3E00000417911F106260027B3E00000418911E6260027B3E0000041991600A7E320000040B1201066C288200000A2A82027B3E0000041A91027B3E0000041B911E6260027B3E0000041C911F1062602A52027B3E0000041D91027B3E0000041E911E62602A8E027B3E0000041F09911F1062027B3E0000041F0A911E6260027B3E0000041F0B91602A3A0F00FE16100000026F5600000A2A1E0228490000062A5A0F007B3E000004252D0B267E3D0000047B3E0000042A1E02733D0000062A133004005300000014000011027B3E0000040A062D0B7E3D0000047B3E0000040A1F188D620000010B160C160D2B2407080609911F105B28510300069D07080609911F105D28510300069D0818580C0917580D081F1832D707738300000A2A00133005001A000000150000111F0C8D590000010A027B3E0000041606161F0C286C00000A062A0000133002001700000016000011021200284A0000062C02062A723F020070738400000A7A00133004006E0000001700001102288500000A2D0A026F6700000A1F182E0D037E3D0000048110000002162A1F0C8D590000010A160B2B300207186F8600000A2000020000288700000A1202288800000A2D0D037E3D0000048110000002162A0607089C0718580B071F1832CB0306733D0000068110000002172A46288900000A027B3E0000046F8A00000A2A46168D59000001733D000006803D0000042A8E02282500000A042D0B7253010070732600000A7A02037D4000000402047D410000042A1E027B410000042A1E027B400000042A26027B4100000403912A26027B410000048E692A1E026F5600000A2A1E0228580000062A1E027B410000042A221602734D0000062A00133004004500000014000011027B410000040A1F188D620000010B160C160D2B2407080609911F105B285B0000069D07080609911F105D285B0000069D0818580C0917580D081F1832D707738300000A2A000000133005001A000000150000111F0C8D590000010A027B410000041606161F0C286C00000A062A000013300200170000000700001102120028590000062C02062A7289020070738400000A7A0013300400630000001700001102288500000A2C09037E3F00000451172A026F6700000A185B8D590000010A160B2B2C0207186F8600000A2000020000288700000A1202288800000A2D09037E3F00000451162A0607089C0718580B07026F6700000A32CB031606734D00000651172A46288900000A027B410000046F8A00000A2A52021F0A2F06021F3058D12A021F0A591F6158D12A46027B41000004740300001B6F8C00000A2A32027B410000046F8D00000A2A4A16168D59000001734D000006803F0000042A1B300300760000001800001102282500000A032D0B72C7020070732600000A7A02037D4D000004738E00000A0A036FA80200062C33036FA80200066F8F00000A0C2B11086F9000000A0B072C0706076F9100000A086F9200000A2DE7DE0A082C06086F1300000ADC02067D4F0000040203036FA302000673340300067D4E0000042A000001100000020035001D52000A000000001E027B4D0000042A2602031428790000062A0000133002005400000019000011289700000A6F9800000A027BCF0100043315027BCE0100041FFE330B02167DCE010004020A2B131673A10300060A06027BD00100047DD001000406027BD20100047DD101000406027BD40100047DD3010004062A1E02289A0300062A13300400800000001A000011027BCE0100040A06450200000002000000550000002B6702157DCE010004027BD10100042D0B7213000070732600000A7A02027BD1010004283A00000A7DD50100042B2D02027BD0010004027BD5010004027BD30100046F7C0000067DCD01000402177DCE010004172A02157DCE010004027BD50100046F3B00000A2CC6162A1E027BCD0100042A1A739900000A7A062A1E027BCD0100042A7A02282500000A02037DCE01000402289700000A6F9800000A7DCF0100042A133002001F000000190000111FFE73A10300060A06027DD001000406037DD201000406047DD4010004062A0013300200480000001B000011289700000A6F9800000A027B9B00000A3315027B9C00000A1FFE330B02167D9C00000A020A2B1316739D00000A0A06027B9E00000A7D9E00000A06027B9F00000A7DA000000A062A1E0228A100000A2A13300400950000001A000011027B9C00000A0A064502000000020000006A0000002B7C02157D9C00000A027BA000000A2D0B7213000070732600000A7A02D02F00001B282B00000A7DA200000A02027BA000000A283A00000A7DA300000A2B3202027B9E00000A027BA300000A027BA200000A6F7C000006A52F00001B7DA400000A02177D9C00000A172A02157D9C00000A027BA300000A6F3B00000A2CC1162A1E027BA400000A2A1A739900000A7A062A32027BA400000A8C2F00001B2A7A02282500000A02037D9C00000A02289700000A6F9800000A7D9B00000A2A000013300200180000001C0000111FFE73A500000A0A06027DA600000A06037DA700000A062A220203280100002B2A00000013300300840000001D00001102031200287F0000062C02062A036F3C00000A0B077B3F00000A0C08175945030000000F0000003200000006000000081C2E142B2C020304287E0000062A020304287D0000062A036F4100000A26027B4E00000404077B4B00000A6F3A0300062A036F4100000A2607725B000070077B3F00000A8C20000002284000000A733E00000A7A13300600290100001E000011036F4100000A0A067B3F00000A172E1C0672D9020070067B3F00000A8C20000002284000000A733E00000A7A027B4D0000046FA7020006046F200300060B0428410300060C027B4E000004046F360300060D38B7000000036F3C00000A0A067B3F00000A13081108182E1B11081B332B036F4100000A26067B4700000A7B5D01000413042B38036F4100000A26027B4E00000404096F3A0300062A036F4100000A26067211030070067B3F00000A8C20000002284000000A733E00000A7A082C081413050813062B27072C1E07110412056FA800000A2C1211052D03142B0711057B9601000413062B0614130514130602031106287C0000061307027B4E00000409041105110411076F38030006036F3B00000A393EFFFFFF7E50000004727B030070733E00000A7A000000133004003D0100001F000011036F4100000A0A067B3F00000A192E1C0672A3030070067B3F00000A8C20000002284000000A733E00000A7A0428420300060B0714FE010C73A900000A0D38DF000000036F3C00000A0A067B3F00000A13051105175945060000002D0000007A00000002000000170000007A0000003F0000002B780203082D03072B0114287E00000613043886000000036F4100000A26027B4E0000040407096F3E0300062A0203082D03072B0114287D00000613042B5E02031204287F0000062D1B036F4100000A0A0614284800000A2D03142B06067B4B00000A1304082D35027B4E0000040711046F3A03000613042B23036F4100000A260672D9030070067B3F00000A8C20000002284000000A733E00000A7A07110428430300060B0911046FAA00000A26036F3B00000A3916FFFFFF7E50000004722D040070733E00000A7A0000001B3004004C00000020000011036F3B00000A2D3D027B4F0000046F8F00000A0C2B1B086F9000000A0A06027B4D00000403046FAB00000A2C04170BDE19086F9200000A2DDDDE0A082C06086F1300000ADC041451162A072A0110000002001400273B000A00000000361902737902000673AC00000A2A3E19020304737A02000673AC00000A2A22190273AC00000A2A361702737902000673AC00000A2A22170273AC00000A2A00001330020014000000210000110228AD00000A0A1B06737902000673AC00000A2A361B02737902000673AC00000A2A221B0273AC00000A2A221C0273AE00000A2A03300200B0000000000000001673AF00000A80500000041A73AF00000A80510000041873AF00000A80520000041C73AF00000A80530000041C168C5300000173AE00000A80540000041C178C5300000173AE00000A80550000041973AF00000A80560000041773AF00000A80570000041C23000000000000F8FF8C5200000173AE00000A80580000041C23000000000000F07F8C5200000173AE00000A80590000041C23000000000000F0FF8C5200000173AE00000A805A0000042A7202282500000A032D0B72C702007073B000000A7A02037DB100000A2A1E027BB100000A2A2202036F0200002B2A0000133003002B000000220000110203D03500001B282B00000A6FB300000A0A06753500001B2D0A1201FE153500001B072A06A53500001B2A260203146FB300000A2A000000133004002500000023000011026FB400000A0A062D0B725304007073B500000A7A020606036FB600000A0428B700000A2A2202036F0300002B2A0000133003002B000000220000110203D03500001B282B00000A6FB900000A0A06753500001B2D0A1201FE153500001B072A06A53500001B2A260203146FB900000A2A000000133004002500000023000011026FB400000A0A062D0B727D040070732600000A7A020606036FBA00000A0428B700000A2A0000001B3005005F00000024000011026FB400000A0A062D0B727D040070732600000A7A026FBB00000A0B072D0B7291040070732600000A7A0706036FB600000A6FBC00000A0DDE2326FE1A0C086FBD00000A066FBE00000A066FBF00000A066FC000000A0873C70200067A092A00011C000000002A00103A00036D00000200002A00103D00202A0000011B3005009400000025000011026FBB00000A0A062D0B7291040070732600000A7A0604056FC100000A6F0100000A0B076F9200000A2D05141304DE61076F1200000A0C0228C200000A6FA50200062D25076F9200000A2C1D72A3040070036FBE00000A036FBF00000A036FC000000A73C50200067A081304DE2326FE1A0D096FBD00000A036FBE00000A036FBF00000A036FC000000A0973C70200067A11042A011C000000001500596E00036D00000200001500597100202A00000122020328C300000A2A320228C400000A73760000062A00001B3002006700000026000011022D0B72D5040070732600000A7A02753800001B0A062C1B066FC500000A16311006166FC600000A7B3F00000A1CFE012A162A026FC700000A0D2B13096FC800000A0B077B3F00000A1CFE010CDE16096F9200000A2DE5DE0A092C06096F1300000ADC162A082A000110000002003A001F59000A000000001B3002006700000026000011022D0B72D5040070732600000A7A02753800001B0A062C1B066FC500000A16311006166FC600000A7B3F00000A17FE012A162A026FC700000A0D2B13096FC800000A0B077B3F00000A17FE010CDE16096F9200000A2DE5DE0A092C06096F1300000ADC162A082A000110000002003A001F59000A0000000013300200BA00000027000011022D0B72D5040070732600000A7A02283A00000A0A066F3B00000A2D0E066F4100000A7B3F00000A172E02162A160B2B7C066F3C00000A0C087B3F00000A0D0917594505000000020000001C000000020000000F0000002E0000002B490717580B066F4100000A262B430717590B066F4100000A262B36072C0D0717590B066F4100000A262B26162A066F4100000A26072D1A032C0E03087B4700000A6FC900000A2C09172A066F4100000A26066F3B00000A3979FFFFFF162A1E02282500000A2A3603027BDE01000428850200062A1B3003005500000028000011140B73AA0300060C08037DDE01000402072D0D08FE06AB03000673CA00000A0B0728AF0000066FCB00000A0A066F9200000A2D03142B0F066FCC00000A1304120428CD00000A0DDE0A062C06066F1300000ADC092A0000000110000002002C001D49000A0000000022021428AF0000062A9A022D0B72D5040070732600000A7A02753800001B2D080273CE00000A1000020328B00000062A133002004800000029000011289700000A6F9800000A027BE10100043315027BE00100041FFE330B02167DE0010004020A2B071673B30300060A06027BE30100047DE201000406027BE50100047DE4010004062A1E0228AC0300062A133003008C0100002A000011027BE00100040A0645020000000500000050010000387001000002157DE001000402027BE2010004283A00000A7DE6010004027BE60100046F3B00000A3A48010000027BE60100046F4100000A7B3F00000A17403201000002167DE7010004381601000002027BE60100046F3C00000A7DE8010004027BE80100047B3F00000A0B0717594505000000050000004300000005000000240000006A00000038CC00000002257BE701000417587DE7010004027BE60100046F4100000A2638B900000002257BE701000417597DE7010004027BE60100046F4100000A26389A000000027BE7010004399F00000002257BE701000417597DE7010004027BE60100046F4100000A262B73027BE60100046F4100000A26027BE70100042D5F027BE40100042C18027BE4010004027BE80100047B4700000A6FC900000A2C3F02027BE80100047B4700000A027BE601000428BC00000673CF00000A7DDF01000402177DE0010004172A02157DE00100042B0C027BE6\
-0100046F4100000A26027BE60100046F3B00000A39DAFEFFFF162A1E027BDF0100042A1A739900000A7A062A32027BDF0100048C3F00001B2A7A02282500000A02037DE001000402289700000A6F9800000A7DE10100042A0000001330020018000000290000111FFE73B30300060A06027DE301000406037DE5010004062A1B3002006700000026000011022D0B72D5040070732600000A7A02753800001B0A062C1B066FC500000A16311006166FC600000A7B3F00000A19FE012A162A026FC700000A0D2B13096FC800000A0B077B3F00000A19FE010CDE16096F9200000A2DE5DE0A092C06096F1300000ADC162A082A000110000002003A001F59000A0000000022021428B30000062A9A022D0B72D5040070732600000A7A02753800001B2D080273CE00000A1000020328B40000062A13300200480000002B000011289700000A6F9800000A027BEB0100043315027BEA0100041FFE330B02167DEA010004020A2B071673BB0300060A06027BED0100047DEC01000406027BEF0100047DEE010004062A1E0228B40300062A133003000B0100001A000011027BEA0100040A0645030000000500000055000000BE00000038EB00000002157DEA01000402027BEC010004283A00000A7DF0010004027BF00100046F3B00000A3AC3000000027BF00100046F4100000A7B3F00000A192E2102027BEC0100047DE901000402177DEA010004172A02157DEA010004388F00000002167DF10100042B7602027BF00100046F3C00000A7DF2010004027BF20100047B3F00000A1A2E67027BEE0100042C13027BEE010004027BF10100046FD200000A2C2302027BF001000428BC0000067DE901000402187DEA010004172A02157DEA0100042B0B027BF001000428BD00000602257BF101000417587DF1010004027BF00100046F3B00000A397AFFFFFF162A1E027BE90100042A1A739900000A7A062A1E027BE90100042A7A02282500000A02037DEA01000402289700000A6F9800000A7DEB0100042A0013300200180000002B0000111FFE73BB0300060A06027DED01000406037DEF010004062A96022D0B72D5040070732600000A7A02753800001B2D080273CE00000A10000228B60000062A0000133002003C0000002C000011289700000A6F9800000A027BF50100043315027BF40100041FFE330B02167DF4010004020A2B071673C30300060A06027BF70100047DF6010004062A1E0228BC0300062A1B3003002A0200002D000011027BF40100040B07450900000005000000EC01000082000000EC010000DB000000EC0100006E010000EC010000BC01000038E701000002157DF4010004027BF601000428AA0000063AD0010000027BF601000428AB00000639E400000002027BF60100041428AF0000066FCB00000A7DFC01000402177DF401000438A600000002027BFC0100046FCC00000A7DF801000402027BF80100040C120228CD00000A7DF301000402187DF4010004170ADD7501000002177DF401000402027BF80100040D120328CD00000A28B50000066FD000000A7DFD01000402197DF40100042B3202027BFD0100046FD100000A7DF901000402027BF90100047DF3010004021A7DF4010004170ADD1C01000002197DF4010004027BFD0100046F9200000A2DC10228C5030006027BFC0100046F9200000A3A4AFFFFFF0228C403000638DC000000027BF601000428B100000639CC00000002027BF60100041428B30000066FD000000A7DFE010004021B7DF4010004389300000002027BFE0100046FD100000A7DFA01000402027BFA0100047DF3010004021C7DF4010004170ADD89000000021B7DF401000402027BFA01000428B50000066FD000000A7DFF010004021D7DF40100042B2F02027BFF0100046FD100000A7DFB01000402027BFB0100047DF3010004021E7DF4010004170ADE3B021D7DF4010004027BFF0100046F9200000A2DC40228C7030006027BFE0100046F9200000A3A5DFFFFFF0228C6030006160ADE070228C1030006DC062A0000411C00000400000000000000210200002102000007000000000000001E027BF30100042A1A739900000A7A001B300200980000002E000011027BF40100040A0617594504000000020000000200000002000000020000002B2B027BF40100040B071959450200000002000000020000002B09DE070228C5030006DCDE070228C4030006DC027BF40100040C081B594504000000010000000100000001000000010000002A027BF40100040D091D59450200000002000000020000002B09DE070228C7030006DCDE070228C6030006DC2A0134000002003A00023C00070000000002002100244500070000000002008500028700070000000002006C0024900007000000001E027BF30100042A7A02282500000A02037DF401000402289700000A6F9800000A7DF50100042A6E02157DF4010004027BFC0100042C0B027BFC0100046F1300000A2A6E02177DF4010004027BFD0100042C0B027BFD0100046F1300000A2A6E02157DF4010004027BFE0100042C0B027BFE0100046F1300000A2A6E021B7DF4010004027BFF0100042C0B027BFF0100046F1300000A2A0013300200110000002C0000111FFE73C30300060A06027DF7010004062A96022D0B72D5040070732600000A7A02753800001B2D080273CE00000A10000228B80000062A00133002003C0000002F000011289700000A6F9800000A027B020200043315027B010200041FFE330B02167D01020004020A2B071673CF0300060A06027B040200047D03020004062A1E0228C80300062A1B300200B500000030000011027B010200040B07450400000005000000230000008B00000071000000388600000002157D0102000402027B030200047D0002000402177D01020004170ADE7302157D0102000402027B0302000428B60000066FD000000A7D0602000402187D010200042B2F02027B060200046FD100000A7D0502000402027B050200047D0002000402197D01020004170ADE2502187D01020004027B060200046F9200000A2DC40228D0030006160ADE070228CD030006DC062A0000000110000004000000ACAC0007000000001E027B000200042A1A739900000A7A001B300200220000001A000011027B010200040A061859450200000001000000010000002ADE070228D0030006DC2A00000110000002001800021A0007000000001E027B000200042A7A02282500000A02037D0102000402289700000A6F9800000A7D020200042A6E02157D01020004027B060200042C0B027B060200046F1300000A2A0013300200110000002F0000111FFE73CF0300060A06027D04020004062A86022D07168D3A00001B2A02753800001B2D080273CE00000A10000228BA0000062A00133002003C00000031000011289700000A6F9800000A027B090200043315027B080200041FFE330B02167D08020004020A2B071673D80300060A06027B0B0200047D0A020004062A1E0228D10300062A1B3002007F00000030000011027B080200040B07450300000002000000590000003F0000002B5702157D0802000402027B0A020004283A00000A7D0C02000402177D080200042B2302027B0C02000428BC0000067D0702000402187D08020004170ADE2502177D08020004027B0C0200046F3B00000A2CD00228D9030006160ADE070228D6030006DC062A00011000000400000076760007000000001E027B070200042A1A739900000A7A001B300200220000001A000011027B080200040A061759450200000001000000010000002ADE070228D9030006DC2A00000110000002001800021A0007000000001E027B070200042A7A02282500000A02037D0802000402289700000A6F9800000A7D090200042A6E02157D08020004027B0C0200042C0B027B0C0200046F1300000A2A001330020011000000310000111FFE73D80300060A06027D0B020004062A000000133002003C00000032000011289700000A6F9800000A027B0F0200043315027B0E0200041FFE330B02167D0E020004020A2B071673E10300060A06027B110200047D10020004062A1E0228DA0300062A13300300D501000033000011027B0E0200040A06450600000005000000700000009F00000005010000310100004F01000038A901000002157D0E020004027B100200046F3B00000A3A9201000002167D1202000402027B100200046F4100000A7D13020004027B130200047B3F00000A0B0717594503000000280000003401000028000000071C402D01000002027B130200047D0D02000402177D0E020004172A02157D0E020004383201000002257B1202000417587D1202000402027B130200047D0D02000402187D0E020004172A02157D0E02000438AB00000002027B100200046F4100000A7D13020004027B130200047B3F00000A0C0817594504000000020000002E000000020000002E0000002B5802257B1202000417587D1202000402027B130200047D0D02000402197D0E020004172A02157D0E0200042B4802257B1202000417597D1202000402027B130200047D0D020004021A7D0E020004172A02157D0E0200042B1C02027B130200047D0D020004021B7D0E020004172A02157D0E020004027B100200046F3B00000A2D0C027B12020004163D3CFFFFFF027B120200041631367E5000000472E3040070733E00000A7A027B130200047221050070027B130200047B3F00000A8C20000002284000000A733E00000A7A162A1E027B0D0200042A1A739900000A7A062A1E027B0D0200042A7A02282500000A02037D0E02000402289700000A6F9800000A7D0F0200042A0000001330020011000000320000111FFE73E10300060A06027D11020004062A00000013300300C600000034000011026F3B00000A2C107E5000000472E3040070733E00000A7A026FD400000A160A026F4100000A0B077B3F00000A0C08175945030000000B000000680000000B000000081C3364026FD500000A2A0617580A2B30026F4100000A7B3F00000A0D0917594504000000020000000800000002000000080000002B0A0617580A2B040617590A026F3B00000A2D04061630C4061631107E5000000472E3040070733E00000A7A026FD500000A2A077221050070077B3F00000A8C20000002284000000A733E00000A7A000013300300A500000034000011026F3B00000A2C012A160A026F4100000A0B077B3F00000A0C0817594503000000050000005C00000005000000081C33582A0617580A2B30026F4100000A7B3F00000A0D0917594504000000020000000800000002000000080000002B0A0617580A2B040617590A026F3B00000A2D04061630C4061631107E5000000472E3040070733E00000A7A2A077221050070077B3F00000A8C20000002284000000A733E00000A7A32168D2200001B805E0000042A00001B300200640000001800001102282500000A032D0B72C7020070732600000A7A02037D67000004738E00000A0A036FBC0200062C33036FBC0200066F8F00000A0C2B11086F9000000A0B072C0706076F9100000A086F9200000A2DE7DE0A082C06086F1300000ADC02067D680000042A01100000020035001D52000A00000000133004003A00000035000011027B670000046FB10200060C08183313027B670000046FB302000673940200060A2B0673990200060A737400000A0B0207060328C2000006072A00001B300500B302000036000011052D0C037E530000046F6100000A2A04056F920200062C46027B670000046FB10200061305110545030000001A000000020000000E0000002B18177267050070738E0200067A1872BB050070738E0200067A037E530000046F6100000A2A027B680000046F8F00000A13062B2511066F9000000A0A06027B670000040512016FD600000A2C0C03076FD700000ADD2002000011066F9200000A2DD2DE0C11062C0711066F1300000ADC056F5A00000A0C086FD800000A2C160305740200000128880000066F6100000ADDE401000008285B00000A1307110745130000000A010000170100000A01000005000000FC00000029000000290000002900000029000000290000002900000029000000290000009B0000003F00000029000000FC00000017010000FC000000381201000003171308120805285000000A2D077E540000042B057E550000046F6100000ADD600100000305740400000128880000066F6100000ADD4A01000005A5520000010D0928D900000A2C0D037E580000046F6100000A2B3B0928DA00000A2C0D037E590000046F6100000A2B260928DB00000A2C0D037E5A0000046F6100000A2B1103098C5200000128880000066F6100000ADDEE00000005A56B0000011304110428DC00000A2C0D037E580000046F6100000A2B3E110428DD00000A2C0D037E590000046F6100000A2B28110428DE00000A2C0D037E5A0000046F6100000A2B120311048C6B00000128880000066F6100000ADD8D000000030528880000066F6100000ADE7F037E530000046F6100000ADE720575060000012C1002030405740600000128C3000006DE5A0575190000012D1005756C0000012D080575130000012C0E030528880000066F6100000ADE340575540000012C180305A5540000018C5400000128880000066F6100000ADE14020304080528C6000006DE0804056F93020006DC2A0041340000020000006B000000320000009D0000000C00000000000000020000005E0000004C020000AA0200000800000000000000133005006F00000037000011020528C70000060A056F0100000A0B07754400001B2C100203040607744400001B28C50000062A07751E0000012C100203040607741E00000128C40000062A030628820000066F6100000A2B0E020304076F1200000A28C2000006076F9200000A2DEA037E510000046F6100000A2A00033004004400000000000000030528840000066F6100000A2B21030E046FDF00000A28850000066F6100000A0203040E046FE000000A28C20000060E046F9200000A2DD6037E520000046F6100000A2A133004004C00000038000011030528840000066F6100000A2B290E046FE100000A0A03120028E200000A28860000066F6100000A020304120028E300000A28C20000060E046F9200000A2DCE037E520000046F6100000A2A1B300400D500000039000011020E0428C70000060A030628840000066F6100000A027B670000046FBB020006056F200300060B072D0C037E520000046F6100000A2A027B670000046FBB020006076FE400000A6F1E0300060C086FE500000A13052B5B11056FE600000A0D097B9A0100042D4B097B970100042C43097B970100040E046F6A0000061304097B990100042C11097B990100040E0411046F120300062D1B03097B9501000428870000066F6100000A020304110428C200000611056F9200000A2D9CDE0C11052C0711056F1300000ADC037E520000046F6100000A2A000000011000000200550068BD000C000000001B300200590000003A000011027B670000046FBB020006032D03142B06036F5A00000A6F1F0300060A062C31066FE700000A0D2B14096FE800000A0B1201287C0200062D04070CDE1A096F9200000A2DE4DE0A092C06096F1300000ADC7E5C0100042A082A00000001100000020027002047000A0000000013300400150000003B00001102030412006FE900000A0B05068C4B00001B51072A7205145104754B00001B2C0F020304A54B00001B056FEA00000A2A162A1E02282500000A2A1E0228EB00000A2A0000133002003900000021000011027B6C000004250A2C2D06722D06007028EC00000A2D1C06726B06007028EC00000A2D110672B506007028EC00000A2D062B04162A172A182A000000133002003A0000003C000011030A064503000000020000000E0000001A0000002B1802722D0600707D6C0000042A02726B0600707D6C0000042A0272B50600707D6C0000042A0000133002004F0000003D000011046F3C00000A0A0614283D00000A2D16067B3F00000A1C330D067B4B00000A754A0000012D0905FE1508000001162A066F4E00000A0528D60000062D0905FE1508000001162A046F4100000A26172A00133005001B0000003E00001105178D2200001B0A0616020428D70000062888000006A20651172A001B300500420000003F000011030272B5060070284500000A208F00000028ED00000A8108000001DE0C2603FE1508000001160ADE1703285100000A18330C0303285200000A8108000001172A062A000001100000000000001D1D000C2A000001860F01285100000A1833090F01285200000A10010F01027B6C00000428EE00000A2A4A02726B0600707D6C0000040228EF00000A2A000000133002004F0000003D000011046F3C00000A0A0614283D00000A2D16067B3F00000A1C330D067B4B00000A754A0000012D0905FE1508000001162A066F4E00000A0528DB0000062D0905FE1508000001162A046F4100000A26172A00133005001B0000003E00001105178D2200001B0A0616020428DC0000062888000006A20651172A0013300400970000004000001102288500000A2C0903FE1508000001162A7E77000004026FF000000A0A066FF100000A2C20066FF200000A176FF300000A6FF400000A1D284500000A120128F500000A2D0903FE1508000001162A07210028D3ED7CC7FFFF300D037EF600000A81080000012B2E072100DC1FD277E60000320D037EF700000A81080000012B15037E760000040C1202076C286600000A8108000001172A00133003003F000000410000110F01285100000A1833090F01285200000A10010F017E76000004285300000A0A1200285400000A6A0B7207070070078C560000017215070070288000000A2AAE20B207000017171616161617733500000A8076000004721B0700702008030000736900000A80770000042A1E0228EF00000A2A7202282500000A032D0B72C702007073B000000A7A02037DF800000A2A1E027BF800000A2A1B3003004C00000042000011026FF900000A0A062D0B7267070070732600000A7A026FFA00000A0B072D0B7275070070732600000A7A0706036FFB00000A046FFC00000ADE1126FE1A0C086FBD00000A08738B0200067A2A011C000000002A00103A00036400000200002A00103D000E2A0000011B3003004D00000043000011026FF900000A0A062D0B7267070070732600000A7A026FFA00000A0B072D0B7275070070732600000A7A0706036FFB00000A6FFD00000A0DDE1126FE1A0C086FBD00000A08738B0200067A092A000000011C000000002A00103A00036400000200002A00103D000E2A00000122020328FE00000A2A1A283800000A2A320228FF00000A73C00000062A22021428F30000062A8E02282500000A0203288500000A2D09031728F50000062B057E2D00000A7D790000042A1E027B790000042A2602031728F60000062A033003004F0000000000000002288500000A2C14042C0B7289070070730001000A7A7E2D00000A2A0272B307007072890000706F0101000A1000020328F70000062D1672B70700700272D1070070280201000A730001000A7A022A0013300400B80000004400001102288500000A2C02162A032C4302178D6200000113071107161F2E9D11076F0301000A0A0613081613092B1A110811099A0B071628F70000062D05161306DE75110917581309110911088E6932DE172A0228F80000062C02162A160C160D026F6700000A13042B4602096F6800000A1305082C0C11051F30320611051F39312A11051F61320611051F7A311811051F41320611051F5A310C11051F5F2E0611051F243304170C2B02162A0917580D09110432B5172A11062A13300400460400004500001102250A393C040000FE137E140200043A1E0300001F3D730401000A2572F907007016280501000A25720308007017280501000A25720F08007018280501000A25721908007019280501000A2572250800701A280501000A25722F0800701B280501000A25723B0800701C280501000A25724D0800701D280501000A25725F0800701E280501000A25726F0800701F09280501000A25727D0800701F0A280501000A2572830800701F0B280501000A25728D0800701F0C280501000A25729D0800701F0D280501000A2572A50800701F0E280501000A2572B70800701F0F280501000A2572BD0800701F10280501000A2572C30800701F11280501000A2572D90800701F12280501000A2572E10800701F13280501000A2572EF0800701F14280501000A2572FD0800701F15280501000A2572070900701F16280501000A2572130900701F17280501000A25721B0900701F18280501000A2572290900701F19280501000A2572310900701F1A280501000A25723B0900701F1B280501000A2572470900701F1C280501000A2572510900701F1D280501000A2572630900701F1E280501000A2572730900701F1F280501000A25727D0900701F20280501000A2572870900701F21280501000A2572930900701F22280501000A25729F0900701F23280501000A2572AD0900701F24280501000A2572B70900701F25280501000A2572C50900701F26280501000A2572D50900701F27280501000A2572E10900701F28280501000A2572ED0900701F29280501000A2572F70900701F2A280501000A25720D0A00701F2B280501000A25721B0A00701F2C280501000A2572230A00701F2D280501000A2572370A00701F2E280501000A2572410A00701F2F280501000A25724F0A00701F30280501000A25725F0A00701F31280501000A25726F0A00701F32280501000A2572830A00701F33280501000A2572910A00701F34280501000A25729D0A00701F35280501000A2572AB0A00701F36280501000A2572B70A00701F37280501000A2572D10A00701F38280501000A2572DF0A00701F39280501000A2572F30A00701F3A280501000A2572050B00701F3B280501000A25720D0B00701F3C280501000AFE138014020004FE137E14020004061201280601000A39FE00000007453D000000020000000200000002000000020000000200000002000000020000000200000002000000020000000200000002000000020000000200000002000000020000000200000002000000020000000200000002000000020000000200000002000000020000000200000002000000020000000200000002000000020000000200000002000000020000000200000002000000020000000200000002000000020000000200000002000000020000000200000002000000020000000200000002000000020000000200000002000000020000000200000002000000020000000200000002000000020000000200000002000000020000002B02172A162A1E0273F30000062A42022D067E2D00000A2A027B790000042A1E0273F30000062A9A027B79000004288500000A2C0C0472F90700706F0701000A2A04027B790000046F0701000A2A1E027B790000042A000013300300450000004600001103752E0000020A062D080203280801000A2A027B79000004288500000A2C0F067B79000004288500000A2C02172A280901000A027B79000004067B790000046F0A01000A2A46280901000A027B790000046F0B01000A2A320273AA02000628EE0000062A4A02032D0773AA0200062B010328EE0000062AF602032D0773AA0200062B010328EE000006042D0B72190B007073B000000A7A02048E698D4A0000017D7B00000404027B7B000004048E69280C01000A2A000000133002003C00000047000011289700000A6F9800000A027B1B0200043315027B1A0200041FFE330B02167D1A020004020A2B131673E90300060A06027B1C0200047D1C020004062A1E0228E20300062A1B3003001D01000030000011027B1A0200040B07450600000005000000EB00000067000000AA000000C7000000E400000038E600000002157D1A020004027B1C0200047B7B0000042C7B02177D1A02000402027B1C0200047B7B0000047D1E02000402167D1F0200042B4202027B1E020004027B1F0200049A7D1D02000402027B1D0200047D1902000402187D1A020004170ADD8F00000002177D1A02000402027B1F02000417587D1F020004027B1F020004027B1E0200048E6932AE0228EA0300062B570272330B00707D1902000402197D1A020004170ADE4C02157D1A0200040272550B00707D19020004021A7D1A020004170ADE2F02157D1A0200040272690B00707D19020004021B7D1A020004170ADE1202157D1A020004160ADE070228E7030006DC062A000000411C00000400000000000000140100001401000007000000000000001E027B190200042A1A739900000A7A00133002001F0000001A000011027B1A0200040A061759450200000001000000010000002A0228EA0300062A1E027B190200042A7A02282500000A02037D1A02000402289700000A6F9800000A7D1B0200042A2202157D1A0200042A001330020011000000470000111FFE73E90300060A06027D1C020004062A000000133002003C00000048000011289700000A6F9800000A027B220200043315027B210200041FFE330B02167D21020004020A2B131673F20300060A06027B230200047D23020004062A1E0228EB0300062A133002003B0000001A000011027B210200040A064502000000020000001D0000002B2202157D210200040272810B00707D2002000402177D21020004172A02157D21020004162A1E027B200200042A1A739900000A7A062A1E027B200200042A7A02282500000A02037D2102000402289700000A6F9800000A7D220200042A001330020011000000480000111FFE73F20300060A06027D23020004062A320228FF00000A73080100062A7202282500000A032D0B72C7020070732600000A7A02037D7C0000042A1E027B7D0000042A2202037D7D0000042A1B3003002800000049000011730F01000A0A020306280C010006066F1001000A6F5600000A0BDE0A062C06066F1300000ADC072A0110000002000600161C000A000000001B300400E70200004A000011032D0B7213000070732600000A7A027B7C0000046FB50200060A160B160C160D036FC700000A1308389F02000011086FC800000A130411047B3F00000A1309110945070000004C02000080010000BB0100000500000040000000E0010000650000003847020000082C13041F2C6F1101000A062C080204092814010006072C11062C0C0204091758250D2814010006160B041F5B6F1101000A170B160C382A020000072C04160B2B0F062C0C0204091759250D2814010006041F5D6F1101000A170C3805020000082C13041F2C6F1101000A062C080204092814010006072C11062C0C0204091758250D2814010006160B11047B4B00000A2C0E11047B4B00000A6F5A00000A2B011413051105285B00000A13061106130A110A4510000000440000005100000044000000020000005100000029000000290000002900000029000000290000002900000029000000290000002900000029000000290000002B4F0417130B120B11047B4B00000A285000000A2D0772030800702B05720F0800706F0701000A2B5311056FD800000A2D1F020411047B4B00000A11066F0F0100062B380472F90700706F0701000A2B2B11047B4B00000A750D00001B130711072C0B110702046F0500000A2B0E020411047B4B00000A6F0D010006170C38EA000000082C13041F2C6F1101000A062C080204092814010006072C11062C0C0204091758250D2814010006160B041F7B6F1101000A170B160C38AF000000072C04160B2B0F062C0C0204091759250D2814010006041F7D6F1101000A170C388A000000082C13\
-041F2C6F1101000A062C080204092814010006072C11062C0C0204091758250D2814010006160B020411047B4700000A7B5D0100046F0E010006062C200472B30700706F0701000A041F3A6F1101000A0472B30700706F0701000A2B08041F3A6F1101000A160C2B1E1104725B00007011047B3F00000A8C20000002284000000A733E00000A7A11086F9200000A3A55FDFFFFDE0C11082C0711086F1300000ADC2A00411C00000200000028000000B2020000DA0200000C0000000000000013300400340000004B0000110475540000012C1D020304A5540000010A1200281201000A8C560000011F0B6F0F0100062A020302046F150100066F130100062A3E020302046F150100066F130100062A13300300480200004C000011160A05130411041959450D00000024000000D30100001101000005000000B20000007B010000D100000097010000F0000000B501000030010000640000004300000038CE01000004A55900000113051205728B000070284500000A281301000A0B38C0010000171306120604285000000A2D07728D0B00702B0572910B00700B38A1010000170A04A52200000113071207728B000070284500000A281401000A0B388001000004A5520000010C0828D900000A2C0802036F120100062A08281501000A2C180828DB00000A2C0802036F100100062A02036F110100062A120272950B0070284500000A281601000A0B383201000004A57500000113081208728B000070284500000A281701000A0B381301000004A55000000113091209728B000070284500000A281801000A0B38F4000000170A04A556000001130A120A728B000070284500000A281901000A0B38D300000004A576000001130B120B728B000070284500000A281A01000A0B38B400000004A56B0000010D0928DC00000A2C0802036F120100062A09281B01000A2C180928DE00000A2C0802036F100100062A02036F110100062A120372950B0070284500000A281C01000A0B2B6904A560000001130C120C728B000070284500000A281D01000A0B2B4D170A04A577000001130D120D728B000070284500000A281E01000A0B2B2F170A04A578000001130E120E728B000070284500000A281F01000A0B2B1104288800000672990B0070733E00000A7A062C170204282001000A6F180100062C090203076F130100062A03076F0701000A2A320372F90700706F0701000A2A320372F90700706F0701000A2A320372F90700706F0701000A2A00133005002C0100004D000011160A046F6700000A0B031F226F1101000A060C38F000000004086F6800000A0D091F1F311F091F7F2F1A027B7D0000042C05091F3C2E0D091F222E08091F5C40C0000000080631100304060806596F8600000A6F0701000A0817580A09130411041E5945060000001D00000051000000370000005E0000002A0000004400000011041F222E0611041F5C3352031F5C6F1101000A03096F1101000A2B670372C30B00706F0701000A2B5A0372C90B00706F0701000A2B4D0372CF0B00706F0701000A2B400372D50B00706F0701000A2B330372DB0B00706F0701000A2B260372E10B00706F0701000A03040828530300061305120572E70B0070282101000A6F0701000A0817580C08073F09FFFFFF070631100304060706596F8600000A6F0701000A031F226F1101000A2A133002002F0000001A00001103027B7C0000046FB90200066F0701000A160A2B1503027B7C0000046FB70200066F0701000A0617580A060432E72A720375020000012C0D0203740200000128160100062A0328AD00000A2A13300400BD0000004E000011036F5A00000A0A027B7C0000046FBB020006066F220300060B06D07A000001282B00000A176F2201000A2C700603282301000A2D67060328170100060D098E698D4A00000113041613052B3A070911059A110411058F4A0000016F2401000A2C0C110411059A288500000A2C13110411050911059A72ED0B00706F2501000AA21105175813051105098E6932BF72F10B00701104282601000A0C2B1F070312026F2401000A2C0808288500000A2C0C0372ED0B00706F2501000A0C082A00000013300400A40000004F00001103282701000A0A02282801000A0B076F2901000A732A01000A0C06166A331E080302284500000A282B01000A74020000016F2C01000A086F2D01000A2A076F2901000A17590D2B3A07096F2E01000A282701000A1304092D061104166A2E1F0611045F11043317061104590A0807096F2E01000A75020000016F2C01000A0917590D09162FC206166A2E12080206282F01000A75020000016F2C01000A086F2D01000A2A1B3002001C0000003F00001103283001000A6C283101000A03283201000A0ADE0526170ADE00062A0110000000000000151500050100000122020328080100062A00000013300800D20000005000001103288500000A2C02162A042D07733301000A1002037E89000004176F3401000A0A06169A0B160C160D388B000000170C091631160772F70B0070285800000A0B0706099A285800000A0B04076F3501000A2D627E8A000004076F3601000A2D5504076F3701000A092D2E052C1F0272FB0B00700772F70B00700616068E691759283801000A6F3901000A2B0C02723B0C0070076F3A01000A052C0E02724D0C0070076F3B01000A2B0C0272BB0C0070076F3A01000A0917580D09068E6917593F6AFFFFFF052C09082C06026F3C01000A082A3203720F0D00706F0701000A2A52031F2D6F1101000A0372170D00706F0701000A2A320372170D00706F0701000A2ACE0475080000012C0D0304A50800000128200100062A04751F0000012C0D0304741F00000128210100062A020304280D0100062A6A041628F70000062C0803046F0701000A2A020304280E0100062A13300600C3000000510000110F01285100000A2D7F0272290D00701D8D010000010C08160F01283D01000A8C50000001A208170F01283E01000A17598C50000001A208180F01283F01000A8C50000001A208190F01284001000A8C50000001A2081A0F01284101000A8C50000001A2081B0F01284201000A8C50000001A2081C0F01284301000A8C50000001A2086F4401000A2A0F01285100000A1833090F01285200000A10010F017E88000004285300000A0A1200285400000A6A0B02727F0D0070078C560000016F3A01000A2A2602031628220100062A00000013300500FA00000052000011032D0C0272F90700706F0701000A2A036F5600000A0A06288500000A2C06729B0D00700A042D0772890000702B05728B0000700B036F5700000A195F130511051759450300000002000000100000001E0000002B2807728F000070285800000A0B2B1A077293000070285800000A0B2B0C077297000070285800000A0B021F2F6F1101000A066F6700000A0C160D0913042B420611046F6800000A130611061F2F332C020609110409596F8600000A6F0701000A110417580D021F5C6F1101000A020611046F6800000A6F1101000A11041758130411040832B90206090809596F8600000A6F0701000A021F2F6F1101000A02076F0701000A2A0000133008008D0000005300001120B207000017171616161617733500000A8088000004178D620000010A06161F2E9D0680890000041F0A8D4A0000010B071672A50D0070A2071772B50D0070A2071872C70D0070A2071972D30D0070A2071A72E10D0070A2071B72F10D0070A2071C72030E0070A2071D72170E0070A2071E72230E0070A2071F0972310E0070A207734501000A808A0000042A00000013300400460100004500001102250A393C010000FE137E150200043AD50000001F10730401000A25723F0E007016280501000A2572490E007017280501000A2572530E007018280501000A2572650E007019280501000A25726B0E00701A280501000A2572730E00701B280501000A25727F0E00701C280501000A2572850E00701D280501000A25728D0E00701E280501000A2572990E00701F09280501000A2572A90E00701F0A280501000A2572B70E00701F0B280501000A2572C10E00701F0C280501000A2572CB0E00701F0D280501000A2572D50400701F0E280501000A2572D70E00701F0F280501000AFE138015020004FE137E15020004061201280601000A2C4A074510000000020000000200000002000000020000000200000002000000020000000200000002000000020000000200000002000000020000000200000002000000020000002B02172A162A000013300400460100004500001102250A393C010000FE137E160200043AD50000001F10730401000A2572DF0E007016280501000A2572E90E007017280501000A2572FB0E007018280501000A2572010F007019280501000A2572070F00701A280501000A2572130F00701B280501000A25721D0F00701C280501000A2572270F00701D280501000A25722D0F00701E280501000A25723B0F00701F09280501000A25723F0F00701F0A280501000A25724B0F00701F0B280501000A2572510F00701F0C280501000A25725D0F00701F0D280501000A2572630F00701F0E280501000A25726F0F00701F0F280501000AFE138016020004FE137E16020004061201280601000A2C4A074510000000020000000200000002000000020000000200000002000000020000000200000002000000020000000200000002000000020000000200000002000000020000002B02172A162A000013300400FE0800004500001102250A39F0080000FE137E170200043A980600002081000000730401000A2572750F007016280501000A2572790F007017280501000A2572830F007018280501000A25723F0E007019280501000A2572930F00701A280501000A25729B0F00701B280501000A2572A50F00701C280501000A2572AF0F00701D280501000A2572B70F00701E280501000A2572990E00701F09280501000A2572BD0F00701F0A280501000A2572C50F00701F0B280501000A2572CD0F00701F0C280501000A2572D10F00701F0D280501000A2572DB0F00701F0E280501000A2572E50F00701F0F280501000A2572F30F00701F10280501000A2572290900701F11280501000A2572D70E00701F12280501000A2572FD0F00701F13280501000A2572091000701F14280501000A2572850E00701F15280501000A2572191000701F16280501000A2572D50400701F17280501000A2572251000701F18280501000A2572331000701F19280501000A25723D1000701F1A280501000A2572451000701F1B280501000A2572511000701F1C280501000A2572551000701F1D280501000A25725D1000701F1E280501000A2572691000701F1F280501000A25727F1000701F20280501000A25728F0000701F21280501000A2572891000701F22280501000A2572991000701F23280501000A2572A31000701F24280501000A2572A91000701F25280501000A2572AF1000701F26280501000A2572B91000701F27280501000A2572BD1000701F28280501000A2572C91000701F29280501000A2572D71000701F2A280501000A2572DF1000701F2B280501000A2572E71000701F2C280501000A2572ED1000701F2D280501000A2572F11000701F2E280501000A2572011100701F2F280501000A2572111100701F30280501000A25721F1100701F31280501000A2572351100701F32280501000A2572650E00701F33280501000A25723B1100701F34280501000A2572491100701F35280501000A2572511100701F36280501000A2572611100701F37280501000A2572691100701F38280501000A2572771100701F39280501000A2572851100701F3A280501000A25728B1100701F3B280501000A2572911100701F3C280501000A2572971100701F3D280501000A25729D1100701F3E280501000A2572A31100701F3F280501000A2572A91100701F40280501000A2572B71100701F41280501000A25727F0E00701F42280501000A2572C51100701F43280501000A2572CD1100701F44280501000A2572D51100701F45280501000A25723B0F00701F46280501000A2572DF1100701F47280501000A2572E71100701F48280501000A2572F71100701F49280501000A2572071200701F4A280501000A2572171200701F4B280501000A2572FB0E00701F4C280501000A25721D1200701F4D280501000A2572010F00701F4E280501000A2572251200701F4F280501000A2572270F00701F50280501000A25722B1200701F51280501000A2572351200701F52280501000A25723B1200701F53280501000A2572411200701F54280501000A25726B0E00701F55280501000A2572E90E00701F56280501000A2572511200701F57280501000A25723F0F00701F58280501000A25724B0F00701F59280501000A25725D0F00701F5A280501000A2572630F00701F5B280501000A2572510F00701F5C280501000A25726F0F00701F5D280501000A25725D1200701F5E280501000A25726B1200701F5F280501000A25727D1200701F60280501000A25728F1200701F61280501000A2572A90E00701F62280501000A25728D0E00701F63280501000A2572991200701F64280501000A2572A51200701F65280501000A2572B31200701F66280501000A2572BF1200701F67280501000A25722D0F00701F68280501000A2572D11200701F69280501000A2572DF1200701F6A280501000A2572F11200701F6B280501000A2572FF1200701F6C280501000A2572111300701F6D280501000A2572070F00701F6E280501000A25721F1300701F6F280501000A25722F1300701F70280501000A2572CB0E00701F71280501000A2572530E00701F72280501000A2572B70E00701F73280501000A25723D1300701F74280501000A2572491300701F75280501000A25725B1300701F76280501000A2572490E00701F77280501000A2572DF0E00701F78280501000A2572730E00701F79280501000A2572691300701F7A280501000A2572130F00701F7B280501000A25721D0F00701F7C280501000A25727B1300701F7D280501000A2572C10E00701F7E280501000A2572891300701F7F280501000A25729B1300702080000000280501000AFE138017020004FE137E17020004061201280601000A3938020000074581000000020000000200000002000000020000000200000002000000020000000200000002000000020000000200000002000000020000000200000002000000020000000200000002000000020000000400000004000000040000000400000004000000070000000700000007000000070000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000E0000000E0000000E0000000E0000000E0000000E0000000E0000000E0000000E0000000E0000001000000010000000100000001000000010000000100000001000000010000000100000001000000013000000130000001300000013000000130000001300000013000000130000001300000013000000130000001300000013000000130000001300000016000000160000001600000016000000160000001C0000001C0000001C0000002200000022000000280000002800000028000000280000002800000028000000280000002800000028000000280000002B2C172A1F112A1F182A192A1E2A1A2A1F202A1F402A20000200002A20020100002A20800100002A20000100002A20008000002A1E02282500000A2A9E0273580200067D9A00000402282500000A032D0B72C7020070732600000A7A02037D990000042A1E027B9B0000042A2202037D9B0000042A1E027B9C0000042A2202037D9C0000042A1E027B9D0000042A2202037D9D0000042A32027B9A0000046F550200062A00001B3003002800000049000011730F01000A0A0203062835010006066F1001000A6F5600000A0BDE0A062C06066F1300000ADC072A0110000002000600161C000A0000000013300600BB02000054000011032D0B7213000070732600000A7A03284701000A0A140B3893020000066F4801000A0C087B4901000A130A110A1759450500000005000000C4010000050000004B020000070200003846020000087B4A01000A0D087B4901000A1304066F4B01000A26066F4801000A0C73650200060B027B9A00000412037B5F0100046F510200062D2012037B5F010004288500000A2C44027B9A0000047E2D00000A6F500200062D32027B9A00000412037B5F010004166F5302000613050712037B5D010004110512037B5F010004737A0200066F5C0200062B1B0712037B5E01000412037B5F0100046F5E02000607096F5C020006027B9A000004076F4D02000614130638DF00000011062D1A027B9B0000042D0B734C01000A130B110B2B05734D01000A1306087B4A01000A1307027B9A00000412077B5E01000412077B5F0100046F56020006130811082C6B110812077B5E010004284E01000A2C18120712077B5D010004110812077B5F01000417287B020006027B9A00000412077B5F0100046F510200062D2F12077B5F010004288500000A2C12027B9A0000047E2D00000A6F500200062C0F07110812077B5F0100046F5E020006066F4B01000A26066F4801000A0C1106110708252D06267E400100046F4F01000A066F4B01000A26066F4801000A0C066F5001000A2D0C087B4901000A1A3B0DFFFFFF02041104091106072836010006140B38A3000000027B9A0000046F4C0200062C26020418027B9A0000046F4E0200066F5B02000614142836010006027B9A0000046F4F02000626066F4B01000A26066F4801000A0C2B60087B5101000A751B00001B130911092C0B110902046F5201000A2B1804086F5301000A027B9D000004027B9B000004283C010006066F4B01000A26066F4801000A0C2B1C08725B000070087B4901000A8C5B000002284000000A735401000A7A066F5001000A3962FDFFFF2A001B3006006A010000550000110F037B5D010004288500000A2C012A027B9A0000040F037B5E0100040F037B5F0100046F56020006252D08260F037B5E0100040A031F3C6F1101000A04183308031F2F6F1101000A06288500000A2D100203062839010006031F3A6F1101000A02030F037B5D01000428390100060E052C3F0E056F6302000613042B1D11046F5501000A0B02031201285601000A1201285701000A283701000611046F9200000A2DDADE0C11042C0711046F1300000ADC0E042C790E046F5801000A13052B5711056F5901000A0C027B9A0000041202285A01000A7B5E0100041202285A01000A7B5F0100046F56020006252D0D261202285A01000A7B5E0100040D0203091202285A01000A7B5D0100041202285B01000A283801000611056F9200000A2DA0DE0C11052C0711056F1300000ADC027B9B0000042D1404193310031F206F1101000A031F2F6F1101000A031F3E6F1101000A027B9B0000042C0F0419330B02031805141428360100062A0000011C000002007B002AA5000C000000000200BE006422010C00000000033004005800000000000000031F206F1101000A020372A7130070283901000604288500000A2D10031F3A6F1101000A0203042839010006031F3D6F1101000A031F226F1101000A0305027B9D000004027B9B000004283F010006031F226F1101000A2A13300400C700000056000011031F206F1101000A04288500000A2D100203042839010006031F3A6F1101000A02030528390100060E047B5101000A751B00001B0A062C03142B070E046F5301000A0B062D2607288500000A2C1E02282F0100060C0845030000000200000003000000050000002B032A050B031F3D6F1101000A031F226F1101000A0E047B4901000A0D091B3322062C0A0602036F5201000A2B290307027B9D000004027B9B000004283F0100062B140E04725B0000700E04284000000A735401000A7A031F226F1101000A2A0013300500B401000057000011160A046F6700000A0B060C388801000004086F6800000A0D091F613208091F7A3E6F010000091F413208091F5A3E62010000091F5F3B5A0100000920C0000000320B0920D60000003E470100000920D8000000320B0920F60000003E340100000920F8000000320B0920FF0200003E21010000092070030000320B09207D0300003E0E01000009207F030000320B0920FF1F00003EFB00000009200C200000320B09200D2000003EE8000000092070200000320B09208F2100003ED50000000920002C0000320B0920EF2F00003EC2000000092001300000320B0920FFD700003EAF000000092000F90000320B0920CFFD00003E9C0000000920F0FD0000320B0920FDFF00003E890000000816313C091F303205091F39317B091F2D2E76091F2E2E710920B70000002E69092000030000320809206F030000315909203F20000032080920402000003149080631100304060806596F8600000A6F0701000A0817580A0372B31300706F0701000A03040828530300061304120472E70B0070282101000A6F0701000A0372B91300706F0701000A0817580C08073F71FEFFFF070631100304060706596F8600000A6F0701000A2A2A02031616283C0100062A2A02030416283C0100062A0000133005002301000058000011160A036F6700000A0B060C38F700000003086F6800000A0D09130611061F0D2E4211061F262E3011061F3C59450300000002000000350000000E0000002B3372BD1300701304389800000072C71300701304388C00000072D11300701304388000000005399A0000007E2D00000A13042B71091F202F0A091F0A2E05091F093335042C05091F7F2F2D091F7F32080920840000003120092086000000320809209F00000031100920D0FD000032550920EFFD0000304D03082853030006130572DD130070120572E5130070284500000A281801000A1F3B8C62000001288000000A1304080631100203060806596F8600000A6F0701000A0817580A0211046F0701000A0817580C08073F02FFFFFF070631100203060706596F8600000A6F0701000A2A2A02031616283F0100062A2A02030416283F0100062A000000133005003A0100005800001103288500000A2C012A160A036F6700000A0B060C380501000003086F6800000A0D09130611061F222E5111061F26594502000000360000004800000011061F3C59450300000002000000410000000E0000002B3F72BD1300701304389A000000053AB400000072C71300701304388800000072D113007013042B7F72E913007013042B7605399000000072F713007013042B67091F203235042C05091F7F2F2D091F7F32080920840000003120092086000000320809209F00000031100920D0FD000032550920EFFD0000304D03082853030006130572DD130070120572E5130070284500000A281801000A1F3B8C62000001288000000A1304080631100203060806596F8600000A6F0701000A0817580A0211046F0701000A0817580C08073FF4FEFFFF070631100203060706596F8600000A6F0701000A2A1E027BA60000042A2202037DA60000042A1E027BA70000042A2202037DA70000042A133002003C00000059000011289700000A6F9800000A027B260200043315027B250200041FFE330B02167D25020004020A2B131673FA0300060A06027B270200047D27020004062A1E0228F30300062A1B300200C200000030000011027B250200040B074504000000050000002B000000980000007E000000389300000002157D25020004027B270200047BA50000042D1902147D2402000402177D25020004170ADE7802157D2502000402027B270200047BA50000046F5C01000A7D2902000402187D250200042B3402027B290200046F5D01000A7D2802000402027B280200046F5600000A7D2402000402197D25020004170ADE2502187D25020004027B290200046F9200000A2DBF0228FB030006160ADE070228F8030006DC062A00000110000004000000B9B90007000000001E027B240200042A1A739900000A7A001B300200220000001A000011027B250200040A061859450200000001000000010000002ADE070228FB030006DC2A00000110000002001800021A0007000000001E027B240200042A7A02282500000A02037D2502000402289700000A6F9800000A7D260200042A6E02157D25020004027B290200042C0B027B290200046F1300000A2A001330020011000000590000111FFE73FA0300060A06027D27020004062A0000001B300200610000005A000011032D0802147DA50000042A02735E01000A7DA5000004036F0D01000A0B2B18076F0E01000A0A027BA50000040673610100066F5F01000A076F9200000A2DE0DE0A072C06076F1300000ADC027BA50000046F6001000A172F0702147DA50000042A0000000110000002001D002441000A0000000032027BA40000046FD80100062A32027BA40000046FD90100062A32027BA40000046FDA0100062A001B300500090100005B000011027BA30000046F55020006140A046F6101000A2B7B046F6201000A0D091F262E45091F3C33630203046FDB010006285601000602030406284F0100060B061428620100062C0D071428630100062C0F070A2B0B070628620100062C02140A046F6101000A2B2A0203046FDB01000628560100060203020428580100062856010006046F6101000A2B07046F6301000A26046F6401000A397AFFFFFF0203046FDB0100062856010006027BA30000046F4C0200062C2E027BA60000042C262B17027BA30000046F4F02000626037E410100046F6501000A027BA30000046F4C0200062DDCDE2326FE1A0C086FBD00000A046FDA010006046FD9010006046FD80100060873C70200067A2A000000011C000000000B00DAE500036D00000200000B00DAE800202A00000113300500E80100005C000011046F6301000A1F3C2E1D7205140070046FDA010006046FD9010006046FD801000673C50200067A046F6401000A2C1002031F3C286601000A2856010006142A020428500100060A0614286701000A2C530228470100062C42051428630100062C39067B5101000A75590000020B072C2A076F3A020006723314007028EC00000A2C18067B4901000A067B4A01000A076F3E020006736801000A0A03066F6501000A142A046F6201000A0C170D081F2F3310180D046F6301000A26046F6201000A0C042853010006130411041428620100062C281F3C286601000A13050918331011051F2F8C62000001286901000A1305020311052856010006142A051428630100062C4611040528630100062D0409182E381F3C286601000A13060918331011061F2F8C62000001286901000A1306110611046F5600000A285800000A1306020311062856010006142A1413072B66736F010006130911090428530100066F6B0100061109020428520100066F6D0100061109130811086F6A0100061428620100062C1D723B140070046FDA010006046FD9010006046FD801000673C50200067A11072D07736A01000A1307110711086F6B01000A0204120328540100062C8F020309110411072855010006027BA50000042C0F027BA500000411046F6C01000A2D02142A11042A13300700940200005D000011036F6201000A0A060D091F215945050000000D0000\
-006C020000B40100006C020000E4000000091F3F3B85000000385F020000036F6301000A26036F6201000A130411041F2D2E0811041F5B2E282B420203726D140070726D14007028510100060B072C2D7233140070726D1400700728440200062A02037273140070728314007028510100060C082C070828480200062A7289140070728900007002037E2D00000A7E2D00000A285101000628440200062A036F6301000A26036F6201000A130511051F3D3321728D14007072931400700203728D1400707293140070285101000628440200062A7293140070729314007002037E2D00000A7293140070285101000628440200062A036F6301000A26036F6201000A0A06130611061F2D302211061F21594504000000490000007E000000490000004900000011061F2D2E162B7611061F3A2E3B11061F3D2E3511061F402E2F2B627297140070729F1400700203726D140070726D1400701F258C62000001286901000A285101000628440200062A036F6301000A261F258C62000001068C62000001286901000A72A714007002037E2D00000A72A7140070285101000628440200062A72A714007072A714007002037E2D00000A72A7140070285101000628440200062A036F6301000A26036F6201000A0A06130711071F2B5945030000003B000000700000000E00000011071F3D2E3511071F402E2F2B6272AB14007072B31400700203726D140070726D1400701F238C62000001286901000A285101000628440200062A036F6301000A261F238C62000001068C62000001286901000A72BB14007002037E2D00000A72BB140070285101000628440200062A72BB14007072BB14007002037E2D00000A72BB140070285101000628440200062A142A13300400F70000005E000011036F6201000A0A046F6700000A0B160C2B48036F6401000A2D1A0604086F6800000A3310036F6301000A26036F6201000A0A2B22082D02142A72BF140070036FDA010006036FD9010006036FD801000673C50200067A0817580C080732B4051F3E8C62000001286901000A1003036F6101000A056F6700000A0D1613042B53060511046F6800000A3337110417581304110409322F036FDB0100061305036F6301000A260917590D09163112110511056F6700000A09596F6D01000A130511052A161304036F6301000A26036F6201000A0A036F6401000A2CA572F3140070036FDA010006036FD9010006036FD801000673C50200067A0013300400B00100005F000011032857010006036F6201000A1F3D2E0B7E2D00000A28480200062A036F6301000A26032857010006036F6201000A0A061F222E08061F2740E5000000036F6301000A26036F6201000A0B036F6101000A071F3C4083000000036F6301000A26020328500100060C0814286701000A2C6B036F6201000A0B2B0E036F6301000A26036F6201000A0B036F6401000A2D0C07284C0300062D04070633DE036F6401000A2D0407062E1D7221150070036FDA010006036FD9010006036FD801000673C50200067A036F6301000A26082A036F6301000A26036F6201000A0B036F6401000A2D04070633E6036F6401000A2C1D72F3140070036FDA010006036FD9010006036FD801000673C50200067A036FDB0100060D036F6301000A260928480200062A036F6101000A061F3C331D036F6301000A26020328500100061304110414286701000A2C0311042A036F6201000A13052B0F036F6301000A26036F6201000A1305036F6401000A2D1511051F2F2E0F11051F3E2E091105284C0300062CD4036F6401000A2C1D72F3140070036FDA010006036FD9010006036FD801000673C50200067A036FDB01000628480200062A1B3005006C00000060000011026F6201000A0A06285A0100062D02142A026F6101000A026F6301000A26026F6201000A0A026F6401000A2D0806285B0100062DE2026FDB0100060B0773610100060DDE250C727515007007284000000A026FDA010006026FD9010006026FD80100060873C70200067A092A0110000000003C00094500252A00000113300400A500000061000011036F6401000A2C1D72F3140070036FDA010006036FD9010006036FD801000673C50200067A032857010006036F6201000A0A061F2F2E07061F3E2E5E2B65036F6301000A26036F6201000A1F3E332E044A172E1D72AB150070036FDA010006036FD9010006036FD801000673C50200067A036F6301000A26041954172A72AB150070036FDA010006036FD9010006036FD801000673C50200067A036F6301000A26172A162A0000001B3006001F03000062000011041840FF0000001201057BAA000004057BA9000004027BA3000004057BA9000004166F52020006287A020006027BA30000046F4F0200060A062C11066F5B0200060728860200063991000000027BA60000042D6B062C0C027BA3000004066F4D02000612017B5E010004288500000A2D42027BA300000412017B5E0100046F500200062D2E12017B5F010004288500000A2C20027BA30000047E2D00000A6F500200062D0E120112017B5D0100042879020006037E410100046F6501000A2A027BA3000004076F540200062D10062C0C027BA3000004066F4D0200062A037E410100046F6501000A066F5B0200060728860200062C0F027BA30000046F4F020006250A2DD82A73650200060A0E0439D90000000E046F6E01000A17590C38C30000000E04086F6F01000A0D096F6A0100067BA9000004288500000A2C50096F6A0100067BAA00000472A713007028EC00000A2C39096F6C01000614287001000A2C0B72D715007073B500000A7A067E2D00000A096F6C0100066F5301000A6F5E0200060E04086F7101000A2B54096F6A0100067BA900000472A713007028EC00000A2C3D096F6C01000614287001000A2C0B72D715007073B500000A7A06096F6A0100067BAA000004096F6C0100066F5301000A6F5E0200060E04086F7101000A0817590C08163C36FFFFFF027BA3000004066F4D020006057BA9000004288500000A2D36027BA3000004057BA90000046F500200062D23027BA30000047E2D00000A6F500200062C1106057BA90000047E2D00000A6F5E02000606057BAA000004057BA9000004027BA3000004057BA9000004166F52020006737A0200066F5C0200060419331303066F5B02000628460200066F6501000A2B1103066F5B02000628450200066F6501000A0E042C7E0E046F7201000A13062B5A1206287301000A1304120511046F6A0100067BAA00000411046F6A0100067BA9000004027BA300000411046F6A0100067BA9000004166F52020006287A02000603110528470200066F6501000A0311046F6C0100066F6501000A1206287401000A2D9DDE0E1206FE166700001B6F1300000ADC0419330C027BA30000046F4F020006262A0001100000020099026700030E00000000133004007D0000006300001104288500000A2C012A036F7501000A0A06163003142B09030617596F7601000A0B0714286701000A2C46077B4901000A1B333D077B5101000A754A0000012C3006172E11030618596F7601000A7B4901000A1A2E1B03061759077B5101000A04286901000A28480200066F7701000A2A030428480200066F6501000A2A7E2B07026F6301000A26026F6401000A2D0D026F6201000A284C0300062DE42A00000013300400A101000064000011036F6301000A1F262E1D7201160070036FDA010006036FD9010006036FD801000673C50200067A036F6201000A0C036F6401000A2D1208284C0300062D0A081F262E05081F3C33081F26286601000A2A081F2340E5000000036F6301000A26036F6201000A0C160D036F6401000A2D1A081F782E05081F583310170D036F6301000A26036F6201000A0C036F6101000A2B0E036F6301000A26036F6201000A0C036F6401000A2D080828500300062DE2036FDB0100060B07092D03162B052000020000284500000A1204287801000A2C1E110428540300060A036F6401000A2D0C081F3B3307036F6301000A26062A092C361A8D0100000113061106161F268C62000001A21106171F238C62000001A21106181F788C62000001A211061907A21106287901000A2A1F268C620000011F238C6200000107288000000A2A036F6101000A2B0E036F6301000A26036F6201000A0C036F6401000A2D0808284E0300062DE2036FDB0100060B07285901000613051105162F0E1F268C6200000107286901000A2A036F6401000A2D0C081F3B3307036F6301000A26110528540300062A000000133002003D1400006100001102288500000A2C02152A02166F6800000A0A061F4159453A00000005000000A0000000B6000000DF00000008010000381300009001000038130000A601000038130000080200001E020000340200004A0200007302000021030000381300007003000086030000AF030000EB03000038130000381300004D040000630400008C040000381300003813000038130000381300003813000038130000A2040000BC0500000B060000F20600007A07000074080000E9080000220900007109000038130000450A00005B0A0000780B0000ED0B0000AE0C0000CE0D0000C80E0000DB0E0000E80F000041110000EF110000381300009D120000B3120000C6120000FF12000038331300000272231600706F7A01000A2C0620C60000002A02722F1600706F7A01000A2C0620C10000002A02723D1600706F7A01000A2C0620C20000002A0272491600706F7A01000A2C0620C00000002A0272571600706F7A01000A2C0620910300002A0272631600706F7A01000A2C0620C50000002A02726F1600706F7A01000A2C0620C30000002A02727D1600706F7A01000A399E12000020C40000002A0272871600706F7A01000A398812000020920300002A0272911600706F7A01000A2C0620C70000002A02729F1600706F7A01000A395F12000020A70300002A0272A71600706F7A01000A2C0620212000002A0272B51600706F7A01000A393612000020940300002A0272C11600706F7A01000A2C0620D00000002A0272C91600706F7A01000A2C0620C90000002A0272D71600706F7A01000A2C0620CA0000002A0272E31600706F7A01000A2C0620C80000002A0272F11600706F7A01000A2C0620950300002A0272011700706F7A01000A2C0620970300002A0272091700706F7A01000A39AE11000020CB0000002A0272131700706F7A01000A399811000020930300002A02721F1700706F7A01000A2C0620CD0000002A02722D1700706F7A01000A2C0620CE0000002A0272391700706F7A01000A2C0620CC0000002A0272471700706F7A01000A2C0620990300002A0272511700706F7A01000A393611000020CF0000002A02725B1700706F7A01000A3920110000209A0300002A0272671700706F7A01000A390A110000209B0300002A0272751700706F7A01000A39F4100000209C0300002A02727B1700706F7A01000A2C0620D10000002A0272891700706F7A01000A39CB100000209D0300002A02728F1700706F7A01000A2C0620520100002A02729B1700706F7A01000A2C0620D30000002A0272A91700706F7A01000A2C0620D40000002A0272B51700706F7A01000A2C0620D20000002A0272C31700706F7A01000A2C0620A90300002A0272CF1700706F7A01000A2C06209F0300002A0272DF1700706F7A01000A2C0620D80000002A0272ED1700706F7A01000A2C0620D50000002A0272FB1700706F7A01000A391D10000020D60000002A0272051800706F7A01000A2C0620A60300002A02720D1800706F7A01000A2C0620A00300002A0272131800706F7A01000A2C0620332000002A02721F1800706F7A01000A39CE0F000020A80300002A0272271800706F7A01000A39B80F000020A10300002A02722F1800706F7A01000A2C0620600100002A02723D1800706F7A01000A398F0F000020A30300002A0272491800706F7A01000A2C0620DE0000002A0272551800706F7A01000A2C0620A40300002A02725D1800706F7A01000A39530F000020980300002A0272691800706F7A01000A2C0620DA0000002A0272771800706F7A01000A2C0620DB0000002A0272831800706F7A01000A2C0620D90000002A0272911800706F7A01000A2C0620A50300002A0272A11800706F7A01000A39F10E000020DC0000002A0272AB1800706F7A01000A39DB0E0000209E0300002A0272B11800706F7A01000A2C0620DD0000002A0272BF1800706F7A01000A39B20E000020780100002A0272C91800706F7A01000A399C0E000020960300002A0272D31800706F7A01000A2C0620E10000002A0272E11800706F7A01000A2C0620E20000002A0272ED1800706F7A01000A2C0620B40000002A0272F91800706F7A01000A2C0620E60000002A0272051900706F7A01000A2C0620E00000002A0272131900706F7A01000A2C0620352100002A0272231900706F7A01000A2C0620B10300002A02722F1900706F7A01000A2C031F262A0272371900706F7A01000A2C0620272200002A02723F1900706F7A01000A2C0620202200002A0272471900706F7A01000A2C031F272A0272511900706F7A01000A2C0620E50000002A02725D1900706F7A01000A2C0620482200002A0272691900706F7A01000A2C0620E30000002A0272771900706F7A01000A39820D000020E40000002A0272811900706F7A01000A2C06201E2000002A02728D1900706F7A01000A2C0620B20300002A0272971900706F7A01000A2C0620A60000002A0272A51900706F7A01000A39330D000020222000002A0272AF1900706F7A01000A2C0620292200002A0272B71900706F7A01000A2C0620E70000002A0272C51900706F7A01000A2C0620B80000002A0272D11900706F7A01000A2C0620A20000002A0272DB1900706F7A01000A2C0620C70300002A0272E31900706F7A01000A2C0620C60200002A0272ED1900706F7A01000A2C0620632600002A0272F91900706F7A01000A2C0620452200002A0272031A00706F7A01000A2C0620A90000002A02720D1A00706F7A01000A2C0620B52100002A0272191A00706F7A01000A2C06202A2200002A0272211A00706F7A01000A394C0C000020A40000002A02722F1A00706F7A01000A2C0620D32100002A0272391A00706F7A01000A2C0620202000002A0272471A00706F7A01000A2C06202F2100002A0272511A00706F7A01000A2C0620B00000002A0272591A00706F7A01000A2C0620B40300002A0272651A00706F7A01000A2C0620662600002A0272711A00706F7A01000A39C40B000020F70000002A02727F1A00706F7A01000A2C0620E90000002A02728D1A00706F7A01000A2C0620EA0000002A0272991A00706F7A01000A2C0620E80000002A0272A71A00706F7A01000A2C0620052200002A0272B31A00706F7A01000A2C0620032000002A0272BD1A00706F7A01000A2C0620022000002A0272C71A00706F7A01000A2C0620B50300002A0272D71A00706F7A01000A2C0620612200002A0272E31A00706F7A01000A2C0620B70300002A0272EB1A00706F7A01000A2C0620F00000002A0272F31A00706F7A01000A2C0620EB0000002A0272FD1A00706F7A01000A2C0620AC2000002A0272071B00706F7A01000A39CA0A000020032200002A0272131B00706F7A01000A2C0620920100002A02721D1B00706F7A01000A2C0620002200002A02722B1B00706F7A01000A2C0620BD0000002A0272391B00706F7A01000A2C0620BC0000002A0272471B00706F7A01000A2C0620BE0000002A0272551B00706F7A01000A39550A000020442000002A0272611B00706F7A01000A2C0620B30300002A02726D1B00706F7A01000A2C0620652200002A0272731B00706F7A01000A39190A00001F3E2A0272791B00706F7A01000A2C0620D42100002A0272831B00706F7A01000A2C0620942100002A02728D1B00706F7A01000A2C0620652600002A02729B1B00706F7A01000A39CD09000020262000002A0272A91B00706F7A01000A2C0620ED0000002A0272B71B00706F7A01000A2C0620EE0000002A0272C31B00706F7A01000A2C0620A10000002A0272CF1B00706F7A01000A2C0620EC0000002A0272DD1B00706F7A01000A2C0620112100002A0272E91B00706F7A01000A2C06201E2200002A02721B0A00706F7A01000A2C06202B2200002A0272F51B00706F7A01000A2C0620B90300002A0272FF1B00706F7A01000A2C0620BF0000002A02720D1C00706F7A01000A2C0620082200002A0272171C00706F7A01000A39F908000020EF0000002A0272211C00706F7A01000A39E308000020BA0300002A02722D1C00706F7A01000A2C0620D02100002A0272371C00706F7A01000A2C0620BB0300002A0272451C00706F7A01000A2C0620292300002A02724F1C00706F7A01000A2C0620AB0000002A02725B1C00706F7A01000A2C0620902100002A0272651C00706F7A01000A2C0620082300002A0272711C00706F7A01000A2C06201C2000002A02727D1C00706F7A01000A2C0620642200002A0272831C00706F7A01000A2C06200A2300002A0272911C00706F7A01000A2C0620172200002A02729F1C00706F7A01000A2C0620CA2500002A0272A71C00706F7A01000A2C06200E2000002A0272AF1C00706F7A01000A2C0620392000002A0272BD1C00706F7A01000A2C0620182000002A0272C91C00706F7A01000A39C30700001F3C2A0272CF1C00706F7A01000A2C0620AF0000002A0272D91C00706F7A01000A2C0620142000002A0272E51C00706F7A01000A2C0620B50000002A0272F11C00706F7A01000A2C0620B70000002A0272FF1C00706F7A01000A2C0620122200002A02720B1D00706F7A01000A395107000020BC0300002A0272111D00706F7A01000A2C0620072200002A02721D1D00706F7A01000A2C0620A00000002A0272271D00706F7A01000A2C0620132000002A0272331D00706F7A01000A2C0620602200002A0272391D00706F7A01000A2C06200B2200002A02723F1D00706F7A01000A2C0620AC0000002A0272471D00706F7A01000A2C0620092200002A0272531D00706F7A01000A2C0620842200002A02725D1D00706F7A01000A2C0620F10000002A02726B1D00706F7A01000A399006000020BD0300002A0272711D00706F7A01000A2C0620F30000002A02727F1D00706F7A01000A2C0620F40000002A02728B1D00706F7A01000A2C0620530100002A0272971D00706F7A01000A2C0620F20000002A0272A51D00706F7A01000A2C06203E2000002A0272B11D00706F7A01000A2C0620C90300002A0272BD1D00706F7A01000A2C0620BF0300002A0272CD1D00706F7A01000A2C0620952200002A0272D91D00706F7A01000A2C0620282200002A0272DF1D00706F7A01000A2C0620AA0000002A0272E91D00706F7A01000A2C0620BA0000002A0272F31D00706F7A01000A2C0620F80000002A0272011E00706F7A01000A2C0620F50000002A02720F1E00706F7A01000A2C0620972200002A02721D1E00706F7A01000A397005000020F60000002A0272271E00706F7A01000A2C0620B60000002A0272311E00706F7A01000A2C0620022200002A02723B1E00706F7A01000A2C0620302000002A0272491E00706F7A01000A2C0620A52200002A0272531E00706F7A01000A2C0620C60300002A02725B1E00706F7A01000A2C0620C00300002A0272611E00706F7A01000A2C0620D60300002A0272691E00706F7A01000A2C0620B10000002A0272771E00706F7A01000A2C0620A30000002A0272831E00706F7A01000A2C0620322000002A02728F1E00706F7A01000A2C06200F2200002A0272991E00706F7A01000A2C06201D2200002A0272A31E00706F7A01000A397604000020C80300002A0272AB1E00706F7A01000A39600400001F222A0272B51E00706F7A01000A2C0620D22100002A0272BF1E00706F7A01000A2C06201A2200002A0272CB1E00706F7A01000A2C06202A2300002A0272D51E00706F7A01000A2C0620BB0000002A0272E11E00706F7A01000A2C0620922100002A0272EB1E00706F7A01000A2C0620092300002A0272F71E00706F7A01000A2C06201D2000002A0272031F00706F7A01000A2C06201C2100002A02720D1F00706F7A01000A2C0620AE0000002A0272151F00706F7A01000A2C06200B2300002A0272231F00706F7A01000A2C0620C10300002A02722B1F00706F7A01000A2C06200F2000002A0272331F00706F7A01000A2C06203A2000002A0272411F00706F7A01000A395603000020192000002A02724D1F00706F7A01000A2C06201A2000002A0272591F00706F7A01000A2C0620610100002A0272671F00706F7A01000A2C0620C52200002A0272711F00706F7A01000A2C0620A70000002A02727B1F00706F7A01000A2C0620AD0000002A0272831F00706F7A01000A2C0620C30300002A02728F1F00706F7A01000A2C0620C20300002A02729D1F00706F7A01000A2C06203C2200002A0272A51F00706F7A01000A2C0620602600002A0272D71000706F7A01000A2C0620822200002A0272B31F00706F7A01000A2C0620862200002A0272BD1F00706F7A01000A2C0620112200002A0272DF1000706F7A01000A2C0620832200002A0272C51F00706F7A01000A2C0620B90000002A0272CF1F00706F7A01000A2C0620B20000002A0272D91F00706F7A01000A2C0620B30000002A0272E31F00706F7A01000A2C0620872200002A0272ED1F00706F7A01000A39FD01000020DF0000002A0272F91F00706F7A01000A2C0620C40300002A0272012000706F7A01000A2C0620342200002A02720F2000706F7A01000A2C0620B80300002A02721B2000706F7A01000A2C0620D10300002A02722D2000706F7A01000A2C0620092000002A02723B2000706F7A01000A2C0620FE0000002A0272472000706F7A01000A2C0620DC0200002A0272532000706F7A01000A2C0620D70000002A02725F2000706F7A01000A394F01000020222100002A02726B2000706F7A01000A2C0620D12100002A0272752000706F7A01000A2C0620FA0000002A0272832000706F7A01000A2C0620912100002A02728D2000706F7A01000A2C0620FB0000002A0272992000706F7A01000A2C0620F90000002A0272A72000706F7A01000A2C0620A80000002A0272AF2000706F7A01000A2C0620D20300002A0272BB2000706F7A01000A2C0620C50300002A0272CB2000706F7A01000A39A100000020FC0000002A0272D52000706F7A01000A398B00000020182100002A0272E32000706F7A01000A2C7820BE0300002A0272E92000706F7A01000A2C0620FD0000002A0272F72000706F7A01000A2C0620A50000002A0272FF2000706F7A01000A2C3F20FF0000002A0272092100706F7A01000A2C0620B60300002A0272132100706F7A01000A2C06200D2000002A02721B2100706F7A01000A2C06200C2000002A152A00000003300200EB00000000000000021F613208021F7A3EDC000000021F413208021F5A3ECF000000021F3A3BC7000000021F5F3BBF0000000220C0000000320B0220D60000003EAC0000000220D8000000320B0220F60000003E990000000220F8000000320B0220FF0200003E86000000022070030000320802207D030000317602207F03000032080220FF1F0000316602200C200000320802200D2000003156022070200000320802208F21000031460220002C000032080220EF2F0000313602200130000032080220FFD700003126022000F9000032080220CFFD000031160220F0FD0000320C0220FDFF0000FE0216FE012A162A172A00033002004C0000000000000002285A0100062D42021F303205021F393138021F2D2E33021F2E2E2E0220B70000002E26022000030000320802206F030000311602203F200000320C022040200000FE0216FE012A162A172A133005001E00000065000011737B01000A0A0206020373EF010006250B7DA400000407284E010006062A0000133005001E00000065000011737B01000A0A0206020373DD010006250B7DA400000407284E010006062A3A02176F5F01000602287500000A2A3E032C0B027BA40000046F1300000A2A760273580200067DA3000004027EDD0000047DA400000402282500000A2A00133003006F0000006600001102282500000A03288500000A2C0B7225210070732600000A7A037EA8000004176F3401000A0A068E690B071759450200000002000000170000002B28027E2D00000A7DA90000040206169A7DAA0000042A0206169A7DA90000040206179A7DAA0000042A7225210070730001000A7A660214287C01000A2C080314287C01000A2A02036F670100062A2E0203286201000616FE012AB6027BA9000004288500000A2C07027BAA0000042A027BA90000041F3A8C62000001027BAA000004288000000A2A00133004004C0000001A00001120264B29360A20295555A5065A280901000A027BAA000004252D06267E2D00000A6F0B01000A580A20295555A5065A280901000A027BA9000004252D06267E2D00000A6F0B01000A580A062A3A0203753A0000021428680100062A2602031428680100062AFA042D07280901000A1002031428620100062C02162A04027BA9000004037BA90000046F7D01000A2C1304027BAA000004037BAA0000046F7D01000A2A162A133003001300000067000011178D620000010A06161F3A9D0680A80000042A1E027BAB0000042A2202037DAB0000042A1E027BAC0000042A2202037DAC0000042A0000001330040058000000680000111B8D010000010A061602286A010006A206171F3D8C62000001A206181F228C62000001A2061902286C01000614286701000A2D077E2D00000A2B0B02286C0100066F5301000AA2061A1F228C62000001A206287901000A2A1E02282500000A2A133003004A00000069000011032D0B728D0E0070732600000A7A03283A00000A0A737B01000A0B2B23077EAE00000428450200066F6501000A0207062872010006077E410100046F6501000A066F3B00000A2CD5072A0000133003005F0000006A000011046F3C00000A0A067B3F00000A0B07175945030000000F0000002100000006000000071C2E142B1B02030428740100062A02030428750100062A02030428730100062A06725B000070067B3F00000A8C20000002284000000A733E00000A7A00133003006E0000006B000011046F4100000A0A067B4700000A0C1202287C02000616FE010B072C36037EB400000428450200066F6501000A037EB500000428470200066F6501000A03067B4700000A8C6300000228480200066F6501000A03061B6F0400002B6F6501000A072C0B037E410100046F6501000A2A000013300300E50000006C000011046F4100000A0A037EAF00000428450200066F6501000A067B4700000A0B1201287C0200063AAF000000037EB500000428470200066F6501000A03067B4700000A8C6300000228480200066F6501000A3884000000046F3C00000A0A067B3F00000A0C0817594506000000150000003A00000015000000020000003A000000150000002B38046F4100000A26037E410100046F6501000A2A037EB000000428450200066F6501000A0203042872010006037E410100046F6501000A2B1C06725B000070067B3F00000A8C20000002284000000A733E00000A7A046F3B00000A3971FFFFFF2A00000013300300050100006C000011046F4100000A0A037EB100000428450200066F6501000A067B4700000A0B1201287C0200063ACF000000037EB500000428470200066F6501000A03067B4700000A8C6300000228480200066F6501000A38A4000000046F3C00000A0A06\
-7B3F00000A0C08182E06081B2E152B70046F4100000A26037E410100046F6501000A2A046F4100000A26037EB200000428450200066F6501000A03067B4700000A8C6300000228480200066F6501000A037E410100046F6501000A037EB300000428450200066F6501000A0203042872010006037E410100046F6501000A2B1C06725B000070067B3F00000A8C20000002284000000A733E00000A7A046F3B00000A3951FFFFFF2A0000000330010079000000000000007261110070737902000680AE0000047235120070737902000680AF00000472270F0070737902000680B00000047217120070737902000680B100000472010F0070737902000680B200000472FB0E0070737902000680B300000472DB0F0070737902000680B4000004729B130070737902000680B50000042A1E02282500000A2A4A02282500000A027EB70000047DB80000042A4E02282500000A02038D620000017DB80000042A1E027BB90000042A2202167DB90000042A00000013300400390000001A000011027BB9000004027BB80000048E69300E02027BB90000041758287F010006027BB800000402257BB9000004250A17587DB900000406039D022A000000133004005C0000006D00001103288500000A2C02022A036F6700000A0A027BB9000004027BB80000048E69300E02027BB90000040658287F010006160B2B23027BB800000402257BB9000004250C17587DB90000040803076F6800000A9D0717580B070632D9022A7E027BB9000004172F012A03027BB800000416027BB90000046F7F01000A262A133005004B0000006E000011027BB80000048E690A060332012A1F2006185A288001000A03288001000A0B078D620000010C027BB9000004163114027BB8000004160816027BB9000004288101000A02087DB80000042A4E027BB800000416027BB9000004736E00000A2A32168D6200000180B70000042AA602282500000A032D08168D2F00001B100102738201000A7D8301000A02036F1100000A7D8401000A2A00001B300200450000006F000011160A026F1100000A0D2B22096F9A00000A0B078C2F00001B038C2F00001B288501000A2C04060CDE1A0617580A096F9200000A2DD6DE0A092C06096F1300000ADC152A082A00000001100000020009002E37000A000000001A739900000A7A1A739900000A7A560203288601000A26027B8301000A036F8701000A2A560203288601000A26027B8301000A036F8701000A2A1A738801000A7A1A739900000A7A1A739900000A7A001B3002003F00000070000011026F1100000A0C2B1E086F9A00000A0A068C2F00001B038C2F00001B288501000A2C04170BDE16086F9200000A2DDADE0A082C06086F1300000ADC162A072A0001100000020007002A31000A000000005202288901000A027B8301000A03046F8A01000A2A4A02288901000A027B8301000A6F8B01000A2A0A172A1A739900000A7A1E02738C01000A2A1E02738C01000A2A0000033003006C0000000000000003027B8301000A6F8B01000A2F02172A027B8D01000A2C18162A027B8301000A027B8401000A6F9A00000A6F8E01000A03027B8301000A6F8B01000A320D027B8401000A6F9200000A2DCF0203027B8301000A6F8B01000AFE0416FE017D8D01000A027B8D01000A16FE012AB62B16027B8301000A027B8401000A6F9A00000A6F8E01000A027B8401000A6F9200000A2DDD02177D8D01000A2A5602282500000A02037D8F01000A02157D9001000A2A033002004900000000000000027B9001000A162F0B722F21007073B500000A7A027B9001000A027B8F01000A7B8301000A6F8B01000A320B725D21007073B500000A7A027B8F01000A027B9001000A6F9101000A2A3202289201000A8C2F00001B2A000013300200220000001A000011027B9001000A17580A027B8F01000A066F8601000A2C0902067D9001000A172A162A2202157D9001000A2A062A00000013300300880000007100001102282500000A032D0B7287210070732600000A7A0416320904036F0F00000A320B7299210070738100000A7A0516320B0504036F0F00000A58310B72A5210070738100000A7A03756C00001B0A062C2202067B9301000A7D9301000A02067B9401000A04587D9401000A02057D9501000A2A02037D9301000A02047D9401000A02057D9501000A2A1E02282500000A2A5E038C2F00001B027B9601000A8C2F00001B288501000A2A5E038C2F00001B027B9601000A8C2F00001B288501000A2A13300500CA00000072000011141304141305739701000A13061106037D9601000A027B9301000A756E00001B0A062C2806027B9401000A027B9501000A11042D0F1106FE069801000A739901000A13041104280500002B2A027B9301000A756900001B0B072C2807027B9401000A027B9501000A11052D0F1106FE069B01000A739901000A130511056F9C01000A2A027B9401000A027B9501000A580C027B9401000A0D2B2A027B9301000A096F0900000A8C2F00001B11067B9601000A8C2F00001B288501000A2C02092A0917580D090832D2152A1A739900000A7A1A739900000A7A52027B9301000A027B9401000A03586F0900000A2A52027B9301000A027B9401000A03586F0900000A2A1A739900000A7A1A739900000A7A1A739900000A7A3A0203289D01000A16FE0416FE012A000013300500A400000073000011032D0B72B3210070732600000A7A027B9501000A0458038E69310B72BD210070738100000A7A027B9301000A756E00001B0A062C1506027B9401000A0304027B9501000A288101000A2A027B9301000A756900001B0B072C1507027B9401000A0304027B9501000A6F9E01000A2A040C027B9401000A0D04027B9501000A5813042B1B0308027B9301000A096F0900000AA42F00001B0817580C0917580D08110432E02A1E027B9501000A2A0A172A1A739900000A7A62027B9301000A027B9401000A027B9501000A739F01000A2A62027B9301000A027B9401000A027B9501000A739F01000A2A9E02282500000A02037DA001000A020417597DA101000A02047DA201000A020405587DA301000A2A033002004400000000000000027BA101000A027BA201000A2F0B722F21007073B500000A7A027BA101000A027BA301000A320B725D21007073B500000A7A027BA001000A027BA101000A6F0900000A2A320228A401000A8C2F00001B2AB6027BA101000A027BA301000A2F1D02257BA101000A17587DA101000A027BA101000A027BA301000AFE042A162A3E02027BA201000A17597DA101000A2A062A22021628A501000A2A000013300100290000007400001102751200001B0A062C070673A601000A2A032C0E0273A701000A0A0673A601000A2A0273A801000A2A3A02176FA901000A02287500000A2A321473A601000A80AA01000A2A1E02282500000A2A7A0228AB01000A032D08168D2F00001B100102036F1100000A7DAC01000A2A360228AD01000A027BAE01000A2A360228AD01000A027BAF01000A2A660228AD01000A02027BAE01000A7DB001000A027BAF01000A2A36027BB101000A14FE0116FE012A7E027BB101000A2D0B72D321007073B500000A7A027BB101000A6F8B01000A2A8A027BB101000A2D0E021F1073B201000A7DB101000A2A027BB101000A6FB301000A2A00133002002800000075000011027BB101000A2D0B72D321007073B500000A7A027BB101000A6FB401000A0A02147DB101000A062A033003006400000000000000027BB001000A2C012A02177DB001000A02027BAC01000A6F9200000A16FE017DAE01000A027BAE01000A2C0D027CAF01000AFE152F00001B2A02027BAC01000A6F9A00000A7DAF01000A027BB101000A2C11027BB101000A027BAF01000A6F8E01000A2A3E032C0B027BAC01000A6F1300000A2AAE02157DB501000A02157DB601000A0228AB01000A0203252D0C26168D2F00001B741200001B7DB701000A2A92027BB601000A162F0B72D321007073B500000A7A17027BB501000A58027BB601000A592A36027BB601000A16FE0416FE012A3E02027BB501000A17587DB601000A2A00133004003E00000075000011027BB601000A162F0B72D321007073B500000A7A027BB701000A027BB601000A17027BB501000A58027BB601000A5973B801000A0A02157DB601000A062A360228B901000A027BBA01000A2A360228B901000A027BBB01000A2AC60228B901000A027BBA01000A2C07027BBB01000A2A02167DBC01000A02257BB501000A17587DB501000A027BBB01000A2A133003009500000076000011027BBC01000A2D08027BBA01000A2C012A02177DBC01000A027BB501000A17580A027BB701000A756A00001B0B072C3007066F8601000A2C1302027BB701000A066F0900000A7DBB01000A2A02177DBA01000A027CBB01000AFE152F00001B2A06027BB701000A6F0F00000A2F1302027BB701000A066F0900000A7DBB01000A2A02177DBA01000A027CBB01000AFE152F00001B2A062A9602157DD900000402157DDB00000402282500000A0203252D06267E2D00000A7DDA0000042A1E027BD70000042A1E027BD80000042A22027BD90000046A2A92027BDB000004162F0B72D321007073B500000A7A17027BD900000458027BDB000004592A36027BDB00000416FE0416FE012A3E02027BD900000417587DDB0000042A1E0228E50100062A000000133004003E00000021000011027BDB000004162F0B72D321007073B500000A7A027BDA000004027BDB00000417027BD900000458027BDB000004596F8600000A0A02157DDB000004062AFA027BDB000004162F0B72D321007073B500000A7A03027BDA000004027BDB00000417027BD900000458027BDB000004596FBD01000A2602157DDB0000042A360228EA010006027BD40000042A360228EA010006027BD60000042AA60228EA010006027BD40000042C07027BD60000042A02167DD50000040228EB010006027BD60000042A0013300300500000001A000011027BD50000042C012A02177DD5000004027BD900000417580A06027BDA0000046F6700000A2F1A02167DD400000402027BDA000004066F6800000A7DD60000042A02177DD400000402167DD60000042A133004007D00000077000011027BD9000004162F18020217250A7DD7000004067DD800000402167DD90000042A027BD60000040B071F0A2E07071F0D2E172B2C027BDA000004027BD90000046F6800000A1F0D2E2502257BD800000417587DD800000402167DD70000042B0E02257BD700000417587DD700000402257BD900000417587DD90000042A3A02176FED01000602287500000A2A062A321473DD01000680D30000042A5A02282500000A02037DDE00000402156A7DE50000042A1E027BE30000042A1E027BE40000042A1E027BE50000042A7E027BE60000042D0B72D321007073B500000A7A027BE60000046F7A0100062A36027BE600000414FE0116FE012A8A027BE60000042D0E021F2073790100067DE60000042A027BE60000046F7B0100062A1E0228F70100062A00133002002800000021000011027BE60000042D0B72D321007073B500000A7A027BE60000046F5600000A0A02147DE6000004062A9E027BE60000042D0B72D321007073B500000A7A027BE6000004036F7E01000602147DE60000042A360228FC010006027BE10000042A360228FC010006027BDF0000042A1330030058000000610000110228FC010006027BE10000042C07027BDF0000042A027BE60000042C12027BE6000004027BDF0000046F7C0100062602167DE200000402027BE0000004027BDF00000428FD01000602027BDF000004250A7DE0000004062A13300300470000001A000011027BE20000042D08027BE10000042C012A02177DE2000004027BDE0000046FBE01000A0A020616FE047DE1000004027BE10000042C0802167DDF0000042A0206D17DDF0000042A00133004006B00000077000011027BE5000004166A2F19020217250A7DE3000004067DE400000402166A7DE50000042A040B071F0A2E07071F0D2E072B1C031F0D2E2502257BE400000417587DE400000402167DE30000042B0E02257BE300000417587DE300000402257BE5000004176A587DE50000042A3A02176FFF01000602287500000A2A3E032C0B027BDE0000046FBF01000A2A427EC001000A73EF01000680DD0000042A1E02282500000A2A1E0228C201000A2A1E0228C201000A2A3A0228C201000A020328060200062A1E027BFC0000042A2202037DFC0000042A3202739C02000628080200062A4A02032D07739C0200062B010328A40000062AF602032D07739C0200062B010328A4000006042D0B72190B007073B000000A7A02048E698D4A0000017DFD00000404027BFD000004048E69280C01000A2A000000133002003C00000078000011289700000A6F9800000A027B2D0200043315027B2C0200041FFE330B02167D2C020004020A2B131673060400060A06027B2E0200047D2E020004062A1E0228FF0300062A1B3003001D01000030000011027B2C0200040B07450600000005000000EB00000067000000AA000000C7000000E400000038E600000002157D2C020004027B2E0200047BFD0000042C7B02177D2C02000402027B2E0200047BFD0000047D3002000402167D310200042B4202027B30020004027B310200049A7D2F02000402027B2F0200047D2B02000402187D2C020004170ADD8F00000002177D2C02000402027B3102000417587D31020004027B31020004027B300200048E6932AE0228070400062B570272330B00707D2B02000402197D2C020004170ADE4C02157D2C0200040272550B00707D2B020004021A7D2C020004170ADE2F02157D2C0200040272690B00707D2B020004021B7D2C020004170ADE1202157D2C020004160ADE07022804040006DC062A000000411C00000400000000000000140100001401000007000000000000001E027B2B0200042A1A739900000A7A00133002001F0000001A000011027B2C0200040A061759450200000001000000010000002A0228070400062A1E027B2B0200042A7A02282500000A02037D2C02000402289700000A6F9800000A7D2D0200042A2202157D2C0200042A001330020011000000780000111FFE73060400060A06027D2E020004062A1A731A0200062A32027B050100046FD80100062A32027B050100046FD90100062A32027B050100046FDA0100062A00133002004800000079000011289700000A6F9800000A027B340200043315027B330200041FFE330B02167D33020004020A2B1316730F0400060A06027B350200047D3502000406027B370200047D36020004062A1E0228080400062A13300500C405000077000011027B330200040A0645090000000500000058010000CE01000050020000C60200007E030000AB030000AC04000068050000388C05000002157D33020004027B360200042D0B7203220070732600000A7A027B35020004027B360200047D0501000402167D3802000402167D39020004027B360200042810020006027B360200046F6401000A2C20027B350200047ED30000047D05010004027B360200046F1300000A381B05000002167D3A02000402027B360200046F6201000A7D3B020004027B3B0200040B071F2D3032071F223B51020000071F275945070000002C0200007C0300007C0300007C030000F702000000030000F70200003877030000071F3A3B40030000071F5B5945030000001A0000005A03000090000000071F7B594503000000FD00000045030000730100003840030000027B360200046F6301000A26027B3902000418332C7213220070027B360200046FDA010006027B360200046FD9010006027B360200046FD801000673C50200067A027E560000047D3202000402177D33020004172A02157D3302000402257B3802000417587D3802000402167D3902000438C5FEFFFF027B360200046F6301000A26027B3902000417332C7243220070027B360200046FDA010006027B360200046FD9010006027B360200046FD801000673C50200067A027E510000047D3202000402187D33020004172A02157D3302000402257B3802000417597D3802000402027B38020004163003162B01187D390200043843FEFFFF027B360200046F6301000A26027B3902000418332C7213220070027B360200046FDA010006027B360200046FD9010006027B360200046FD801000673C50200067A027E570000047D3202000402197D33020004172A02157D3302000402257B3802000417587D3802000402167D3902000438CDFDFFFF027B360200046F6301000A26027B3902000417332C7243220070027B360200046FDA010006027B360200046FD9010006027B360200046FD801000673C50200067A027E520000047D32020004021A7D33020004172A02157D3302000402257B3802000417597D3802000402027B38020004163003162B01187D39020004384BFDFFFF027B3902000418332C7213220070027B360200046FDA010006027B360200046FD9010006027B360200046FD801000673C50200067A02027B3602000428130200067D3C020004027B360200042810020006027B360200046F6201000A1F3A333E027B360200046F6301000A2602027B3C020004737902000628870000067D32020004021B7D33020004172A02157D3302000402167D3902000438ADFCFFFF02027B3C02000428880000067D32020004021C7D33020004172A02157D3302000402187D390200043880FCFFFF02177D3A0200042B7C027B360200046F6301000A26027B39020004182E2C7243220070027B360200046FDA010006027B360200046FD9010006027B360200046FD801000673C50200067A02177D39020004382AFCFFFF7279220070027B360200046FDA010006176A58027B360200046FD9010006027B360200046FD801000673C50200067A027B3902000418332C7213220070027B360200046FDA010006027B360200046FD9010006027B360200046FD801000673C50200067A02027B3602000428120200067D3D020004027B3D02000414284800000A2C2802027B3D0200047D32020004021D7D33020004172A02157D3302000402187D39020004387FFBFFFF027B3A0200042D0702167D3B02000402027B360200046FDA010006176A587D3E02000402027B360200046FD90100067D3F02000402027B360200046FD80100067D4002000402027B3602000428150200067D41020004027B41020004288500000A2D5202027B36020004027B41020004027B3B020004027C3902000428140200067D3D020004027B3D02000414284800000A2C2102027B3D0200047D32020004021E7D33020004172A02157D3302000438CAFAFFFF7279220070027B3E020004027B3F020004027B4002000473C50200067A162A1E027B320200042A1A739900000A7A062A1E027B320200042A7A02282500000A02037D3302000402289700000A6F9800000A7D340200042A1330020018000000790000111FFE730F0400060A06027D3502000406037D37020004062A133004002A0100007A000011022811020006026F6401000A2D13026F6201000A72A5220070166F6800000A2E012A026F6301000A26026FDA0100060A026FD80100060B026FD90100060C026F6401000A2C0E72AB22007006080773C50200067A026F6201000A0D0972A5220070176F6800000A33051713042B210972E1220070176F6800000A33051613042B0E72AB22007006080773C50200067A11042C6C026F6301000A26026F6401000A2C0E72AB22007006080773C50200067A026F6201000A72E7220070166F6800000A33D0026F6301000A26026F6401000A2C0E72AB22007006080773C50200067A026F6201000A72E7220070176F6800000A33A0026F6301000A263801FFFFFF026F6301000A26026F6201000A0D026F6401000A3AE8FEFFFF1F0D093BE0FEFFFF1F0A0933DA38D6FEFFFF7E2B07026F6301000A26026F6401000A2D0D026F6201000A284C0300062DE42A00001B300400A20200007B000011026FDA010006176A580A026FD90100060B026FD80100060C026F6101000A026F6201000A0D161304091F2B3316026F6301000A26026F6201000A0D026F6101000A2B16091F2D3311026F6301000A26026F6201000A0D17130409284F0300062D1C091F2E2E17026FDB01000626142A026F6301000A26026F6201000A0D026F6401000A2D0809284F0300062DE2161305026F6401000A2D48091F2E3343026F6301000A26026F6201000A0D2B11026F6301000A26026F6201000A0D171305026F6401000A2D0809284F0300062DDF11052D0E72ED22007006070873C50200067A026FC301000A130611052C0611061759130611042C061106175913061106172F0E72ED22007006070873C50200067A161307026F6401000A2D6D091F652E05091F453363026F6301000A26026F6201000A0D026F6401000A2D05091F2D2E05091F2B3321026F6301000A26026F6201000A0D2B11026F6301000A26026F6201000A0D171307026F6401000A2D0809284F0300062DDF11072D0E72ED22007006070873C50200067A026F6401000A2D1609284E0300062C0E72ED22007006070873C50200067A026FDB010006130811053ABD00000011073AB600000011061F133CAD0000001673C401000A130911081D288700000A28C501000A1309DE0F2672ED22007006070873C50200067A1109200000008073C401000A28C601000A2C25110920FFFFFF7F73C401000A28C701000A2C12110928C801000A8C5000000128880000062A110921000000000000008073C901000A28C601000A2C29110921FFFFFFFFFFFFFF7F73C901000A28C701000A2C12110928CA01000A8C5600000128880000062A11098C2200000128880000062A110820A7000000288700000A28CB01000A130ADE0F2672ED22007006070873C50200067A110A8C5200000128880000062A0000011C00000000CC0111DD010F2A000001000071021586020F2A0000011B300400900200007C000011026FDA010006176A580A026FD90100060B026FD80100060C026F6201000A0D026F6301000A26026F6201000A1304026F6101000A1F2073CC01000A1305026F6401000A2D0F1104284D0300062C1411041F092E0E721523007006070873C50200067A11040933170211056FDC010006026F6301000A2611056F5600000A2A11041F5C2E11026F6301000A26026F6201000A13042BA80211056FDC010006026F6301000A26026F6201000A1304026F6401000A2D0F1104284D0300062C1411041F092E0E721523007006070873C50200067A1104130A110A1F623011110A1F302E36110A1F622E443880010000110A1F662E56110A1F6E2E6E110A1F72594504000000720000005A01000090000000AE0000003855010000026F6301000A26026F6201000A1304385A01000011051E6F7000000A26026F6301000A26026F6201000A1304383D01000011051F0C6F7000000A26026F6301000A26026F6201000A1304381F01000011051F0A6F7000000A26026F6301000A26026F6201000A1304380101000011051F0D6F7000000A26026F6301000A26026F6201000A130438E300000011051F096F7000000A26026F6301000A26026F6201000A130438C5000000026F6301000A26026F6201000A13047E2D00000A13061A13072B25110611048C62000001286901000A1306026F6301000A26026F6201000A1304110717591307026F6401000A2D0E110428500300062C0511071630C516130817130911062000020000288700000A28CD01000A1308DE0626161309DE0011066F6700000A1A331511092C111105110828540300066FCE01000A262B2F11051F756F7000000A26110511066FCE01000A262B19110511046F7000000A26026F6301000A26026F6201000A1304026F6101000A38ADFDFFFF0110000000001C02153102062A00000113300200E60000002100001105185403250A39A200000006720308007028EC00000A2D4306720F08007028EC00000A2D410672F907007028EC00000A2D3F06720F0D007028EC00000A2D3D0672170D007028EC00000A2D3B06724723007028EC00000A2D492B52042C02142A7E540000042A042C02142A7E550000042A042C02142A7E530000042A042C02142A7E580000042A042C05041F2B33067E590000042A041F2D33067E5A0000042A142A042C02142A7E530000042A042C0E04286601000A03285800000A1001022810020006026F6201000A1F3A3316026F6301000A2605165403737902000628870000062A142A000013300200450000007E000011160A026F6101000A026F6201000A0B062C0807284F0300062D1207284E0300062D0A071F5F2E05071F243312170A026F6301000A26026F6201000A0B2BCA026FDB0100062A4A020373EF010006280F02000673CE00000A2A4A020373DD010006280F02000673CE00000A2A3A02176F1902000602287500000A2A3E032C0B027B050100046F1300000A2A4A027EDD0000047D0501000402282500000A2A1E0228C201000A2A3A0228C201000A02037D0A0100042A1E027B0A0100042A2202037D0A0100042A1E02282500000A2A1E027B0E0100042A2202037D0E0100042A000013300200480000007F000011289700000A6F9800000A027B440200043315027B430200041FFE330B02167D43020004020A2B131673170400060A06027B450200047D4502000406027B470200047D46020004062A1E0228100400062A1B3004007607000080000011027B430200040B07451100000005000000C3000000EE0000008D01000000020000AE0200000203000018070000D903000015040000450400007C040000A8040000E8040000620500009F06000003070000381307000002157D43020004027B460200042D0B728D0E0070732600000A7A02027B46020004284701000A7D480200040273580200067D4902000402027B480200046F4801000A7D4A020004387D060000027B4A0200047B4901000A0C08175945050000000500000047040000050000002F060000A4040000382A06000002167D4B02000402027B4A0200047B4901000A19FE017D4C02000402027B4A0200047B4A01000A7D4D020004027E560000047D4202000402177D43020004170ADD6006000002157D4302000402027C4D020004287F02000628880000067D4202000402187D43020004170ADD3506000002157D430200040273650200067D4E02000402027B49020004027B4D0200047B5F010004166F530200067D4F020004280901000A027B4F020004027B4D0200047B5E0100046F0A01000A2D5A027B4D0200047B5F010004288500000A2D48027B4E020004027B4D0200047B5E010004027B4D0200047B5F0100046F5E02000602177D4B020004027E570000047D4202000402197D43020004170ADD9605000002157D43020004027B4E020004027B4D0200046F5C020006027B49020004027B4E0200046F4D020006027B480200046F4B01000A2602027B480200046F4801000A7D4A0200043876010000027B4B0200042D2702177D4B020004027E570000047D42020004021A7D43020004170ADD2305000002157D4302000402027B4A0200047B4A01000A7D5002000402027B49020004027B500200047B5F010004166F530200067D4F020004280901000A027B4F020004027B500200047B5E0100046F0A01000A2D33027B500200047B5F010004288500000A2D21027B4E020004027B500200047B5E010004027B500200047B5F0100046F5E02000602027C50020004287F020006737902000628870000067D42020004021B7D43020004170ADD7504000002157D43020004027B480200046F\
-4B01000A2602027B480200046F4801000A7D4A020004027B4A0200047B4901000A0D091B332902027B4A0200041C6F0600002B7D42020004021C7D43020004170ADD2104000002157D430200042B26027B4A020004725B000070027B4A0200047B4901000A8C5B000002284000000A735401000A7A027B480200046F4B01000A2602027B480200046F4801000A7D4A020004027B480200046F5001000A2D11027B4A0200047B4901000A1A3B6CFEFFFF027B4B020004390C01000002027B4E0200046F630200067D53020004021D7D4302000438B800000002027B530200046F5501000A7D51020004027B5102000413041204285601000A288500000A2C270272A713007028860000067D42020004021E7D43020004170ADD4A030000021D7D430200042B3A02725B230070027B5102000413051205285601000A285800000A28860000067D42020004021F097D43020004170ADD0E030000021D7D4302000402027B5102000413061206285701000A28880000067D42020004021F0A7D43020004170ADDDE020000021D7D43020004027B530200046F9200000A3A38FFFFFF022818040006027E520000047D42020004021F0B7D43020004170ADDA702000002157D43020004027B4C0200043940020000027E510000047D42020004021F0C7D43020004170ADD7B02000002157D43020004027B490200046F4F02000626380E020000027B490200046F4B020006163121027E510000047D42020004021F0D7D43020004170ADD3B02000002157D43020004027B490200046F4F02000626027B480200046F4B01000A2602027B480200046F4801000A7D4A02000438B1010000027B4A0200047B5101000A750D00001B2D12027B4A0200047B5101000A751B00001B2C4A02027B4A0200041C6F0600002B7D42020004021F0E7D43020004170ADDC101000002157D43020004027B480200046F4B01000A2602027B480200046F4801000A7D4A020004384301000002027B4A0200046F5301000A7D52020004027B480200046F4B01000A2602027B480200046F4801000A7D4A0200042B3902027B52020004027B4A0200046F5301000A285800000A7D52020004027B480200046F4B01000A2602027B480200046F4801000A7D4A020004027B480200046F5001000A2D32027B4A0200047B4901000A1B3324027B4A0200047B5101000A750D00001B2D12027B4A0200047B5101000A751B00001B2C88027B450200046F200200061307110745030000001F0000002C000000020000002B2A027E0D010004027B5202000472B30700706FD001000A7D520200042B0D027B52020004284B0300062D4F02027B5202000428880000067D42020004021F0F7D43020004170ADD8400000002157D430200042B26027B4A020004725B000070027B4A0200047B4901000A8C5B000002284000000A735401000A7A027B480200046F5001000A3973F9FFFF2B2A027B490200046F4F02000626027E510000047D42020004021F107D43020004170ADE2002157D43020004027B490200046F4B0200061630C8160ADE07022815040006DC062A0000411C000004000000000000006D0700006D07000007000000000000001E027B420200042A1A739900000A7A001B3002002A0000001A000011027B430200040A061D594504000000010000000100000001000000010000002ADE07022818040006DC2A0000011000000200200002220007000000001E027B420200042A7A02282500000A02037D4302000402289700000A6F9800000A7D440200042A6E02157D43020004027B530200042C0B027B530200046F1300000A2A0013300200180000007F0000111FFE73170400060A06027D4502000406037D47020004062A5672692300702008030000736900000A800D0100042A1E02282500000A2A1E02282500000A2A0000133002004800000081000011289700000A6F9800000A027B560200043315027B550200041FFE330B02167D55020004020A2B131673200400060A06027B5C0200047D5C02000406027B580200047D57020004062A1E0228190400062A133003005603000033000011027B550200040A06450600000005000000270100007C010000CB01000092020000D3020000382A03000002157D55020004027B570200042D0B728D0E0070732600000A7A02027B57020004283A00000A7D5902000402027B590200046F3C00000A7D5A02000438D9020000027B5A0200047B3F00000A0B071959450400000005000000140200008F0200004E020000388A020000027B590200046F4100000A2602027B590200046F3C00000A7D5A020004027B5A0200047B3F00000A1C2E11027B5A0200047271230070733E00000A7A027B5A0200047B4B00000A75630000022C1802027B5A0200047B4B00000AA5630000027D5B0200042B1B027C5B020004027B5A0200046F4E00000A73790200068163000002027B590200046F4100000A2602027B590200046F3C00000A7D5A02000402027B5B02000428450200067D5402000402177D55020004172A02157D55020004027B5A0200047B3F00000A1740E0010000027B590200046F4100000A2602027B590200046F3C00000A7D5A02000438B600000002027B5A0200041A6F0400002B7D5402000402187D55020004172A02157D55020004027B590200046F4100000A2602027B590200046F3C00000A7D5A020004027B5A0200047B3F00000A0C081C332402027B5A0200041B6F0400002B7D5402000402197D55020004172A02157D550200042B26027B5A02000472A1230070027B5A0200047B3F00000A8C20000002284000000A733E00000A7A027B590200046F4100000A2602027B590200046F3C00000A7D5A020004027B5A0200047B3F00000A1B3B39FFFFFF027B5A0200047B3F00000A182E26027B5A02000472E9230070027B5A0200047B3F00000A8C20000002284000000A733E00000A7A027B590200046F4100000A2602027B590200046F3C00000A7D5A02000438A1000000027E410100047D54020004021A7D55020004172A02157D55020004027B590200046F4100000A2602027B590200046F3C00000A7D5A0200042B6702027B5A0200041B6F0400002B7D54020004021B7D55020004172A02157D55020004027B590200046F4100000A2602027B590200046F3C00000A7D5A0200042B26027B5A020004725B000070027B5A0200047B3F00000A8C20000002284000000A733E00000A7A027B590200046F3B00000A3917FDFFFF162A1E027B540200042A1A739900000A7A062A1E027B540200042A7A02282500000A02037D5502000402289700000A6F9800000A7D560200042A00001330020018000000810000111FFE73200400060A06027D5C02000406037D58020004062A1E02282500000A2A133002004500000082000011036FD301000A2D03142B06036FD401000A0A036FD501000A2D03142B06036FD601000A0B062C1C066FD701000A2C14042D0F072C0A076FD701000A16FE012A172A162A172A46036FD801000A2C07036FD901000A2A172A0A142A0A142A0A032A1E02282500000A2A4E020304282D0200062D0703280700002B2A172A4A0203282E0200062D0703280700002B2A172A1E02282500000A2A62168C53000001027B5D020004036F6A000006288501000A2A36027B5E02000404288501000A2AA2027B5E02000404288501000A2D18168C53000001027B5D020004036F6A000006288501000A2A172A0013300300D30000008300001114130414130573210400061306036FDA01000A252D0726036FDB01000A0A03280800002B0B1106147D5D020004072C3E076F1D020006288500000A2D3106076F1D0200061F746FDC01000A0C082C1F086FDD01000AD053000001282B00000A330D11060828910300067D5D02000403280900002B0D092D2111067B5D0200042D02142A11042D0F1106FE06220400067311030006130411042A1106096FDE01000A7D5E02000411067B5D0200042D1611052D0F1106FE06230400067311030006130511052A1106FE062404000673110300062A00133002004800000084000011289700000A6F9800000A027B610200043315027B600200041FFE330B02167D60020004020A2B1316732C0400060A06027B650200047D6502000406027B630200047D62020004062A1E0228250400062A133002006C0000001A000011027B600200040A064502000000020000004E0000002B5302157D6002000402027B62020004280A00002B7D64020004027B640200042C33027B640200046F050200062C2602027B640200046F0502000673790200067D5F02000402177D60020004172A02157D60020004162A1E027B5F0200042A1A739900000A7A062A32027B5F0200048C630000022A7A02282500000A02037D6002000402289700000A6F9800000A7D610200042A0000001330020018000000840000111FFE732C0400060A06027D6502000406037D63020004062A1E0228320200062A1E02282500000A2A7202282500000A0203283B0200060204283D0200060205283F0200062A1E027B170100042A2202037D170100042A1E027B180100042A2202037D180100042A1E027B190100042A2202037D190100042AD6041F3C6F1101000A0402283A0200066F0701000A0402283E0200066F0701000A0402283C0200066F0701000A041F3E6F1101000A2A7202282500000A02037DE001000A02047DE101000A02057DE201000A2A1E027BE001000A2A1E027BE101000A2A1E027BE201000A2A00133002007300000085000011736F00000A0A06722F2400706FCE01000A2606027BE001000A8C2F00001B6FE301000A260672452400706FCE01000A2606027BE101000A8C4B00001B6FE301000A260672572400706FCE01000A2606027BE201000A8C7600001B6FE301000A2606726D2400706FCE01000A26066F5600000A2A0013300300530000008600001103757500001B0A062C4728E401000A027BE001000A067BE001000A6FE501000A2C2F28E601000A027BE101000A067BE101000A6FE701000A2C1728E801000A027BE201000A067BE201000A6FE901000A2A162A0013300300530000001A00001120D589EDF80A20295555A5065A28E401000A027BE001000A6FEA01000A580A20295555A5065A28E601000A027BE101000A6FEB01000A580A20295555A5065A28E801000A027BE201000A6FEC01000A580A062A0013300300550000006800001102283A02000602283C02000602283E02000673ED01000A261B8D010000010A06161F3C8C62000001A2061702283A020006A2061802283E020006A2061902283C020006A2061A1F3E8C62000001A206287901000A2A0000001330030055000000870000110375590000020A062D02162A280901000A02283A020006066F3A0200066F0A01000A2C2F280901000A02283C020006066F3C0200066F0A01000A2C17280901000A02283E020006066F3E0200066F0A01000A2A162A00000013300300510000001A00001120D589EDF80A20295555A5065A280901000A02283A0200066F0B01000A580A20295555A5065A280901000A02283C0200066F0B01000A580A20295555A5065A280901000A02283E0200066F0B01000A582A3E1B020304733902000673EE01000A2A22170273EF01000A2A22190273EF01000A2A221A0273EF01000A2A221B0273EE01000A2A5E1673F001000A80400100041873F001000A80410100042A1E02282500000A2A32027B490100046FF101000A2A3E027B490100046FF101000A16FE022A6E032D0B7273240070732600000A7A027B49010004036FF201000A2A000013300200210000001A000011027B490100046FF101000A17590A06162F02142A027B49010004066FF301000A2A000000133002002F00000088000011027B490100046FF101000A17590A06162F02142A027B49010004066FF301000A0B027B49010004066FF401000A072A1E02282500000A2A3603027B690200046F5F0200062A000000133003002B0000008900001173340400060A06037D69020004027B4901000406FE063504000673F501000A6FF601000A16FE0416FE012A1E02282500000A2A3603027B6A0200046F600200062A000000133003002B0000008A00001173360400060A06037D6A020004027B4901000406FE063704000673F501000A6FF601000A16FE0416FE012A1E02282500000A2A3603027B6B0200046F5F0200062A32027E2D00000A6F5F0200062A000013300300A10000008B00001173380400060C08037D6B020004087B6B0200042D0B087E2D00000A7D6B020004027B4901000408FE063904000673F501000A6FF701000A0A062D4F087B6B020004288500000A2D42042C16727F240070087B6B020004284000000A73B500000A7A027B490100047E4B0100042D1114FE065902000673F501000A804B0100047E4B0100046FF701000A0A062C1206087B6B02000412016F610200062C02072A142A1E02282500000A2A3603027B6C0200046F600200062A32027E2D00000A6F600200062A13300300A10000008C000011733A0400060C08037D6C020004087B6C0200042D0B087E2D00000A7D6C020004027B4901000408FE063B04000673F501000A6FF701000A0A062D4F087B6C020004288500000A2D42042C16727F240070087B6C020004284000000A73B500000A7A027B490100047E4C0100042D1114FE065A02000673F501000A804C0100047E4C0100046FF701000A0A062C1206087B6C02000412016F620200062C02072A142A1E02282500000A2A4A036F5B020006027B6D02000428850200062A133003002D0000008D000011733C0400060B07037D6D020004027B4901000407FE063D04000673F501000A6FF601000A0A0616FE0416FE012A32027B490100046FF801000A2A0000133003002A0000002100001102041628530200060A062D1C04288500000A2D1403288500000A2C0A020428570200060A2B02030A062A0000133004002F0000004500001103287E0200060A06252D23261F718C6200000102257B4A0100041758250B7D4A010004078C50000001286901000A2A4A0273F901000A7D4901000402282500000A2A1E027B4E0100042A2202037D4E0100042A00133003001C00000021000011027B4D0100042C10027B4D0100040312006FFA01000A2D02142A062A9A027B4D0100042D1002280901000A73FB01000A7D4D010004027B4D01000403046FFC01000A2A5E027B4D0100042C0D027B4D010004036FFD01000A2A162A5E027B4D0100042C0D027B4D010004036FFE01000A2A162A6E041451027B4D0100042C0E027B4D01000403046FFA01000A2A162A0013300300350000001A000011041451027B4D0100042D02162A027B4D010004036FFF01000A0A06162F02162A04027B4D0100046F0002000A066F0102000A51172A0000001B3002009D00000030000011027B6F0200040B07450300000002000000770000005D0000002B7502157D6F020004027B700200047B4D0100042C6102027B700200047B4D0100046F0202000A7D7202000402177D6F0200042B2F02027B720200046F5501000A7D7102000402027B710200047D6E02000402187D6F020004170ADE2502177D6F020004027B720200046F9200000A2DC4022844040006160ADE07022841040006DC062A000000011000000400000094940007000000001E027B6E0200042A1A739900000A7A001B300200220000001A000011027B6F0200040A061759450200000001000000010000002ADE07022844040006DC2A00000110000002001800021A00070000000032027B6E0200048C5D00001B2A3A02282500000A02037D6F0200042A6E02157D6F020004027B720200042C0B027B720200046F1300000A2A13300200100000008E0000111673430400060A06027D70020004062A1E0228630200062A1E02282500000A2A13300200480000008F000011289700000A6F9800000A027B750200043315027B740200041FFE330B02167D74020004020A2B0716734C0400060A06027B770200047D7602000406027B790200047D78020004062A1E0228450400062A1B300300F300000030000011027B740200040B07450400000005000000C900000073000000C200000038C400000002157D7402000402027B760200041F2C28680200066F0D01000A7D7C02000402177D740200042B4D02027B7C0200046F0E01000A7D7B02000402027B7B02000428670200067D7A020004027B7A020004288500000A2D1E02027B7A0200047D7302000402187D74020004170ADE6102177D74020004027B7C0200046F9200000A2DA602284D04000602027B7802000428670200067D7A020004027B7A020004288500000A2D1E02027B7A0200047D7302000402197D74020004170ADE1202157D74020004160ADE0702284A040006DC062A000110000004000000EAEA0007000000001E027B730200042A1A739900000A7A001B300200220000001A000011027B740200040A061759450200000001000000010000002ADE0702284D040006DC2A00000110000002001800021A0007000000001E027B730200042A7A02282500000A02037D7402000402289700000A6F9800000A7D750200042A6E02157D74020004027B7C0200042C0B027B7C0200046F1300000A2A0013300200180000008F0000111FFE734C0400060A06027D7702000406037D79020004062A1B3002003700000090000011021F3B28680200066F0D01000A0C2B0B086F0E01000A0A060BDE1A086F9200000A2DEDDE0A082C06086F1300000ADC7E2D00000A2A072A000110000002000E001725000A00000000133002004800000091000011289700000A6F9800000A027B7F0200043315027B7E0200041FFE330B02167D7E020004020A2B071673550400060A06027B810200047D8002000406027B830200047D82020004062A1E02284E0400062A13300500040100001A000011027B7E0200040A06450200000005000000BE00000038E800000002157D7E020004027B80020004288500000A3AD100000002027B800200046F6700000A7D8402000402167D8502000402167D86020004389300000002027B80020004027B82020004027B850200046F0302000A7D86020004027B86020004162F0C02027B840200047D8602000402027B80020004027B85020004027B86020004027B85020004596F8600000A6F0402000A7D87020004027B870200046F6700000A16311C02027B870200047D7D02000402177D7E020004172A02157D7E02000402027B8602000417587D85020004027B85020004027B840200042F0C027B86020004163C53FFFFFF162A1E027B7D0200042A1A739900000A7A062A1E027B7D0200042A7A02282500000A02037D7E02000402289700000A6F9800000A7D7F0200042A1330020018000000910000111FFE73550400060A06027D8102000406037D83020004062A5602288500000A2C067E2D00000A2A02280502000A2A26020314286B0200062A7A0228320200060204252D06267E2D00000A7D5001000402037D510100042A00133002004800000092000011289700000A6F9800000A027B8A0200043315027B890200041FFE330B02167D89020004020A2B1316735D0400060A06027B8B0200047D8B02000406027B8D0200047D8C020004062A1E0228560400062A13300500A901000093000011027B890200041304110445020000000500000089010000388B01000002157D8902000402027B8B020004027B8C0200046F0602000A6F6D0200067D8E020004027B8B0200047B510100043927010000160A027B8E0200048E690B3810010000027B8B0200047B5101000413051105175945040000000500000059000000BA000000D100000038E1000000027B8E020004069A0C086F6700000A173013027B8E02000406086F0702000AA238BC000000027B8E0200040608166F6800000A280802000A8C6200000108176F0902000A6F0A02000A286901000AA2388D000000027B8E020004069A0D062D10027B8E02000406096F0A02000AA22B71096F6700000A173010027B8E02000406096F0702000AA22B58027B8E0200040609166F6800000A280802000A8C6200000109176F0902000A6F0A02000A286901000AA22B2C027B8E02000406027B8E020004069A6F0A02000AA22B15027B8E02000406027B8E020004069A6F0702000AA20617580A06073FE9FEFFFF02027B8B0200047B50010004027B8E020004282601000A73790200067D8802000402177D89020004172A02157D89020004162A1E027B880200042A1A739900000A7A1330000001000000940000112A32027B880200048C630000022A7A02282500000A02037D8902000402289700000A6F9800000A7D8A0200042A0000001330020018000000920000111FFE735D0400060A06027D8B02000406037D8D020004062A13300500E00000009500001103288500000A2C07168D4A0000012A1B730B02000A0A170B160C036F6700000A0D1613042B7F031104280C02000A2D1F1104083111060308110408596F8600000A6F3701000A110417580C170B2B50031104280D02000A1305072C2511052C3908110417592F320603081104085917596F8600000A6F3701000A110417590C2B1811052D14060308110408596F8600000A6F3701000A11040C110516FE010B1104175813041104093F79FFFFFF09085917591306110617330E03086F6800000A280E02000A2D05110617310D0603086F0902000A6F3701000A066F0F02000A2AC602282500000A032D0B727D040070732600000A26042D0B72B5240070732600000A2602037D1002000A02047D1102000A2A32027B1002000A6FC000000A2A32027B1002000A6FBF00000A2A32027B1002000A6FBE00000A2A000000133002001A00000096000011027B1002000A036FB600000A0A027B1102000A066F1202000A2A0000133002001A00000096000011027B1002000A036FBA00000A0A027B1102000A066F1202000A2A1A738801000A7AC602282500000A032D0B7275070070732600000A26042D0B72B5240070732600000A2602037D1302000A02047D1402000A2A00133003001B00000097000011027B1402000A036F1202000A0A027B1302000A06046F1502000A2A00133002001A00000097000011027B1402000A036F1202000A0A027B1302000A066F1602000A2A360203287D02000628790200062A2E0203141416287B0200062A2E0203040516287B0200062A033002006000000000000000032D0B72CD240070732600000A7A042D077E2D00000A100205288500000A2C097E2D00000A10032B190517281702000A2D1072E12400707237250070737E00000A7A02037D5D01000402047D5E01000402057D5F010004020E047D600100042A2A027B5D01000414FE012A00133004005E0100009800001102D001000001282B00000A330314100002285B00000A0D0945130000000200000062000000020000000800000014000000380000000E00000026000000440000002C0000004A00000032000000500000003E000000200000001A0000005C00000062000000560000002B60722F1300702A72630900702A72512500702A726B2500702A72752500702A729F0900702A72910A00702A721B0A00702A72370A00702A72730900702A72E10900702A72852500702A72A12500702A72B92500702A72D32500702A72E12500702AD02E000001282B00000A026F1802000A2D0E027EB4010004166F1902000A2C06722F1300702A026F1A02000A2D12D006000001282B00000A026F1802000A2C0672F32500702A026F1B02000A0A062C1E026F0602000A72FF25007016284500000A6F1C02000A2C06722F1300702A026F0602000A0B062D03152B08071F606F1D02000A0C081632090716086F8600000A0B072A000013300400E90000004500001102250A39DF000000FE137E180200042D6D1E730401000A25722526007016280501000A25726F26007017280501000A2572B126007018280501000A25720527007019280501000A2572412700701A280501000A25727B2700701B280501000A2572B32700701C280501000A2572F52700701D280501000AFE138018020004FE137E18020004061201280601000A2C5807450800000002000000080000000E000000140000001A00000020000000260000002C0000002B3072432800702A724B2800702A72512800702A72A71300702A721D0F00702A72592800702A72632800702A72692800702A142A000000133003004A00000021000011027B5E010004288500000A2C07027B5D0100042A027B5E0100040A06288500000A2C15027B5F010004287E020006252D062672712800700A067279280070027B5D010004280201000A2AC2027B5F010004288500000A2C07027B5D0100042A727D280070027B5F0100047281280070027B5D010004281E02000A2A6E027B5E010004288500000A2C070228800200062A02287F0200062A5E0375630000022D02162A0203A56300000228830200062A00033003004C00000000000000280901000A027B5F0100040F017B5F0100046F0A01000A2C31280901000A027B5E0100040F017B5E0100046F0A01000A2C18280901000A027B5D0100040F017B5D0100046F0A01000A2A162A133004006E0000001A00001120264B29360A20295555A5065A280901000A027B5D010004252D06267E2D00000A6F0B01000A580A20295555A5065A280901000A027B5E010004252D06267E2D00000A6F0B01000A580A20295555A5065A280901000A027B5F010004252D06267E2D00000A6F0B01000A580A062A92028C6300000214287C01000A2C0D038C6300000214287C01000A2A0F000328830200062A2E0203288502000616FE012A0013300300350000001A000011280901000A027B5F0100040F017B5F0100046F1F02000A0A062C02062A280901000A027B5D0100040F017B5D0100046F1F02000A2A327F5C010004FE15630000022A1E02282002000A2A22020328B500000A2A26020304282102000A2A26020304282202000A2A3A02288902000602037D610100042A3E0204288A02000602037D610100042A42020405288B02000602037D610100042A26020304288C0200062A1E027B610100042A8A02282500000A03172F10728528007072C9280070737E00000A7A02037D660100042A8202257B6701000417587D67010004027B67010004027B66010004FE0416FE012A3E02257B6701000417597D670100042A00000013300500A600000099000011032C100375040000012D0803754A0000012C02162A027B6C01000417590A2B16027B6B010004069A03287C01000A2C02172A0617590A06162FE6027B6C010004027B6B0100048E693241027B6B0100048E692C0C18027B6B0100048E695A2B011A8D010000010B027B6C010004163114027B6B010004160716027B6C010004288101000A02077D6B010004027B6B01000402257B6C010004250C17587D6C0100040803A2162A000013300600790000001A000011032C100375040000012D0803754A0000012C012A027B6C01000417590A2B55027B6B010004069A03287C01000A2C41061758027B6C0100043318027B6B0100040614A202257B6C01000417597D6C0100042A027B6B010004061758027B6B01000406027B6C0100040659288101000A2A0617590A06162FA72A32168D01000001806A0100042A4A027E6A0100047D6B01000402282500000A2A000000133005001C0000009A000011027332020006178D3300001B0A061673D8000006A206289F0200062A3602733202000603289F0200062A360273320200060328A00200062A3A0203731D0300060428A10200062A3A0203731D0300060428A20200062A3A020304742A00001B28A20200062A\
-8E02177D6D01000402177D6E01000402282500000A02037D6F01000402047D700100042A1E027B6D0100042A2202037D6D0100042A1E027B6E0100042A2202037D6E0100042A1E027B6F0100042A1E027B700100042A1E027B6F0100042A00133005001C0000009A000011027332020006178D3300001B0A061673D8000006A20628AD0200062A360273320200060328AD0200062A360273320200060328AE0200062A3A0203731D0300060428AF0200062A3A0203731D0300060428B00200062A3A020304742A00001B28B00200062A0000000330020041000000000000000272DB2800707D7301000402282302000A7D750100040272890000707D780100040272890000707D7901000402282500000A02037D7601000402047D770100042A1E027B720100042A2202037D720100042A1E027B740100042A2202037D740100042A1E027B710100042A2202037D710100042A1E027B730100042A2202037D730100042A1E027B750100042A2202037D750100042A1E027B760100042A1E027B770100042A1E027B780100042A2202037D780100042A1E027B790100042A2202037D790100042A1E027B7A0100042A2202037D7A0100042A1E027B760100042A2E020304151528C50200062AD202157D7B01000402157D7C01000402156A7D7D0100040203288A020006020E047D7B01000402057D7C01000402047D7D0100042A3202030415150528C70200062ADA02157D7B01000402157D7C01000402156A7D7D01000402030E05288B020006020E047D7B01000402057D7C01000402047D7D0100042A7E02157D7B01000402157D7C01000402156A7D7D010004020304288C0200062A1E027B7B0100042A1E027B7D0100042A1E027B7C0100042A0000133003004D00000030000011032D06732402000A7A051754041754160A027B7D01000469036F6700000A282502000A0B2B22062D0605254A175854030717596F6800000A1F0A330804254A175854170A0717590B071630DA2A3A02288902000602037D2602000A2A3E0204288A02000602037D2602000A2A42020405288B02000602037D2602000A2A26020304288C0200062A1E027B2602000A2A1E02282702000A2A220203280001000A2A26020304282802000A2A26020304282902000A2A1B3003008A0000009B00001102282A02000A732B02000A7D7F01000402282500000A032C70036F2C02000A0C2B53086F2D02000A0A066F8A0000066F0D01000A0D2B2A096F0E01000A0B07288500000A2D1B027B7F010004076F2E02000A2D0D027B7F01000407066F2F02000A096F9200000A2DCEDE0A092C06096F1300000ADC086F9200000A2DA5DE0A082C06086F1300000ADC2A0000011C000002003500366B000A00000000020020005F7F000A00000000133003001B0000009C0000110328670200060A027B7F0100040612016F3002000A2C02072A142A001B300300140100009D00001102282A02000A733102000A7D8101000402282A02000A733102000A7D8201000402282500000A0339E7000000036F3202000A130438C000000011046F3302000A0A027B800100042D0702067D80010004066FE00000066F0D01000A13052B2B11056F0E01000A0B07288500000A2D1B027B82010004076F3402000A2D0D027B8201000407066F3502000A11056F9200000A2DCCDE0C11052C0711056F1300000ADC066FE10000066F0D01000A13062B3211066F0E01000A0C08288500000A2D22027B81010004086F3402000A2D140828690200060D027B8101000409066F3502000A11066F9200000A2DC5DE0C11062C0711066F1300000ADC11046F9200000A3A34FFFFFFDE0C11042C0711046F1300000ADC2A0128000002005D003895000C000000000200AE003FED000C0000000002003400D307010C000000001E027B800100042A133003001C0000009E0000110328690200061001027B810100040312006F3602000A2C02062A142A1B300300420000009F000011030428660200066F0D01000A0D2B1B096F0E01000A0B027B820100040712006F3602000A2C04060CDE16096F9200000A2DDDDE0A092C06096F1300000ADC142A082A00000110000002000D002734000A000000001E027B830100042A2202037D830100042A1E027B840100042A2202037D840100042A1E027B850100042A2202037D850100042A1E027B860100042A2202037D860100042A1E027B870100042A2202037D870100042A620228E00200062D02162A0228E002000603046FF10200062A5E0228E20200062D02162A0228E2020006036FF50200062A5E0228E40200062D02142A0228E4020006036FF90200062A5E0228E60200062D02142A0228E6020006036FFD0200062A5E0228E80200062D02032A0228E8020006036F010300062A1E02282500000A2A360203748C00001B28050300062A1B3002004E000000A000001102282500000A032D0B72DF280070732600000A7A036F3702000A0A2B15066F3802000A26032D0B72DF280070732600000A7A066F9200000A2DE3DE0A062C06066F1300000ADC02037D880100042A00000110000002001B00213C000A000000001B3003003B000000A1000011027B880100046F3702000A0C2B15086F3802000A0A0603046F280200062C04170BDE16086F9200000A2DE3DE0A082C06086F1300000ADC162A072A000110000002000C00212D000A000000001B3002003A000000A1000011027B880100046F3702000A0C2B14086F3802000A0A06036F290200062C04170BDE16086F9200000A2DE4DE0A082C06086F1300000ADC162A072A00000110000002000C00202C000A000000001E02282500000A2A1B30030041000000A2000011027B8F0200046F3902000A0C2B161202283A02000A0A0603046F120300062C04170BDE1B1202283B02000A2DE1DE0E1202FE168F00001B6F1300000ADC162A072A0000000110000002000C00232F000E000000001B3002008E000000A3000011735E0400060C08733C02000A7D8F020004027B880100046F3702000A13042B1F11046F3802000A0A06036F2A0200060B072C0C087B8F020004076F3D02000A11046F9200000A2DD8DE0C11042C0711046F1300000ADC087B8F0200046F3E02000A172F02142A087B8F0200046F3E02000A17330D087B8F020004166F3F02000A2A08FE065F04000673110300062A00000110000002001E002C4A000C000000001330020048000000A4000011289700000A6F9800000A027B920200043315027B910200041FFE330B02167D91020004020A2B131673670400060A06027B930200047D9302000406027B950200047D94020004062A1E0228600400062A1B300300EB000000A5000011027B910200040B07162E0C07193B9C00000038C700000002157D9102000402027B930200047B880100046F3702000A7D9802000402177D91020004388800000002027B980200046F3802000A7D9602000402027B96020004027B940200046F2B0200066FE700000A7D9902000402187D910200042B3F02027B990200046FE800000A7D97020004027B970200040C1202287C0200062D1E02027B970200047D9002000402197D91020004170ADE3B02187D91020004027B990200046F9200000A2DB4022869040006027B980200046F9200000A3A68FFFFFF022868040006160ADE07022865040006DC062A000110000004000000E2E20007000000001E027B900200042A1A739900000A7A001B30020048000000A6000011027B910200040A06175945030000000100000001000000010000002A027B910200040B071859450200000002000000020000002B09DE07022869040006DCDE07022868040006DC2A011C000002003500023700070000000002001C00244000070000000032027B900200048C630000022A7A02282500000A02037D9102000402289700000A6F9800000A7D920200042A6E02157D91020004027B980200042C0B027B980200046F1300000A2A6E02177D91020004027B990200042C0B027B990200046F1300000A2A1330020018000000A40000111FFE73670400060A06027D9302000406037D95020004062A1B30020039000000A7000011027B880100046F3702000A0B2B15076F3802000A0A06036F2C020006252D0226031001076F9200000A2DE3DE0A072C06076F1300000ADC032A0000000110000002000C00212D000A0000000013300400D9000000A8000011D001000001282B00000A6F3300000A6F2800000A178D6200000113041104161F2C9D11046F0301000A0A061672F5280070A2722F29007006282601000A284002000A0B0772332900706F4102000A808D0100040772992900706F4102000A808E0100040772FB2900706F4102000A808F0100047E8D0100042C3A7E8D01000472692A00701F546FDC01000A0C08289103000680900100047E8D01000472732A00701F546FDC01000A0C08289103000680910100047E8E0100042C1D7E8E01000472692A00701F546FDC01000A0D09289103000680920100042A0000001330030042000000A9000011036FDA01000A252D0726036FDB01000A0A067E8D01000428460300062C1B037E8E01000428460300062C0C037E8F01000428460300062A172A020304282D0200062A00001330020041000000A9000011036FDA01000A252D0726036FDB01000A0A067E8D01000428460300062C1B037E8E01000428460300062C0C037E8F01000428460300062A172A0203282E0200062A0A142A1330020048000000AA000011289700000A6F9800000A027B9C0200043315027B9B0200041FFE330B02167D9B020004020A2B131673710400060A06027BA30200047DA302000406027B9E0200047D9D020004062A1E02286A0400062A133004007A0100001A000011027B9B0200040A06450300000005000000A400000058010000385A01000002157D9B020004027B9D020004751C000001399400000002027B9D0200047E8D01000428480300067DA1020004027BA10200043922010000027E90010004027BA10200046F6A000006744A0000017D9F020004027E91010004027BA10200046F6A000006744A0000017DA0020004027B9F020004288500000A3ADC00000002027B9F02000414027BA0020004737A0200067D9A02000402177D9B020004172A02157D9B02000438AF00000002027B9D0200046FDB01000A7E8D01000428480300067DA1020004027BA10200043989000000027E91010004027BA10200046F6A000006744A0000017DA002000402027B9D0200047E8E01000428480300067DA2020004027BA20200042C50027E92010004027BA20200046F6A000006744A0000017D9F020004027B9F020004288500000A2D2802027B9F02000414027BA0020004737A0200067D9A02000402187D9B020004172A02157D9B020004162A1E027B9A0200042A1A739900000A7A062A32027B9A0200048C630000022A7A02282500000A02037D9B02000402289700000A6F9800000A7D9C0200042A001330020018000000AA0000111FFE73710400060A06027DA302000406037D9E020004062A1E0228320200062A03300200510000000000000002282500000A02037B930100047D9301000402037B960100047D9601000402037B970100047D9701000402037B980100047D9801000402037B990100047D9901000402047D9501000402177D9A0100042A000000033002005A0000000000000002282500000A032D0B72872A0070732600000A7A02047D9501000402037D9301000402036F0602000A7D9401000402036FDD01000A7D96010004020328910300067D97010004020328920300067D9801000402057D990100042A0000033002005A0000000000000002282500000A032D0B72A12A0070732600000A7A02047D9501000402037D9301000402036F0602000A7D9401000402036F4202000A7D96010004020328930300067D97010004020328940300067D9801000402057D990100042A000013300300C6010000AB00001102282500000A032D0B72B52A0070732600000A7A03281B0300062C1672BF2A0070036F4302000A284000000A734402000A7A020328970300067D9D010004D006000001282B00000A036F1802000A2D35027B9D0100042C012A031F546F4502000A0A068E6917331C06169A0B020728990300067D9D01000402076F4602000A7D9E0100042A031F546F4502000A0A02068E69734702000A7D9C01000406130916130A2B661109110A9A0C086F4602000A0D098E6917334D09169A6F4802000A13041104D04A000001282B00000A2E3511047EB2010004166F1902000A2D13D006000001282B00000A11046F1802000A2D13027B9C01000411040828990300066F4902000A110A1758130A110A11098E693292027B9D0100042D0C020328970300067D9D01000403726E2B00706F4A02000A130511052C2C11056F4602000A130611068E6917331C02110528960300067DA1010004021106169A6F4802000A7DA2010004141307037EB3010004166F1902000A130711072C10110772802B00706F4A02000A13052B0D0372802B00706F4A02000A130511052C2C11056F4602000A130811088E6917331C02110528960300067D9F010004021108169A6F4802000A7DA00100042A6A027B9C0100042D067E4B02000A2A027B9C0100046F4C02000A2A000000133003001C000000AC000011027B9C0100042C10027B9C0100040312006F4D02000A2D02142A062A66026F4E02000A2D0F026F4F02000A2D07026F5002000A2A172ABE026F4E02000A2D25026F4F02000A2D1D026F5002000A2D13021F74147E4B02000A146F5102000A14FE012A172A162A000003300200480000000000000002735202000A7DA301000402735302000A7DA401000402735402000A7DA501000402735502000A7DA601000402282500000A032D0B72882B0070732600000A7A02037DA70100042A4A027BA7010004036F2C020006252D0226032A00133003003E000000AD000011032D1B178D630000020D09168F630000020373780200068163000002092A027BA60100040312006F5602000A2C04060CDE0A0203120128240300062A082A00001330030034000000AE000011032C0D03D001000001282B00000A3302142A027BA30100040312006F5702000A2C04060BDE0C02031200282403000626062A072A1B3002004C000000AF00001102036FDB01000A28200300060A066FE400000A6FE500000A0D2B19096FE600000A0B077B9301000403288501000A2C04070CDE16096F9200000A2DDFDE0A092C06096F1300000ADC142A082A0110000002001900253E000A00000000133003002F000000B0000011032C08036FD800000A2D02142A027BA40100040312006F5802000A2C04060BDE0C02031200282503000626062A072AB6027BA60100046F5902000A027BA30100046F5A02000A027BA40100046F5B02000A027BA50100046F5C02000A2A0000001B30050095030000B1000011160A027BA7010004036F2B0200060B072C36076FE700000A13122B1511126FE800000A0C1202287C0200062D04170A2B0911126F9200000A2DE2DE0C11122C0711126F1300000ADC062D1E178D6300000213131113168F63000002037378020006816300000211130B036FD800000A2C0D0402031203282503000651072AD09D00001B282B00000A036F1802000A2D12D02E000001282B00000A036F1802000A2C2D04027BA301000403142513146F5D02000A111451027BA601000403072513156F5E02000A11151311DDC302000004735F02000A5103281C0300061304031F746F6002000A13161613173833010000111611179A130511056F6102000A8E693A18010000027BA7010004110511046F280200063A04010000027BA701000411056F2B0200061306160A11062C3811066FE700000A13182B1611186FE800000A13071207287C0200062D04170A2B0911186F9200000A2DE1DE0C11182C0711186F1300000ADC062D25178D6300000213191119168F6300000211056F0602000A7379020006816300000211191306027BA701000411056F2A020006130814130911066FE700000A131A2B5B111A6FE800000A130A120A287C0200062D490450120A7B5D0100046F6202000A2D3911092D1E0450120A7B5D0100041105110A110873160300062513096F6302000A2B170450120A7B5D0100041109110A73150300066F6302000A111A6F9200000A2D9CDE0C111A2C07111A6F1300000ADC111717581317111711168E693FC2FEFFFF031F746F6402000A131B16131C3823010000111B111C9A130B027BA7010004110B6F290200063A04010000027BA7010004110B6F2B020006130C160A110C2C38110C6FE700000A131D2B16111D6FE800000A130D120D287C0200062D04170A2B09111D6F9200000A2DE1DE0C111D2C07111D6F1300000ADC062D25178D63000002131E111E168F63000002110B6F0602000A73790200068163000002111E130C027BA7010004110B6F2A020006130E14130F110C6FE700000A131F2B5B111F6FE800000A13101210287C0200062D49045012107B5D0100046F6202000A2D39110F2D1E045012107B5D010004110B1110110E731703000625130F6F6302000A2B17045012107B5D010004110F111073150300066F6302000A111F6F9200000A2D9CDE0C111F2C07111F6F1300000ADC111C1758131C111C111B8E693FD2FEFFFF027BA30100040304506F5D02000A027BA601000403072513206F5E02000A11201311DE0011112A0000000140000002001A00223C000C0000000002003701235A010C000000000200A9016811020C0000000002007702239A020C000000000200E9026851030C000000001B300500F5010000B2000011032C08036FD800000A2D05041451142A160A027BA7010004036F2B0200060B072C36076FE700000A130A2B15110A6FE800000A0C1202287C0200062D04170A2B09110A6F9200000A2DE2DE0C110A2C07110A6F1300000ADC062D1E178D63000002130B110B168F630000020373780200068163000002110B0B735F02000A0D04736502000A51031F586F6402000A130C16130D381E010000110C110D9A1304160A027BA701000411046F2B020006130511052C3811056FE700000A130E2B16110E6FE800000A13061206287C0200062D04170A2B09110E6F9200000A2DE1DE0C110E2C07110E6F1300000ADC062D25178D63000002130F110F168F6300000211046F0602000A73790200068163000002110F130514130711056FE700000A13102B7711106FE800000A13081208287C0200062D650912087B5D0100046F6202000A2D5611072D3C0912087B5D010004110411081473170300062513076F6302000A045011077B97010004146F6A000006740200000112087B5D0100046F6602000A2B160912087B5D0100041107110873150300066F6302000A11106F9200000A2D80DE0C11102C0711106F1300000ADC110D1758130D110D110C8E693FD7FEFFFF027BA601000403076F5E02000A027BA40100040304506F6702000A027BA301000403092513116F5D02000A11111309DE0011092A0000000128000002002A00224C000C000000000200BD0023E0000C000000000200200184A4010C000000001330040042000000B3000011032C0D03D001000001282B00000A3302142A027BA50100040312006F6802000A2C04060BDE1A0373180300060A027BA50100040306250C6F6902000A080BDE00072A6602282500000A02037D6A02000A027E5C0100047D6B02000A2A8202282500000A02037D6A02000A02047D6C02000A027E5C0100047D6B02000A2A5602282500000A02037D6A02000A02047D6B02000A2A7202282500000A02037D6A02000A02047D6B02000A02057D6C02000A2A1330020086000000B4000011736F00000A0A06729A2B00706FCE01000A2606027B6A02000A8C2F00001B6FE301000A26027B6B02000A0B1201287C0200062D1E0672A02B00706FCE01000A2606027B6B02000A8C630000026FE301000A26027B6C02000A2C190672A02B00706FCE01000A260602286D02000A6FCE01000A2606726D2400706FCE01000A26066F5600000A2A0000133002001A000000B50000110375A100001B0A0614286E02000A2C02162A0206286F02000A2A00000330030054000000000000000314286E02000A2C02162A28E401000A027B6A02000A037B6A02000A6FE501000A2C2F287002000A027B6B02000A037B6B02000A6F7102000A2C17287202000A027B6C02000A037B6C02000A6F7302000A2A162A13300300530000001A000011207EF4F0430A20295555A5065A28E401000A027B6A02000A6FEA01000A580A20295555A5065A287002000A027B6B02000A6F7402000A580A20295555A5065A287202000A027B6C02000A6F7502000A580A062A660214287C01000A2C080314287C01000A2A02036F6F02000A2A2E0203286E02000A16FE012A32027B6C02000A287602000A2A0000133003002A020000B6000011022C08026F5A00000A2B01140A062C19066FD800000A2C1102740200000172A42B00706F2501000A2A06285B00000A0D094513000000590000006A010000590000000500000038000000E10000001E000000930000001C010000AD00000036010000C700000050010000FB000000790000005F000000440000006A010000150100003865010000171304120402285000000A2D0672030800702A720F0800702A02A55900000113051205728B000070284500000A281301000A2A02A562000001286601000A2A02A5080000011306120672B506007028EE00000A2A7E2D00000A2A02A52200000113071207728B000070284500000A281401000A2A02A55200000113081208728B000070284500000A281601000A2A02A57500000113091209728B000070284500000A281701000A2A02A550000001130A120A728B000070284500000A281801000A2A02A556000001130B120B728B000070284500000A281901000A2A02A576000001130C120C728B000070284500000A281A01000A2A02A56B000001130D120D728B000070284500000A281C01000A2A02744A0000012A02A560000001130E120E728B000070284500000A281D01000A2A02A577000001130F120F728B000070284500000A281E01000A2A02A57800000113101210728B000070284500000A281F01000A2A02758F0000010B072C0C07284500000A6F7702000A2A0275900000010C082C0D0814284500000A6F7802000A2A02754A000001252D0726026F5600000A2A4E03027B6B02000A027B6C02000A737902000A2A3A02036F9B0200060428350300062A8E02282500000A032D0B72A82B0070732600000A7A02037DB601000402047DB50100042A000000133002008C000000B7000011032C2A036F5002000A2D22036F4F02000A2D1A03D001000001282B00000A2E0D03D04A000001282B00000A3306737A02000A2A0328400300061001036F4E02000A2C06737A02000A2A027BB6010004036F260300060A062C1B067B9D0100042C13067B9E0100042C11067B9E0100048E69163106737A02000A2A067B9D010004168D010000016F620000062A1B300600C6010000B80000110328400300061001027BB6010004036F260300060A062C08067B9D0100042D1672C42B0070036F4302000A284000000A73D30200067A067B9E0100042C0B067B9E0100048E69172F12067B9D010004168D010000016F620000062A067B9E0100048E698D010000010B04759D00001B0C08398E000000160D078E6913042B7B067B9E010004099A6F7B02000A1305067B9E010004099A6F4802000A1306086F7C02000A6F0D01000A130E2B33110E6F0E01000A1307282A02000A110711056F0A01000A2C1507090211060811076F7D02000A283A030006A2DE0EDE0326DE00110E6F9200000A2DC4DE0C110E2C07110E6F1300000ADC0917580D091104328038B500000004752E0000011308110839A6000000161309078E69130A3890000000067B9E01000411099A6F7B02000A130B067B9E01000411099A6F4802000A130C11086F7E02000A6F0100000A130F2B3A110F6F1200000A744A000001130D282A02000A110D110B6F0A01000A2C1707110902110C1108110D6F7F02000A283A030006A2DE0EDE0326DE00110F6F9200000A2DBDDE15110F7503000001131011102C0711106F1300000ADC1109175813091109110A3F67FFFFFF067B9D010004076F620000062A0000013400000000B50027DC0003010000010200AA0040EA000C0000000000005E01298701030100000102004E01479501150000000003300500A900000000000000032D012A03759D00001B2C1003749D00001B0E040E056F8002000A2A03752E0000012C1003742E0000010E040E056F8102000A2A042C1F047EB4010004166F1902000A2C1172632C007004284000000A73D30200067A052C4F057B980100042C470E052D29057B9801000403057B960100046F5002000A2D03142B0C057B9601000417288202000A6F6E0000062A057B980100040302057B960100040E05283A0300066F6E0000062A5E02D03500001B282B00000A03283A030006A53500001B2A0000001B300400E3020000B9000011032C0D03D001000001282B00000A3302042A0328440300060A042D2B027BB50100042D21036F5002000A2C19062D16724E2D0070036F4302000A284000000A73D30200067A042A062C12036F8302000A0B078E6917330507169A1001046F5A00000A0C03086F1802000A2C02042A036FD800000A2C6704754A0000012C480304282301000A2D31027BB6010004036F200300060D092C210904744A0000016F6202000A2C130904744A0000016F8402000A7B9401000410020304744A00000116288502000A2A0203288602000A04283A03000610020304288702000A2A04759D00001B2C0E020304749D00001B283B0300062A04752E0000012C0E020304742E000001283C0300062AD006000001282B00000A036F1802000A2C21D006000001282B00000A086F1802000A2C0F020308047406000001283D0300062A04754A000001393601000003D008000001282B00000A335F04744A000001284500000A208F000000288802000A13041204285100000A1833131204285200000A8C080000011307DD5801000011048C080000011307DD4A01000026DE0004744A000001120428DB000006390001000011048C080000012A03D019000001282B00000A331104744A000001737800000A8C190000012A03D062000001282B00000A332304744A0000016F6700000A1740BC00000004744A000001166F6800000A8C620000012A03D06C000001282B00000A331604744A000001161205288902000A398A00000011052A03D013000001282B00000A330C04744A000001738A02000A2A03D054000001282B00000A336104744A000001288B02000A288C02000A8C540000011307DE7D26DE0004744A000001288D02000A8C540000011307DE6626DE2E03D054000001282B00000A332102D056000001282B00000A04283A030006A556000001738E02000A8C540000012A0403284500000A282B01000A1307DE25130672962D0070046F5A00000A6F4302000A036F4302000A288F02000A110673D40200067A11072A000134000000005401429601032A00000100004A02196302032A00000100006602147A02032A0000010000AB0210BB02252A0000011B30040013010000BA00001102030428370300060A027BB6010004036F200300060B073A9800000006759D00001B0C082C3F046F7C02000A6F0D01000A13082B1611086F0E01000A0D080904096F7D02000A6F8002000A11086F9200000A2DE1DDB800000011082C0711086F1300000ADC06752E00000113041104399D000000046F7C0200\
-0A6F0D01000A13092B1A11096F0E01000A1305110411050411056F7D02000A6F8102000A11096F9200000A2DDDDE6911092C0711096F1300000ADC046F7C02000A6F0D01000A130A2B37110A6F0E01000A130607110612076FA800000A2C2211072C1E11077B980100042C1511077B98010004060411066F7D02000A6F6E000006110A6F9200000A2DC0DE0C110A2C07110A6F1300000ADC062A0001280000020033002659000C000000000200810027A8000C000000000200C1004405010C000000001B3004004E010000BB00001102030428370300060A027BB6010004036F200300060B073ABC00000006759D00001B0C082C57046F7E02000A6F0100000A130A2B25110A6F1200000A0D09284500000A289002000A13040811040411046F7F02000A6F8002000A110A6F9200000A2DD2DDE4000000110A7503000001130B110B2C07110B6F1300000ADC06752E0000011305110539C0000000046F7E02000A6F0100000A130C2B1A110C6F1200000A1306110511060411066F7F02000A6F8102000A110C6F9200000A2DDDDD89000000110C7503000001130D110D2C07110D6F1300000ADC046F7E02000A6F0100000A130E2B45110E6F1200000A13071107284500000A289002000A130807110812096FA800000A2C2211092C1E11097B980100042C1511097B98010004060411076F7F02000A6F6E000006110E6F9200000A2DB2DE15110E7503000001130F110F2C07110F6F1300000ADC062A000001280000020033003568001500000000020099002AC30015000000000200E50052370115000000001B300700C8010000BC0000110328400300061001036F1A02000A2C0E02036F9102000A05283F0300062A027BB6010004036F260300060A062D1672C42B0070036F4302000A284000000A73D30200067A066F190300066F9202000A13082B3611086F9302000A0B07046F1802000A2C2506076F1A030006178D01000001130911091605A211096F620000061307DD3F01000026DE0011086F9200000A2DC1DE0C11082C0711086F1300000ADC067B9D0100042D1672C42B0070036F4302000A284000000A73D30200067A067BA10100042C46067BA20100042C3E067BA2010004046F1802000A2C30067B9D010004168D010000016F620000060C067BA101000408178D01000001130A110A1605A2110A6F6600000626082A067B9F0100042C7C067BA00100042C74067B9D010004168D010000016F620000060D067BA00100041304056F0100000A130B2B2E110B6F1200000A1305067B9F01000409178D01000001130C110C160211041105283A030006A2110C6F6600000626110B6F9200000A2DC9DE15110B7503000001130D110D2C07110D6F1300000ADC092A0503284500000A282B01000A1307DE25130672962D0070056F5A00000A6F4302000A036F4302000A288F02000A110673D40200067A11072A01340000000064002286000301000001020051004394000C0000000002003E013B790115000000000000900110A001252A0000011330040044000000BD000011032C1C03D001000001282B00000A2E0F0203056F5A00000A05283D0300062A04252D0B26D001000001282B00000A056F9402000A289502000A0A0506166F9602000A062A1B30040077000000BE00001104752F0000010A062D4873A900000A0B046F0100000A13042B1611046F1200000A0C07020308283A0300066F9702000A11046F9200000A2DE1DE1511047503000001130511052C0711056F1300000ADC070A03252D0B26D001000001282B00000A066F9402000A289502000A0D0609166F9602000A092A000110000002001800233B001500000000133002000F010000BF000011026F4E02000A3902010000026F1B02000A39A9000000026F9802000A0A06D009000001282B00000A2E1A06D005000001282B00000A2E0D06D00A000001282B00000A331E026F8302000A0BD018000001282B00000A076F9902000A100038AB00000006D023000001282B00000A409B000000026F8302000A0C088E6918332C08169AD04A000001282B00000A331D08169AD001000001282B00000A330ED0A500001B282B00000A10002B62D072000001282B00000A086F9902000A10002B4E02D069000001282B00000A2E1A02D006000001282B00000A2E0D02D02F000001282B00000A330ED0A800001B282B00000A10002B1902D02E000001282B00000A330CD0A500001B282B00000A1000022A001330030063000000C0000011022D02142A140A027EB4010004166F1902000A0A062D02142A066F8302000A0B078E6918331407169AD04A000001282B00000A6F1802000A2D25D02E000001282B00000A026F1802000A2C02142A72CE2D007002284000000A730001000A7A07179A2A001330030048000000C0000011022C0D02D04A000001282B00000A3302142A026F9A02000A2C07026F9102000A2A140A027EB2010004166F1902000A0A062D02142A066F8302000A0B078E69172E02142A07169A2A1330020055000000A9000011032D19022C4D026F5002000A2C45D001000001282B00000A10002B37022D0A036F5A00000A10002B2A036F5A00000A0A02066F1802000A2D1A06026F1802000A2C050610002B0CD001000001282B00000A1000022A76026F1B02000A2C13D092000001282B00000A026F9802000AFE012A162A5A022C1102D03500001B282B00000A289B02000A2A162A42022C0B032C080203289B02000A2A162A001330020035000000C1000011022C1202D03500001B282B00000A289B02000A2D0A1200FE153500001B062A02D03500001B282B00000A289C02000AA53500001B2A66022C0C032C090203289B02000A2D02142A0203289C02000A2A1E027BB60100042AF6D005000001282B00000A6F4302000A80B2010004D00A000001282B00000A6F4302000A80B3010004D023000001282B00000A6F4302000A80B40100042A0000001330020028000000A6000011022C23160A026F6700000A0B2B1402066F6800000A284C0300062D02162A0617580A060732E8172A6A021F20FE01021F0AFE01602D0B021F0D2E06021F09FE012A172A6A021F1F3113021F7F320C02209F000000FE0216FE012A162A172A72021F613205021F7A3110021F413209021F5AFE0216FE012A162A172A42021F303209021F39FE0216FE012A162A9A021F303205021F39311A021F413205021F463110021F613209021F66FE0216FE012A162A172A52021F0A2F06021F3058D12A021F0A591F6158D12A133002002B0000002100001172890000700A2B1C021F106A5E6928510300068C6200000106286901000A0A021A64100002166A35DF062A220203289D02000A2A1B300100140000002100001102289E02000A0ADE092672931400700ADE00062A011000000000000009090009610000013202739C02000628560300062A4A02032D07739C0200062B010328A40000062AF602032D07739C0200062B010328A4000006042D0B72190B007073B000000A7A02048E698D4A0000017DB701000404027BB7010004048E69280C01000A2A0000133002003C000000C2000011289700000A6F9800000A027BA60200043315027BA50200041FFE330B02167DA5020004020A2B131673790400060A06027BA70200047DA7020004062A1E0228720400062A1B300300F900000030000011027BA50200040B07450500000005000000CB00000064000000A7000000C400000038C600000002157DA5020004027BA70200047BB70100042C7802177DA502000402027BA70200047BB70100047DA902000402167DAA0200042B3F02027BA9020004027BAA0200049A7DA802000402027BA80200047DA402000402187DA5020004170ADE7202177DA502000402027BAA02000417587DAA020004027BAA020004027BA90200048E6932B102287A0400062B3A0272A52E00707DA402000402197DA5020004170ADE2F02157DA50200040272C52E00707DA4020004021A7DA5020004170ADE1202157DA5020004160ADE07022877040006DC062A0000000110000004000000F0F00007000000001E027BA40200042A1A739900000A7A00133002001F0000001A000011027BA50200040A061759450200000001000000010000002A02287A0400062A1E027BA40200042A7A02282500000A02037DA502000402289700000A6F9800000A7DA60200042A2202157DA50200042A001330020011000000C20000111FFE73790400060A06027DA7020004062A5A73600300060228C400000A735A030006739F02000A2A9E0273580200067DBE01000402282500000A032D0B72C7020070732600000A7A02037DBF0100042A1330020048000000C3000011289700000A6F9800000A027BAD0200043315027BAC0200041FFE330B02167DAC020004020A2B131673820400060A06027BAE0200047DAE02000406027BB00200047DAF020004062A1E02287B0400062A1B300400DD00000030000011027BAC0200040B07450300000005000000B70000009000000038B200000002157DAC020004027BAF0200042D0B728D0E0070732600000A7A027BAE0200047BBE0100046F5502000602027BAF020004284701000A7DB10200042B6802027BAE020004027BB1020004176F5C0300066FC700000A7DB302000402177DAC0200042B2F02027BB30200046FC800000A7DB202000402027BB20200047DAB02000402187DAC020004170ADE3202177DAC020004027BB30200046F9200000A2DC4022883040006027BB10200046F5001000A2C8B160ADE07022880040006DC062A0000000110000004000000D4D40007000000001E027BAB0200042A1A739900000A7A001B300200220000001A000011027BAC0200040A061759450200000001000000010000002ADE07022883040006DC2A00000110000002001800021A0007000000001E027BAB0200042A7A02282500000A02037DAC02000402289700000A6F9800000A7DAD0200042A6E02157DAC020004027BB30200042C0B027BB30200046F1300000A2A001330020018000000C30000111FFE73820400060A06027DAE02000406037DB0020004062A133004006B000000C4000011036F4801000A0A067B4901000A0B07175945050000001C000000250000001C00000025000000020000002B23036F4B01000A26178D2200001B0C0816061C6F0600002BA2082A020304285D0300062A06725B000070067B4901000A8C5B000002284000000A735401000A7A001B3004008E030000C5000011036F4801000A0A02067B4A01000AD001000001282B00000A285E0300060B067B4901000A19FE010C036F4B01000A26140D3841030000036F4801000A0A067B4901000A182E1208399A020000067B4901000A1A3B8E020000082D07036F4B01000A26737400000A1304092C19096FA002000A173110077EBC010004288502000639F10000007E5C0100041305141306092C43096FA102000A130711076F9200000A2C2411076FA202000A130E120E28A302000A130611076FA202000A130F120F28A402000A1305DE0C11072C0711076F1300000ADC11062C0A11066FA502000A17301F11062D0D077EBC01000428850200062D0E11057EBD01000428850200062C7411041201287C0200062D180207D030000001282B00000A285E03000628820000062B057E560000046F6100000A11062C3411066FA602000A13102B1211106FA702000A1308110411086FD700000A11106F9200000A2DE5DE0C11102C0711106F1300000ADC11047E510000046F6100000A11042A042C1D11041201287C0200062D080728840000062B057E570000046F6100000A093929010000096FA102000A1311380201000011116FA202000A1309120928A302000A6FA502000A173354042C3802120928A402000AD001000001282B00000A285E030006130A1104120A287C0200062D09110A28870000062B060728870000066F6100000A1104120928A302000A166FA802000A6FD700000A3896000000120928A402000A13121212287C0200063A810000001104120928A402000A13131213287C0200062D1E02120928A402000AD030000001282B00000A285E03000628820000062B057E560000046F6100000A120928A302000A6FA602000A13142B1211146FA702000A130B1104110B6FD700000A11146F9200000A2DE5DE0C11142C0711146F1300000ADC11047E510000046F6100000A11116F9200000A3AF2FEFFFFDE1B11112C0711116F1300000ADC042D0C11047E530000046F6100000A042C0C11047E520000046F6100000A11042A067B4A01000A130C067B4901000A1A3307036F4B01000A26092D0673A902000A0D09110C6FAA02000A2D0D09110C73AB02000A6FAC02000A02030416FE01285C030006130D110D6FC500000A173333110D166FC600000A7B3F00000A1C3323110D166FC600000A7B4B00000A2C14110D166FC600000A6F4E00000A284B0300062D0F09110C6FAD02000A110D6FAE02000A036F5001000A39B4FCFFFF06727B030070735401000A7A000041640000020000009A0000002F000000C90000000C00000000000000020000003C0100001F0000005B0100000C0000000000000002000000740200001F000000930200000C0000000000000002000000A401000015010000B90200000C000000000000001B3004008B000000C6000011027BBF0100046FA7020006046F1F0300060A062C3A066FE700000A13042B1911046FE800000A0B030728850200062C087E5C0100040DDE5111046F9200000A2DDEDE0C11042C0711046F1300000ADC0F017B5D01000428AF02000A0C0F017B5D0100040828EC00000A2C02032A080F017B5E0100040F017B5F0100040F017B60010004737B0200062A092A000110000002001D002643000C00000000E2D001000001282B00000A737802000680BB010004D030000001282B00000A737802000680BC01000472D72E0070737902000680BD0100042A22021428610300062A0000133003002D000000C700001102282500000A032D1C0273B002000A0A06166FB102000A06166FB202000A067DC00100042A02037DC00100042A0A162A0A162A0E156A2A5A0203252D06267E2D00000A73B302000A28660300062A0000133002003B000000C8000011032D0B725F010070732600000A7A03027BC001000428B402000A0A0675960000010B072C0E07166FB502000A07166FB602000A020628670300062A001330020048000000C9000011289700000A6F9800000A027BB60200043315027BB50200041FFE330B02167DB5020004020A2B1316738B0400060A06027BBD0200047DBD02000406027BB80200047DB7020004062A1E0228840400062A1B30060055050000CA000011027BB50200040D09451100000005000000F7040000E60100000E020000F704000073020000A2020000DA020000260300005203000083030000B4030000E50300003504000070040000A8040000E004000038F204000002157DB5020004027BB70200042D0B725F010070732600000A7A027BB70200046FB702000A2D10027BB70200046F1300000ADDBB040000DE2C0A066FBD00000A066FB802000A6A066FB902000A150673C70200067A0B076FBD00000A156A0773C60200067A027BB70200046FBA02000A13041104451200000026040000050000002002000098020000FA02000059FFFFFF59FFFFFF2B0300007B03000059FFFFFFB603000059FFFFFFEE030000C9020000C9020000FB01000059FFFFFF2B0300003854FFFFFF027CB9020004027BB70200046FBB02000A027BB70200046FBC02000A027BB70200046FBD02000A737A020006816300000202027BB70200046FBE02000A7DBA020004027BB70200046FBF02000A399B0000000273C002000A7DBB0200042B7C027BB70200046FBC02000A288500000A2C17027BB70200046FBB02000A72A713007028EC00000A2D53027BB70200046FBC02000A72A713007028EC00000A2D3C027BBB020004027BB70200046FBB02000A027BB70200046FBC02000A027BB70200046FBD02000A737A020006027BB70200046FC102000A6FC202000A027BB70200046FC302000A3A74FFFFFF2B0702147DBB020004027BBA0200042C2802027BB902000428460200067DB402000402187DB5020004170CDD1C03000002157DB50200042B2602027BB902000428450200067DB402000402197DB5020004170CDDF402000002157DB5020004027BBB02000439FFFDFFFF02027BBB0200046FC402000A7DBE020004021A7DB50200042B6F02027BBE0200046FC502000A7DBC02000402027BBC0200041305120528C602000A28470200067DB4020004021B7DB5020004170CDD8F020000021A7DB502000402027BBC0200041306120628C702000A28480200067DB4020004021C7DB5020004170CDD60020000021A7DB5020004027BBE0200046F9200000A2D8402288C040006385EFDFFFF027E410100047DB4020004021D7DB5020004170CDD2802000002157DB50200043839FDFFFF02027BB70200046FC802000A027BB70200046FBC02000A027BB70200046FBD02000A17737B02000628470200067DB4020004021E7DB5020004170CDDDC01000002157DB502000402027BB70200046FC102000A28480200067DB4020004021F097DB5020004170CDDB001000002157DB502000438C1FCFFFF02027BB70200046FC102000A28480200067DB4020004021F0A7DB5020004170CDD7F01000002157DB50200043890FCFFFF02027BB70200046FC102000A28480200067DB4020004021F0B7DB5020004170CDD4E01000002157DB5020004385FFCFFFF02027BB70200046FC102000A28480200067DB4020004021F0C7DB5020004170CDD1D01000002157DB5020004382EFCFFFF0272931400707293140070027BB70200046FC802000A72B3070070027BB70200046FC102000A280201000A28440200067DB4020004021F0D7DB5020004170CDDCD00000002157DB502000438DEFBFFFF027233140070726D140070027BB70200046FC102000A28440200067DB4020004021F0E7DB5020004170CDD9200000002157DB502000438A3FBFFFF0272E12E00707289000070027BB70200046FC102000A28440200067DB4020004021F0F7DB5020004170CDE5A02157DB5020004386BFBFFFF0272F52E00707289000070027BB70200046FC102000A28440200067DB4020004021F107DB5020004170CDE2202157DB50200043833FBFFFF027BB70200046F1300000A160CDE07022889040006DC082A000000414C000000000000700000001F0000008F0000001C0000009800000100000000700000001F000000AB000000100000002A00000104000000000000004C0500004C05000007000000000000001E027BB40200042A1A739900000A7A001B30020026000000CB000011027BB50200040C081A5945030000000100000001000000010000002ADE0702288C040006DC2A00000110000002001C00021E0007000000001E027BB40200042A7A02282500000A02037DB502000402289700000A6F9800000A7DB60200042A6E02157DB5020004027BBE0200042C0B027BBE0200046F1300000A2A001330020018000000C90000111FFE738B0400060A06027DBD02000406037DB8020004062A3A02176F6903000602287500000A2A0E03262A320273AA02000628EE0000062A4A02032D0773AA0200062B010328EE0000062AF602032D0773AA0200062B010328EE000006042D0B72190B007073B000000A7A02048E698D4A0000017DC101000404027BC1010004048E69280C01000A2A000000133002003C000000CC000011289700000A6F9800000A027BC10200043315027BC00200041FFE330B02167DC0020004020A2B131673940400060A06027BC20200047DC2020004062A1E02288D0400062A1B300300F900000030000011027BC00200040B07450500000005000000CB00000064000000A7000000C400000038C600000002157DC0020004027BC20200047BC10100042C7802177DC002000402027BC20200047BC10100047DC402000402167DC50200042B3F02027BC4020004027BC50200049A7DC302000402027BC30200047DBF02000402187DC0020004170ADE7202177DC002000402027BC502000417587DC5020004027BC5020004027BC40200048E6932B10228950400062B3A0272A52E00707DBF02000402197DC0020004170ADE2F02157DC00200040272C52E00707DBF020004021A7DC0020004170ADE1202157DC0020004160ADE07022892040006DC062A0000000110000004000000F0F00007000000001E027BBF0200042A1A739900000A7A00133002001F0000001A000011027BC00200040A061759450200000001000000010000002A0228950400062A1E027BBF0200042A7A02282500000A02037DC002000402289700000A6F9800000A7DC10200042A2202157DC00200042A001330020011000000CC0000111FFE73940400060A06027DC2020004062A000000133002003C000000CD000011289700000A6F9800000A027BC80200043315027BC70200041FFE330B02167DC7020004020A2B1316739D0400060A06027BC90200047DC9020004062A1E0228960400062A133002003B0000001A000011027BC70200040A064502000000020000001D0000002B2202157DC702000402720B2F00707DC602000402177DC7020004172A02157DC7020004162A1E027BC60200042A1A739900000A7A062A1E027BC60200042A7A02282500000A02037DC702000402289700000A6F9800000A7DC80200042A001330020011000000CD0000111FFE739D0400060A06027DC9020004062A720228FF00000A73780300060228FF00000A737003000673C902000A2A9E0273580200067DC301000402282500000A032D0B72C7020070732600000A7A02037DC40100042A00001330050031010000CE000011032D0B728D0E0070732600000A7A03283A00000A0A737B01000A0B160C7E5C0100040D027BC30100046F55020006066F3C00000A7B3F00000A17336F027BC40100046FC10200062C390207027BC40100046FBD0200067289000070284E01000A2D0772F32500702B0B027BC40100046FBD020006737902000614172875030006170C027BC40100046FBF0200067289000070284E01000A2C121203027BC40100046FBF0200062879020006066F3C00000A7B3F00000A193334027BC40100046FBD0200067289000070284E01000A2C1D1203027BC40100046FBD02000628790200062B09020706092872030006066F3B00000A2CEF082C370207027BC40100046FBD0200067289000070284E01000A2D0772F32500702B0B027BC40100046FBD020006737902000614182875030006072A00000013300500F40000006A000011027BC60100042C29027BC40100046FB50200062C1502257BC501000417587DC50100040203287603000602167DC6010004046F3C00000A0A067B3F00000A0B0717594503000000100000008500000006000000071C2E162B7F0203040528730300062A0203040528740300062A046F4100000A260F03287C0200062C08067B4700000A1003067B4B00000A2D1502051428770300061003020305141928750300062A0205067B4B00000A6F5A00000A287703000610030203051417287503000603061B6F0400002B6F6501000A020305141828750300062A06725B000070067B3F00000A8C20000002284000000A733E00000A7A1330050078010000CF000011046F4100000A0A020F03287C0200062D03052B06067B4700000AD030000001282B00000A287703000610031201027BC40100046FBF0200067289000070284E01000A2D0772D72E00702B0B027BC40100046FBF02000628790200060203051417287503000602177DC6010004160C38F9000000046F3C00000A0A067B3F00000A0D091759450600000051000000AF0000005100000005000000AF0000005100000038AA000000046F4100000A26027BC60100042C0902167DC60100042B22027BC40100046FB50200062C1502257BC501000417597DC5010004020328760300060203051418287503000602177DC60100042A082C16027BC40100046FB50200062C0702032876030006160C027BC60100042C29027BC40100046FB50200062C1502257BC501000417587DC50100040203287603000602167DC601000402030407287203000602167DC6010004170C2B1C06725B000070067B3F00000A8C20000002284000000A733E00000A7A046F3B00000A39FCFEFFFF2A13300500D1010000D0000011046F4100000A0A020F03287C0200062D03052B06067B4700000AD001000001282B00000A28770300061003170B140C160D388F010000046F3C00000A0A067B3F00000A13051105182E0A11051B2E673855010000046F4100000A26072C13160B0203050817287503000602177DC6010004027BC60100042C0902167DC60100042B22027BC40100046FB50200062C1502257BC501000417597DC5010004020328760300060203051418287503000602177DC60100042A046F4100000A26092C16027BC40100046FB50200062C0702032876030006160D073983000000067B4700000A7B600100042C63082D0673CA02000A0C067B4700000A1304046F3C00000A0A067B3F00000A1C2E0C0672152F0070733E00000A7A046F4100000A261204287C0200062C08067B4700000A13040811046FCB02000A2D09081104066FCC02000A02167DC6010004170D2B79160B0203050817287503000602177DC6010004027BC60100042C29027BC40100046FB50200062C1502257BC501000417587DC50100040203287603000602167DC6010004020304067B4700000A287203000602167DC6010004170D2B1C06725B000070067B3F00000A8C20000002284000000A733E00000A7A046F3B00000A3966FEFFFF2A0000001B30030005010000D1000011027BC60100042C29027BC40100046FB50200062C1502257BC501000417587DC50100040203287603000602167DC601000473650200060A06046F5C020006027BC30100040F027B5F0100046F510200062D14060F027B5E0100040F027B5F0100046F5E020006027BC3010004066F4D0200060E040C08175945030000001D00000010000000020000002B1B030428460200066F6501000A2B19037E410100046F6501000A2B0C030428450200066F6501000A052C4F056FCD02000A0D2B2C096FCE02000A0B03120128CF02000A28470200066F6501000A03120128D002000A1B6F0400002B6F6501000A096F9200000A2DCCDE0A092C06096F1300000ADC056FD102000A2A000000011000000200BC0038F4000A0000000013300300A3000000D2000011027BC40100046FB7020006288500000A0A062C13027BC40100046FB9020006288500000A2C012A027BC40100046FB902000673D202000A0B062D56027BC40100046FB70200066F6700000A17332007027BC40100046FB7020006166F6800000A027BC50100046FD302000A262B23160C2B1607027BC40100046FB70200066FCE01000A260817580C08027BC501000432E103076F5600000A28480200066F6501000A2A001B3004008B000000D30000110F017B5D010004288500000A2C41027BC40100046FBB020006046F1F0300066FE700000A0D2B14096FE800000A0A1200287C0200062D04060CDE4E096F9200000A2DE4DE0A092C06096F1300000ADC0F017B5D01000428D402000A0B0F017B5D0100040728EC00000A2C02032A070F017B5E0100040F017B5F0100040F017B60010004737B0200062A082A0001100000020025002045000A000000007202282500000A032D0B72C7020070732600000A7A02037DC80100042A0000001B3003002800000049000011730F01000A0A020306287A030006066F1001000A6F\
-5600000A0BDE0A062C06066F1300000ADC072A0110000002000600161C000A000000001B300300A3000000D4000011042D0B72692F0070732600000A7A0475890000020A062C0E02066F7E03000603287B0300062A0473D502000A0C08166FD602000A08166FD702000A08283800000A6FD802000A08027BC80100046FB50200066FD902000A08027BC80100046FB70200066FDA02000A08027BC80100046FB90200066FDB02000A08186FDC02000A08176FDD02000A0828DE02000A0B020703287B030006DE0A072C06076F1300000ADC2A000110000002008E000A98000A000000001B300400AC010000D5000011032D0B72692F0070732600000A7A042D0B7213000070732600000A7A160A04284701000A0B076F4801000A0C384B010000087B4901000A130511051759450500000005000000A500000043000000BF000000D000000038050100000617580A03087B4A01000A7B5E010004087B4A01000A7B5D010004087B4A01000A7B5F0100046FDF02000A076F4B01000A26076F4801000A0C38E300000003087B4A01000A7B5E010004087B4A01000A7B5D010004087B4A01000A7B5F0100046FDF02000A076F4B01000A26076F4801000A0C2B0F020307287C030006076F4801000A0C076F5001000A2D09087B4901000A1A2EE0036FE002000A38810000000617590A036FE002000A076F4B01000A26076F4801000A0C2B67020307287C030006076F4801000A0C2B56087B5101000A751B00001B0D092C0F090203737D0300066F5201000A2B0C03086F5301000A6FE102000A076F4B01000A26076F4801000A0C2B1C08725B000070087B4901000A8C5B000002284000000A735401000A7A076F5001000A39AAFEFFFF2B06036FE002000A062517590A1630F2DE1213040811046FBD00000A110473E202000A7A2A411C0000000000002C0000006D01000099010000120000002A0000011330040093000000D6000011046F4801000A0A03067B4A01000A7B5E010004067B4A01000A7B5D010004067B4A01000A7B5F0100046FE302000A046F4B01000A26046F4801000A0A067B4901000A0C081B332C067B5101000A751B00001B0B072C0F070203737D0300066F5201000A2B2003066F5301000A6FE102000A2B1206725B00007006284000000A735401000A7A046F4B01000A26036FE402000A2A3A0228E502000A0203287F0300062A1E027BC90100042A2202037DC90100042A4A02287E03000603286601000A6FE602000A2A52032C1002287E0300060316038E696FE702000A2A4A032C0E02287E0300060304056FE702000A2A3602287E030006036FE602000A2A3202287E0300066FE802000A2A4602287E0300066FE902000A6FEA02000A2A4E020304282D0200062D0703280B00002B2A172A4A0203282E0200062D0703280B00002B2A172A1E02282500000A2A160314FE012A8E042C1E168C53000001027BCB02000403168D010000016F66000006288501000A2A172A76042C18168C53000001027BCA020004036F6A000006288501000A2A172AF2042C37168C53000001027BCB02000403168D010000016F66000006288501000A2D18168C53000001027BCA020004036F6A000006288501000A2A172A4A042C0D027BCC02000404288501000A2A172AC6042C2C027BCC02000404288501000A2D1E168C53000001027BCB02000403168D010000016F66000006288501000A2A172AAE042C26027BCC02000404288501000A2D18168C53000001027BCA020004036F6A000006288501000A2A172A033004004A00000000000000042C45027BCC02000404288501000A2D37168C53000001027BCB02000403168D010000016F66000006288501000A2D18168C53000001027BCA020004036F6A000006288501000A2A172A000013300300B7010000D7000011141304141305141306141307141308141309739E040006130A036FDA01000A252D0726036FDB01000A0A110A147DCA02000406036F0602000A72772F0070285800000A1F746FDC01000A0B072C1F076FDD01000AD053000001282B00000A330D110A0728910300067DCA020004110A147DCB02000406728B2F0070036F0602000A285800000A1F746FEB02000A0C082C29086FEC02000AD053000001282B00000A3317086F4602000A8E692D0D110A0828960300067DCB02000403280900002B0D092D7B110A7BCA0200042D3D110A7BCB0200042D1E7ECC0100042D1114FE068C030006731103000680CC0100047ECC0100042A11042D0F110AFE069F0400067311030006130411042A110A7BCB0200042D1611052D0F110AFE06A00400067311030006130511052A11062D0F110AFE06A10400067311030006130611062A110A096FDE01000A7DCC020004110A7BCA0200042D35110A7BCB0200042D1611072D0F110AFE06A20400067311030006130711072A11082D0F110AFE06A30400067311030006130811082A110A7BCB0200042D1611092D0F110AFE06A40400067311030006130911092A110AFE06A504000673110300062A001330020048000000D8000011289700000A6F9800000A027BCF0200043315027BCE0200041FFE330B02167DCE020004020A2B131673AD0400060A06027BD80200047DD802000406027BD10200047DD0020004062A1E0228A60400062A13300500990200001A000011027BCE0200040A0645070000000500000072000000D50000003701000095010000F201000067020000386902000002157DCE020004027BD0020004751C00000139C500000002027BD0020004280C00002B7DD2020004027BD20200042C44027BD20200046FED02000A288500000A2D3202027BD20200046FED02000A14027BD20200046FEE02000A737A0200067DCD02000402177DCE020004172A02157DCE02000402027BD0020004280D00002B7DD3020004027BD302000439D9010000027BD30200046FEF02000A288500000A3AC401000002027BD30200046FEF02000A14027BD30200046FF002000A737A0200067DCD02000402187DCE020004172A02157DCE020004388D01000002027BD0020004280E00002B7DD4020004027BD40200042C44027BD40200046FF102000A288500000A2D3202027BD40200046FF102000A14027BD40200046FF202000A737A0200067DCD02000402197DCE020004172A02157DCE02000402027BD0020004280F00002B7DD5020004027BD50200042C45027BD50200046FF302000A288500000A2D3302027BD50200046FF302000A14027BD50200046FF402000A17737B0200067DCD020004021A7DCE020004172A02157DCE02000402027BD0020004281000002B7DD6020004027BD60200042C44027BD60200046FF502000A288500000A2D3202027BD60200046FF502000A14027BD60200046FF602000A737A0200067DCD020004021B7DCE020004172A02157DCE020004027BD002000475270000012C68027BD002000474270000016FDB01000A6FD800000A2C5102027BD0020004281100002B7DD7020004027BD70200042C38027BD70200046FF702000A288500000A2D2602027BD70200046FF702000A73790200067DCD020004021C7DCE020004172A02157DCE020004162A1E027BCD0200042A1A739900000A7A062A32027BCD0200048C630000022A7A02282500000A02037DCE02000402289700000A6F9800000A7DCF0200042A00001330020018000000D80000111FFE73AD0400060A06027DD802000406037DD1020004062A1330020048000000D9000011289700000A6F9800000A027BDB0200043315027BDA0200041FFE330B02167DDA020004020A2B131673B50400060A06027BE30200047DE302000406027BDD0200047DDC020004062A1E0228AE0400062A1B300200CD01000030000011027BDA0200040B074507000000050000009701000080000000970100000E010000970100007D010000389201000002157DDA020004027BDC02000475C100001B398300000002027BDC02000474C100001B6FF802000A7DDE020004027BDE02000417306B02027BDC0200046FE500000A7DE402000402177DDA0200042B3202027BE40200046FE600000A7DDF02000402027BDF0200047DD902000402187DDA020004170ADD2201000002177DDA020004027BE40200046F9200000A2DC10228B604000638F8000000021B7DDE02000402027BDE02000473F902000A7DE002000402027BDC0200046FE500000A7DE502000402197DDA0200042B5702027BE50200046FE600000A7DE1020004027BE10200047B950100047B600100042C2302027BE10200047DD9020004021A7DDA020004170ADD9400000002197DDA0200042B11027BE0020004027BE10200046FFA02000A027BE50200046F9200000A2D9C0228B704000602027BE00200046FFB02000A7DE6020004021B7DDA0200042B2F02027CE602000428FC02000A7DE202000402027BE20200047DD9020004021C7DDA020004170ADE25021B7DDA020004027CE602000428FD02000A2DC40228B8040006160ADE070228B3040006DC062A000000411C00000400000000000000C4010000C401000007000000000000001E027BD90200042A1A739900000A7A001B300200660000006D000011027BDA0200040A061759450200000002000000020000002B09DE070228B6040006DC027BDA0200040B071959450200000002000000020000002B09DE070228B7040006DC027BDA0200040C081B59450200000001000000010000002ADE070228B8040006DC2A00000128000002001900021B00070000000002003B00023D00070000000002005C00025E0007000000001E027BD90200042A7A02282500000A02037DDA02000402289700000A6F9800000A7DDB0200042A6E02157DDA020004027BE40200042C0B027BE40200046F1300000A2A6E02157DDA020004027BE50200042C0B027BE50200046F1300000A2A6602157DDA020004027CE6020004FE16C300001B6F1300000A2A0000001330020018000000D90000111FFE73B50400060A06027DE302000406037DDD020004062A1E0228320200062A1E02282500000A2A1E0228C201000A2AAA0275260000012C0C02742600000128910300062A0275270000012C0C02742700000128930300062A142AAA0275260000012C0C02742600000128920300062A0275270000012C0C02742700000128940300062A142A1E02282500000A2A4A027BE7020004037E4B02000A6F0003000A2A0000001330030042000000DA00001173B90400060A022D0B72872A0070732600000A7A026FD301000A2D02142A0602176F0103000A7DE7020004067BE70200042D02142A06FE06BA04000673690000062A1E02282500000A2A0000133005001A00000068000011027BE802000403178D010000010A061604A2066F0003000A262A00001330030042000000DB00001173BB0400060A022D0B72872A0070732600000A7A026FD501000A2D02142A0602176F0203000A7DE8020004067BE80200042D02142A06FE06BC040006736D0000062A1E02282500000A2A36027BE9020004036F0303000A2A133002002D000000DC00001173BD0400060A06027DE9020004067BE90200042D0B72A12A0070732600000A7A06FE06BE04000673690000062A1E02282500000A2A3A027BEA02000403046F0403000A2A1330020049000000DD00001173BF0400060A06027DEA020004067BEA0200042D0B72A12A0070732600000A7A067BEA0200046FD901000A2D0D067BEA0200046F0503000A2C02142A06FE06C0040006736D0000062A000000133006004C000000DE000011022D0B72AB2F0070732600000A7A03288500000A2C0B72C72F0070732600000A7A048E6916310F02031F7C1404146F0603000A0A2B0A02031F7C6FEB02000A0A062D02142A0628960300062A1E02282500000A2A3A027BEB02000403046F0003000A2A00133002002D000000DF00001173C10400060A06027DEB020004067BEB0200042D0B72DD2F0070732600000A7A06FE06C204000673650000062A000000133005002A000000E0000011022D0B72B52A0070732600000A7A021F74147E4B02000A146F5102000A0A062D02142A0628990300062A00001330050026000000E0000011022D0B72B52A0070732600000A7A021F741403146F5102000A0A062D02142A0628990300062A1E02282500000A2A36027BEC020004036F0703000A2A133002002D000000E100001173C30400060A06027DEC020004067BEC0200042D0B72F32F0070732600000A7A06FE06C404000673610000062A00000042534A4201000100000000000C00000076322E302E35303732370000000005006C000000D8B50000237E000044B600007C6A000023537472696E677300000000C02001000030000023555300C0500100100000002347554944000000D0500100E844000023426C6F620000000000000002000001571FA20B091E000000FA25330016000001000000A4000000BC000000EC020000C4040000FD030000D700000007030000D800000058010000E100000058000000CF000000F7000000F2000000C300000001000000030000004600000037000000110000000200000000000A000100000000000600500A490A0600570A490A06005E0A490A06006A0A490A06008F0A740A0600B00A9D0A0600BC0A490A0600E10A490A0600F30A740A0600FB0A740A0600090B740A0600170B9D0A0600230B490A06002D0B740A06003C0B490A06004A0B490A0600640B490A0600800B760B06008E0B490A0600E80BD60B0600870D760B0600950D760B06003A0E760B06005F0E740A0600A90E490A06009210490A06009F10490A06007B10490A06008D13760B060072159D0A0A003C171D1706008217761706000319490A06007B19490A06001B1C740A0600C41E740A06004E2076170600B528D60B0600D428D60B0600ED28D60B0A00282D740A0600C42E490A0600EB2ECE2E0600FD2ECE2E06003937D60B060072399D0A060089399D0A06001B0C490A0E00F43AE93A0E005609E93A0E008909E93A06000F3CD60B0600293CD60B0600DD3CBE3C0600113D490A06004541D60B06005C41D60B06007941D60B06009841D60B0600B141D60B0600CA41D60B0600E541D60B06000042D60B06001942D60B06003242D60B06005F424F420600984285420F01AC4200000600BB42090A0600DB42090A06000543490A06001B43D60B06004143490A06000B0C490A0600CB43490A0600DD43490A0600EA43760B06002444760B0600494434440600890C490A06006A44490A0600040C490A06003B0C490A06009344490A0A00BB441D170600990C490A0600F844490A06006345490A06007845490A0600F024490A06009A45490A0600AE45BE3C0600C445BE3C0600CF45740A0600EE45090A06001A46490A06002146490A06004846490A06004D46490A06007A46344406009D4634440600AA46D60B06001848854206004148304806005A499D0A06006049490A06008D51490A0A009451490A0600AB5134440A00C5511D170A00CB511D170A00DD511D170A00F8511D1706006552740A06008652490A0600CE53760B06000154490A06000754490A06000D54490A06001454490A06001B54490A06002D54490A06007954490A63004304000006005D55490A06006655490A0600AF55490A0600E455C55506000456490A06001C56490A06004659D60B0600235AD60B0A00635A4D5A0600015C854206001C5C854206006B5D740A0600585F760B0A00BE5F490A06003F60490A06001C61490A0600A261D60B0600A961D60B0600F561490A06000262490A06000F62490A06009E62490A0E00EB62E93A0E000A63E93A06003063760B0E003D63E93A0E005D63E93A0E000164E93A0E002E64E93A0E00BA64E93A0E000565E93A0E00AA6591650E00996691650E00BA6691650E00DB6691650E00FF6691650E00256791650E004867916506005C694F42060079694F420000000001000000000001000100010110001A002000050001000100010100002700370009000A00030001010000430037000900200003000100100055003700050027000300A10000006000730000003300050002001000880000000500330007000100100096003700050033001100A1000000A100730000003300120002001000B400000005003300150009011000C200370011003600220001001000CA00370005003700290009011000DC003700110039002E0009011000EF00370011003A00330001001000FA00370005003B003800090110000801370011003D003D00010010001501370005003F004D00A100000020017300000042005F00A10000003501370000004200600001010000460156011D004200610001010000650156011D004200650001010000730156011D004200690001010000820156011D0042006D00A10000009101730000004200710001001000A201B00105004200760081011000BD01B001050050008000A1000000CA01730000005B008A0081001000D601730005005B00950081001000E301B0011A005C00A40001010000EF01B0011D005C00A60081011000F601B00105005C00AA00010100000802B00109005F00BF00A10000001702730000006700BF00010010002702B00105006700C000A10000003302410200006900C800A10000005E02410200006900CA00810010006C02410205006900CC0081001000790287022A006900D100010010009C0287022E006900D20002010000AE02000009006D00D90001001000B80287022E007100D900A1000000C902730000007800DF0081001000D502730005007800E50081001000E202B00132007900EE00A1000000EE02730000007900F100010010000103160305007900F200A10000002803730000007A0000010100100039034403B0007A000201020010005003000005007C000801010010005E031603C4007E001901A10000007203860300008B002401010010009203860305008B002801010100009D03860309008B002C0101001000AA038603050098002C0102010000B803000009009E004001A1000000CB0373000000A200400101001000DC0386030500A200450103001000EA0300000500A800610103001000F00300000500AB006A01A1000000F70373000000AD007001010010000A0486030500AD007101000010001D0428040500B600780100001000320428040500BA00820103011000430400000500BD009401000010004E0428040500BF009A0103011000430400000500C200AA01A10000005C0428040000C600B00181001000660428040500C600B701000010006F0428045E00C700C40100001000820428045E00CD00CE01A10000008F0428040000D300D801010010009B0428040500D300DD0101001000A80428040500DC00EF0100001000B90444030500E700010201011000C50444033500FC00020201001000D90444033500FC00030201001000EB0444037400FD00070202001000F60400000500FE000C020301000004050000090006011B02010010001405440335000A011B02010010003305400505000B011F02020010004E05000005000B012002010010006205400505000F012502020010006F05000005000F012602A10000008405960500001301280201001000B5059605050013012D0201001000CA05DF0558011301330201010000F50504060900130138020100100012060406050017013802000010002006040605001A014402010100002E060406090042014B02000010003E060406050049014B02020010004F06000005004D015B02810110005506690605004F0166020100100088069605580150016A0202010000A3060000090052016E0200001000AE067300050058016E0200001000C306730005005A01750209011000D806730011005C01780201001000E106730041006101890201001000F8060C07900161018D02010100002D070C07090062019202A10000003C070C07000066019202010010004B070C070500660194020100100058070C07050068019702A10000006507960500006D019B02010110007D07730005006D019C02010110009007730005007101AA0201001000A307730090017B01C40201001000BC07730090017E01CD0201001000CD07730045007F01D202A1000000E307690600007F01D60201001000F707690605007F01D702A10000000A08690600008001D902010010001E08690605008001DC02010110003108960505008301E002020100004A0800001D008801F00202010000620800001D008801F40202010000770800001D008801F802020100008F0800001D008801FC02020100009F0800001D008801000301011000B308960505008801040301000000CC089605580189010B0301010000E90896051D009301110301011000FE089605050093011503010110000809960505009B01180301011000130996050500A3011D0301011000210973000500A801270301011000290973000500AC013403810110003D0949090500B7014B0301001000560960097400B7015503020010006B0900000500B8015A03020010007C0900000500C00160030100100089096009B000C1016A0302001000930900000500C201700302001000A50900000500C701780303001000B20900004900C9017D0301001000C309D7095801CA01860301001000EC0900000500CD018D0300011000F609090A3500CD018E0380011000290A56010500CD018F0303011000C14600000500CD019A03030110006E4800000500D601A20303011000834900000500DE01AA0303011000A54900000500DF01AC03030110008D4C00000500E901B40303011000854E00000500F301BC03030110004C4F000005000002C803030110009B4F000005000702D10303011000D34F000005000D02DA03000000002052000005001402E20303011000A652000005001902E20303011000B653000005002002EB03030110001255000005002402F303030110007E55000005002A02FC0303011000A652000005002B02FF03030110002D56000005003202080403011000F156000005004202100403011000F1560000050054021904030110006D59000005005D02210403011000795A000005005F02250400011000925B0000050066022D0403011000335C0000050069023404030110007E55000005006A02360403011000815C000005006B02380403011000EA5C000005006C023A0403011000445D000005006D023C0403011000A75D000005006E023E0403011000B95E0000050073024504030110000D5F000005007D024E04030110006A5F000005008802560403011000335C000005008F025E040301100076600000050090026004030110006A5F000005009A026A0403011000A65200000500A402720403011000A96200000500AB027B0403011000876300000500B402840403011000A65200000500BF028D0403011000B65300000500C602960403011000BD6500000500CA029E04030110008A6600000500CD02A60403011000986700000500D902AE0403011000335C00000500E702B904030110007E5500000500E802BB0403011000C36900000500E902BD0403011000EB6900000500EA02BF04030110002A6A00000500EB02C10403011000526A00000500EC02C30436008B0B130126008E0B17012600960B1B0126009F0B1B012600A40B1B012600B20B1B012600BC0B1B012600C20B1B012600CE0B1B010606F70B24015680FF0B27015680040C270156800B0C27015680120C270156801B0C27015680210C27015680280C27015680320C270156803B0C27015680430C270156804F0C27015680540C270156805B0C27015680650C27015680740C270156807B0C27015680890C270156808F0C27015680990C270156809F0C27015680A60C27010606F70B24015680AD0C55015680B50C55015680BE0C55015680C80C55015680CD0C55015680D10C55015380DD0C1B015180EF0C1B015180040D1B015380220D160253802D0D16025380390D16025380450D16025380520D16025380610D240153806A0D24015380740D240133007D0D2D0251801F0E1B013100470E2D030100580E2D032600AE0E94030100FA0EEB030100100FEF032600270F1B012600270F1B010100620F1B0101007D0F36043600A10F36042100A70F43043600A10F85042100021055012100A70F43045180EF0C1B015180E1101B015180F4101B0151800B111B01518027111B0151803D111B01518054111B01518068111B015180040D1B01518082111B0151809D111B012100D81029082100B5112E082100BE11330836009512C00836009F12C0083600AD12C0083600BC12C0083600C612C0083600D112C0083600DB12C0083600F212C00833000A13C00833001313C00833002913C0082100B21329085180DF131B015180F9131B0131001314200A0606F70B16025680FF0B390B56802F15390B56803B15390B56804515390B56805015390B56804214390B56805915390B2100D810660B2100BE113308518030161B0151803C161B01518047161B01010052161B010606F70B160256809416790D56809C16790D5680A916790D5180AF167E0D5180C4167E0D5180D9161B015180EB161B015180FC161B0131000D172D0231004217F00D2100B213660B2100EC171B015180EF0C1B012100A0189D0E2100D810660B0100AD18B50E5180A1191B015180B5191B015180C9191B015180DC19960F5180EF19960F5180021A1B015180111A1B015180261A1B015180361A1B015180451A1B0131000D172D023100591AB2103100691AB6100606F70B160256801D1B13115680221B13115680291B131156802F1B13115680341B131156803A1B13115680401B13115680461B131156804B1B13115680120C13115680521B13115680591B13115180EF0C1B012100D810660B2100611B3B1101006C1BB50E01007A1B401101008A1BB50E0606F70B16025680A71C40115680AC1C40115680B21C40115180D61C16022100611B3B110100E81CE8110100F01CED110100FD1CB50E01003D1EB50E3100991EB2102600A31E1B0126009F0B1B010100001FFE120100171F03135180EF0C1B0131003E1F371331004A1F37133100571F37133100681F37133100761F371331008F1F37133100AA1F37133100BB1F371351800E20160231001E20B21001002A20B210010031201602210079208E1321007F20961301008820B50E21008D23E3130100190E160221002624091421002C24160221003224160221002624091421002C2416022100372416020100190E160236004F0C26145180AD2416022100430496130100C224B50E0100CA24B50E0100D62450140100DE248E130100CA24B50E0100C224B50E0100D62450142100F02409140100F72416020100FD24160236004F0C5E140100CA24B50E0100C224B50E0100D624960F01000325160201000A2516020100F72416022100F0241B010100FD2416025180D61C160236004F0C6F142100580E74140100D624960F01004325960F0100CA24B50E0100C224B50E01000325160201000A2516020100F7247E0D0100DE247814568048251B01568059251B01568065251B01568072251B0156807E251B01568089251B0156809925960F5680AC25960F5680BD25960F5680D125960F5680E325960F5680F625960F56800826960F56801C26960F5680EF19960F56803326960F56804626960F56805826960F56806D261B01568082261B01568095261B010100A9261B012100A0189D0E5180C0261B015180D7261B015180F0261B01518008271B0151801B271B01518032271B015180D61C16020100E81CE8110606F70B1602568093278A1656809D278A165680AC278A160100B5271B01518005281B015180EF0C1B0131001128F00D01003F28BA165180EF0C1B01518066281B0151807A281B0151\
-8095281B010606F70B16025680FF0BBA1656802429BA1656802D29BA1601005B291B01010072291B010100171F1B0156808D29960F5680A229960F5680B529960F5680E325960F5680F625960F5680CA29960F56800826960F56801C26960F5680DE29960F5680F229960F5680042A960F5680162A960F56802B2A960F56803D2A960F56804D2A960F56806D261B01568082261B015680622A1B015680752A1B015680862A960F5680A42A1B015680BF2A1B015680E22A1B015680032B960F5680102B960F5680262B960F56803D2B960F5680552B960F5680692B960F56807E2B960F5680942B1B015680AB2B1B015680BB2B960F5680C62B960F5680DA2B960F5680EF2B960F5680062C1B0156801B2C1B013600951203133600292C03130606F70B16025680FF0B38185680792C38185680862C38185680912C38185680230B381856805915381821009D2C3D180100A32C16021100BA5C643611001D5D64360100352D70180100732D37135680942D1B012600E02D1B012600EE2DF5180606F70B16025680002EF5185680092EF5185680142EF51856801E2EF5185680282EF5182100322E0F1921003C2E18192100482E561921003C2E18193600A10F37132600522E1B012600A31E1B0126005C2E1B012600692EB50E21002D07AA190606F70B16025680262FAA1956802D2FAA195680372FAA192100372F16020100402F16025180462F16025180522F160231005F2FDA1901006A2FDA190100312016020100822FB50E0100962FB50E21001309EA192100AB2F33080100F330B50E0100FF30AA1901000B311B0101000F311602010018311B0121001309EA192100AB2F3308010020311B01010032311B0101004331B50E21000325160221000A2516022100F7247E0D2100E3329B1A2100FE32E41A21003433131B21004233181B21004F33181B010051356F1B01007435741B01009435791B0100B5357E1B0100CE35831B2100FB35FD1B51800B361B01518024361B01518039361B0151804C361B0131006536851D31007636851D31008536851D31009A36891D3100B136891D3100CD36891D2600ED28971D26009F0B1B012600D806371326007B10851D2600E936891D2600F0369C1D2600F736A01D26000137B50E51800D371B0121002437771E26003437821E26004737861E2600C0218C1E26005037851D260058378C1E26006137851D2100A237B61E2100AE37C81E2100B837D91E2100C237E51E2100CC37F51E518028381B0126003B38501426009F0B371326002E1F661F538065381B01518079381B0151808C381B01518096381B015180B0381B015180C8381B013300E4381B013300FB381B01330012391B0121007C30B50E01001309EA192100A0189D0E5180EF0C1B0151809D111B015180843A1B0131009A3A37133100AC3A37133100BD3A37132100611B3B112100D81029082100D81083232100A0189D0E5180EF0C1B012100611B3B112100D810660B0100402F16020100063BB50E5180EF0C1B012100D810660B0100653B3E245180843B1B015180943B1B011100BA5CA01D01001347661F0100874716020100924716020600A74777280600423C200A0600B147200A0600353D851D0600BD47851D0600CD47EF030100134750140100874716020100924716020600A74777280600423C200A0600B147200A0600F848851D06000949EF030600913D371301001347BF2A0100874716020100924716020600803D200A0600764B200A0600873DEA2A0600824BEA2A0600914BEF0306009E4B16020600AA4BC00801001347200A0100874716020100924716020600803D200A0600764B200A0600873D632B0600824B632B0600D04DEF030600DD4D16020600E94DC00801001347200A0100874716020100924716020600803D200A0600764B200A0600A04EBF2A0600B04E200A0600C24E200A0600CE4E200A0600E04E872B0600FB4EA02B0600164FA02B0600314FA02B01001347200A0100874716020100924716020600803D200A0600764B200A06006E4F200A0600804FA02B01001347200A0100874716020100924716020600803D200A0600764B200A0600B64FEF0301001347C0080100874716020100924716020600493CEF030600C850EF030600D45016020600E150C00813007252232E1300D654232E1300EA54232E1300FE54232E13002360232E010013471B010100874716020100924716020600A7476F2E060042531B01060062539D0E06006D531602010013471B010100874716020100924716020600A7476F2E010013471B010100874716020100924716020600A747273106002955FE12060034552C310600C83E5014010013471B010100874716020100924716020600A7472D34060042531B01060062539D0E06006D53160201001347C0080100874716020100924716020600A74738340600703EE81106003D56E81106004A561602060056568A1606006C56B50E06007D56960F060086561B010600E94DC008060092567E0D06009F5616020600AD5616020600BB561B0101001347C0080100874716020100924716020600A747A8340600703DAD3406000157AD340600CD47BB3406000C573B1106001D57031306002957B50E06003D57B50E06004A57371306005857CA34060064571B0106007157371306008057CF3406008C571B0106009857D7340100134703130100874716020100924716020600703D200A06000157200A0600CD47EF0306008F58C00806009B5837130600A747383506008059891D06009859661F0100134737130100874716020100924716020600033F971D06002D5B971D0600395B8F350600A74794352100D35B50142100E35BAF352100F15BB3350600523D1B010600593D1B010600523D1B010600593D1B0106003A3F371301001347CF340100874716020600A747CA340600355ECF340600E04ED734010013471B010100874716020100924716020600533F1B010600CC5E1B0106005A3F1B010600D85E1B010600E95E1B010600F45E1B0106006253EA36010013471B010100874716020100924716020600803D1B010600764B1B0106009D3E960F06001D5F960F0600255F16020600325F160206003D5F16020600485F1B010100134737130100874716020100924716020600A7470D370600033F971D06002D5B971D0600785F9D0E060065609B380100134737130100874716020100924716020600A747DA380600033F971D06002D5B971D06008460F51E06009360371306009E60DF380600B760E8380100134737130100874716020100924716020600033F971D06002D5B971D0600D5601B010600E5601B010600EE6031390600FD6031390600A7473539010013471B010100874716020100924716020600A747D73D060042531B01060062539D0E06006D53160201001347C0080100874716020100924716020600A747EE3D0600703DAD3406000157AD340600B962BB340600C662C0080600D262F33D0100134703130100874716020100924716020600733C63400600976363400600A36337130600B263B50E0600C36368400600D56373400600A7477D400600E6638240010013471B010100874716020100924716020600A747FB40060042531B01060062539D0E06006D531602010013471B010100874716020100924716020600A747FB4006008059891D0600D0658C1E06009859661F0100134737130100874716020100924716020600033F971D06002D5B971D0600AA66C2420600CB66C7420600EF66CC4206001567D14206003767D64206005967DB420600A747E04201001347194301008747160201009247160206001A3F244306006768244306007468160206008168194306008C682D4306009C6819430600A76819430600A747E0420600B26836430600CD6836430600E8683F43060035417743060035417743060040408F43060040408F4306003541774306004041C643D020000000008618F10B1E010100FE21000000009118E2368D1D02003122000000008618F10B310202001922000000009118E2368D1D0200000000000000C6058E0D35020200000000000000C6058E0D460204003C2200000000E6018E0D560205008C2200000000E6018E0D67020600F822000000008100A20D790208006C24000000008100B00D8C020A001028000000009100BD0DA0020D005428000000009100C90DA80210009C28000000008100D50DB60212001429000000009100E80DBE021400282A000000009100F70DC40215009A2A000000008618F10B31021600A22A000000008618F10B31021600000000000000C60D050ECA021600000000000000C6050F0ECE021600000000000000C6050F0EDE021700AA2A00000000E609050ECA021800BC2A000000009100660E31031800442B000000009100730E31031B00302E0000000091007F0E44031E00E02E0000000091008A0E56032000082F000000009100950E56032100352F00000000E6010F0E5C032200562F00000000E6010F0E6D032300742F0000000084000F0E7E032400D02F00000000E601A10E31022500DF2F00000000C401A10E8F0325000530000000008618F10B31022600EF2F000000009118E2368D1D26001830000000008618F10B980326002630000000008618F10B9D0327003430000000008618F10BA30328003D30000000009608B30EA90329004630000000009608B30EB0032A00503000000000C600BF0EB7032B00713000000000C600C80EBB032B008330000000008608D40EBF032B008B30000000008608DD0EC4032B009430000000008608E60ECA032C009C30000000008608F00EDA032C00A530000000008618F10B31022D00AD30000000008618F10B98032D00B630000000009608B30E13042E00BF30000000009608B30E19042F00C73000000000C600BF0EB7033000CF3000000000C600C80EBB033000E130000000008618F10B98033000EA30000000009608B30E1F043100F330000000009608B30E25043200FB3000000000C600BF0EB7033300033100000000C600C80EBB03330015310000000086082C0FB70333001D310000000086083A0F980333002631000000008608480F2B0434002E31000000008608550F300434003731000000008618F10B310235003F31000000008618F10B9D0335007031000000008618F10B470436001432000000008608AD0F50043A005C32000000008608B60FBB033A007D32000000008608C20FBB033A009232000000008608CA0FBB033A00B632000000009608B30E55043A00C532000000009608B30E5B043B00CD32000000009608B30E61043C00E432000000009608B30E68043D00EC3200000000C600BF0EB7033E004C33000000008600D20F6F043E007433000000009600DE0F5B043E009833000000009600E40F74043F00123400000000C600C80EBB0341002434000000009118E2368D1D41003634000000008618F10B890441005A340000000083080A106F04430062340000000086081310910443006A340000000086081C109604430074340000000086082510BB0344007E34000000009608B30E9B0444008634000000009608B30EA10445008E34000000009608B30EA70446009634000000009608B30EAE044700A03400000000C600BF0EB7034800F434000000008600D20F6F0448001C35000000009600DE0FA10448004035000000009600E40FB5044900AF3500000000C600C80EBB034B00C1350000000091002F10BD044B00D63500000000E6013B10C2044C00E83500000000E1014910CA044C00F535000000009118E2368D1D4C00000000000000C6058E0DDE044C00000000000000C605E80DEA044E000000000003008618F10BEF044E00000000000300C6018B10F5045000000000000300C601AD10FB045100000000000300C601B910050554000000000003008618F10BEF045500000000000300C6018B100B055700000000000300C601AD1012055900000000000300C601B91005055D000000000003008618F10BEF045E00000000000300C6018B101D056000000000000300C601AD1022056100000000000300C601B910050564000000000003008618F10BEF046500000000000300C6018B102B056700000000000300C601AD1031056900000000000300C601B9103B056D00000000000000C60DC31041056E00000000000000C605D01047056E00000000000000C605D01057056F00000000000000C605D01069057100000000000000C605D0107E0572000836000000008618F10B410874009C3600000000E109C61141057500A43600000000E601D01048087500DC3700000000E601D01059087600443900000000E601D0106C087800683900000000E601D01082087900743900000000810014129A087B00043A00000000810021129A087D003C3B0000000081002F129A087F00883C0000000081003C12AD088100F03C0000000096003F13CA088300FE3C0000000096003F13D60884000E3D0000000096003F13E4088700173D0000000096004F13CA088800253D0000000096004F13E4088900303D0000000093006013F2088A00503D0000000096006013CA088B005E3D0000000096006013E4088C00673D0000000096006E13F2088D00703D000000009118E2368D1D8E00000000000000C60D7D13FE088E00000000000000C60DC31041058E00000000000000C605981306098E00000000000000C605981310099000000000000000C605981318099100000000000000C60598131E099200000000000000C605981326099400000000000000C60598132F099600000000000000C605981336099700000000000000C60598133B099800000000000000C6059D1342099A002C3E000000008418F10B41089B00000000000000C60D7D13FE089C00493E00000000E609C31041059C00513E00000000C601981306099C005C3E00000000C601981310099E00933E00000000C601981318099F00A03E00000000C60198131E09A000D13E00000000C60198132609A200DC3E00000000C60198132F09A400133F00000000C60198133609A500203F00000000C60198133B09A600543F00000000E6019D134209A800DC3F000000008100BB135109A900000000000000C405C6136909AC00000000000000C405D3137309AC009840000000008418F10B4108AC00A14000000000C400D3137C09AD000000000003008618F10BEF04AD00000000000300C6018B108609AF00000000000300C601AD108D09B000000000000300C601B9109709B300B04000000000960021142E0AB40034410000000096002D142E0AB500B84100000000960036143E0AB60094420000000096004214560AB80008430000000096004B14740ABA0011430000000096004B149A0ABB006C4500000000910056149A0ABD00904500000000960069142E0ABF0014460000000096007114C80AC0001D460000000096007114E70AC100F0470000000091007C14E70AC30014480000000096008F14C80AC500604C0000000091009B14C80AC6007D4C000000009600AF14C80AC7005C4E000000009100C214C80AC800794E000000009300DD14C80AC9001C50000000009100E914C80ACA00A852000000009100FD140C0BCB00C85200000000910011150C0BCC009C530000000091002115280BCD004D54000000009118E2368D1DCE00000000000000C6050F0E570BCE005C54000000008618F10B6B0BCF00DC5400000000E6010F0E720BD00024550000000081000F0E820BD10018580000000081006315960BD40094580000000081008815AB0BD700E4580000000081008815C30BDB003C590000000081008815E30BDF00305A0000000081009815F90BE300000000000000C605A415000CE400000000000000C605AC15150CE700000000000000C605A415290CEA00000000000000C605AC153F0CED00000000000000C605A415290CF000000000000000C605AC153F0CF300A85A00000000E101B515000CF600C95A00000000E101F215150CF900E65A000000008418F10B3102FC00EE5A000000008418F10B3102FC00F85A00000000860860162B0DFC00405B0000000086086B16310DFC00885B00000000C600A415380DFD00E45B00000000C600AC154F0D00010C5C0000000091007616650D03016C5C00000000810086166D0D05018E5C000000008618F10B31020601A45C00000000C600A415380D0601005D00000000C600AC154F0D0901285D0000000093005217650D0C01CC5D00000000810065176D0D0E01435E000000008618F10B31020F01175E000000009118E2368D1D0F01000000000000C60D8B17F40D0F01000000000000C60D7D13FE080F01000000000000C60D9F17FE080F01000000000000C60DC310FA0D0F01000000000000C605B117000E0F01000000000000C605B117070E11014B5E000000008418F10B6B0B1201000000000000C60D8B17F40D1301000000000000C60D7D13FE081301000000000000C60D9F17FE081301685E00000000E609C310FA0D1301705E00000000C601B117000E1301E45E00000000C601B117070E1501000000000000C405D517180E1601000000000000C405DF17220E16015C5F000000008418F10B6B0B1601655F00000000C6088B17F40D17016C5F00000000C400D5172C0E1701000000000000C6058E0D370E1701795F000000008618F10B31021901825F000000008618F10B98031901A65F000000008608F717B7031A01AE5F0000000096000618440E1A01B85F00000000960006184A0E1C0114600000000096001718510E1F01D8600000000091002918570E21012A65000000009600DE0F5C0E220132650000000096083818630E2301436500000000960838185C0E24014B6500000000E10144186A0E2501726500000000C600BF0EB70327017C6500000000C6008E18780E2701CD6500000000C600C80EBB032801000000000000C6058E0D7D0E2801000000000000C6058E0D8E0E2A01DF65000000008618F10B31022B01EC65000000008618F10B6B0B2B01FF65000000008618F10BA10E2C01446800000000C6087D13FE082E01346900000000C6089F17FE082E01516900000000C400DF17AA0E2E015E69000000008618F10B6B0B2E017B69000000008608BC18B80E2F018369000000008608CF188F032F018C6900000000E6018E0DBC0E3001D06900000000E6018E0DCC0E3101E06C00000000C401E218DE0E3301206D00000000C401F118E50E3501306D00000000C4010C19EC0E3701846F00000000C4011819F60E3A01916F00000000C4012E19F60E3B019E6F00000000C4014419F60E3C01AC6F00000000C401BD0DE50E3D01E4700000000081004D19FC0E3F011F7100000000C4015719070E41013C710000000081006419030F420108720000000091006F19090F4301B87200000000C4018319120F4501F072000000008618F10B6B0B4601FC72000000009600781ABD104701DA7300000000C4004419F60E4B01E77300000000C4001819F60E4C01FC7300000000C4002E19F60E4D01097400000000C400E218DE0E4E013D7400000000C400F118E50E50015874000000009600921ACA1052012775000000009600A61AD21054013475000000009600A61ADA1056013C76000000009118E2368D1D5901000000000000C605BC1AE3105901000000000000C605C61AF0105C01000000000000C605D61AFC105F01000000000000C605E21A06116201D876000000009100F01A570E63012C78000000009100001B570E64018079000000009100111B0C1165018A82000000008618F10B310266019282000000008618F10B6B0B6601BA82000000008608991BB80E6701C282000000008608AB1B8F036701CB82000000008608BD1B45116801D382000000008608D11B4B116801DC82000000008608E51BB80E6901E482000000008608F81B8F036901ED820000000086000B1C31026A01FC8200000000E6018E0D52116A01408300000000E6018E0D62116B010886000000008100291C74116D019C87000000008100321C9311720100880000000081003D1C9B117501D4880000000081004C1CE50E7901948A0000000096005B1CAB117B019F8A0000000096005B1CB2117D01AC8A0000000091005B1CBA118001DB8B000000009600661CAB118401E68B000000009600661CB2118601F48B000000009100661CBA118901000000000000C60DB61CBB038D01000000000000C60DC11CBB038D01000000000000C60D050ECA028D01000000000000C6050F0EC9118D01000000000000C6050F0ED9118E013A8D0000000086080D1DB80E8F01428D000000008608211D8F038F014B8D000000008608351DB80E9001538D000000008608501D8F039001208F0000000086086B1DFE089101408F0000000086087C1DF6119101C08F00000000E609B61CBB039201CD8F00000000E609C11CBB039201DA8F00000000E609050ECA029201E88F0000000081000F0EFF1192011C910000000081008D1D121294011093000000008100951D2A129701B095000000008100A71D38129801B496000000008100B91D2A129B017098000000009100CC1D41129C01F898000000008100D61D4A129D01AC99000000008100E41D55129F01E89C000000008100EC1D7212A301719D000000009100F51D8312A501949D000000008600041E8A12A601449F000000009100111E9112A70190B3000000009100221E9612A80188B4000000009100321E9612A901E0B400000000E6010F0E9B12AA010CB500000000E6010F0EAC12AB0136B500000000E601A10E3102AC0145B500000000C401A10E8F03AC0155B5000000008618F10B3102AD0174B5000000008618F10B9803AD01EFB5000000009608AA1EBC12AE0109B6000000009608B61EBC12B00115B600000000C600BF0EB703B20144B600000000C600C80EBB03B2019CB600000000C6008E18780EB201ABB60000000086008E18C612B301B5B60000000086008E18CD12B401F4B6000000009118E2368D1DB60113B7000000008608D81EDA12B6011BB7000000008608E21EE012B60124B7000000008608EC1EE712B7012CB7000000008608F61EF212B70138B700000000C600BF0EB703B8019CB7000000008618F10B3102B801000000000000C605341F1E13B801A4B700000000E601341F3C13B901FCB7000000008100CD1F5713BA0168B8000000008100DC1F5713BC01E4B8000000008100EF1F5713BE01D8B9000000008100FE1F5713C00171BB000000008618F10B3102C201ECBA000000009118E2368D1DC20179BB000000008618F10B3102C2018CBB000000008618F10B7413C201A0BB0000000086083620BB03C301A8BB00000000860041203102C301B4BB00000000860047207913C301FCBB00000000860047208013C40164BC0000000086005C208713C50184BC00000000810063207413C601DBBC00000000C600BF0EB703C701EFBC000000009118E2368D1DC701FCBC000000008618F10B9E13C70128BD00000000E1019320A813C8018CBD00000000E101C720AE13C90193BD00000000E101F9207413CB019ABD0000000086081C10B513CC01B0BD00000000E1092F21B513CD01C6BD00000000E1095C21AE13CE01CDBD00000000E1019221BB13D001D4BD00000000E101C4213102D101DCBD00000000E101F421C113D10138BE00000000E1013022C713D2014DBE00000000E1096122BB03D40160BE00000000E6099522B80ED40163BE00000000E101A422C113D4016ABE00000000E101DC22CF13D50172BE00000000E1014910CA04D5017CBE0000000086001423D813D501F4BE0000000081001F233102D60122BF000000008618F10BEC13D60138BF00000000E6099623F713D7018DBF00000000E109A223FC13D7019CBF00000000E601CD23B80ED701CABF00000000E601D6233102D701D3BF00000000E101DC233102D701D8BF000000008618F10B1114D701A4C000000000E601BF20A813DA017AC100000000E101C720AE13DB0181C100000000E101F9207413DD0188C10000000086081C10B513DE019DC100000000E1092F21B513DF01B2C100000000E1095C21AE13E001B9C100000000E1019221BB13E201C0C100000000E101C4213102E301C7C100000000E6012722C113E301D8C100000000E6015C20C713E40188C200000000E6092510BB03E60190C200000000E6099522B80EE60193C200000000E101A422C113E6019AC200000000E6013B10CF13E701B3C200000000E1014910CA04E701CCC2000000008618F10B1114E701F4C200000000E6099623F713EA0144C300000000E109A223FC13EA0151C300000000E601CD23B80EEA017FC300000000E601D6233102EA018FC300000000E101DC233102EA01000000000000C60D3B24B80EEA01000000000000C60D4B24B80EEA01000000000000C60D5A24BB03EA01000000000000C6056824F713EA01000000000000C6056D24F713EA01000000000000C60571243102EA01000000000000C6057C241D14EA0191C3000000009600A6242F14EA019CC3000000009600A6243F14EB01000000000000C60D3B24B80EED01000000000000C6056824F713ED01000000000000C6056D24F713ED01000000000000C60D4B24B80EED01000000000000C60D5A24BB03ED01000000000000C60571243102ED01000000000000C6057C241D14ED01D1C300000000E601A10E3102ED01000000000000C405A10E8F03ED01EDC3000000008418F10B3102EE01E0C3000000009118E2368D1DEE01F5C3000000008618F10B9E13EE0114C400000000C6083B24B80EEF0122C400000000C6006824F713EF0130C400000000C6006D24F713EF014AC400000000C6084B24B80EEF0158C400000000C6085A24BB03EF0178C400000000C60071243102EF019CC400000000C6007C241D14EF01D0C4000000008100E4243102EF0140C500000000C400A10E8F03EF0150C5000000008618F10B5414F0017CC500000000C6085A24BB03F101A1C500000000C6084B24B80EF101AFC500000000C60071243102F101C0C500000000C6007C241D14F1010AC600000000C6083B24B80EF10118C600000000C6006824F713F10126C600000000C6006D24F713F10158C6000000008100E4243102F101F9C600000000C400A10E8F03F101000000000000C60DB61CBB03F201000000000000C60DC11CBB03F201000000000000C60D050ECA02F201000000000000C6057C24B703F201000000000000C6057C248713F201FBC6000000008618F10B9803F30121C700000000E609B61CBB03F40129C700000000E609C11CBB03F40131C700000000E609050ECA02F4013AC700000000E6095A24BB03F4015FC700000000E6094B24B80EF4016DC700000000E60171243102F4017DC700000000E1010F256314F40188C700000000E6017C24B703F401D2C700000000E6017C248713F40111C800000000C6093B24B80EF5011FC800000000C60168246B14F5012DC800000000C6016D246B14F50158C8000000008100E4243102F501B4C800000000810037253102F5013DC900000000E601A10E3102F5014CC900000000C401A10E8F03F5014EC9000000009118E2368D1DF6015BC9000000008618F10B7D14F60172C900000000E609B61CBB03F7017AC900000000E609C11CBB03F70182C900000000E609050ECA02F7018AC900000000E6095A24BB03F701AAC900000000E6094B24B80EF701B8C900000000E60171243102F701DBC900000000E1010F256314F701E4C900000000E6017C24B703F70118CA00000000E6017C248713F70140CA00000000C6093B24B80EF8014ECA00000000C60168246B14F8015CCA00000000C6016D246B14F801C0CA000000008100E4243102F80114CB00000000810037258314F8018BCB00000000E601A10E3102FA019ACB00000000C401A10E8F\
-03FA01AACB000000009118E2368D1DFB01BBCB000000008618F10B3102FB01C3CB000000008618F10B3102FB01CBCB000000008618F10B3102FB01D3CB000000008618F10B9803FB01E2CB000000008608AE26B703FC01EACB000000008608B7269803FC01F3CB000000008618F10B3102FD0100CC000000008618F10B4108FD0113CC000000008618F10BFE14FE0158CE00000000C6087D13FE08000275CE00000000C400C613071500027CCE00000000E609B61CBB03000289CE00000000E609C11CBB03000296CE00000000E609050ECA02000208D50000000084000F0E2E1600022CD500000000910047278312010262D6000000009100F51D8312020284D600000000910061274016030250D90000000091006C274E160402FCDB000000009100772755160502F0DC00000000910084274E16090241DD00000000E6010F0E69160A0254DD00000000E6010F0E7A160B0267DD00000000E601A10E31020C0276DD00000000C401A10E8F030C0286DD000000008618F10B31020D0299DD000000008618F10B31020D02A1DD000000008618F10B98030D02B0DD000000008608C727B7030E02B8DD000000008608DD2798030E02C1DD000000008618F10B31020F02C9DD000000008608212892160F02D1DD000000008608302898160F0274E600000000E601341F9F161002AEE6000000008618F10B3102110298E6000000009118E2368D1D1102B6E6000000008618F10B31021102B8EA00000000E601341F3C131102DCEA000000008618F10B31021202000000000000C605C22880171202000000000000C605DE2888171402000000000000C605F8288F171502000000000000C605102998171602000000000000C6051829A5171702E4EA00000000C601C2288017180235EB00000000C601DE2888171A0247EB00000000C601F8288F171B024AEB00000000C601102998171C024DEB00000000C6011829A5171D0250EB000000008618F10B31021E0258EB00000000C600C22880171E026CEB00000000C600DE2888172002D8EB00000000C600F8288F172102CCED00000000C600102998172202F0ED000000008618F10B31022302F8ED000000008618F10B3102230200EE000000008618F10BB61723021DEE0000000086083729B703260225EE0000000086084129980326022EEE0000000086084B29B703270236EE0000000086085329980327023FEE000000008608EC1EB703280247EE000000008608F61E9803280250EE00000000E6018E0DBD172902FCEF00000000C600BF0EB7032B0260F000000000C6008E18780E2B02C4F000000000C600C80EBB032C0221F1000000009600392C10182C0231F1000000009600472C1E182F023AF1000000009600592C1E18300243F10000000096006A2C1E1831024CF10000000096006E132C1832026DF1000000008618F10B3102330255F1000000009118E2368D1D330275F10000000086082510BB03330282F1000000008608AD2CB80E330292F1000000008600BA2C46183302B0F100000000860068244D183402E0F10000000086006D244D18340234F2000000008600BF2C5318340284F2000000008600CE2C53183502E0F2000000008600E02C58183602B0F3000000008600ED2C5818380278F4000000008600F72C5E183A02B1F4000000008600412031023B02C0F4000000008600032D65183B02F8F4000000008600102D6B183D0233F5000000008618F10B31023E02D1F2000000009100A75C5D363E02A3F30000000091000D5D5D363F0246F50000000086083E2D791840024EF50000000086084A2D7F18400258F50000000086081C106B18410280F5000000008608892186184202A7F5000000008600BF2C53184402BFF5000000008600CE2C53184502D7F5000000008600562D8C184602F4F5000000008600662D8C1848027CF700000000E6013B1093184A0298F700000000E1014910CA044A02A0F7000000008618F10B31024A02A8F9000000009600A72DDC184A02CCF9000000009600B42DE6184C02C4FB000000009100C32DEB184D02E8FB000000009600CD2DE6184F02FEFB000000008618F10BFA18500208FC000000008618F10B0119510284FE00000000C600102998175302A8FE000000008100F52D0919540294FF000000008618F10B23195502C6FF00000000E609B61CBB035702D3FF00000000E609C11CBB035702E0FF00000000E609050ECA025702F0FF00000000E6010F0E37195702180001000000E6010F0E471958023E0001000000E601A10E310259024500010000008618F10B5F195902780001000000E6018E0D7D0E5B02A00001000000E6018E0D8E0E5D02C600010000008618F10B73195E02D400010000008618F10B98035F02E000010000008618F10BB6176002EC00010000008618F10B791963025801010000008608752EB80E67026401010000009100981581196702D002010000009300812EE6186802C803010000008600932EB70369021E04010000008600A22EB70369024F0401000000C600BF0EB70369026B0401000000C6008E18780E690284040100000086008E185E186A02DC0401000000C600C80EBB036B025605010000009608AA1E87196B027B05010000009608B61E87196D02880501000000E601B22E91196F02C905010000009118E2368D1D7002D605010000008618F10B31027002DE05010000008618F10B98037002E705010000008618F10B98197102F105010000008618F10BA0197302FB05010000008618F10BAF1975020A06010000008618F10BB61976021A06010000008618F10BBE1978022B06010000008618F10BA0197B0235060100000086080E2FC9197D02000000000000C605C021780E7D02000000000000C605D522D5197E023D06010000008618F10B74137F02600601000000E601C021780E8002810601000000E601D522D5198102940601000000E601C021780E8202480701000000E601D522D5198302DA07010000008618F10B31028402CD07010000009118E2368D1D8402000000000000C60D702FDE198402F007010000008618F10B310284021808010000008618F10BEF1984022608010000008618F10BFC1985023408010000008618F10B0C1A86024308010000008618F10B1C1A88025208010000008618F10B2F1A8A026108010000008618F10B3F1A8C028508010000008608B82FB80E8E028D08010000008608D02F8F038E029608010000008608E82FB80E8F029E0801000000860801308F038F02A7080100000086081A30DE199002AF080100000086082730521A9002B70801000000E1093330DE199002C008010000008618F10B31029002E808010000008618F10BEF199002F608010000008618F10BFC1991020409010000008618F10B0C1A92021309010000008618F10B1C1A94022209010000008618F10B2F1A96023409010000008618F10B3F1A980281090100000086085D31C9199A0289090100000086086D31AF199A0292090100000086087D31BB039B029A090100000086088A3174139B02A3090100000086089731B80E9C02AB09010000008608A7318F039C02B409010000008608B731B7039D02BC09010000008608BF3198039D02C509010000008608C731B7039E02CD09010000008608D33198039E02D6090100000086081A30DE199F02DE090100000086082730521A9F02E609010000008608DF31B7039F02EE09010000008608F53198039F02F7090100000086080B32B703A002FF0901000000860820329803A002080A0100000086083532B80EA102100A01000000860853328F03A102190A01000000E1093330DE19A202210A010000008618F10B701AA2022D0A010000008618F10B761AA402620A010000008618F10B7E1AA8026F0A010000008618F10B871AAB02A60A010000008618F10BA019B002C60A010000008608B61CBB03B202CE0A010000008608050ECA02B202D60A010000008608C11CBB03B202E00A010000008600D232921AB202390B010000008618F10BA41AB502480B010000008618F10BAF1AB602580B010000008618F10BBB1AB802690B010000008618F10BA019BB02730B010000008608E932CA1ABD027B0B010000008618F10B3102BD02830B010000008618F10B9803BD028C0B010000008618F10B9819BE02960B010000008618F10BA019C002000000000000C605F932DE1AC202A00B010000008618F10BEE1AC302540C01000000C601F932DE1AC402000000000000C60D0C33F81AC502000000000000C605F932FE1AC502000000000000C605F932051BC6027C0C010000008618F10B231BC802C40D01000000E6090C33F81AC902CC0D01000000C601F932FE1AC902F40D01000000C601F932051BCA02540E0100000086085D332E1BCC025C0E0100000086087333341BCC02650E01000000860889333B1BCD026D0E0100000086089C33411BCD02760E010000008608AF33481BCE027E0E010000008608C3334E1BCE02870E010000008608D733551BCF028F0E010000008608E3335B1BCF02980E010000008608EF33621BD002A00E010000008608FF33681BD002A90E01000000E1010F348017D102C20E01000000E10152348817D302DA0E01000000E10192348F17D402F20E01000000E101DB349817D5020A0F01000000E1011435A517D602220F010000008618F10B3102D7020000000003008618F10BEF04D702000000000300C6018B108017D902000000000300C601AD10A61BDB02000000000300C601B910B21BDF020000000003008618F10BEF04E002000000000300C6018B108817E202000000000300C601AD10B81BE302000000000300C601B910B21BE6020000000003008618F10BEF04E702000000000300C6018B108F17E902000000000300C601AD10C31BEA02000000000300C601B910CE1BED020000000003008618F10BEF04EE02000000000300C6018B109817F002000000000300C601AD10C31BF102000000000300C601B910D61BF4020000000003008618F10BEF04F502000000000300C6018B10A517F702000000000300C601AD10E21BF802000000000300C601B910F11BFB022A0F010000008618F10B061CFC02380F010000008618F10B0E1CFD02A40F01000000E601C2288017FE02FC0F01000000E601DE2888170003BC1001000000E601F8288F170103B01301000000E601102998170203D41301000000E6011829A51703032C14010000009118E2368D1D0403141501000000C600C22880170403641501000000C600DE2888170603B11501000000C600F8288F170703D41701000000C600102998170803F817010000008618F10B310209030000000003008618F10BEF040903000000000300C6018B10911D0B03000000000300C601AD1031050D03000000000300C601B910B21B11030018010000008618F10BA51D12036018010000008618F10BAF1D1403C818010000008618F10BBC1D17033019010000008618F10B73191A03021B0100000086086E37901E1B03201B0100000086081C10991E1B03481B0100000093007B37A01E1C03621B0100000093008937A01E1D03941B010000008618F10BFA1E1E03E81B0100000086001829A5171F03FC1B010000008600D537011F2003481C010000008600E2370D1F2103881C010000008600EB371B1F2203F01C010000008600F937241F23032B1D0100000086004120310224035C1D0100000081000638311F240340210100000081000F38471F26036C230100000086001C385E1F2803BA23010000008618F10BBB132903D423010000008618F10B691F2A03F523010000008618F10B701F2C030B24010000008618F10B791F2E03282401000000C600BF0EB7033103BC2401000000C6008E18780E3103E4240100000086008E18831F3203442501000000C600C80EBB033303A325010000009608AA1E8E1F3303BD25010000009608B61E8E1F3503C9250100000086004538B7033703D825010000009600BF0EA01F37030E280100000086005338A51F38032228010000008618F10BB32239033128010000008618F10BBB223B0358280100000083002939C3223D03F0280100000083004639C9223E03F82A0100000083005839D0224003AD2B0100000086006739DC224503C82B0100000086006739C9224603EC2E0100000081006739E322480334300100000081006739F0224A03B8310100000081007E39F9224C03C033010000008300953903234F031034010000008100A6390E235203A434010000009100B23918235403C035010000009300C739182355033036010000009300E80D182356038436010000009300DD391F235703E536010000009100EC39A01E59030337010000009300F73927235A031A37010000009300F7392F235B032C37010000009300043A38235D036D37010000009300043A41235E03873701000000E1093330DE1960038F37010000009118E2368D1D6003D037010000009600113A570E60030438010000009600243A961261031F38010000009600313A961262033A380100000096003B3A961263035738010000009600443A9612640368380100000096004C3A961265038F380100000096002F10BD046603A438010000009600573A4B236703DB38010000009600643A50236803E438010000009600733A56236A031439010000008618F10B31026B032139010000008618F10B41086B033439010000008618F10BFE146C03483B01000000C6087D13FE086E03653B01000000C400C61307156E037C3B010000008618F10B41086E03903D01000000E601341F9F166F03B43D010000008100CD1F5B2370032C3E010000008100CD3A5B2372032C42010000008100DE3A78237403D442010000009118E2368D1D76030D43010000008618F10B310276031843010000008618F10B88237603514301000000E609B61CBB037703544301000000E609C11CBB037703574301000000E609050ECA0277035B4301000000E6010F0EAC127703744301000000E6010F0E9B127803604A0100000086000F0E8F237903844A01000000E601A10E31027A03934A01000000C401A10E8F037A03974A010000008618F10B31027B03A44A010000008618F10B6B0B7B03B74A010000008618F10BA10E7C03CC4C01000000C6087D13FE087E03BC4D01000000C6089F17FE087E03D94D01000000C400DF17AA0E7E03F64D010000008618F10B6B0B7E03204E01000000E601341F3C137F03604F010000008100CD1FA12380036050010000008100EF1FA1238303E451010000008100FE1FA1238603C453010000008100E41DC1238903E854010000008100153BE7238D039855010000008100213B78238E034056010000008618F10B6B0B9003605601000000E6018E0D52119103A45601000000E6018E0D6211920364570100000086008E0DF723940338590100000081002C3B0A249603D759010000008618F10B1E249803E6590100000086083C3B25249903EE59010000008108473B1E249903F75901000000C600B1172B249A030A5A01000000C600B11730249B031F5A01000000C600B11736249C03325A01000000C600B11798039F03405A01000000C600523B3102A0034D5A01000000C608583BF40DA0035F5A01000000C600C2288017A003735A01000000C600DE288817A203DC5B01000000C600F8288F17A303E06001000000C60010299817A403806401000000C6001829A517A503A464010000008618F10B3102A6038E5A010000009100A5596432A603AC64010000008618F10B3102A803B464010000008618F10B3102A803BC64010000009600AA3B7B24A803E764010000009600B43B8324A9033065010000009600BE3B8B24AA03B065010000009600D03B9324AB031466010000009600E23B9B24AC036466010000009600F13BA324AD03BC66010000009600003CAB24AE032C67010000009600003CB624B10368670100000096001A3CBE24B203A0670100000096001A3CC524B303E8670100000096001A3CCF24B503B03600000000E101CF466F28B603103700000000E1014910CA04B603183700000000E101CD23B80EB603A43700000000E1092047FC13B603AC3700000000E10162473102B603B33700000000E101DC233102B603B53700000000E109A223FC13B603BD37000000008618F10B7413B603083800000000E1017E48CF13B7035C3800000000E1014910CA04B703643800000000E101CD23B80EB703053900000000E109BC48F713B7030D3900000000E10162473102B703143900000000E101DC233102B703163900000000E109A223FC13B7032339000000008618F10B7413B7037E42000000008618F10B3102B803864200000000860096495E18B803384300000000E101BE49A52AB9038C4300000000E1014910CA04B903944300000000E101CD23B80EB9032C4500000000E1099B4AD42AB903344500000000E10162473102B9033B4500000000E101DC233102B9033D4500000000E109A223FC13B9034A45000000008618F10B7413B903444600000000E101A64C412BBA03984600000000E1014910CA04BA03A04600000000E101CD23B80EBA03B74700000000E1093C4D542BBA03BF4700000000E10162473102BA03C64700000000E101DC233102BA03C84700000000E109A223FC13BA03D047000000008618F10B7413BA033C4800000000E101A64C412BBB03844800000000E1014910CA04BB038C4800000000E101CD23B80EBB03E04A00000000E1093C4D542BBB03E84A00000000E10162473102BB03F04A00000000E101DC233102BB03C84B00000000E109A223FC13BB03D04B000000008618F10B7413BB03EF4B000000008100EC4E3102BC030B4C000000008100074F3102BC03274C000000008100224F3102BC03434C0000000081003D4F3102BC03A44C00000000E101A64C412BBC03EC4C00000000E1014910CA04BC03F44C00000000E101CD23B80EBC03C84D00000000E1093C4D542BBC03D04D00000000E10162473102BC03D84D00000000E101DC233102BC03184E00000000E109A223FC13BC03204E000000008618F10B7413BC033F4E0000000081008C4F3102BD039C4E00000000E101A64C412BBD03E44E00000000E1014910CA04BD03EC4E00000000E101CD23B80EBD03884F00000000E1093C4D542BBD03904F00000000E10162473102BD03984F00000000E101DC233102BD03D84F00000000E109A223FC13BD03E04F000000008618F10B7413BD03FF4F000000008100C44F3102BE033C5000000000E101EE4F3C2CBE03845000000000E1014910CA04BE038C5000000000E101CD23B80EBE036D5200000000E1095C504B2CBE03755200000000E10162473102BE037C5200000000E101DC233102BE037E5200000000E109A223FC13BE038652000000008618F10B7413BE03406600000000E101BC52672EBF03886600000000E1014910CA04BF03906600000000E101CD23B80EBF03D86700000000E1090053B703BF03E06700000000E10162473102BF03E86700000000E101DC233102BF03136800000000E109A223FC13BF031B68000000008618F10B7413BF033A6800000000810054533102C003646800000000E101BC52672EC003AC6800000000E1014910CA04C003B46800000000E101CD23B80EC003FB6800000000E1090053B703C003036900000000E10162473102C0030A6900000000E101DC233102C0030C6900000000E109A223FC13C0031469000000008618F10B7413C0035C8D00000000E101BC52672EC103A48D00000000E1014910CA04C103AC8D00000000E101CD23B80EC1038C8E00000000E1090053B703C103948E00000000E10162473102C1039C8E00000000E101DC233102C103DC8E00000000E109A223FC13C103E48E000000008618F10B7413C103038F0000000081003F553102C2036CC0000000008618F10B3102C20374C00000000086009155C113C2038CC00000000086009F55C113C30354CC00000000E101BC52672EC4039CCC00000000E1014910CA04C403A4CC00000000E101CD23B80EC403ECCD00000000E1090053B703C403F4CD00000000E10162473102C403FCCD00000000E101DC233102C40327CE00000000E109A223FC13C4032FCE000000008618F10B7413C4034ECE00000000810054533102C503A4CE00000000E101EE4F3C2CC503F8CE00000000E1014910CA04C50300CF00000000E101CD23B80EC503D0D400000000E1095C504B2CC503D8D400000000E10162473102C503DFD400000000E101DC233102C503E1D400000000E109A223FC13C503E9D4000000008618F10B7413C503DCDD00000000E101EE4F3C2CC60330DE00000000E1014910CA04C60338DE00000000E101CD23B80EC603D8E500000000E1095C504B2CC603E0E500000000E10162473102C603E8E500000000E101DC233102C60330E600000000E109A223FC13C60338E6000000008618F10B7413C60357E6000000008100A3573102C703C0E600000000E101B1572935C70314E700000000E1014910CA04C7031CE700000000E101CD23B80EC7037EEA00000000E1092158E712C70386EA00000000E10162473102C7038DEA00000000E101DC233102C7038FEA00000000E109A223FC13C70397EA000000008618F10B7413C7037FEB000000008618F10B3102C80387EB000000008600A559911DC803A0EB000000008600C359911DCA03AEEB000000008600E159911DCC03B8EC00000000E101875A8535CE030CED00000000E1014910CA04CE0314ED00000000E101CD23B80ECE038CED00000000E109DB5A7918CE0394ED00000000E10162473102CE039BED00000000E101DC233102CE039DED00000000E109A223FC13CE03AAED000000008618F10B7413CE0386EE000000008618F10BA535CF03A3EE0000000086083729F713D203ABEE0000000086084B294E2AD203B3EE000000008608EC1EB735D203BCEE00000000C600BF0EB703D2033CEF00000000C6008E18780ED2039CEF00000000C600C80EBB03D3031BF2000000008618F10B3102D30323F2000000008600465C3636D3036BF2000000008618F10B3102D40373F2000000008600695C3636D403BBF2000000008618F10B3102D503C3F2000000008600945C3636D5038DF3000000008618F10B3102D60395F3000000008600FD5C3636D6035DF4000000008618F10B3102D70365F4000000008600585D3636D70338F600000000E101CD23B80ED803F4F600000000E109BC5DC336D803FCF600000000E10162473102D80304F700000000E101DC233102D80344F700000000E109A223FC13D80351F7000000008618F10B7413D80360F7000000008100EC4E3102D903A8F700000000E101BC52672ED903FCF700000000E1014910CA04D90304F800000000E101CD23B80ED90314F900000000E1090053B703D9031CF900000000E10162473102D90324F900000000E101DC233102D90364F900000000E109A223FC13D9036CF9000000008618F10B7413D9038BF9000000008100FF5E3102DA0320FA00000000E101BC52672EDA0374FA00000000E1014910CA04DA037CFA00000000E101CD23B80EDA038CFB00000000E1090053B703DA0394FB00000000E10162473102DA039BFB00000000E101DC233102DA039DFB00000000E109A223FC13DA03A5FB000000008618F10B7413DA0328FC00000000E101875A8535DB037CFC00000000E1014910CA04DB0384FC00000000E101CD23B80EDB0339FE00000000E109DB5A7918DB0341FE00000000E10162473102DB0348FE00000000E101DC233102DB0355FE00000000E109A223FC13DB0362FE000000008618F10B7413DB035410010000008618F10B3102DC035C10010000008600A559911DDC03681101000000E101875A8535DE03BC1101000000E1014910CA04DE03C41101000000E101CD23B80EDE03CC1201000000E109DB5A7918DE03D41201000000E10162473102DE03DC1201000000E101DC233102DE034C1301000000E109A223FC13DE035913010000008618F10B7413DE037813010000008100A9603102DF039413010000008100C2603102DF03B41501000000E101875A8535DF03081601000000E1014910CA04DF03101601000000E101CD23B80EDF03961701000000E109DB5A7918DF039E1701000000E10162473102DF03A51701000000E101DC233102DF03A71701000000E109A223FC13DF03B417010000008618F10B7413DF03743901000000E101BC52672EE003BC3901000000E1014910CA04E003C43901000000E101CD23B80EE003DC3A01000000E1090053B703E003E43A01000000E10162473102E003EC3A01000000E101DC233102E003173B01000000E109A223FC13E0031F3B010000008618F10B7413E0033E3B01000000810054533102E103A43B01000000E101EE4F3C2CE103F83B01000000E1014910CA04E103003C01000000E101CD23B80EE103FC3C01000000E1095C504B2CE103043D01000000E10162473102E1030C3D01000000E101DC233102E1034C3D01000000E109A223FC13E103543D010000008618F10B7413E103733D010000008100DD623102E203BC4301000000E101B1572935E203104401000000E1014910CA04E203184401000000E101CD23B80EE203C84901000000E1092158E712E203D04901000000E10162473102E203D84901000000E101DC233102E2031C4A01000000E109A223FC13E203244A010000008618F10B7413E203434A010000008100F2633102E303F84A01000000E101BC52672EE303404B01000000E1014910CA04E303484B01000000E101CD23B80EE303604C01000000E1090053B703E303684C01000000E10162473102E303704C01000000E101DC233102E3039B4C01000000E109A223FC13E303A34C010000008618F10B7413E303C24C01000000810054533102E403EC4C01000000E101BC52672EE403344D01000000E1014910CA04E4033C4D01000000E101CD23B80EE403834D01000000E1090053B703E4038B4D01000000E10162473102E403924D01000000E101DC233102E403944D01000000E109A223FC13E4039C4D010000008618F10B7413E403865A010000008618F10B3102E503945A010000008600C359911DE503B85A010000008600E159911DE703D65A010000008600E565911DE903135B0100000086000366911DEB03265B0100000086002166911DED03585B0100000086003F66911DEF03845B0100000086005D66911DF103A05D01000000E101875A8535F303F45D01000000E1014910CA04F303FC5D01000000E101CD23B80EF303A16001000000E109DB5A7918F303A96001000000E10162473102F303B06001000000E101DC233102F303B26001000000E109A223FC13F303BF60010000008618F10B7413F303046101000000E101AB670F43F403586101000000E1014910CA04F403606101000000E101CD23B80EF403586301000000E1090A681E43F403606301000000E10162473102F403686301000000E101DC233102F403046401000000E109A223FC13F4030C64010000008618F10B7413F4032B64010000008100BE683102F5034764010000008100D9683102F5036364010000008100F4683102F5031265010000008618F10B3102F5031A6501000000860093691D05F5037E65010000008618F10B3102F6038865010000008600AB692B05F603FE65010000008618F10B3102F8030666010000008600D6691D05F8034D66010000008618F10B3102F9035566010000008600FE692B05F9031467010000008618F10B3102FB031C670100000086003D6A0B05FB03D267010000008618F10B3102FD03DA67010000008600666AF504FD0300000100393C00000100423C00000200493C00000100423C00000100423C00000100423C00000200493C00000100503C00000200423C00000100503C00000200423C0000030057\
-3C00000100503C000002005D3C00000300633C00000100503C00000200E33200000100503C000002005D3C000001005D3C000001005D3C00000100493C000001006D3C00000100423C00000200733C000003007A3C00000100423C00000200733C00000300823C00000100423C00000200733C00000100733C00000100733C00000100493C000001006D3C00000100733C000001008E3C00000100983C00000100983C00000100983C000001005D3C000001005D3C000001005D3C000001005D3C000001009D3C000001005D3C000001005D3C000001009D3C000001005D3C000001005D3C000001005D3C000001005D3C000001006D3C00000100A23C00000200A73C00000300AF3C00000400B33C000001005D3C000001005D3C000001005D3C000001005D3C000001005D3C000001005D3C02000200B73C00000100EA3C000002006D3C00000100F724000001005D3C000001005D3C000001005D3C000001005D3C000001005D3C000001005D3C02000200B73C00000100F23C00000100F43C00000200503C00000100FE3C00000200053D000001000C3D000001000C3D00000200253D00000300FE3C00000100B73C00000100FE3C00000200053D000001002E3D000002000C3D000001002E3D000002000C3D00000300253D00000400FE3C00000100B73C00000100FE3C00000200053D000001002E3D000001002E3D00000200253D00000300FE3C00000100B73C00000100FE3C00000200053D000001002E3D000002005D3C000001002E3D000002005D3C00000300253D00000400FE3C00000100B73C00000100423C00000100423C00000200353D00000100423C00000100423C00000200403D00000100B21300000100423C00000100423C00000200353D00000100423C00000100423C00000200403D00000100423C00000200353D00000100423C00000200353D00000100423C00000200483D00000100423C02000200B73C00000100A92600000100A92600000200523D00000300593D00000100A92600000100A92600000100A92600000100663D00000100663D00000100A926000001005D3C00000100703D00000200403D00000100703D00000100703D00000100703D00000200353D00000100703D00000200403D00000100703D00000100703D00000100703D00000200353D00000100703D00000100B21300000100703D00000200403D00000100703D00000100703D00000100703D00000200353D00000100703D00000200403D00000100703D00000100703D00000100703D00000200353D00000100703D00000100763D00000200423C00000300353D00000100B21300000100FE3C00000200053D00000100703D00000100703D00000200253D00000300FE3C00000100B73C00000100803D00000100803D00000100803D00000200873D00000100803D00000200913D00000100803D00000100803D00000200873D00000100803D00000200873D00000100803D00000100803D00000100803D00000200873D00000100803D00000200873D00000100803D00000100803D00000100803D00000100803D00000100803D00000100803D00000100493C00000100493C00000100493C000001005D3C00000100B213000001005D3C00000100423C000002009E3D000003005D3C00000100423C000002009E3D000003005D3C00000100423C000002009E3D00000300A73D00000400B03D00000100423C000002009E3D00000300A73D00000400B03D00000100423C000002009E3D00000300BB3D000004005D3C000001005D3C00000100B21300000200423C020003005D3C00000100B213000002005D3C02000300423C00000100B21300000200423C020003005D3C00000100B213000002005D3C02000300423C00000100B21300000200423C020003005D3C00000100B213000002005D3C02000300423C00000100B21300000200423C020003005D3C00000100B213000002005D3C02000300423C000001005D3C00000100B21300000200423C020003005D3C00000100B213000002005D3C02000300423C00000100C03D020002005D3C000001005D3C00000100B21300000200423C020003005D3C00000100B213000002005D3C02000300423C00000100C03D020002005D3C000001005D3C00000100C53D00000200CA3D00000100C53D00000100B21300000100C53D00000200CA3D00000100C53D00000100B21300000100F43C00000200503C00000100D13D00000100D13D00000200D73D00000100D13D00000200D73D00000300DE3D00000100D13D00000200D73D00000100D13D000001005D3C00000100D13D00000100D13D00000100F43C00000200503C00000100EB3D00000100423C00000200503C00000100423C00000100B21300000100B21300000200EF3D00000100B213000001005D3C00000100423C00000100423C00000200503C00000100503C000002005D3C00000100503C00000200913D00000100503C000002005D3C00000300FC3D00000100503C00000100503C00000100503C00000100503C000002005D3C00000100503C00000200402F000001005D3C000001005D3C00000100053E000002005D3C000001005D3C00000100B21300000100503C00000200D13D000003000E3E00000400F33000000100503C00000100503C00000100503C00000100503C000002005D3C00000100503C00000200913D00000100503C000002005D3C00000100503C00000200193E00000100503C00000200193E000003001F3E00000100283E00000200BB3D000003002C3E00000100283E00000200353E000003005D3C00000100283E000002003F3E000003005D3C000001005D3C00000100283E00000100283E00000100283E00000100B213000001005D3C000001005D3C000001005D3C00000100423C00000100423C00000200503C00000100503C00000200BB3D00000300453E000004004D3E00000500583E00000100503C00000200523D00000300593D00000100503C00000200523D00000300663D000004005D3C00000100503C000002005D3C00000100503C000002005D3C00000100503C000002005D3C000003008A1B00000100503C000002005D3C000003008A1B000004006C1B00000100503C000002005D3C00000100503C000002005D3C000003008A1B00000100503C000002005D3C000003008A1B000004006C1B00000100733C000001006B3E000001005D3C000001005D3C000001005D3C00000100423C00000200703E00000100423C00000200703E00000300783E00000100703E00000100703E00000200853E000003008B3E00000100703E00000100703E00000100703E000002008F3E00000100423C000002008F3E00000300973E000004004D3E00000100423C000002005D3C00000100703E00000100703E00000100A926000001009D3E000001009D3E00000100733C000001006B3E000001008E3C00000100A92600000100A03E00000200A23E00000100A03E00000200A23E00000100EB3D00000100A43E00000100A43E00000200A93E000001005D3C000001005D3C00000100703D00000100703D00000100CA3D00000200703D00000100CA3D00000200703D00000100CA3D00000200703D00000100CA3D00000200703D00000100B23E000001005D3C000001005D3C000001002A2000000100BB3E00000100BF3E00000100C83E00000100F72400000200C83E00000100F72400000100F72400000100F72400000100F724000002005D3C00000100C83E00000100C83E000001006A2F00000200CD3E00000100C83E00000100F72400000100BF3E00000100BF3E00000200FD2400000300D83E00000100C83E00000100F72400000200C83E00000100F72400000100F72400000100F72400000100F724000002005D3C00000100C83E00000100C83E00000100DF3E00000200CD3E00000100C83E00000100BF3E00000200FD2400000300D83E00000100BF3E00000100BF3E00000200E43E000001008E3C00000100BF3E000001008E3C000001005D3C000001008E3C000001002A20000001005D3C000001002A20000001008E3C00000100733C000001002A20000001004325000002005D3C000001008E3C00000100A926000001005D3C00000100B21300000100B21300000200EF3D00000100703E00000100703E00000100703E00000100703E00000100703E00000100703E00000200D13D00000300ED3E02000400F33E00000100703E00000100733C000001006B3E000001008E3C00000100913D000001005D3C000001005D3C00000100703D00000100703D00000100033F000002000A3F00000100033F00000100033F00000100033F000001001A3F00000100033F000002000A3F00000100033F00000100033F00000100033F000001001A3F00000100033F000002000A3F00000100033F00000100033F00000100033F00000100853E000002008B3E000003005D3C000001005D3C000001005D3C000001005D3C00000100F43C00000200503C000001005D3C00000100853E000002008B3E000003005D3C00000100A92600000100A92600000100A926000001005D3C00000100223F00000100523D00000100593D00000100523D00000200283F00000100593D00000200283F000001003A3F00000100433F00000200593D00000100593D00000100C83E00000100C83E000001005D3C00000100523D00000100523D000002005D3C00000100523D00000100593D00000100523D02000200593D00000100593D02000200523D00000100533F000002005A3F00000100BB3D00000100803D000002009D3E00000100663F00000100703F00000100703F00000200773F00000100033F00000100853F00000100763D000002008F3F00000100733C000001006B3E00000100F43C000002008F3F00000100423C00000200503C00000100423C00000100BB3D00000100663D00000100663D00000200523D00000300593D00000100663D00000200523D00000300593D000004009B3F00000100BB3D00000100593D00000100EB3D00000100A43E00000100A03E00000200A23E00000100A03E00000200A23E00000100A43E00000100A73F00000100A73F00000200AF3F00000100BE3F00000200C33F00000100CB3F00000100CB3F00000200A73F00000100CB3F00000200A73F00000300AF3F00000100BE3F00000200C33F00000100C83E00000100C83E000001000F3100000100C83E00000100C83E00000100C83E00000100C83E00000100D53F00000100D53F00000100DD3F00000200D53F00000100DD3F00000200D53F00000100E63F00000200D53F00000100E63F00000200D53F000001005D3C000001005D3C00000100D53F00000100D53F00000100DD3F00000200D53F00000100DD3F00000200D53F00000100E63F00000200D53F00000100E63F00000200D53F000001005D3C000001005D3C000001005D3C000001005D3C000001005D3C000001005D3C000001005D3C000001005D3C00000100A73F00000200F72400000100A73F00000200F724000003000A2500000400032500000100A73F00000200F72400000300AF3F00000100A73F00000200F724000003000A2500000400032500000500AF3F00000100BE3F00000200C33F00000100803D020002000A2502000300F43F00000100E33200000100E33200000200A73F00000100E33200000200A73F00000300AF3F00000100BE3F00000200C33F00000100A73F00000100A73F00000200AF3F00000100BE3F00000200C33F00000100F83F000001000A4000000100F83F00000100663F00000100124000000200F83F000001001F4000000100663F00000100124000000200F83F000001005D3C000001005D3C000001005D3C000001005D3C000001005D3C00000100033F000002000A3F00000100033F00000100033F00000100033F000001001A3F00000100FE3C00000200053D00000100274000000200344000000100274000000200344000000300253D00000400FE3C00000100B73C00000100FE3C00000200053D00000100404000000100404000000200253D00000300FE3C00000100B73C00000100FE3C00000200053D000001004A40000001004A4000000200253D00000300FE3C00000100B73C00000100FE3C00000200053D000001004A40000001004A4000000200253D00000300FE3C00000100B73C00000100FE3C00000200053D000001001A3F000001001A3F00000200253D00000300FE3C00000100B73C00000100554000000100554000000100033F000002000A3F00000100033F00000100033F00000100033F000001001A3F00000100033F000002000A3F00000100033F00000100033F00000100033F00000100FE3C00000200053D00000100604000000200694000000100604000000200694000000300253D00000400FE3C00000100B73C00000100754000000200794000000100274000000200794000000300824000000100404000000200794000000300824000000100BB3D000001008C4000000100BB3D00000100BB3D00000100DD3F000001001A3F00000100BB3D00000100BB3D00000100033F00000100BB3D000001009440020002009F4000000100053E02000200A44000000100BB3D00000100AD4000000100AD40000002005D3C00000100AD4000000200A92600000100AD4000000200A926000003005D3C00000100EB3D00000100A43E00000100A03E00000200A23E00000100A03E00000200A23E000001005D3C00000100AD4000000100B74000000200822F00000100E63F00000200822F00000100353D00000100353D000002000C3D000001002E3D00000200353D00000300C64000000400D040000005006940000001005D3C00000100353D000002005D3C00000100353D000002005D3C00000100353D000002005D3C00000100353D00000200DB40000003005D3C00000100353D00000200E540000003005D3C00000100E540000002005D3C00000100353D00000100353D00000100353D00000100E540000002005D3C00000100BB3D00000100BE3F00000100BE3F00000200BB3D00000100BE3F00000100BE3F00000200BB3D000001005D3C000001009D3E000001009D3E000001009D3E000001009D3E000001009D3E00000100F23C00000100F23C000001005D3C00000200F72400000100EE4000000100B21300000100B21300000200EF3D00000100B21300000100703D00000100703D00000200F44000000100703D00000200F44000000100A92600000200BB3D00000100B213000001006B3E00000100733C00000100733C000001008E3C00000100B21300000100B21300000200EF3D00000100B21300000100703D00000100CA3D00000200703D00000300913D00000100CA3D00000200703D00000300913D00000100CA3D00000200703D00000300913D00000100CA3D000002000141000003004D3E000004008F3E00000100CA3D00000100A92600000200BB3D00000100B21300000100423C00000100423C00000200503C00000100503C00000200423C00000100503C00000200493C00000100503C000001005D3C000001005D3C000001002A20000001002A2000000200F724000003000D41000001005D3C00000100033F000002000A3F00000100033F00000100033F00000100033F000001001A3F000001002E3D000002005D3C000001004A40000001004A40000001002740000001002740000001004040000001004040000001001341000002002141000003002C4100000100354100000100BB3D00000100BB3D000002000C3D00000100404100000100874700000100874700000100A92600000100874700000100874700000100874700000100874700000100874700000100874700000100874700000100874700000100874700000100AD5500000100AD55000001008747000001008747000001008747000001008747000001002E3D000002005D3C000001002E3D000002005D3C000001002E3D000002005D3C000001008747000001008729000002003724000003002E1F000001005D3C00000100C83E00000100C83E00000100C83E00000100C83E00000100C83E000001008747000001008747000001008747000001008747000001006040000002006940000001008747000001008747000001008747000001008747000001008747000001008747000001008747000001002E3D000002005D3C000001002E3D000002005D3C000001002E3D000002005D3C000001002E3D000002005D3C000001002E3D000002005D3C000001002E3D000002005D3C000001002E3D000002005D3C000001008747000001008747000001006040000001006040000002005D3C000001006040000001006040000002005D3C000001006040000002000C3D000001000C3D0700060009000D000A000A000A000D0011000E001100190013001200190016001C006C0022001E002400220025002600250022002B00A8002E00360031003A0036003E0038000D003900420039000D003D0046003F004A003F004E003F0052003F0019004000560040000D004000310041004A0041004E0041005200410019004200560042000D004200310043000D0044005A0044000D004700620047000D0048001C014800620048000D0049001C014900620049000D004E0066004E000D0052006A00540046005600540159006E005D0072005D0019006100760061000D0062007A0063007E0068009C0169009C016B00A8016C00A8017100C0017300C801740054017A0054018100A80184006A008500420085000D008700460088003E008E00B2008E0019008E00B6008E0031008E000D008F0052008F0019008F0056008F0031008F000D009100F600910019009100FA009100310091000D00920006019200190092000A019200310092000D00930006019300190093000A019300310093000D00940006019400190094000A019400310094000D00950006019500190095000A019500310095000D009600EA00960019009600EE009600310096000D0098003E0198001900980042019800310098000D0099003E0199001900990042019900310099000D009A003E019A0019009A0042019A0031009A000D009C003E019C0019009C0042019C0031009C000D009D00EA009D0019009D00EE009D0031009D000D009E00EA009E0019009E00EE009E0031009E000D009F00CE019F0019009F00D2019F0031009F000D00A1002201A1001900A1002601A1003100A1000D00A8007201A8003100A8000D00A9003E01A9001900A9004201A9003100A9000D00AA003E01AA001900AA004201AA003100AA000D00AB002201AB001900AB002601AB003100AB000D00AD002201AD001900AD002601AD003100AD000D00AE002201AE001900AE002601AE003100AE000D00AF003E01AF001900AF004201AF003100AF000D00B000EA00B0001900B000EE00B0003100B0000D00B100CE01B1001900B100D201B1003100B1000D00B2003E01B2001900B2004201B2003100B2000D00B3003E01B3001900B3004201B3003100B3000D00B5002201B5001900B5002601B5003100B5000D00B6001A01B6001900B6001E01B6003100B6000D0031003B10CA042C00C31041054400A415000C4400AC15150C6C008E0D370E9400BF20A8139400F220AE1394002621741394001C10B51394008921AE139C00C021BB139C00412031029C002722C1139C005C20C7139C002510BB039C00D522C113A4003B10CF1361009623FC131900A10E3102C4007C241D14B101F10B3102B901F10B3102C101F10B9803C901F10B9803D101F10B9803D901F10B9803E101F10B9803E901F10B9803F101F10B9803F901F10B98030102F10B98030902F10B98031102F10B31021902F10BD7242902F10B74133102F10B31020900F10B31023902F10B9803A10010298025A1002843B7034102354386254102AE26B703E10053438B256900654393255102A10F1B01E9017843B703C9018643B703C1019643B703D901A043B703D101AC43B703E100BE43B1255902F10B31024100F10BB6256902F10B31026902F7436F040101FF43CC25B100F10BD2250401A6242F140C013B24B80E0C016824F7131401AA1E8E1F1C01F10BAF1A14013B38501451028E0D1B260C016D24F713B10008442126A9001744CA02B1002F442626790255442E268102BF0E342614019F0B37131401B61E8E1FB100B1173B26B100B117741314012E1F661F24008E0DDE04B100B117512614014538B703B100B1179D0399028E18780E41007A44592641008344500441009C445F26A102A5446726B100B1176B260900BF0EB703F900C84470265102D44476260101DB44A5260900E444BC26E100EC44C126B902F10B9803C900D20F6F04B90008442126B9000E45BB03B9001745BB032C01C021BB13B9002145E726B9002A456726B9003545F026B9003F45CA0241004945F62651023620BB0351025945FC26F900F10B0127C900F10B9D03C10270453327D1027D453A27B900874554275102F10B36242901F10B3102290147206027B90091456B14B900F10BD2256902F10B6E272C01F10B3102D9029D459227A9004F0C9727E102F10B9B27C900F10B98033401E245AF273401C80EA813F902F10B31023C01E245AF273C01C80EA8138900F10B8618A102094667265102D444C0270903F10B980341003D46F6265102F10B30241903F10B980351026246570E51027046E72721038B46ED27C902E40FF3274401E245AF274401C80EA8133103F10B98031C003B10CF1381013B10CA044C01F10B310254013B10CF135C019623F7134C01C021BB136100CD23B80E64013B10CF136C019623F7136100D62331023903F10B3102410348487B2841035A48BB03B902F10B3102AC009623F7137401924716027401874716027401F10B74137401A74777287401B147200A7401423C200A74017E48CF137401F848851D74010949EF037401134750148401F10B74138401A74777288401B147200A8C014E49D0289401F10B31024903C02100299C01A415000C1401F10B701F1401BF0EA01F1401F10B691F1401F10BBB135103F10B9803A401B2132908A40198131009A40198131E09A401C61369098100F10B9803B4010F0EC911A401BB135109A40198132F09A40198133B09B4010F0ED911A401D3137309BC01D010470551017749B703B401050ECA02B401C11CBB03B401B61CBB03BC01D0105705A401C31041053400F10B41083400C3104105CC012510BB03C4011C10B513D4013B10CF13DC019623F713E4018B108609E401F10BEF04EC013B10CF13F4019623F713FC01EC1E4E2A0402F10B9E13FC01F10B102B0C023B10CF1314029623F7131C028B1086095902F10BFB2B0C01712431020C017C241D149C01AC15150C2C0158379E13E1005651B80E91026151982C91026751982C91027A51982C590361519D2C590367519D2C59037A519D2CF1009851FC13F100EC1EFC1324029623F7132C029851F7132C02EC1E4E2A8C01A051F32C34023B10CF133C029623F71344023B10CF134C029623F7135402A415290C5402AC153F0C5400F10B31025102AA1E672D4100BA518A2D4100BF0E6B185C00F10B3102F900C5519B2D7903D151B80E7103ED51A22D81031C10A82D8903EC1EB703B102E40FAF2D410000522D02410009522D026402B213660B6402D517180E6402DF17220E6C020F0E570BF4008E0D7D0EF4008E0D8E0E6400F10B6B0B6400C310FA0D8900F10B98035102125265185102D444052E51021A520C2E7402F10B74137402C021102B74024E49D0289100B117980309008E18780E99039552392E99038E183F2E9903C80E4B2E8101A152502E7C023B10CF1384029623F713A103F10B3102A103DB53802E9100B1172B24A102EC53CA02C902BF0EC22E1101BF0EC22E9102F653982C9102BF0EC22EA903BF0EC22E8102BF0EC22EB102BF0EC22EB103BF0EC22E5903F6539D2C5903BF0EC22E0103BF0EC22EB903BF0EC22EC103BF0EC22EC9032354CA2E8102BF0E6B1841013C54F02E11003C54F72E8C024E49D0281100BF0E6B1851024654072FC9034B54222F11005454272F81013620BB039402F10B7413C9035338362F9402C021BB139402F743402F81015E54462F110067544B2F11017054612F1101B30E682F1101B61E6F2F9C02F10B310251021A527F2F9C022722C113A4022722C1139C02C021BB13510246548F2F9100B117982F9100B1179F2F91004D199F2F91004D19310241008C54BB0341009554BB0341009F54BB034100A754BB034100B054BB034100BB54BB034100C654BB039100B117AD2F9C02F10B9E13D103F10B3102AC02A6242F14B4026824F713BC023B385014BC029F0B3713B4026D24F713C402F10B3102CC02F10B31025102B61E672DD4028921102BB4023B24B80EBC022E1F661FDC008E0D370EBC024538B703DC02F10BAF1AE4029623F713EC029851F713EC02EC1E4E2AF4023B10CF13FC029623F71304039851F7130403EC1E4E2A0C033B10CF1314039623F7131C03F10B31022403C021BB1324032510BB03C40071243102C4006824F713C4006D24F713C4003B24B80E2C03C021BB131103BF0E7E31BC02B61E8E1FBC02F10B791F5102D44483313403F10B31023403C021BB1324032722C1135102D522C03134032510BB0334031C10B513BC02AA1E8E1F34032621741334033B10F4313C039623F7133C03CD23B80E2C032510BB032C031C10B5132C038921AE138102E40F2E325102D4443B3251028E1853182C03F10B310209004D55643244038E18713214015338A51F29014720D932E9036255E3328101A1523A274C03F10B3102540379208E1354037F20961309008E18643254031423D8134C031C10B513F103F10B310254031F2331024C035C20C7134C032510BB035C03F10BEC1354038820B50E4C03C021BB135C038D23E3135C03190E160254031C10B5135C039623F71364032624091464032C2416026403322416026C03C83E50146C03F10B31026C039155C1137C03F10BEF048101BB5546336C039F55C1134C03BB555C336403BF20A8134C035C208C338403F10B11148403262409148403190E160284032C24160284033724160284039623F713BC00A6243F148C03F10B54145403F10B9E139403F10B9E13BC00A10E8F03BC004F0C2614BC00F10B31029403430496139403E42431029403CA24B50E9403D62450149403C224B50E9403DE248E134C03F10B74134C03412031024C03F955C6338C03F72416028C03FD2416028C03F02409146403F10B11148C03E42431028C03CA24B50E8C03D62450148C03C224B50E29014720E433E9009813BB03E900A10E3102E9004F0C74140904F10BF2336900F10B3102C4005A24BB031101F10B74131101DE0F4B341101C8566F2F1101DE566F2F1101B30E58341101F10B6B261101B30E5F349102DE0F66342901F10B74138102DE0F8134290147208C34BC025338A51FF900125265189C033B10CF13A4039623F71331011359B80E31011F59433531012C59B80E31013959433519045159B80E39015159B80E39015E59B80E4101FF59BC264101115ABC26E100305A5E3531013C5ABC262904EC1EFC133104F10BC635AC03D35B5014AC03E35BAF35AC03F15BB33529014720E235BC03E245AF27BC038E187132C403E245AF27C4038E187132CC03E245AF27CC038E187132BC03C80EA813C403C80EA813CC03C80EA813D403F10BA535BC02F10B691FBC02F10B701FBC02F10BBB13DC032510BB03DC03C021BB13DC031C10B513DC0326217413E403F10BEF04DC035B5C4636DC03E15C6E36DC0341203102DC03F10B3102EC034E49D028EC03F10B9D36EC038921102BEC03775DC113EC03835DA836EC03915DAE36EC039E5DB436F4031C10B513EC033B10D53651\
-02BF2007375102535FB70349045D5FE6184101AE26B7035102845FB7031103845F183751027046C0315102955FB7039C02F10B74131103A65F2F371103B65F2F371103A65F96129C02F743402FFC03322E0F19FC033C2E18190404341F1E130C04482E56190C043C2E181914048E0D7D0E14048E0D8E0E6103C65F8537E100DC5F8D37E100ED5F9337E100FA5FB80EE1000660B80E510218609A375102BF20A3375102D444B13799033760B9378100F10B31028100F10B98198100F10BA0195904C731D2373902F10B3102E9034B60E3321C04E3329B1A8900F10B31028900F10B98198900F10BA01999034F60392E2404F10BE7372C043B10CF1334049623F7133C04775DC1133C048921102B3C044E49D0284404F10BE7374C043B10CF1354049623F7135C04775DC1135C048921102B5C044E49D02864043B10CF136C049623F71374043B10F4317C049623F7137C04CD23B80E7404F10B31027404C021BB1374042510BB0374041C10B513A100D0601139A100E444173939010E61BC26E1002843B7036104F10B9803E1002E61403919043E614A398404F10B741369014C61BC268C048921102BE1005E616539E100686191398C049E5D96398C044E49D028E1007361B80EE1008361B80EE1009261B80EE100BB61A4399404F10B31029C04F10B3102A404F10B3102AC04F10B3102B4044E49D028BC044E49D028C4044E49D028CC0441203102D40441203102DC0441203102E40441203102BC048921102BB4048921102BF404F10B3102E100CA61DA3A3101D8614A398C01775DC1138C018921102BE100EB61E43AFC04F10B31028C028921102BC4048921102B04054E49D02804058921102B0C053B3850140C059F0B37130C052E1F661F0C054538B7030C05AA1E8E1F0C058E18831F1405E245AF2714058E1871321C05E245AF271C058E1871321405C80EA8131C05C80EA8130C05BF0EA01F7904BF0E34268104BF0EC22E2405F10B791F2C05F10B31026901AE26B703EC049E5D9639EC041C10860971019E5D663C71011C101D05EC048921102B710189212B0589041962933CE10028629A3C8C011C1086091100DE0FA03C11003C62182311006754A83C4100DE0FAF3C61034E62BB3C9900F10B9803B102DE0FC73CA1025862CC3CA102DE0FD33CA102F10B6B2651028E0DDA3CC903BF0E283DE100E80DBC2634053B10CF133C059623F71379012510BB03810119628A3D79015C20933D9401C021BB13E1006262BC26E1007B62B43DE1008B62B80E69003C542F236900654341231103643A50231103733A56234C05F10B231954052510BB035C053B10CF1364059623F7136C05EC1E4E2A6C059851F71374052510BB037C053B10CF1384059623F7138C051C10B5139405F10B31029C05775DC113A405F10B31029C058921102B9C051C1086097405C021BB139904DE3AE6188901F10B31028901F6628F0389011B633B40A904F10B98039101A6244840B1044B638F03B1047063534091019813B80EC1040E64BB03C1041F64BB0391013A64964091014764B70391015564B70391016064B70391017164B80E91018464B80EAC05F10B31029101EC1EB703B4058921102B91019664B80EBC053B10CF13C4059623F713CC059851F713CC05EC1E4E2A9101AE26B703D405F10B5F19DC05F10B3102E405775DC113E405C021102BEC053B10CF13F4059623F713FC059851F713FC05EC1E4E2A0406412031022901F10B98032901472006429904AA64E618D104F10B3102D104F6628F03D1041B633B40D104CC642742D104D9648F03D104E4649803D104F4649803D10415652E42D10429658F039901A624354299014065B6179901526531029901BD0D9803DC02F10BBB1A99016265B6179901766531029100F10B31029901886598039901886536249901523B31029901C3108942D104583BF40DE1005E619542A1017B66BC26E9046967B703E9042C0FB703F1047967B703F1042C0FB703F9046967B703F9042C0FB70301058667B70301052C0FB70309056967B70309052C0FB7031105AE26B7030C062510BB031406F10B74131406C021BB1314063B10F4311C069623F7131C06CD23B80E1905F10B31022105F10B310219048B100B0531011F597C43310139597C4339015E541D053901136A2B0539011C6AB80EE1005E61A043A9018B10F50405002C002B01050030002D01050034002F0105003800310105003C00330105004000350105004400370105004800390105004C003B01050050003D01050054003F0105005800410105005C00430105006000450105006400470105006800490105006C004B01050070004D01050074004F0105007800510105007C005301050084002B01050088002D0105008C002F010500900031010500940035010500980059010E009C005B010E00A00086010E00A400B3010800A80019020800AC001E020800B00023020800B40023020800B80028020500BC002B010500C0002B010500C4002D010E00CC00F2020E00080186010E000C019B050E001001D0050E00140123060E0018018A060E001C01AF060E002001D4060E0024010B070E00280174070E002C01D3070E00300102080E0070019E090E007401DB09080080013E0B08008401190208008801430B08008C01480B080090011E02080094014D0B08009801520B0E00A401540C0E00A801910C0E00AC01DA0C0800B8013E0B0800BC0119020800C001430B0A00C401810D0A00C8018A0D0E00CC01930D0E00D001DE0D0E00D401EB0D0E00E80186010E00F8011D0F0E00FC01380F0E0000028D0F03000402990F030008029C0F0E000C029F0F0E001002A20F0E001402E10F0E001802F20F0E001C024510080030023E0B08003402190208003802430B08003C021E02080040022302080044021811080048021D1108004C022211080050022711080054022C1108005802311108005C0236110E006002860108007C023E0B08008002190208008402430B080088021D110E00B40286010800D8021D1108001C031811080070031D110E009C0389140E00A0039C140E00A403A5140E00A803B0140E00AC03B9140E00B003C0140300B403D1140300B803D4140300BC03D7140300C003DA140300C403DD140300C803E0140300CC03E3140300D003E6140300D4039C0F0300D803E9140300DC03EC140300E0039F0F0E00E403EF140E00E803F4140E00EC03F9140E00F80312150E00FC033D150E00000472150E000404A3150E000804CA150E000C04F915080010041D1108001C043E0B08002004190208002404430B0E002C048F160E00300486010E003C0486010E004004C5160E004404F4160E0048043B17080050043E0B08005404190208005804430B03006804CB1703006C04CE1703007004990F030074048F1603007804D11703007C04E01403008004E31403008404E61403008804D41703008C04D71703009004DA1703009404DD1703009804E01703009C04E3170300A004E9140E00A404E6170E00A804E6170E00AC04EB170E00B004FA170300B404FF170E00B80402180E00BC04FF170E00C004FF170300C40407180300C8040A180300CC04D1170300D004E3170300D404E0140300D804D7170300DC040D180E00E00407180E00E40407180300E804D7170300EC040A180300F004D1170300F404EC140E00F804D7170E00FC04D71708000C053E0B08001005190208001405430B08001805480B08001C051E02080020054D0B0E003C05AB1808004C053E0B08005005190208005405430B08005805480B08005C051E0208008C053E0B08009005190208009405430B0800A0051E020800A405430B0E002406191C0E002806521C0E002C06B71C0E003006181D0E006C06C91D0E00A006DA0C0E00B006B21F0E00B406D71F0E00B8061E200E00BC06BC200E00C006F3200E00C406DD210E00E00686010E00E40602080E00E806F4160E00080786010E001C0786010E00280749240E002C075C242E000B0119022E001301B4442E001B01BD442E000301A3442E00C300E2432E002301C6442E00721C19022E00BB00D1432E00D300FE432E00CB00F8432E00DB0014442E00E3001E442E00EB00F843E301A30119022102A301190223025B040F28E102A3011902E303721C19026104A30119022005DB0319024005DB0319026005DB0319028005DB031902A306330A1902E106DB0319020007DB0319020107DB0319022007DB0319024007DB0319026007DB0319026107DB0319028107DB031902E3075B040F2823085B040F2863090B0EF93383090B0E1334030A0B0EF933040AB3001902040BB3001902A30B5B040F28C30F5B040F2883110B0E6E43A311FB171902A311F3171902C311DB031902E311DB0319020312DB0319022312DB0319024312DB0319026312DB0319028312DB031902A312DB031902C312DB031902E312DB0319020313DB0319022313DB0319024313DB0319026313DB0319028313DB031902A313DB031902C313DB031902E313DB0319020314DB0319022314DB0319024314DB0319026314DB0319028314DB031902A314DB031902C314DB031902E114DB031902E314DB0319020315DB0319022315DB0319024015721C19024315DB0319026015721C19026115DB0319026315DB0319028015721C19028115DB0319028315DB031902A015721C1902A315DB031902C015721C1902C315DB031902E015721C1902E315DB0319020316DB0319022016721C19022316DB0319024016721C19024316DB0319026016721C19026316DB0319028316DB031902A016721C1902A316DB031902C316DB031902E016721C1902E316DB0319020317DB0319022017721C19022317DB0319024317DB03190260179B06012C6317DB0319028317DB031902C121DB031902E122DB0319020123DB0319022123DB031902A425B3001902E028DB0319020029DB0319026129DB0319028129DB031902C129DB031902402DDB031902602DDB031902802DDB031902A02DDB0319026130DB0319028130DB031902A130DB031902C130DB031902E130DB0319022139DB0319028139DB031902E43FB30019020044DB0319022044DB0319024047DB0319026047DB0319028047DB031902A047DB031902C047DB031902E047DB031902204BDB031902404BDB031902604BDB031902804BDB031902C14CFB0ECD35E14CFB0ECD35014DFB0ECD358450B3001902E450B30019026451B30019020452B30019026452B3001902E452B3001902005CDB031902205CDB031902405CDB031902605CDB031902805CDB031902A05CDB031902C05CDB031902E05CDB031902005DDB031902205DDB031902845FB3001902A46DB3001902A46FB3001902C06FDB031902E06FDB0319028071DB0319024073B30419026073B3041902A073B3041902C073B30419020074B30419022074B30419024074B30419026074B3041902A074B3041902C074B30419020075B30419022075B30419028075B3041902A075B3041902E075B30419020076B30419020476B30019024076B30419026076B30419028076B30419028476B3001902A076B3041902E076B30419020077B30419024077B30419026077B30419028077B3041902A077B3041902E077B30419020078B30419024078B30419026078B30419020079B30419022079B30419026079B30419028079B3041902C079B3041902E079B3041902207AB3041902407AB3041902807AB3041902A07AB3041902E07AB3041902007BB3041902407BB3041902607BB3041902A07BB3041902C07BB3041902007CB3041902207CB3041902407CB3041902607CB3041902A07CB3041902C07CB3041902007DB3041902207DB3041902607DB3041902807DB3041902C07DB3041902E07DB3041902207EB3041902407EB3041902607EB3041902807EB3041902C07EB3041902E07EB3041902207FB3041902407FB3041902E07FB30419020080B30419024080B30419026080B3041902A080B3041902C080B30419020081B30419022081B30419026081B30419028081B3041902C081B3041902E081B30419020082B30419022082B30419026082B30419028082B3041902C082B3041902E082B30419022083B30419024083B30419028083B3041902A083B3041902E083B30419020084B3041902A084B3041902C084B30419020085B30419022085B30419026085B30419028085B3041902A085B30419022086B30419024086B30419026086B3041902E087B30419020088B30419024088B30419026088B3041902A088B3041902C088B30419020089B30419022089B30419026089B30419028089B3041902C089B3041902E089B3041902208AB3041902408AB3041902808AB3041902A08AB3041902C08AB3041902E08AB3041902208BB3041902408BB3041902808BB3041902A08BB3041902008CB3041902208CB3041902608CB3041902808CB3041902C08CB3041902E08CB3041902408DB3041902608DB3041902A08DB3041902C08DB3041902008EB3041902208EB3041902408EB3041902608EB3041902A08EB3041902C08EB3041902008FB3041902208FB3041902608FB3041902808FB3041902C08FB3041902E08FB30419022090B30419024090B30419028090B3041902A090B3041902E090B30419020091B30419024091B30419026091B3041902A091B3041902C091B30419020092B30419022092B30419026092B30419028092B3041902C092B3041902E092B30419022093B30419024093B30419028093B3041902A093B3041902C094B3041902E094B30419022095B30419024095B30419028095B3041902A095B3041902C095B3041902E095B30419022096B30419024096B30419028096B3041902A096B30419029C25C425F72540267C26AB26B126B626C926D126EB26092747275A2767277527A227C727CE27D427DD27E22700284028812887289328A828B728D928052923293B294929572968297D29C129EE29532A0A2B182B7A2BB22BB82BE32BEA2BF02BF52B612C672C712C832CA22CDB2CEA2C0C2D3D2D612D6D2D732D7E2D972DBC2DC52DDC2DF02D132E342E452E742E7A2E862E8D2EBC2ED12EE72E0E2F522FA52FB42FBD2FC92F3130CC30033115311D3135315B3171319131B531C531CE31E531F0310732223241324C325E3279327E3283329F32B332C232D332E932FF320C33283369339633BD33D033D933ED3332343D344334713493341602A334E334EF343D3549356E359935EC350A3621362F36513657367A3684368E36E436F136F736013712371D372837353757377737A837BF37C63709381A3844385E38643883388D38B538C438F138F738FF3804391D392C393A396C399F39013A303A453A6E3AEE3A923BFB3B0F3C183C323C603C6C3CE13CFC3C303D693D9B3DA13DBF3DCA3DD23DDC3D013E073E113F234042405A409040D340F14000410641184138416C41DB410E42164240424C4273429F42E5424F438343894394439A43B443BA43C043CB43090001000A0002000C0003000F0005001000070011000B0018000F00190010001B0011001C001300270015002A0016002B001A002C001E002E001F0030002000310022003600230038002600390029003B002F003E0031003F003200400036004100380042003C0043003E0044004100450044004600470047004A0048004D00490053004C0059004D005A004E005B0050005E0052005F00590060005C0063005D0065006100670063006A0065006B006A006C006B006D006C0072006D007D006E0080007200810073008200740083007E00880081008A0083008B0085008C0086008F00890091008E0093008F009500910097009200990093009B0094009D0095009F009600A1009800A3009900A5009A00A7009C00A9009D00AB009E00AD009F00AF00A100B100A200B300A800B600A900B800AA00BA00AB00BC00AD00BE00AE00C000AF00C200B000C400B100C600B200C800B300CA00B500CC00B600CE000000190EEE020000190EEE020000270FFE0300004F0603040000970F3A040000320C3E040000ED0F7C040000F20F81040000FA0F81040000FE0F810400007610CF0400007B10D40400008010D9040000851081040000D810950500004B1295050000A61349090000D81095050000A61349090000D810950500008E0D730D0000B7170C0E0000A61349090000C71749090000D810120E0000B7170C0E0000A61349090000C71749090000D810120E0000B7170C0E000095183A040000A61349090000C717490900009219190F00007A1C190F0000881CC3110000981C190F0000CA1C81040000D11C81040000190EEE020000651E190F0000751E190F00008C1E49090000CA1C81040000D11C81040000190EEE020000EA030D1300002E1F131300007220810400008010DD1300002923DD1300005223810400008223190F0000F72300140000FF23051400008010DD1300002923DD1300008510810400008223190F0000F72300140000FF23051400008524190F00009124190F00009C24810400008524190F00009124190F00009C24810400008524190F00009124190F00009C24810400009C24810400009124190F00008524190F0000CA1C81040000D11C81040000190EEE020000CA1C81040000D11C81040000190EEE0200009C24810400009124190F00008524190F0000CA1C81040000D11C81040000190EEE0200009C24810400009124190F00008524190F00009F0B3A040000A61349090000CA1C81040000D11C81040000190EEE020000F3273A0400005B28BF16000087293A04000037243A0400002E1F3A0400008510810400001F2D190F00008C2DA01800008010A6180000CA1C81040000D11C81040000190EEE020000BC2E190F00001C2FCF1900001309E41900007C30190F00009030190F0000A530E4190000BE11611A0000AE30E41900007132CF190000372F810400007D32190F000089323A0400008D323A040000A530E4190000BE11611A000095323A040000A7323A040000B832190F0000AE30E4190000CA1C81040000190EEE020000D11C81040000F332D41A000022330D1B000022330D1B0000C228881B0000DE288E1B0000EB35941B000010299A1B00001829A01B00009937A61E00008010AF1E0000AE30E4190000A61349090000CA1C81040000D11C81040000190EEE020000A61349090000C717490900007D3B4324000082170C0E0000DA4705140000FF2305140000164900140000FF2305140000B64BF42A0000FF2305140000F54D6B2B0000FF2305140000F54D6B2B0000FF2305140000F54D6B2B0000FF2305140000F54D6B2B0000FF2305140000EE50562C0000FF230514000078533A040000FF230514000078533A040000FF230514000078533A040000FF230514000078533A040000FF2305140000EE50562C0000FF2305140000EE50562C0000FF2305140000A95813130000FF2305140000445BA0180000FF23051400008729001400003724BC3500002E1FC1350000445ECC360000FF230514000078533A040000FF230514000078533A040000FF2305140000445BA0180000FF2305140000445BA0180000FF2305140000445BA0180000FF230514000078533A040000FF2305140000EE50562C0000FF2305140000A95813130000FF230514000078533A040000FF230514000078533A040000FF2305140000445BA0180000FF2305140000036949430000FF23051402001200030002001500050002002900070001002A00070002002B00090001002C000900020038000B00010039000B0002003A000D0001003B000D0002003F000F0002004000110002004100130002004200150002004E00170002004F001900020050001B00020051001D00020071001F0002007700210002008A00230002008B0025000200960027000200970029000100D3002B000200D2002B000200DF002D000200E0002F000200E10031000200E20033000200E60035000200E70037000200E80039000200E9003B000200EF003D000200F4003F0002000501410002000601430002000901450001000A01450002002D01470001002E01470002002F014900010030014900020031014B00010032014B00020040014D00020041014F0002004201510002004501530001004601530001004801550002004701550002004901570001004A01570002004B01590002004C015B0002004D015D0002006A015F0001006B015F0002006C01610001006D01610002007A01630002008601650002008701670001008801670002008D01690002008E016B00020095016D00020096016F0002009E01710002009F0173000100A00173000200A50175000200A60177000200AB0179000200AC017B000200B0017D000200B1017F000200B20181000200B90183000200BC0185000200BD0187000200C50189000200C8018B000200C9018D000200CF018F000200D00191000200D30193000200D80195000200D90197000200DA0199000200DE019B000200DF019D000200E0019F000200E101A1000200E201A3000200E701A5000200F001A7000200F101A9000200F201AB000200F301AD000200F401AF000200F901B10002000502B30001000602B30002000A02B50002000C02B70002000D02B90002000E02BB0002001D02BD0001001E02BD0002002002BF0001002102BF0002003A02C10001003B02C10002003C02C30001003D02C30002003E02C50001003F02C50002004B02C70002004C02C90001005C02CB0002005B02CB0001005E02CD0002005D02CD0002006F02CF0002007002D10002007102D30002007C02D50002009102D70002009B02D9000200A302DB000100A402DB000200A502DD000100A602DD000200A702DF000200A802E1000200A902E3000200B102E5000100B202E5000200B302E7000100B402E7000200B502E9000100B602E9000200B702EB000100B802EB000200B902ED000100BA02ED000200BB02EF000200BC02F1000100BE02F3000200BD02F3000100C002F5000200BF02F5000200C102F7000100C202F7000200C302F9000200C902FB000200CA02FD000200CB02FF000200D10201010200D90203010200DD0205010200E00207010100E10207010100E30209010200E20209010200E4020B010100E5020B010200E6020D010100E7020D010200E8020F010100E9020F0102001903110102001A031301020049031501020058031701020062031901020063031B01020064031D0102006D031F0102006E03210101007F03230102007E03230102008503250102009D0327010200A00329010200A5032B010200A8032D010200AF032F010200B20331010200B70333010200BA0335010200BF0337010200C20339010200CB033B010200CE033D010200D4033F010200D70341010200DD0343010200E00345010200E50347010200E80349010200EE034B010200F1034D010200F6034F010200F903510102000204530102000504550102000B04570102000E045901020013045B01020016045D0102001C045F0102001F04610102002804630102002B04650102002E04670102002F046901020030046B0102003F046D01020042046F0102004804710102004B04730102005104750102005404770102005904790102005C047B01020063047D01020066047F0102006D04810102007004830102007504850102007804870102007E048901020081048B01020087048D0102008A048F0102009004910102009304930102009904950102009C0497010200A90499010200AC049B010200B1049D010200B4049F011100BA0003001900EE00050025009C01070025009E0109002E00F8010B003F00100315003F0008030F003F000A0311003F000E0313003F0006030D003F00120317003F00140319003F0016031B003F0018031D003F001A031F003F001E0321003F00200323003F002203030040002C03250040003203270041005203030041003A03110041003E03130041004003150041004203170041004403190041004E032100410038030F0042005803250042005E0327004800C80329004900EC0329005D00C80403006B00520536056C00860536057400D80554047400D60552047400D40550047400DA0556047400DC0558048100920636058E003C072B018E00360703008E00380725018E003A0729018E00340727018E003E0727008E00400725008F00440723008F00460703008F00480725018F004A0735018F004C072B018F004E0727008F005007250091005E07990191005A07030091005C072501910058079701910060072B0191006207270091006407250092006807A10192006A07030092006C07250192006E07A301920070072B0192007207270092007407250093007807A10193007A07030093007C07250193007E07A301930080072B0193008207270093008407250094009007A10194009207030094009407250194009607A301940098072B0194009A07270094009C0725009500A807A3019500A40703009500A60725019500A207A1019500AA072B019500AC0727009500AE0725009600B4078F019600B60703009600B80725019600BA0791019600BC072B019600BE0727009600C00725009800CA071D029800C60703009800C80725019800C4071B029800CC072B019800CE0727009800D00725009900DC071D029900D80703009900DA0725019900D6071B029900DE072B019900E00727009900E20725009A00E6071B029A00E80703009A00EA0725019A00EC071D029A00EE072B019A00F00727009A00F20725009C00020825019C00000803009C00FE071B029C0004081D029C0006082B019C00080827009C000A0825009D0010088F019D00120803009D00140825019D00160891019D0018082B019D001A0827009D001C0825009E0020088F019E00220803009E00240825019E00260891019E0028082B019E002A0827009E002C0825009F003208A3039F00340803009F00360825019F003808A5039F003A082B019F003C0827009F003E082500A1004E082501A1004C080300A1004A08CF01A1005008D101A10052082B01A10054082700A10056082500A8007C082501A8007E08AB02A80080082B01A80082082700A80084082500A90092082B01A9008C080300A9008E082501A90090081D02A9008A081B02A90094082700A90096082500AA00A2081D02AA009E080300AA00A0082501AA009C081B02AA00A4082B01AA00A6082700AA00A8082500AB00AC08CF01AB00AE080300AB00B0082501AB00B208D101AB00B4082B01AB00B6082700AB00B8082500AD00C2080300AD00C008CF01AD00C4082501AD00C608D101AD00C8082B01AD00CA082700AD00CC082500AE00D408CF01AE00D6080300AE00D8082501AE00DA08D101AE00DC082B01AE00DE082700AE00E0082500AF00E4081B02AF00E6080300AF00E8082501AF00EA081D02AF00EC082B01AF00EE082700AF00F0082500B000F6088F01B000F8080300B000FA082501B000FC089101B000FE082B01B00000092700B00002092500B1000E09A503B1000A090300B1000C092501B1000809A303B10010092B01B10012092700B10014092500B2001A091B02B2001C090300B2001E092501B20020091D02B20022092B01B20024092700B20026092500B30032091D02B3002E090300B30030092501B3002C091B02B30034092B01B30036092700B30038092500B5005209D101B5004E090300B50050092501B5004C09CF01B50054092B01B50056092700B50058092500B6005C09CB01B6005E090300B60060092501B6006209CD01B60064092B01B60066092700B600680925000A0012001A0020002800300038004100490053005E0066006F00780081008A0093009F00A600AD00B400BB00C300CB00D200DB00E700F000FB0003010B01DB25E925092612265626DA26A727B9270728192826283328632869288B289D28A028C6\
-28FA281A293F2946294F2961298D299A29A729B429E5290A2A222A3A2A972A1F2B302B802BD02CE32CFC2C042D2D2D352D542D5E2DCC2DD42D2C2E5B2E612EFE2E2F2F792F892FD02FDE2FEC2FF52F06301730283082308D309430A830BC303B3143314B31533164318931FE316A32F032F7321833203332333A333E33A533AD33B5330F351C35D635E935F235FA350236183627363D369536BD3643374D3765376F37D637DE37F237F937003820382A3832383A3873387B38A438AC3851395B39B739C839D839E339F2391F3A5E3A813A933AA73ABA3AC83AD03A893BF03B073C223C2B3C503C583C5B3D623DBC3DE23D1E3E3A3E563E723E8A3E9B3EAC3EBD3ECE3EE73E003F9C40A640B040BD40CA400C414A415B418F41A341B741C74155435D43654304800000030003005300000001000000DE24F94200000200000000000000000000000100400A000000000200000000000000000000000100490A000000000200000000000000000000000100E93A00000000070005000A0008002800270031003000370036003A0039003B00390040003F00420041004E004D004F004E0052005100540053005D005C0060005F00750074007600740077007400780074007900740084008300850083008700860088008600890088008E0019008F00190090001F0091001F0092001F0093001F0094001F0095001F0096001F0098003000990030009A0039009B0041009C004D009D004E009E0052009F005400A0005700A1005700A3005C00A4005C00A5005C00A6005C00A7005C00A8005D00A9005E00AA005E00AB005F00AC007A00AD007A00AE007B00AF008300B0008400B1008500B2008600B3008600B4008A00B5008A00B6008A00B7008D00B8008D00B9008D00BA008D00BB008D00BC008D00000000000C005C0A0000000012005C0A0000000024005C0A0000000030005C0A0000000038005C0A000000003C005C0A010000003C00CE0A0000000042005C0A000000004600D60A000000004800D60A010000004800CE0A000000004A00D60A010000004A00CE0A000000004C005C0A0000000056005C0A000000005A005C0A000000005E005C0A0000000070005C0A000000007800EA0A010000007800EE0A000000007E005C0A0000000080005C0A0000000082005C0A0000000084005C0A0000000086005C0A0000000088005C0A000000008A005C0A000000008C005C0A00000000C200EA0A01000000C200EE0A00000000C400EA0A01000000C400EE0A00000000DC005C0A00000000E900CE0A00000000EB00CE0A00000000F500CE0A00000000F700CE0A0000000000015C0A000000001901CE0A000000001B01CE0A000000001E01CE0A000000002101CE0A000000002301CE0A000000003101CE0A000000003301CE0A0000000036015C0A000000003901CE0A000000003B01CE0A000000004401A85B010000004401B75B020000004401C45B0000000067065E380000000073065C0A000000008B065C0A000000008F065C0AF400B2286501B2287101B228FD02AD32350357339F03E9348A0652358E0658358E0668358E069F358A068F428E06EB428E06F1428E06F7428E06FD428E0603438E060943360035003700350000000000003C4D6F64756C653E0053514C232E4A736F6E46782E646C6C0041626F7574004A736F6E46780042736F6E456C656D656E7454797065004A736F6E46782E42736F6E0042736F6E42696E617279537562747970650042736F6E577269746572004942696E617279466F726D61747465726031004A736F6E46782E53657269616C697A6174696F6E0042736F6E466F726D61747465720042736F6E526561646572004942696E617279546F6B656E697A657260310042736F6E546F6B656E697A65720042736F6E4D44350042736F6E436F64655769746853636F70650042736F6E4A617661536372697074436F64650042736F6E53796D626F6C0042736F6E4442506F696E7465720042736F6E4F626A65637449440042736F6E42696E617279004942696E617279466F726D61747461626C656031004942736F6E466F726D61747461626C6500466163746F727944656C6567617465004A736F6E46782E436F646547656E0050726F787944656C65676174650047657474657244656C65676174650053657474657244656C65676174650049546F6B656E416E616C797A65726031004D6F64656C416E616C797A6572004A736F6E46782E4D6F64656C004D6F64656C4772616D6D617200494461746152656164657200446174615265616465726031004D6F64656C5265616465720046756E636032004D6F64656C53756273657175656E636572004D6F64656C546F6B656E5479706500494F626A65637457616C6B65726031004D6F64656C57616C6B657200494461746146696C7465726031004A736F6E46782E53657269616C697A6174696F6E2E46696C7465727300494461746146696C7465726032004461746146696C7465726032004D6F64656C46696C7465726031004A736F6E46782E4D6F64656C2E46696C746572730049736F383630314461746546696C74657200507265636973696F6E004D53416A61784461746546696C74657200494461746157726974657200446174615772697465726031004D6F64656C577269746572004954657874466F726D61747461626C6560310045636D615363726970744964656E746966696572004A736F6E46782E45636D61536372697074004954657874466F726D61747465726031004A736F6E577269746572004A736F6E46782E4A736F6E004A736F6E466F726D61747465720045636D61536372697074466F726D6174746572004948746D6C46696C7465725374726174656779004A736F6E46782E48746D6C0048746D6C46696C7465720048746D6C5461786F6E6F6D790048746D6C466F726D617474657200456D70747941747472696275746554797065004954657874546F6B656E697A657260310048746D6C546F6B656E697A657200514E616D65004174747269620049446174615472616E73666F726D657260320048746D6C4F75745472616E73666F726D65720043686172427566666572004A736F6E46782E494F0053657175656E6365427566666572603100456E756D657261746F720053756273657175656E63656031004953747265616D60310053747265616D603100456E756D657261626C6553747265616D6031004C69737453747265616D603100495465787453747265616D00537472696E6753747265616D005465787452656164657253747265616D004A736F6E4772616D6D6172004A736F6E49676E6F7265417474726962757465004A736F6E4E616D65417474726962757465004A736F6E526561646572004A736F6E546F6B656E697A6572004E6565647356616C756544656C696D004A736F6E53706563696669656450726F7065727479417474726962757465004A736F6E4D4C526561646572004A736F6E46782E4A736F6E4D4C004A736F6E4D4C496E5472616E73666F726D6572004A736F6E4D4C577269746572004A736F6E4D4C4F75745472616E73666F726D657200495265736F6C7665725374726174656779004A736F6E46782E53657269616C697A6174696F6E2E5265736F6C7665727300506F636F5265736F6C7665725374726174656779004A736F6E5265736F6C7665725374726174656779004A736F6E46782E4A736F6E2E5265736F6C76657273005768697465737061636554797065004A736F6E46782E4D61726B757000556E706172736564426C6F636B004D61726B75704772616D6D6172004D61726B7570546F6B656E547970650050726566697853636F7065436861696E0053636F7065004461746150726F76696465725574696C697479004A736F6E46782E53657269616C697A6174696F6E2E50726F76696465727300436F6E76656E74696F6E5265736F6C766572537472617465677900576F7264436173696E67005472616E73666F726D546F6B656E697A65726032005472616E73666F726D466F726D6174746572603200446174614E616D650053657269616C697A6174696F6E457863657074696F6E0047726170684379636C65457863657074696F6E004A736F6E46782E53657269616C697A6174696F6E2E47726170684379636C65730047726170684379636C655479706500494379636C654465746563746F72004465707468436F756E746572005265666572656E636553657400495265736F6C7665724361636865436F6E7461696E6572004461746152656164657253657474696E6773004461746157726974657253657474696E677300446573657269616C697A6174696F6E457863657074696F6E00546F6B656E457863657074696F6E60310054797065436F657263696F6E457863657074696F6E00494461746152656164657250726F7669646572004461746152656164657250726F766964657200494461746157726974657250726F7669646572004461746157726974657250726F76696465720043616C6C6261636B5265736F6C76657253747261746567790050726F706572747949676E6F72656444656C6567617465004669656C6449676E6F72656444656C65676174650047657456616C756549676E6F72656444656C6567617465004765744E616D6544656C656761746500536F72744D656D6265727344656C656761746500436F6D62696E65645265736F6C76657253747261746567790044617461436F6E74726163745265736F6C76657253747261746567790056616C756549676E6F72656444656C6567617465004D656D6265724D617000466163746F72794D6170005265736F6C766572436163686500546F6B656E60310054797065436F657263696F6E5574696C69747900436861725574696C697479004A736F6E46782E5574696C7300586D6C526561646572004A736F6E46782E586D6C00586D6C496E5472616E73666F726D657200586D6C546F6B656E697A657200586D6C57726974657200586D6C4F75745472616E73666F726D657200586D6C466F726D617474657200586D6C5772697465724164617074657200586D6C5265736F6C7665725374726174656779004A736F6E46782E586D6C2E5265736F6C76657273004A534F4E5574696C7300457874656E73696F6E4174747269627574650053797374656D2E52756E74696D652E436F6D70696C657253657276696365730044796E616D69634D6574686F6447656E657261746F72006D73636F726C69620053797374656D004F626A65637400456E756D00540049446973706F7361626C650056616C7565547970650053797374656D2E436F6C6C656374696F6E732E47656E657269630049456E756D657261626C6560310053797374656D2E436F6C6C656374696F6E730049456E756D657261626C65004D756C74696361737444656C65676174650054526573756C740054546F6B656E54797065004461746554696D650054496E00544F757400494C69737460310049436F6C6C656374696F6E60310049456E756D657261746F7260310049456E756D657261746F7200417474726962757465004B657956616C75655061697260320049436F6D70617261626C65603100496E76616C69644F7065726174696F6E457863657074696F6E00417267756D656E74457863657074696F6E0053797374656D2E494F00546578745772697465720046780056657273696F6E0046756C6C4E616D65004E616D6500436F6E66696775726174696F6E00436F70797269676874005469746C65004465736372697074696F6E00436F6D70616E790053797374656D2E5265666C656374696F6E00417373656D626C79002E63746F720076616C75655F5F004E6F6E6500446F75626C6500537472696E6700446F63756D656E740041727261790042696E61727900556E646566696E6564004F626A656374494400426F6F6C65616E004461746554696D65557463004E756C6C00526567457870004442506F696E746572004A617661536372697074436F64650053796D626F6C00436F64655769746853636F706500496E7433320054696D655374616D7000496E743634004D696E4B6579004D61784B65790047656E657269630046756E6374696F6E0042696E6172794F6C640055554944004D44350055736572446566696E6564004572726F72556E7465726D696E61746564004572726F72556E6578706563746564546F6B656E004572726F7245787065637465644F626A65637456616C756544656C696D0053697A654F66427974650053697A654F66496E7433320053697A654F66496E7436340053697A654F66446F75626C650053697A654F664F626A6563744944004E756C6C427974650046616C73654279746500547275654279746500556E697845706F63680053747265616D00466F726D61740042696E617279577269746572005772697465446F63756D656E74005772697465456C656D656E74005772697465537472696E6700577269746542696E617279005772697465436F64655769746853636F706500476574456C656D656E74547970650047657442736F6E42696E617279006765745F496E64657800476574546F6B656E7300496E646578004572726F72556E6578706563746564456C656D656E74547970650042696E617279526561646572004E756C6C42696E61727952656164657200526561646572004C69737460310052656164446F63756D656E740052656164456C656D656E74005265616442696E6172790052656164537472696E67005265616443537472696E6700446973706F736500477569640048617368006F705F4578706C6963697400546F537472696E670047657448617368436F6465006765745F436F6465007365745F436F6465006765745F53636F7065007365745F53636F7065003C436F64653E6B5F5F4261636B696E674669656C64003C53636F70653E6B5F5F4261636B696E674669656C6400436F6465006765745F4E616D657370616365007365745F4E616D657370616365006765745F4F626A6563744944007365745F4F626A6563744944003C4E616D6573706163653E6B5F5F4261636B696E674669656C64003C4F626A65637449443E6B5F5F4261636B696E674669656C64004E616D65737061636500456D707479004279746573006765745F54696D65006765745F4D616368696E65006765745F506964006765745F496E6300546F4279746541727261790050617273650054727950617273650054696D65004D616368696E650050696400496E630053756274797065006765745F44617461006765745F54797065006765745F4974656D006765745F436F756E7400476574486578446967697400476574456E756D657261746F720053797374656D2E436F6C6C656374696F6E732E49456E756D657261626C652E476574456E756D657261746F7200446174610054797065004974656D00436F756E7400496E766F6B6500494173796E63526573756C74004173796E6343616C6C6261636B00426567696E496E766F6B6500456E64496E766F6B65006765745F53657474696E677300416E616C797A650053657474696E6773004572726F7245787065637465644172726179004572726F72457870656374656441727261794974656D004572726F72457870656374656441727261794974656D44656C696D004572726F724D697373696E6741727261794974656D004572726F72556E7465726D696E617465644172726179004572726F7245787065637465644F626A656374004572726F72457870656374656450726F70657274794E616D65004572726F724D697373696E674F626A65637450726F7065727479004572726F72556E7465726D696E617465644F626A65637400436F657263696F6E0046696C74657273004A736F6E46782E53657269616C697A6174696F6E2E49546F6B656E416E616C797A65723C4A736F6E46782E4D6F64656C2E4D6F64656C546F6B656E547970653E2E6765745F53657474696E677300436F6E73756D6556616C756500436F6E73756D654F626A65637400436F6E73756D654172726179005472795265616446696C74657273004A736F6E46782E53657269616C697A6174696F6E2E49546F6B656E416E616C797A65723C4A736F6E46782E4D6F64656C2E4D6F64656C546F6B656E547970653E2E53657474696E677300546F6B656E4E6F6E6500546F6B656E4172726179456E6400546F6B656E4F626A656374456E6400546F6B656E4E756C6C00546F6B656E46616C736500546F6B656E5472756500546F6B656E4172726179426567696E556E6E616D656400546F6B656E4F626A656374426567696E556E6E616D656400546F6B656E4E614E00546F6B656E506F736974697665496E66696E69747900546F6B656E4E65676174697665496E66696E69747900546F6B656E4172726179426567696E00546F6B656E4F626A656374426567696E00546F6B656E50726F706572747900546F6B656E5072696D6974697665006765745F436F6E74656E74547970650054657874526561646572005265616400526561644D616E7900436F6E74656E74547970650073657474696E6773005265616453696E676C6500476574546F6B656E697A657200476574416E616C797A6572004572726F72556E6578706563746564456E644F66496E707574004572726F72496E76616C696450726F706572747956616C756500456D70747953657175656E63650049735072696D69746976650049734F626A6563740048617350726F70657274790050726F70657274790050726F706572746965730050726F706572746965734974657261746F7200497341727261790041727261794974656D730041727261794974656D734974657261746F720044657363656E64616E74730044657363656E64616E74734974657261746F720044657363656E64616E7473416E6453656C660044657363656E64616E7473416E6453656C664974657261746F720053706C697456616C7565730053706C697456616C7565734974657261746F720053706C6963654E65787456616C75654C617A790053706C6963654E65787456616C756500536B69704E65787456616C7565004F626A656374426567696E004F626A656374456E64004172726179426567696E004172726179456E64005072696D6974697665004765744172726179546F6B656E73004944696374696F6E617279456E756D657261746F72004765744F626A656374546F6B656E7300476574547970654E616D650054727952656164005472795772697465004A736F6E46782E53657269616C697A6174696F6E2E46696C746572732E494461746146696C7465723C54546F6B656E547970653E2E54727952656164004A736F6E46782E53657269616C697A6174696F6E2E46696C746572732E494461746146696C7465723C54546F6B656E547970653E2E54727957726974650053686F7274466F726D6174004C6F6E67466F726D61740046756C6C466F726D61740069736F38363031466F726D6174006765745F466F726D6174007365745F466F726D617400547279506172736549736F3836303100466F726D617449736F38363031005365636F6E6473004D696C6C697365636F6E6473005469636B73004D696E56616C75654D696C6C697365636F6E6473004D617856616C75654D696C6C697365636F6E6473004D53416A6178446174655061747465726E004D53416A617844617465507265666978004D53416A6178446174655375666669780045636D6153637269707445706F63680053797374656D2E546578742E526567756C617245787072657373696F6E73005265676578004D53416A61784461746552656765780054727950617273654D53416A61784461746500466F726D61744D53416A6178446174650053797374656D2E5465787400456E636F64696E67006765745F436F6E74656E74456E636F64696E67006765745F46696C65457874656E73696F6E00577269746500436F6E74656E74456E636F64696E670046696C65457874656E73696F6E0047657457616C6B657200476574466F726D6174746572006964656E746966696572006765745F4964656E746966696572005665726966794964656E74696669657200497356616C69644964656E7469666965720049735265736572766564576F7264006F705F496D706C69636974004A736F6E46782E53657269616C697A6174696F6E2E4954657874466F726D61747461626C653C4A736F6E46782E4D6F64656C2E4D6F64656C546F6B656E547970653E2E466F726D617400457175616C73004964656E74696669657200436F6E74656E74547970657300656E636F64654C6573735468616E006765745F456E636F64654C6573735468616E007365745F456E636F64654C6573735468616E0057726974655072696D697469766500577269746550726F70657274794E616D650054797065436F64650057726974654E756D6265720057726974654E65676174697665496E66696E697479005772697465506F736974697665496E66696E6974790057726974654E614E0057726974654C696E6500466F726D6174537472696E6700466F726D6174456E756D00476574466C61674C69737400446563696D616C00496E76616C69644945454537353400456E636F64654C6573735468616E0045636D615363726970744461746543746F72310045636D615363726970744461746543746F723700456D7074795265674578704C69746572616C005265674578704C69746572616C44656C696D004F70657261746F7243686172457363617065004E616D65737061636544656C696D00526F6F744465636C61726174696F6E446562756700526F6F744465636C61726174696F6E004E616D657370616365436865636B004E616D657370616365436865636B4465627567004E616D65737061636544656C696D730042726F777365724F626A656374730057726974654E616D6573706163654465636C61726174696F6E00577269746545636D615363726970744461746500577269746545636D615363726970745265674578700046696C7465725461670046696C7465724174747269627574650046696C7465725374796C650046696C7465724C69746572616C00566F6964546167526571756972656400436C6F73655461674F7074696F6E616C004765745461786F6E6F6D79005465787400496E6C696E65005374796C65004C69737400426C6F636B004D65646961005461626C6500466F726D0053637269707400506C7567696E00556E6B6E6F776E0053636F7065436861696E0063616E6F6E6963616C466F726D00656D7074794174747269627574657300656E636F64654E6F6E4173636969006765745F43616E6F6E6963616C466F726D007365745F43616E6F6E6963616C466F726D006765745F456D70747941747472696275746573007365745F456D70747941747472696275746573006765745F456E636F64654E6F6E4173636969007365745F456E636F64654E6F6E417363696900526573657453636F7065436861696E004944696374696F6E6172796032005772697465546167005772697465586D6C6E730057726974654174747269627574650057726974654C6F63616C4E616D650048746D6C456E636F64650048746D6C417474726962757465456E636F64650043616E6F6E6963616C466F726D00456D7074794174747269627574657300456E636F64654E6F6E41736369690048746D6C005868746D6C00586D6C006765745F436F6C756D6E006765745F4C696E6500436F6C756D6E004C696E650044656661756C7442756666657253697A65005363616E6E657200756E70617273656454616773006175746F42616C616E636554616773006765745F4175746F42616C616E636554616773007365745F4175746F42616C616E636554616773006765745F556E77726170556E706172736564436F6D6D656E7473007365745F556E77726170556E706172736564436F6D6D656E7473006765745F556E70617273656454616773007365745F556E70617273656454616773005363616E546167005363616E556E706172736564426C6F636B005363616E556E70617273656456616C7565005363616E41747472696275746556616C7565005363616E514E616D65004973546167436F6D706C65746500456D697454616700456D69745465787400536B697057686974657370616365004465636F6465456E74697479004465636F6465456E746974794E616D650049734E616D655374617274436861720049734E616D6543686172003C556E77726170556E706172736564436F6D6D656E74733E6B5F5F4261636B696E674669656C64004175746F42616C616E63655461677300556E77726170556E706172736564436F6D6D656E747300556E70617273656454616773004E616D6544656C696D00507265666978006F705F457175616C697479006F705F496E657175616C6974790049457175616C697479436F6D70617265726031006765745F514E616D65007365745F514E616D65006765745F56616C7565007365745F56616C7565003C514E616D653E6B5F5F4261636B696E674669656C64003C56616C75653E6B5F5F4261636B696E674669656C640056616C7565005472616E73666F726D00526F6F745461674E616D650041727261795461674E616D650041727261794974656D5461674E616D65004F626A6563745461674E616D65004F626A65637450726F70657274794B65795461674E616D65004F626A65637450726F706572747956616C75655461674E616D65005072696D69746976655461674E616D650048696E744174747269627574654E616D65005472616E73666F726D56616C7565005472616E73666F726D5072696D6974697665005472616E73666F726D4172726179005472616E73666F726D4F626A6563740044656661756C74436170616369747900456D707479427566666572006275666665720073697A65006765745F4C656E67746800436C65617200417070656E6400537472696E674275696C64657200436F7079546F00456E737572654361706163697479004C656E677468004361636865004974657261746F72006973436F6D706C6574650053797374656D2E436F6C6C656374696F6E732E47656E657269632E494C6973743C543E2E496E6465784F6600496E6465784F660053797374656D2E436F6C6C656374696F6E732E47656E657269632E494C6973743C543E2E496E7365727400496E736572740053797374656D2E436F6C6C656374696F6E732E47656E657269632E494C6973743C543E2E52656D6F766541740052656D6F766541740053797374656D2E436F6C6C656374696F6E732E47656E657269632E494C6973743C543E2E6765745F4974656D0053797374656D2E436F6C6C656374696F6E732E47656E657269632E494C6973743C543E2E7365745F4974656D007365745F4974656D0053797374656D2E436F6C6C656374696F6E732E47656E657269632E49436F6C6C656374696F6E3C543E2E416464004164640053797374656D2E436F6C6C656374696F6E732E47656E657269632E49436F6C6C656374696F6E3C543E2E436C6561720053797374656D2E436F6C6C656374696F6E732E47656E657269632E49436F6C6C656374696F6E3C543E2E436F6E7461696E7300436F6E7461696E730053797374656D2E436F6C6C656374696F6E732E47656E657269632E49436F6C6C656374696F6E3C543E2E436F7079546F0053797374656D2E436F6C6C656374696F6E732E47656E6572\
-69632E49436F6C6C656374696F6E3C543E2E6765745F436F756E74006765745F4973526561644F6E6C790053797374656D2E436F6C6C656374696F6E732E47656E657269632E49436F6C6C656374696F6E3C543E2E52656D6F76650052656D6F76650053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261626C653C543E2E476574456E756D657261746F7200547279416476616E6365005365656B546F456E640053797374656D2E436F6C6C656374696F6E732E47656E657269632E494C6973743C543E2E4974656D0053797374656D2E436F6C6C656374696F6E732E47656E657269632E49436F6C6C656374696F6E3C543E2E436F756E74004973526561644F6E6C790053657175656E6365006765745F43757272656E740053797374656D2E436F6C6C656374696F6E732E49456E756D657261746F722E6765745F43757272656E74004D6F76654E6578740052657365740053797374656D2E49446973706F7361626C652E446973706F73650043757272656E740053797374656D2E436F6C6C656374696F6E732E49456E756D657261746F722E43757272656E74004974656D730053746172740053697A6500456E64006765745F4973436F6D706C65746564006765745F49734368756E6B696E67006765745F4368756E6B53697A65005065656B00506F7000426567696E4368756E6B00456E644368756E6B004973436F6D706C657465640049734368756E6B696E67004368756E6B53697A650043726561746500496E697469616C4368756E6B43617061636974790069735265616479006973436F6D706C657465640063757272656E74006368756E6B00456E7375726552656164790042756666657200696E64657800737461727400636F6C756D6E006C696E65004A736F6E46782E494F2E4953747265616D3C53797374656D2E436861723E2E456E644368756E6B0055706461746553746174730070726576004B6579776F7264556E646566696E6564004B6579776F72644E756C6C004B6579776F726446616C7365004B6579776F726454727565004B6579776F72644E614E004B6579776F7264496E66696E697479004F70657261746F724172726179426567696E004F70657261746F724172726179456E64004F70657261746F724F626A656374426567696E004F70657261746F724F626A656374456E64004F70657261746F7256616C756544656C696D004F70657261746F725061697244656C696D004F70657261746F72537472696E6744656C696D004F70657261746F72537472696E6744656C696D416C74004F70657261746F72556E6172794D696E7573004F70657261746F72556E617279506C7573004F70657261746F72446563696D616C506F696E74004F70657261746F72436F6D6D656E74426567696E004F70657261746F72436F6D6D656E74456E64004F70657261746F72436F6D6D656E744C696E65006E616D65006765745F4E616D65007365745F4E616D65004572726F72556E7265636F676E697A6564546F6B656E004572726F72556E7465726D696E61746564436F6D6D656E74004572726F72556E7465726D696E61746564537472696E67004572726F72496C6C6567616C4E756D626572004572726F724D697373696E6756616C756544656C696D004572726F72457874726156616C756544656C696D00536B6970436F6D6D656E7473416E6457686974657370616365005363616E4E756D626572005363616E537472696E67005363616E4B6579776F726473005363616E4964656E74696669657200466F7262696464656E0043757272656E74497344656C696D0052657175697265640073706563696669656450726F7065727479006765745F53706563696669656450726F7065727479007365745F53706563696669656450726F70657274790053706563696669656450726F70657274790053696E676C65537061636500526567657857686974657370616365006765745F57686974657370616365007365745F57686974657370616365003C576869746573706163653E6B5F5F4261636B696E674669656C640057686974657370616365004572726F724D697373696E675461674E616D65004572726F72496E76616C696441747472696275746556616C7565004572726F72556E7465726D696E61746564417474726962757465426C6F636B0050726F7065727479496E666F00497350726F706572747949676E6F726564004669656C64496E666F0049734669656C6449676E6F726564004D656D626572496E666F0047657456616C756549676E6F72656443616C6C6261636B004765744E616D6500536F72744D656D62657273005072657365727665004E6F726D616C697A65006765745F426567696E007365745F426567696E006765745F456E64007365745F456E64003C426567696E3E6B5F5F4261636B696E674669656C64003C456E643E6B5F5F4261636B696E674669656C6400426567696E004F70657261746F72456C656D656E74426567696E004F70657261746F72456C656D656E74456E64004F70657261746F72456C656D656E74436C6F7365004F70657261746F7250726566697844656C696D004F70657261746F72456E74697479426567696E004F70657261746F72456E746974794E756D004F70657261746F72456E74697479486578004F70657261746F72456E74697479486578416C74004F70657261746F72456E74697479456E64004F70657261746F72436F6D6D656E74004F70657261746F72436F6D6D656E7444656C696D004F70657261746F724344617461426567696E004F70657261746F724344617461456E64004F70657261746F7250726F63657373696E67496E737472756374696F6E004F70657261746F7250687045787072657373696F6E426567696E004F70657261746F7250726F63657373696E67496E737472756374696F6E426567696E004F70657261746F7250726F63657373696E67496E737472756374696F6E456E64004F70657261746F72436F6465004F70657261746F72436F6465446972656374697665004F70657261746F72436F646545787072657373696F6E004F70657261746F72436F64654465636C61726174696F6E004F70657261746F72436F6465456E636F646564004F70657261746F72436F64654461746142696E64004F70657261746F72436F6465457874656E73696F6E004F70657261746F72436F6465426C6F636B426567696E004F70657261746F72436F6465456E64004F70657261746F725434004F70657261746F725434446972656374697665004F70657261746F72543445787072657373696F6E004F70657261746F725434436C61737346656174757265004F70657261746F725434426C6F636B426567696E004F70657261746F725434456E6400546F6B656E456C656D656E74456E6400546F6B656E556E70617273656400546F6B656E456C656D656E74426567696E00546F6B656E456C656D656E74566F696400546F6B656E41747472696275746500456C656D656E74426567696E00456C656D656E74456E6400456C656D656E74566F696400436861696E006E73436F756E746572006765745F48617353636F7065005075736800436F6E7461696E7350726566697800436F6E7461696E734E616D657370616365004765744E616D6573706163650047657450726566697800436F6E7461696E7354616700456E737572655072656669780047656E65726174655072656669780048617353636F706500536F727465644C6973746032007072656669786573006765745F5461674E616D65007365745F5461674E616D65005472794765744E616D65737061636500547279476574507265666978003C5461674E616D653E6B5F5F4261636B696E674669656C64005461674E616D650044656661756C74436F6E74656E7454797065005061727365486561646572730050617273654D65646961547970650053706C69745472696D004E6F726D616C697A65457874656E73696F6E00576F7264536570617261746F7200436173696E670053706C6974576F726473004E6F4368616E67650050617363616C436173650043616D656C43617365004C6F776572636173650055707065726361736500546F6B656E697A6572005472616E73666F726D657200466F726D6174746572004C6F63616C4E616D65004E616D657370616365557269004973417474726962757465006765745F4973456D707479004765745374616E6461726450726566697800546F50726566697865644E616D6500546F5175616C69666965644E616D6500436F6D70617265546F004973456D70747900457863657074696F6E0053797374656D2E52756E74696D652E53657269616C697A6174696F6E0053657269616C697A6174696F6E496E666F0053747265616D696E67436F6E74657874006765745F4379636C6554797065004379636C65547970650049676E6F7265005265666572656E6365004D6178446570746800646570746800496E697469616C53697A650047726F777468466163746F7200456D7074794172726179006172726179006765745F5265736F6C766572436163686500616C6C6F774E756C6C56616C7565547970657300616C6C6F77547261696C696E67436F6E74656E74004D6F64656C46696C74657273006765745F416C6C6F774E756C6C56616C75655479706573007365745F416C6C6F774E756C6C56616C75655479706573006765745F416C6C6F77547261696C696E67436F6E74656E74007365745F416C6C6F77547261696C696E67436F6E74656E74006765745F5265736F6C766572006765745F46696C74657273004A736F6E46782E53657269616C697A6174696F6E2E5265736F6C766572732E495265736F6C7665724361636865436F6E7461696E65722E6765745F5265736F6C766572436163686500416C6C6F774E756C6C56616C7565547970657300416C6C6F77547261696C696E67436F6E74656E74005265736F6C766572004A736F6E46782E53657269616C697A6174696F6E2E5265736F6C766572732E495265736F6C7665724361636865436F6E7461696E65722E5265736F6C7665724361636865007072657474795072696E740067726170684379636C657300746162006D61784465707468006E65774C696E650061727261794E616D654F76657272696465006974656D4E616D654F7665727269646500696E636C75646541727261794E616D65466F724F626A656374006765745F47726170684379636C6573007365745F47726170684379636C6573006765745F4D61784465707468007365745F4D61784465707468006765745F5072657474795072696E74007365745F5072657474795072696E74006765745F546162007365745F546162006765745F4E65774C696E65007365745F4E65774C696E65006765745F41727261794E616D654F76657272696465007365745F41727261794E616D654F76657272696465006765745F4974656D4E616D654F76657272696465007365745F4974656D4E616D654F76657272696465006765745F496E636C75646541727261794E616D65466F724F626A656374007365745F496E636C75646541727261794E616D65466F724F626A6563740047726170684379636C6573005072657474795072696E7400546162004E65774C696E650041727261794E616D654F76657272696465004974656D4E616D654F7665727269646500496E636C75646541727261794E616D65466F724F626A656374004765744C696E65416E64436F6C756D6E00746F6B656E006765745F546F6B656E00546F6B656E0046696E64005265616465727342794D696D65006765745F44656661756C74446174615772697465720044656661756C74446174615772697465720044656661756C7457726974657200577269746572734279457874005772697465727342794D696D65006765745F497350726F706572747949676E6F726564007365745F497350726F706572747949676E6F726564006765745F49734669656C6449676E6F726564007365745F49734669656C6449676E6F726564006765745F47657456616C756549676E6F726564007365745F47657456616C756549676E6F726564006765745F4765744E616D65007365745F4765744E616D65006765745F536F72744D656D62657273007365745F536F72744D656D62657273004A736F6E46782E53657269616C697A6174696F6E2E5265736F6C766572732E495265736F6C76657253747261746567792E497350726F706572747949676E6F726564004A736F6E46782E53657269616C697A6174696F6E2E5265736F6C766572732E495265736F6C76657253747261746567792E49734669656C6449676E6F726564004A736F6E46782E53657269616C697A6174696F6E2E5265736F6C766572732E495265736F6C76657253747261746567792E47657456616C756549676E6F72656443616C6C6261636B004A736F6E46782E53657269616C697A6174696F6E2E5265736F6C766572732E495265736F6C76657253747261746567792E4765744E616D65004A736F6E46782E53657269616C697A6174696F6E2E5265736F6C766572732E495265736F6C76657253747261746567792E536F72744D656D62657273003C497350726F706572747949676E6F7265643E6B5F5F4261636B696E674669656C64003C49734669656C6449676E6F7265643E6B5F5F4261636B696E674669656C64003C47657456616C756549676E6F7265643E6B5F5F4261636B696E674669656C64003C4765744E616D653E6B5F5F4261636B696E674669656C64003C536F72744D656D626572733E6B5F5F4261636B696E674669656C640047657456616C756549676E6F72656400496E6E6572537472617465676965730044617461436F6E7472616374417373656D626C794E616D650044617461436F6E7472616374547970654E616D6500446174614D656D626572547970654E616D650049676E6F7265446174614D656D626572547970654E616D650044617461436F6E74726163745479706500446174614D656D626572547970650049676E6F7265446174614D656D626572547970650044617461436F6E74726163744E616D654765747465720044617461436F6E74726163744E616D65737061636547657474657200446174614D656D6265724E616D65476574746572002E6363746F72004765747465720053657474657200497349676E6F726564004973416C7465726E617465004572726F7243616E6E6F74496E7374616E746961746500436F6C6C656374696F6E43746F72730043746F7200506172616D65746572496E666F0043746F724172677300416464547970650041646452616E67650041646452616E676554797065006765745F4172675479706573004973496E76616C696454797065004973496D6D757461626C6554797065004172675479706573004D656D626572436163686500456E756D436163686500466163746F72696573004E616D654361636865005374726174656779004C6F6164547970654E616D65004C6F61644D617073004C6F61644D656D6265724D6170004C6F6164456E756D4D617073004275696C644D6170004275696C64456E756D4D6170004C6F6164466163746F72790046756C6C4461746554696D65466F726D617400546F6B656E547970650056616C75654173537472696E67004368616E67655479706500544F7468657200416E6F6E796D6F757354797065507265666978004572726F724E756C6C56616C756554797065004572726F7243746F72004572726F7243616E6E6F74496E7374616E7469617465417354004572726F7247656E657269634944696374696F6E617279004572726F7247656E657269634944696374696F6E6172794B657973005479706547656E6572696349456E756D657261626C65005479706547656E6572696349436F6C6C656374696F6E005479706547656E657269634944696374696F6E61727900496E7374616E74696174654F626A65637444656661756C7443746F7200496E7374616E74696174654F626A656374005365744D656D62657256616C756500436F6572636554797065004944696374696F6E61727900436F657263654C6973740049436F6C6C656374696F6E00436F65726365436F6C6C656374696F6E00436F657263654172726179005265736F6C7665496E74657266616365547970650047657444696374696F6E6172794974656D547970650046696E64436F6D6D6F6E547970650049734E756C6C61626C6500486173417474726962757465004765744174747269627574650049734E756C6C4F725768697465537061636500497357686974655370616365004973436F6E74726F6C0049734C65747465720049734469676974004973486578446967697400476574486578537472696E6700436F6E76657274546F557466333200436F6E7665727446726F6D5574663332004572726F72496E76616C69644174747269627574650044656661756C744F626A6563744E616D650044656661756C7441727261794E616D650044656661756C744974656D4E616D65005472616E73666F726D456C656D656E74004465636F64654E616D650053797374656D2E586D6C00586D6C52656164657253657474696E67730070656E64696E674E65774C696E6500456D69744E65774C696E6500456E636F64654E616D6500466F726D6174417474726962757465006765745F577269746572007365745F57726974657200466C757368006765745F456E636F64696E67003C5772697465723E6B5F5F4261636B696E674669656C6400577269746572005370656369666965645375666669780053686F756C6453657269616C697A6550726566697800476574476574746572004765745365747465720047657450726F70657274794765747465720047657450726F7065727479536574746572004765744669656C64476574746572004765744669656C64536574746572004765744D6574686F6450726F7879004D6574686F64496E666F0047657454797065466163746F727900436F6E7374727563746F72496E666F00617373656D626C7900746F6B656E730073747265616D0077726974657200656E616D650076616C756500617343537472696E6700627974657300726561646572006973417272617900697341727261794974656D00646973706F73696E67006861736800636F64650074696D65006D616368696E650070696400696E6300726573756C740053797374656D2E52756E74696D652E496E7465726F705365727669636573004F75744174747269627574650073756274797065006900666F726D6174746572006F626A656374006D6574686F64006172677300506172616D41727261794174747269627574650063616C6C6261636B0074617267657400746172676574547970650069676E6F7265640061727261795479706500707265666978006E616D657370616365557269006C6F63616C4E616D6500696E70757400746F6B656E697A657200736F75726365007072656469636174650070726F70657274794E616D65006465746563746F7200747970654E616D6500656E756D657261746F72007479706500646174650064617461006F7574707574006964656E74006E6573746564007468726F774F6E456D707479006F626A00636F6E74656E7454797065730074797065436F646500656E756D54797065006E616D65737061636573007265676578006973476C6F62616C00746167007461786F6E6F6D7900617474726962757465007374796C65007461674E616D650061747472696275746573007072656669784465636C61726174696F6E730074657874007363616E6E657200756E7061727365644E616D6500626567696E00656E64007461675479706500714E616D6500636800610062007468617400636F6D7061726572006361706163697479006D696E0073657175656E6365006974656D006172726179496E646578006C656E677468006465737400627566666572656400756E617279006E6565647356616C756544656C696D006D656D626572006973496D6D757461626C6554797065006D656D626572730073636F7065007468726F774F6E556E6465636C6172656400636C6F7365546167007072656665727265645072656669780061636365707400636F6E74656E745479706500657874656E73696F6E00636173696E6700776F7264536570617261746F72006D756C7469776F7264007472616E73666F726D6572006973417474726962757465006D65737361676500696E6E6572457863657074696F6E00696E666F00636F6E74657874006379636C65547970650066696C74657273007374726174656779007265736F6C766572436163686500636F6C00636F6E74656E745479706548656164657200726561646572730061636365707448656164657200777269746572730070726F7065727479496E666F006973416E6F6E796D6F7573006669656C64496E666F006D656D626572496E666F007374726174656769657300696E7374616E6365006D656D62657256616C7565006D617000646174614E616D6500697349676E6F7265640061726754797065006F626A65637454797065006D61707300656E756D4D61707300746F6B656E54797065006361636865436F6E7461696E6572006D656D6265724D6170006D656D6265724E616D650076616C756554797065006974656D547970650075746633320069735374616E64416C6F6E6500656C656D656E744E616D6500636F756E74006465636C6172696E6754797065006D6574686F644E616D65006172675479706573006D6574686F64496E666F0063746F7200417373656D626C795469746C6541747472696275746500417373656D626C794465736372697074696F6E41747472696275746500417373656D626C79436F6E66696775726174696F6E41747472696275746500417373656D626C79436F6D70616E7941747472696275746500417373656D626C7950726F6475637441747472696275746500417373656D626C79436F7079726967687441747472696275746500417373656D626C7954726164656D61726B41747472696275746500417373656D626C7943756C7475726541747472696275746500417373656D626C7956657273696F6E41747472696275746500417373656D626C7946696C6556657273696F6E4174747269627574650053797374656D2E536563757269747900416C6C6F775061727469616C6C795472757374656443616C6C6572734174747269627574650053797374656D2E446961676E6F73746963730044656275676761626C6541747472696275746500446562756767696E674D6F64657300436F6D70696C6174696F6E52656C61786174696F6E734174747269627574650052756E74696D65436F6D7061746962696C6974794174747269627574650053514C232E4A736F6E467800417267756D656E744E756C6C457863657074696F6E00417373656D626C794E616D65006765745F46756C6C4E616D65006765745F56657273696F6E0052756E74696D655479706548616E646C65004765745479706546726F6D48616E646C6500476574437573746F6D417474726962757465006765745F436F70797269676874006765745F4465736372697074696F6E006765745F5469746C65006765745F436F6D70616E79006765745F436F6E66696775726174696F6E006765745F417373656D626C79004F62736F6C657465417474726962757465004461746554696D654B696E64004D656D6F727953747265616D00546F4172726179006765745F55544638006765745F4261736553747265616D006765745F506F736974696F6E005365656B4F726967696E005365656B0053797374656D2E476C6F62616C697A6174696F6E0043756C74757265496E666F006765745F496E76617269616E7443756C747572650049466F726D617450726F7669646572006765745F4B696E6400546F556E6976657273616C54696D650054696D655370616E005375627472616374006765745F546F74616C4D696C6C697365636F6E64730052656765784F7074696F6E73006765745F4F7074696F6E7300436F6E63617400476574427974657300476574547970650047657454797065436F6465004E6F74537570706F72746564457863657074696F6E005065656B436861720052656164496E7433320052656164427974650052656164446F75626C65005265616442797465730052656164496E743634004164644D696C6C697365636F6E6473006765745F436861727300426974436F6E76657274657200546F496E743332004279746500426C6F636B436F70790052656164436861727300526561644368617200474300537570707265737346696E616C697A65005374727563744C61796F7574417474726962757465004C61796F75744B696E6400457175616C697479436F6D70617265726031006765745F44656661756C7400436F6D70696C657247656E657261746564417474726962757465006765745F546F74616C5365636F6E64730055496E74313600417267756D656E744F75744F6652616E6765457863657074696F6E004164645365636F6E6473004368617200496E76616C696443617374457863657074696F6E0049734E756C6C4F72456D70747900537562737472696E67004E756D626572466F726D6174496E666F006765745F496E76617269616E74496E666F004E756D6265725374796C65730044656661756C744D656D626572417474726962757465003C416E616C797A653E645F5F300053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261626C653C53797374656D2E4F626A6563743E2E476574456E756D657261746F72003C3E325F5F63757272656E740053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261746F723C53797374656D2E4F626A6563743E2E6765745F43757272656E740053797374656D2E436F6C6C656374696F6E732E49456E756D657261746F722E5265736574003C3E315F5F7374617465003C3E6C5F5F696E697469616C5468726561644964003C3E345F5F74686973003C3E335F5F746F6B656E73003C3E335F5F74617267657454797065003C73747265616D3E355F5F310053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261746F723C53797374656D2E4F626A6563743E2E43757272656E7400446562756767657248696464656E4174747269627574650053797374656D2E546872656164696E6700546872656164006765745F43757272656E74546872656164006765745F4D616E616765645468726561644964003C416E616C797A653E645F5F3460310053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261626C653C54526573756C743E2E476574456E756D657261746F720053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261746F723C54526573756C743E2E6765745F43757272656E74003C726573756C74547970653E355F5F35003C73747265616D3E355F5F360053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261746F723C54526573756C743E2E43757272656E740054727947657456616C756500494C697374004E756C6C5265666572656E6365457863657074696F6E006765745F4D657373616765003C3E635F5F44\
-6973706C6179436C61737332003C50726F70657274793E625F5F30003C50726F706572746965734974657261746F723E645F5F340053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261626C653C53797374656D2E436F6C6C656374696F6E732E47656E657269632E4B657956616C7565506169723C4A736F6E46782E53657269616C697A6174696F6E2E446174614E616D652C53797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261626C653C4A736F6E46782E53657269616C697A6174696F6E2E546F6B656E3C4A736F6E46782E4D6F64656C2E4D6F64656C546F6B656E547970653E3E3E3E2E476574456E756D657261746F720053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261746F723C53797374656D2E436F6C6C656374696F6E732E47656E657269632E4B657956616C7565506169723C4A736F6E46782E53657269616C697A6174696F6E2E446174614E616D652C53797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261626C653C4A736F6E46782E53657269616C697A6174696F6E2E546F6B656E3C4A736F6E46782E4D6F64656C2E4D6F64656C546F6B656E547970653E3E3E3E2E6765745F43757272656E74003C3E335F5F736F75726365003C3E335F5F707265646963617465003C73747265616D3E355F5F35003C64657074683E355F5F36003C746F6B656E3E355F5F370053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261746F723C53797374656D2E436F6C6C656374696F6E732E47656E657269632E4B657956616C7565506169723C4A736F6E46782E53657269616C697A6174696F6E2E446174614E616D652C53797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261626C653C4A736F6E46782E53657269616C697A6174696F6E2E546F6B656E3C4A736F6E46782E4D6F64656C2E4D6F64656C546F6B656E547970653E3E3E3E2E43757272656E74003C41727261794974656D734974657261746F723E645F5F610053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261626C653C53797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261626C653C4A736F6E46782E53657269616C697A6174696F6E2E546F6B656E3C4A736F6E46782E4D6F64656C2E4D6F64656C546F6B656E547970653E3E3E2E476574456E756D657261746F720053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261746F723C53797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261626C653C4A736F6E46782E53657269616C697A6174696F6E2E546F6B656E3C4A736F6E46782E4D6F64656C2E4D6F64656C546F6B656E547970653E3E3E2E6765745F43757272656E74003C73747265616D3E355F5F62003C696E6465783E355F5F63003C746F6B656E3E355F5F640053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261746F723C53797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261626C653C4A736F6E46782E53657269616C697A6174696F6E2E546F6B656E3C4A736F6E46782E4D6F64656C2E4D6F64656C546F6B656E547970653E3E3E2E43757272656E74003C44657363656E64616E74734974657261746F723E645F5F3130003C70726F70657274793E355F5F3131003C64657363656E64616E743E355F5F3132003C6974656D3E355F5F3133003C64657363656E64616E743E355F5F3134003C3E375F5F777261703135003C3E6D5F5F46696E616C6C793136003C3E375F5F777261703137003C3E6D5F5F46696E616C6C793138003C3E375F5F777261703139003C3E6D5F5F46696E616C6C793161003C3E375F5F777261703162003C3E6D5F5F46696E616C6C793163003C44657363656E64616E7473416E6453656C664974657261746F723E645F5F3166003C64657363656E64616E743E355F5F3230003C3E375F5F777261703231003C3E6D5F5F46696E616C6C793232003C53706C697456616C7565734974657261746F723E645F5F3235003C73747265616D3E355F5F3236003C3E6D5F5F46696E616C6C793237003C53706C6963654E65787456616C75654C617A793E645F5F32610053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261626C653C4A736F6E46782E53657269616C697A6174696F6E2E546F6B656E3C4A736F6E46782E4D6F64656C2E4D6F64656C546F6B656E547970653E3E2E476574456E756D657261746F720053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261746F723C4A736F6E46782E53657269616C697A6174696F6E2E546F6B656E3C4A736F6E46782E4D6F64656C2E4D6F64656C546F6B656E547970653E3E2E6765745F43757272656E74003C3E335F5F73747265616D003C64657074683E355F5F3262003C746F6B656E3E355F5F32630053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261746F723C4A736F6E46782E53657269616C697A6174696F6E2E546F6B656E3C4A736F6E46782E4D6F64656C2E4D6F64656C546F6B656E547970653E3E2E43757272656E74006765745F4973456E756D0049734E614E004973506F736974697665496E66696E6974790049734E65676174697665496E66696E6974790053696E676C6500557269006765745F4B6579006765745F56616C756573004461746554696D655374796C65730050617273654578616374004D617463680047726F7570006765745F537563636573730047726F7570436F6C6C656374696F6E006765745F47726F7570730043617074757265004D696E56616C7565004D617856616C7565005265706C6163650053706C6974003C50726976617465496D706C656D656E746174696F6E44657461696C733E7B46354146393346302D364239462D343746322D413737362D3730393644423544363845387D0044696374696F6E61727960320024246D6574686F643078363030303066302D3100537472696E67436F6D7061726572006765745F4F7264696E616C00436F7079003C6765745F436F6E74656E74547970653E645F5F300053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261626C653C53797374656D2E537472696E673E2E476574456E756D657261746F720053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261746F723C53797374656D2E537472696E673E2E6765745F43757272656E74003C636F6E74656E74547970653E355F5F31003C3E6D5F5F46696E616C6C7932003C3E375F5F7772617033003C3E375F5F77726170340053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261746F723C53797374656D2E537472696E673E2E43757272656E74003C6765745F46696C65457874656E73696F6E3E645F5F3700537472696E6757726974657200476574537472696E674275696C646572006765745F5469636B73004973496E66696E69747900496E7431360053427974650055496E7433320055496E74363400436F6E7665727400546F446563696D616C00466C616773417474726962757465004973446566696E6564004A6F696E00546F55496E7436340047657456616C7565730047657456616C756500546F4F626A65637400546F446F75626C6500537472696E6753706C69744F7074696F6E73006765745F59656172006765745F4D6F6E7468006765745F446179006765745F486F7572006765745F4D696E757465006765745F5365636F6E64006765745F4D696C6C697365636F6E640024246D6574686F643078363030303131662D310024246D6574686F643078363030303132302D310024246D6574686F643078363030303132312D31003C6765745F556E706172736564546167733E645F5F30003C6E616D653E355F5F31003C3E375F5F7772617032003C3E6D5F5F46696E616C6C7933005265666572656E6365457175616C73004D617468004D6178004E6F74496D706C656D656E746564457863657074696F6E003C3E635F5F446973706C6179436C61737334003C496E6465784F663E625F5F30003C496E6465784F663E625F5F31006E0050726564696361746560310046696E64496E6465780053797374656D2E436F6C6C656374696F6E732E4F626A6563744D6F64656C00526561644F6E6C79436F6C6C656374696F6E6031004173526561644F6E6C790041747472696275746555736167654174747269627574650041747472696275746554617267657473003C476574546F6B656E733E645F5F37003C3E335F5F7363616E6E6572003C64657074683E355F5F38003C6E6565647356616C756544656C696D3E355F5F39003C686173556E6172794F703E355F5F61003C63683E355F5F62003C76616C75653E355F5F63003C737472506F733E355F5F65003C7374724C696E653E355F5F66003C737472436F6C3E355F5F3130003C6964656E743E355F5F3131006F705F477265617465725468616E4F72457175616C006F705F4C6573735468616E4F72457175616C003C5472616E73666F726D3E645F5F30003C3E335F5F696E707574003C73636F7065436861696E3E355F5F32003C746F6B656E3E355F5F33003C68617350726F706572746965733E355F5F34003C6973566F69643E355F5F35003C7461674E616D653E355F5F36003C73636F70653E355F5F37003C7072656669783E355F5F38003C617474724E616D653E355F5F39003C786D6C6E733E355F5F61003C76616C75653E355F5F62003C3E375F5F7772617063003C3E6D5F5F46696E616C6C79640053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261626C653C4A736F6E46782E53657269616C697A6174696F6E2E546F6B656E3C4A736F6E46782E4D61726B75702E4D61726B7570546F6B656E547970653E3E2E476574456E756D657261746F720053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261746F723C4A736F6E46782E53657269616C697A6174696F6E2E546F6B656E3C4A736F6E46782E4D61726B75702E4D61726B7570546F6B656E547970653E3E2E6765745F43757272656E74003C746F6B656E3E355F5F32003C7461674E616D653E355F5F330053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261746F723C4A736F6E46782E53657269616C697A6174696F6E2E546F6B656E3C4A736F6E46782E4D61726B75702E4D61726B7570546F6B656E547970653E3E2E43757272656E74006765745F43616E52656164004765744765744D6574686F64006765745F43616E5772697465004765745365744D6574686F64004D6574686F6442617365006765745F49735075626C6963006765745F4973496E69744F6E6C79003C3E635F5F446973706C6179436C617373350073706563696669656450726F70657274794765747465720064656661756C7456616C7565003C47657456616C756549676E6F72656443616C6C6261636B3E625F5F30003C47657456616C756549676E6F72656443616C6C6261636B3E625F5F31003C47657456616C756549676E6F72656443616C6C6261636B3E625F5F32006765745F5265666C656374656454797065006765745F4465636C6172696E67547970650042696E64696E67466C6167730047657450726F7065727479006765745F50726F7065727479547970650053797374656D2E436F6D706F6E656E744D6F64656C0044656661756C7456616C7565417474726962757465003C4765744E616D653E645F5F370053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261626C653C4A736F6E46782E53657269616C697A6174696F6E2E446174614E616D653E2E476574456E756D657261746F720053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261746F723C4A736F6E46782E53657269616C697A6174696F6E2E446174614E616D653E2E6765745F43757272656E74003C3E335F5F6D656D626572003C617474723E355F5F380053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261746F723C4A736F6E46782E53657269616C697A6174696F6E2E446174614E616D653E2E43757272656E74003C3E665F5F416E6F6E796D6F757354797065306033003C426567696E3E6A5F5F54506172003C456E643E6A5F5F54506172003C56616C75653E6A5F5F54506172003C426567696E3E695F5F4669656C64003C456E643E695F5F4669656C64003C56616C75653E695F5F4669656C6400446562756767657242726F777361626C6541747472696275746500446562756767657242726F777361626C655374617465003C3E635F5F446973706C6179436C61737331003C436F6E7461696E735072656669783E625F5F300046696E644C617374496E646578003C436F6E7461696E734E616D6573706163653E625F5F33003C3E635F5F446973706C6179436C61737339003C4765744E616D6573706163653E625F5F36003C4765744E616D6573706163653E625F5F37004353243C3E395F5F436163686564416E6F6E796D6F75734D6574686F6444656C6567617465380046696E644C617374003C3E635F5F446973706C6179436C61737365003C4765745072656669783E625F5F62003C4765745072656669783E625F5F63004353243C3E395F5F436163686564416E6F6E796D6F75734D6574686F6444656C656761746564003C3E635F5F446973706C6179436C6173733131003C436F6E7461696E735461673E625F5F31300049436F6D7061726572603100436F6E7461696E734B657900436F6E7461696E7356616C756500496E6465784F6656616C7565006765745F4B657973003C476574456E756D657261746F723E645F5F31330053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261746F723C53797374656D2E436F6C6C656374696F6E732E47656E657269632E4B657956616C7565506169723C53797374656D2E537472696E672C53797374656D2E537472696E673E3E2E6765745F43757272656E74003C6D617070696E673E355F5F31340053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261746F723C53797374656D2E436F6C6C656374696F6E732E47656E657269632E4B657956616C7565506169723C53797374656D2E537472696E672C53797374656D2E537472696E673E3E2E43757272656E74003C5061727365486561646572733E645F5F30003C3E335F5F616363657074003C3E335F5F636F6E74656E7454797065003C6D696D653E355F5F31003C747970653E355F5F32003C3E6D5F5F46696E616C6C7934003C53706C69745472696D3E645F5F37003C3E335F5F6368003C6C656E6774683E355F5F38003C707265763E355F5F39003C6E6578743E355F5F61003C706172743E355F5F62005472696D005061746800476574457874656E73696F6E003C4765744E616D653E645F5F30003C776F7264733E355F5F3100546F5570706572496E76617269616E7400546F4C6F776572496E76617269616E740049734C65747465724F7244696769740049734C6F776572005572694B696E6400497357656C6C466F726D6564557269537472696E6700497341737369676E61626C6546726F6D00476574496E74657266616365006765745F49734172726179006765745F497347656E657269635479706500537461727473576974680024246D6574686F643078363030303236622D3100436F6D7061726500456E7669726F6E6D656E74004D696E006765745F4F7264696E616C49676E6F7265436173650069676E6F72656444656C656761746573003C4765744E616D653E645F5F33003C73747261746567793E355F5F34003C6E616D653E355F5F35003C3E375F5F7772617036003C3E6D5F5F46696E616C6C7937003C3E375F5F7772617038003C3E6D5F5F46696E616C6C7939004C6F6164003C6C6F63616C4E616D653E355F5F31003C6E733E355F5F32003C74797065417474723E355F5F33003C6D656D626572417474723E355F5F34006765745F4669656C645479706500547970654C6F6164457863657074696F6E00476574436F6E7374727563746F727300476574506172616D6574657273006765745F506172616D6574657254797065004765744D6574686F6400456D7074795479706573006765745F4973496E74657266616365006765745F49734162737472616374006765745F497356616C7565547970650042696E64657200506172616D657465724D6F64696669657200476574436F6E7374727563746F720047657450726F7065727469657300476574496E646578506172616D6574657273004765744669656C64730049436F6E7665727469626C650049466F726D61747461626C6500416374697661746F7200437265617465496E7374616E63650047657447656E65726963417267756D656E747300476574556E6465726C79696E6754797065005472794372656174650046726F6D5469636B730047657447656E6572696354797065446566696E6974696F6E004D616B6547656E6572696354797065006765745F486173456C656D656E7454797065004E756C6C61626C656031003C5472616E73666F726D3E645F5F37003C73747265616D3E355F5F38003C746F6B656E3E355F5F39003C3E375F5F7772617061003C3E6D5F5F46696E616C6C796200586D6C436F6E76657274007365745F436865636B4368617261637465727300436F6E666F726D616E63654C6576656C007365745F436F6E666F726D616E63654C6576656C00537472696E6752656164657200586D6C54657874526561646572007365745F4E6F726D616C697A6174696F6E005768697465737061636548616E646C696E67007365745F5768697465737061636548616E646C696E67003C476574546F6B656E733E645F5F66003C3E335F5F726561646572003C7461674E616D653E355F5F3130003C6973566F69645461673E355F5F3131003C617474726962757465733E355F5F3132003C6174747269627574653E355F5F3133003C3E375F5F777261703134003C3E6D5F5F46696E616C6C79313500586D6C457863657074696F6E006765745F4C696E65506F736974696F6E006765745F4C696E654E756D62657200586D6C4E6F646554797065006765745F4E6F646554797065006765745F4C6F63616C4E616D65006765745F507265666978006765745F4E616D657370616365555249006765745F4973456D707479456C656D656E74006765745F48617341747472696275746573004D6F7665546F4E65787441747472696275746500456E636F64654C6F63616C4E616D6500586D6C57726974657253657474696E6773007365745F456E636F64696E67007365745F496E64656E74007365745F496E64656E744368617273007365745F4E65774C696E654368617273004E65774C696E6548616E646C696E67007365745F4E65774C696E6548616E646C696E67007365745F4F6D6974586D6C4465636C61726174696F6E0057726974655374617274456C656D656E74005772697465456E64456C656D656E740057726974655374617274417474726962757465005772697465456E644174747269627574650057726974655261770053797374656D2E586D6C2E53657269616C697A6174696F6E00586D6C49676E6F7265417474726962757465003C3E635F5F446973706C6179436C617373660073686F756C6453657269616C697A6550726F7879003C47657456616C756549676E6F72656443616C6C6261636B3E625F5F33003C47657456616C756549676E6F72656443616C6C6261636B3E625F5F34003C47657456616C756549676E6F72656443616C6C6261636B3E625F5F35003C47657456616C756549676E6F72656443616C6C6261636B3E625F5F36003C47657456616C756549676E6F72656443616C6C6261636B3E625F5F37006765745F52657475726E54797065003C4765744E616D653E645F5F313100586D6C526F6F74417474726962757465003C726F6F74417474723E355F5F313200586D6C54797065417474726962757465003C74797065417474723E355F5F313300586D6C456C656D656E74417474726962757465003C656C656D417474723E355F5F313400586D6C417474726962757465417474726962757465003C61747472417474723E355F5F313500586D6C4172726179417474726962757465003C6172726179417474723E355F5F313600586D6C456E756D417474726962757465003C656E756D417474723E355F5F3137006765745F456C656D656E744E616D65006765745F547970654E616D65006765745F4174747269627574654E616D65003C536F72744D656D626572733E645F5F31610053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261626C653C4A736F6E46782E53657269616C697A6174696F6E2E5265736F6C766572732E4D656D6265724D61703E2E476574456E756D657261746F720053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261746F723C4A736F6E46782E53657269616C697A6174696F6E2E5265736F6C766572732E4D656D6265724D61703E2E6765745F43757272656E74003C3E335F5F6D656D62657273003C636F756E743E355F5F3162003C6D61703E355F5F3163003C656C656D656E74733E355F5F3164003C6D61703E355F5F3165003C6D61703E355F5F3166003C3E375F5F777261703230003C3E6D5F5F46696E616C6C793231003C3E375F5F777261703232003C3E6D5F5F46696E616C6C793233003C3E375F5F777261703234003C3E6D5F5F46696E616C6C7932350053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261746F723C4A736F6E46782E53657269616C697A6174696F6E2E5265736F6C766572732E4D656D6265724D61703E2E43757272656E740053656375726974795472656174417353616665417474726962757465005365637572697479437269746963616C417474726962757465003C47657450726F70657274794765747465723E625F5F30003C47657450726F70657274795365747465723E625F5F33003C3E635F5F446973706C6179436C61737337003C4765744669656C644765747465723E625F5F36003C3E635F5F446973706C6179436C61737361003C4765744669656C645365747465723E625F5F390053657456616C7565006765745F49734C69746572616C003C3E635F5F446973706C6179436C61737364003C4765744D6574686F6450726F78793E625F5F63003C3E635F5F446973706C6179436C6173733130003C47657454797065466163746F72793E625F5F660000001161007300730065006D0062006C007900000D74006F006B0065006E007300000D730074007200650061006D00002B55006E007400650072006D0069006E006100740065006400200064006F00630075006D0065006E007400002D55006E0065007800700065006300740065006400200074006F006B0065006E00200028007B0030007D0029000001000367000003690000036D00000569006D00003D55006E006B006E006F0077006E002000420053004F004E00200065006C0065006D0065006E0074002000640061007400610020007400790070006500003B55006E006B006E006F0077006E002000420053004F004E002000620069006E006100720079002000640061007400610020007400790070006500003B55006E0065007800700065006300740065006400200065006C0065006D0065006E00740020007400790070006500200028007B0030007D002900000B62007900740065007300000D72006500610064006500720000354F0062006A006500630074004900440020006900730020006500780061006300740020003100320020006200790074006500730000634F0062006A006500630074004900440020006F006E006C007900200073007500700070006F007200740073002000610020006C0069006D0069007400650064002000720061006E006700650020006F00660020006400610074006500730020002800003720007300650063006F006E00640073002000730069006E0063006500200055006E00690078002000650070006F006300680029002E00004953007400720069006E00670020006D007500730074002000620065002000650078006100630074006C00790020003200340020006800650078002000640069006700690074007300003D53007400720069006E00670020006D0075007300740020006200650020006F006E006C007900200068006500780020006400690067006900740073000011730065007400740069006E006700730000374500780070006500630074006500640020006F0062006A00650063007400200073007400610072007400200028007B0030007D00290000694500780070006500630074006500640020006F0062006A006500630074002000700072006F007000650072007400790020006E0061006D00650020006F007200200065006E00640020006F00660020006F0062006A00650063007400200028007B0030007D002900002755006E007400650072006D0069006E00610074006500640020006F0062006A00650063007400003545007800700065006300740065006400200061007200720061007900200073007400610072007400200028007B0030007D00290000534500780070006500630074006500640020006100720072006100790020006900740065006D0020006F007200200065006E00640020006F006600200061007200720061007900200028007B0030007D002900002555006E007400650072006D0069006E006100740065006400200061007200720061007900002954006F006B0065006E0069007A0065007200200069007300200069006E00760061006C0069006400001374006F006B0065006E0069007A0065007200001161006E0061006C0079007A0065007200003149006E00760061006C0069006400200074007200610069006C0069006E006700200063006F006E00740065006E007400000D73006F007500720063006500003D55006E0065007800700065006300740065006400200065006E00640020006F006600200074006F006B0065006E002000730074007200650061006D00004549006E00760061006C00690064002000700072006F00700065007200740079002000760061006C0075006500200074006F006B0065006E00200028007B0030007D00290000534700720061007000680020006300790063006C0065002000640065007400650063007400650064003A0020007200650070006500610074006500640020007200650066006500720065006E0063006500730000714700720061007000680020006300790063006C006500200070006F00740065006E007400690061006C006C0079002000640065007400650063007400650064003A0020006D006100780069006D0075006D00200064006500700074006800200065\
-007800630065006500640065006400003D790079007900790027002D0027004D004D0027002D002700640064002700540027004800480027003A0027006D006D0027003A002700730073004B000149790079007900790027002D0027004D004D0027002D002700640064002700540027004800480027003A0027006D006D0027003A0027007300730027002E0027006600660066004B000151790079007900790027002D0027004D004D0027002D002700640064002700540027004800480027003A0027006D006D0027003A0027007300730027002E00270046004600460046004600460046004B00010D2F0044006100740065002800000529002F00004B5E002F0044006100740065005C00280028005B002B005C002D005D003F005C0064002B003F00290028005B002B005C002D005D005C0064007B0034007D0029003F005C0029002F002400010D770061006C006B0065007200001366006F0072006D006100740074006500720000294900640065006E00740069006600690065007200200069007300200065006D007000740079002E000003200000194900640065006E00740069006600690065007200200022000027220020006900730020006E006F007400200073007500700070006F0072007400650064002E0000096E0075006C006C00000B660061006C007300650000097400720075006500000B62007200650061006B0000096300610073006500000B63006100740063006800001163006F006E00740069006E0075006500001164006500620075006700670065007200000F640065006600610075006C007400000D640065006C00650074006500000564006F00000965006C0073006500000F660069006E0061006C006C007900000766006F0072000011660075006E006300740069006F006E00000569006600000569006E00001569006E007300740061006E00630065006F00660000076E0065007700000D720065007400750072006E00000D73007700690074006300680000097400680069007300000B7400680072006F0077000007740072007900000D74007900700065006F0066000007760061007200000976006F0069006400000B7700680069006C00650000097700690074006800001161006200730074007200610063007400000F62006F006F006C00650061006E000009620079007400650000096300680061007200000B63006C00610073007300000B63006F006E0073007400000D64006F00750062006C006500000965006E0075006D00000D6500780070006F0072007400000F65007800740065006E0064007300000B660069006E0061006C00000B66006C006F0061007400000967006F0074006F00001569006D0070006C0065006D0065006E0074007300000D69006D0070006F0072007400000769006E007400001369006E00740065007200660061006300650000096C006F006E006700000D6E0061007400690076006500000F7000610063006B00610067006500000F70007200690076006100740065000013700072006F00740065006300740065006400000D7000750062006C0069006300000B730068006F0072007400000D730074006100740069006300000B730075007000650072000019730079006E006300680072006F006E0069007A0065006400000D7400680072006F007700730000137400720061006E007300690065006E007400001176006F006C006100740069006C00650000076C0065007400000B7900690065006C006400001963006F006E00740065006E0074005400790070006500730000216100700070006C00690063006100740069006F006E002F006A0073006F006E00001374006500780074002F006A0073006F006E00001774006500780074002F0078002D006A0073006F006E00010B2E006A0073006F006E00000330000003310000037200002949006E00760061006C006900640020006E0075006D00620065007200200074006F006B0065006E0000055C00620000055C00660000055C006E0000055C00720000055C00740000055C0075000005580034000003660000052C00200000032E00003F0D000A002F002A0020006E0061006D0065007300700061006300650020007B0031007D0020002A002F000D000A0076006100720020007B0030007D003B00001176006100720020007B0030007D003B00006D0D000A006900660020002800220075006E0064006500660069006E0065006400220020003D003D003D00200074007900700065006F00660020007B0030007D00290020007B007B000D000A0009007B0030007D0020003D0020007B007B007D007D003B000D000A007D007D000053690066002800220075006E0064006500660069006E006500640022003D003D003D0074007900700065006F00660020007B0030007D0029007B007B007B0030007D003D007B007B007D007D003B007D007D0000074E0061004E00001149006E00660069006E0069007400790000556E00650077002000440061007400650028007B0030003A0030003000300030007D002C007B0031007D002C007B0032007D002C007B0033007D002C007B0034007D002C007B0035007D002C007B0036007D002900001B6E00650077002000440061007400650028007B0030007D002900000928003F003A002900000F63006F006E0073006F006C006500001164006F00630075006D0065006E007400000B6500760065006E007400000D6600720061006D0065007300000F68006900730074006F007200790000116C006F0063006100740069006F006E0000136E006100760069006700610074006F007200000B6F007000650072006100000D730063007200650065006E00000D770069006E0064006F00770000096100720065006100000962006100730065000011620061007300650066006F006E007400000562007200000763006F006C00000B6600720061006D006500000568007200000769006D006700000B69006E00700075007400000F6900730069006E00640065007800000D6B0065007900670065006E0000096C0069006E006B0000096D00650074006100000B70006100720061006D000007770062007200000962006F0064007900001163006F006C00670072006F0075007000000564006400000564007400000B65006D00620065006400000968006500610064000009680074006D006C0000056C006900000D6F007000740069006F006E0000037000000B740062006F0064007900000574006400000B740066006F006F007400000574006800000B740068006500610064000005740072000003610000096100620062007200000F6100630072006F006E0079006D000007620064006F0000096300690074006500000963006F00640065000007640066006E00000565006D0000076B006200640000076D0061007000000371000009730061006D00700000097300700061006E00000D7300740072006F006E0067000009740069006D006500000B61007500640069006F00000F6200670073006F0075006E006400000B73006F0075006E006400000D630061006E0076006100730000096D006100740068000007730076006700000B76006900640065006F00000362000007620069006700000B62006C0069006E006B000015660069006700630061007000740069006F006E00000966006F006E007400000F6D0061007200710075006500650000096D00610072006B000005720070000005720074000009720075006200790000037300000B73006D0061006C006C00000D73007400720069006B0065000007730075006200000773007500700000057400740000037500000F6100640064007200650073007300000F610072007400690063006C006500000D610073007300690064006500001562006C006F0063006B00710075006F0074006500000562007100000D630065006E007400650072000007640065006C00000F640065007400610069006C0073000007640069007600000D660069006700750072006500000D66006F006F00740065007200000568003100000568003200000568003300000568003400000568003500000568003600000D680065006100640065007200000D6800670072006F0075007000000769006E00730000076E006100760000096E006F00620072000007700072006500000F730065006300740069006F006E00000F730075006D006D00610072007900000F63006F006D006D0061006E006400000564006C00000764006900720000056C00680000096D0065006E00750000056F006C00000575006C00000F630061007000740069006F006E00000B7400610062006C006500000D62007500740074006F006E00001164006100740061006C0069007300740000116600690065006C006400730065007400000966006F0072006D00000B6C006100620065006C00000D6C006500670065006E006400000B6D00650074006500720000116F0070007400670072006F0075007000000D6F00750074007000750074000011700072006F0067007200650073007300000D730065006C00650063007400001174006500780074006100720065006100000D6100700070006C0065007400000F6E006F0065006D00620065006400000D6F0062006A00650063007400000B7300740079006C00650000116E006F00730063007200690070007400000D73006300720069007000740000116600720061006D006500730065007400000D69006600720061006D00650000116E006F006600720061006D0065007300000B7400690074006C006500000B78006D006C006E00730000055F00780000035F00000926006C0074003B0000092600670074003B00000B260061006D0070003B00000726002300780000035800000D2600710075006F0074003B00000D2600610070006F0073003B00002D49006E00760061006C0069006400200074006100670020007300740061007200740020006300680061007200000721002D002D0001314D0061006C0066006F0072006D0065006400200061007400740072006900620075007400650020006E0061006D00650000052D002D00010F5B00430044004100540041005B0000055D005D000003210000053F003D0000033F00000725002D002D0001072D002D00250001032500000723002D002D0001072D002D00230001032300003355006E007200650063006F0067006E0069007A0065006400200075006E007000610072007300650064002000740061006700002D55006E0065007800700065006300740065006400200065006E00640020006F0066002000660069006C00650000534D0069007300730069006E00670020006100740074007200690062007500740065002000760061006C0075006500200063006C006F00730069006E0067002000640065006C0069006D006900740065007200003549006E00760061006C0069006400200065006C0065006D0065006E00740020006E0061006D006500200028007B0030007D002900002B4D0061006C0066006F0072006D0065006400200065006C0065006D0065006E0074002000740061006700002978006D006C006E0073002000760061006C0075006500200077006100730020006E0075006C006C0000214D0061006C0066006F0072006D0065006400200065006E007400690074007900000B410045006C0069006700000D410061006300750074006500000B41006300690072006300000D410067007200610076006500000B41006C00700068006100000B4100720069006E006700000D4100740069006C00640065000009410075006D006C0000094200650074006100000D430063006500640069006C000007430068006900000D440061006700670065007200000B440065006C00740061000007450054004800000D450061006300750074006500000B45006300690072006300000D450067007200610076006500000F45007000730069006C006F006E0000074500740061000009450075006D006C00000B470061006D006D006100000D490061006300750074006500000B49006300690072006300000D490067007200610076006500000949006F00740061000009490075006D006C00000B4B006100700070006100000D4C0061006D0062006400610000054D007500000D4E00740069006C006400650000054E007500000B4F0045006C0069006700000D4F0061006300750074006500000B4F006300690072006300000D4F0067007200610076006500000B4F006D00650067006100000F4F006D006900630072006F006E00000D4F0073006C00610073006800000D4F00740069006C006400650000094F0075006D006C000007500068006900000550006900000B5000720069006D00650000075000730069000007520068006F00000D53006300610072006F006E00000B5300690067006D006100000B540048004F0052004E000007540061007500000B54006800650074006100000D550061006300750074006500000B55006300690072006300000D550067007200610076006500000F55007000730069006C006F006E000009550075006D006C00000558006900000D5900610063007500740065000009590075006D006C0000095A00650074006100000D610061006300750074006500000B61006300690072006300000B61006300750074006500000B610065006C0069006700000D610067007200610076006500000F61006C0065006600730079006D00000B61006C00700068006100000761006D007000000761006E006400000761006E0067000009610070006F007300000B6100720069006E006700000B6100730079006D007000000D6100740069006C00640065000009610075006D006C00000B62006400710075006F0000096200650074006100000D6200720076006200610072000009620075006C006C000007630061007000000D630063006500640069006C00000B63006500640069006C000009630065006E007400000763006800690000096300690072006300000B63006C00750062007300000963006F006E006700000963006F0070007900000B630072006100720072000007630075007000000D630075007200720065006E0000096400410072007200000D640061006700670065007200000964006100720072000007640065006700000B640065006C0074006100000B6400690061006D007300000D640069007600690064006500000D650061006300750074006500000B65006300690072006300000D650067007200610076006500000B65006D00700074007900000965006D0073007000000965006E0073007000000F65007000730069006C006F006E00000B65007100750069007600000765007400610000076500740068000009650075006D006C0000096500750072006F00000B65007800690073007400000966006E006F006600000D66006F00720061006C006C00000D660072006100630031003200000D660072006100630031003400000D660072006100630033003400000B66007200610073006C00000B670061006D006D0061000005670065000005670074000009680041007200720000096800610072007200000D680065006100720074007300000D680065006C006C0069007000000D690061006300750074006500000B69006300690072006300000B69006500780063006C00000D690067007200610076006500000B69006D00610067006500000B69006E00660069006E00000969006F0074006100000D69007100750065007300740000096900730069006E000009690075006D006C00000B6B00610070007000610000096C00410072007200000D6C0061006D0062006400610000096C0061006E006700000B6C006100710075006F0000096C00610072007200000B6C006300650069006C00000B6C006400710075006F0000056C006500000D6C0066006C006F006F007200000D6C006F00770061007300740000076C006F007A0000076C0072006D00000D6C0073006100710075006F00000B6C007300710075006F0000056C00740000096D00610063007200000B6D006400610073006800000B6D006900630072006F00000D6D006900640064006F007400000B6D0069006E007500730000056D007500000B6E00610062006C00610000096E00620073007000000B6E00640061007300680000056E00650000056E00690000076E006F007400000B6E006F00740069006E0000096E00730075006200000D6E00740069006C006400650000056E007500000D6F0061006300750074006500000B6F006300690072006300000B6F0065006C0069006700000D6F0067007200610076006500000B6F006C0069006E006500000B6F006D00650067006100000F6F006D006900630072006F006E00000B6F0070006C007500730000056F00720000096F0072006400660000096F00720064006D00000D6F0073006C00610073006800000D6F00740069006C0064006500000D6F00740069006D006500730000096F0075006D006C000009700061007200610000097000610072007400000D7000650072006D0069006C000009700065007200700000077000680069000005700069000007700069007600000D70006C00750073006D006E00000B70006F0075006E006400000B7000720069006D0065000009700072006F0064000009700072006F00700000077000730069000009710075006F00740000097200410072007200000B720061006400690063000009720061006E006700000B72006100710075006F0000097200610072007200000B72006300650069006C00000B72006400710075006F0000097200650061006C000007720065006700000D720066006C006F006F0072000007720068006F00000772006C006D00000D720073006100710075006F00000B72007300710075006F00000B73006200710075006F00000D73006300610072006F006E000009730064006F007400000973006500630074000007730068007900000B7300690067006D006100000D7300690067006D00610066000007730069006D00000D730070006100640065007300000973007500620065000007730075006D0000097300750070003100000973007500700032000009730075007000330000097300750070006500000B73007A006C00690067000007740061007500000D740068006500720065003400000B74006800650074006100001174006800650074006100730079006D00000D7400680069006E0073007000000B740068006F0072006E00000B740069006C0064006500000B740069006D0065007300000B7400720061006400650000097500410072007200000D75006100630075007400650000097500610072007200000B75006300690072006300000D750067007200610076006500000775006D006C00000B75007000730069006800000F75007000730069006C006F006E000009750075006D006C00000D770065006900650072007000000578006900000D7900610063007500740065000007790065006E000009790075006D006C0000097A0065007400610000077A0077006A0000097A0077006E006A0000096E0061006D006500002D45006E0075006D0065007200610074006F00720020006E006F00740020007300740061007200740065006400002945006E0075006D0065007200610074006F0072002000680061007300200065006E006400650064000011730065007100750065006E0063006500000B73007400610072007400000D6C0065006E006700740068000009640065007300740000156100720072006100790049006E00640065007800002F4E006F0074002000630075007200720065006E0074006C00790020006300680075006E006B0069006E0067002E00000F7300630061006E006E0065007200002F4D0069007300730069006E0067002000760061006C00750065002000640065006C0069006D0069007400650072000035450078007400720061006E0065006F00750073002000760061006C00750065002000640065006C0069006D006900740065007200002B49006C006C006500670061006C0020004A0053004F004E002000730065007100750065006E006300650000052F002A00003555006E007400650072006D0069006E006100740065006400200063006F006D006D0065006E007400200062006C006F0063006B0000052F002F0000052A002F00002749006C006C006500670061006C0020004A0053004F004E0020006E0075006D00620065007200003155006E007400650072006D0069006E00610074006500640020004A0053004F004E00200073007400720069006E006700001375006E0064006500660069006E0065006400000D78006D006C006E0073003A0000075C0073002B00002F4D0069007300730069006E00670020004A0073006F006E004D004C00200074006100670020006E0061006D006500004749006E00760061006C006900640020006100740074007200690062007500740065002000760061006C0075006500200074006F006B0065006E00200028007B0030007D002900004555006E007400650072006D0069006E0061007400650064002000610074007400720069006200750074006500200062006C006F0063006B00200028007B0030007D00290000157B00200042006500670069006E0020003D00200000112C00200045006E00640020003D00200000152C002000560061006C007500650020003D002000000520007D00000B730063006F0070006500003555006E006B006E006F0077006E002000730063006F00700065002000700072006500660069007800200028007B0030007D00290000177400720061006E00730066006F0072006D006500720000136C006F00630061006C004E0061006D00650000554E0061006D0065007300700061006300650020006D00750073007400200062006500200061006E0020006100620073006F006C00750074006500200055005200490020006F007200200065006D0070007400790000196E0061006D00650073007000610063006500550072006900001975006E007300690067006E0065006400420079007400650000094300680061007200000F64006500630069006D0061006C00001B75006E007300690067006E0065006400530068006F0072007400001775006E007300690067006E006500640049006E007400001975006E007300690067006E00650064004C006F006E006700000D73007400720069006E00670000116400610074006500540069006D006500000B6100720072006100790000253C003E0066005F005F0041006E006F006E0079006D006F00750073005400790070006500004968007400740070003A002F002F007700770077002E00770033002E006F00720067002F0058004D004C002F0031003900390038002F006E0061006D00650073007000610063006500004168007400740070003A002F002F007700770077002E00770033002E006F00720067002F0032003000300031002F0058004D004C0053006300680065006D006100005368007400740070003A002F002F007700770077002E00770033002E006F00720067002F0032003000300031002F0058004D004C0053006300680065006D0061002D0069006E007300740061006E0063006500013B68007400740070003A002F002F007700770077002E00770033002E006F00720067002F0032003000300030002F0078006D006C006E0073002F00003968007400740070003A002F002F007700770077002E00770033002E006F00720067002F0031003900390039002F007800680074006D006C00003768007400740070003A002F002F007700770077002E00770033002E006F00720067002F0032003000300035002F00410074006F006D00004168007400740070003A002F002F007000750072006C002E006F00720067002F00640063002F0065006C0065006D0065006E00740073002F0031002E0031002F00004D68007400740070003A002F002F007000750072006C002E006F00720067002F00730079006E006400690063006100740069006F006E002F007400680072006500610064002F0031002E003000000778006D006C0000057800730000077800730069000009610074006F006D000005640063000007740068007200000770006600780000033A0000037B0000037D0000434D00610078004400650070007400680020006D0075007300740020006200650020006100200070006F007300690074006900760065002000760061006C007500650000116D00610078004400650070007400680000030900001573007400720061007400650067006900650073000039530079007300740065006D002E00520075006E00740069006D0065002E00530065007200690061006C0069007A006100740069006F006E0000032C000065530079007300740065006D002E00520075006E00740069006D0065002E00530065007200690061006C0069007A006100740069006F006E002E00440061007400610043006F006E00740072006100630074004100740074007200690062007500740065000061530079007300740065006D002E00520075006E00740069006D0065002E00530065007200690061006C0069007A006100740069006F006E002E0044006100740061004D0065006D00620065007200410074007400720069006200750074006500006D530079007300740065006D002E00520075006E00740069006D0065002E00530065007200690061006C0069007A006100740069006F006E002E00490067006E006F007200650044006100740061004D0065006D0062006500720041007400740072006900620075007400650000094E0061006D00650000134E0061006D006500730070006100630065000019700072006F007000650072007400790049006E0066006F0000136600690065006C00640049006E0066006F00000974007900700065000080AD49006E00740065007200660061006300650073002C00200041006200730074007200610063007400200063006C00610073007300650073002C00200061006E006400200075006E0073007500700070006F0072007400650064002000560061006C0075006500540079007000650073002000630061006E006E006F007400200062006500200069006E007300740061006E007400690061007400650064002E00200028007B0030007D0029000011410064006400520061006E0067006500000741006400640000117300740072006100740065006700790000057B00200000033D0000034600001B7200650073006F006C007600650072004300610063006800650000809D55006E00610062006C006500200074006F002000660069006E0064002000610020007300750069007400610062006C006500200063006F006E007300740072007500630074006F007200200066006F007200200069006E007300740061006E00740069006100740069006E00670020007400680065002000740061007200670065007400200054007900700065002E00200028007B0030007D0029000080E954007900700065007300200077006800690063006800200069006D0070006C0065006D0065006E0074002000470065006E00650072006900630020004900440069006300740069006F006E006100720079003C0054004B00650079002C0020005400560061006C00750065003E00200061006C0073006F0020006E00650065006400200074006F00200069006D0070006C0065006D0065006E00740020004900440069006300740069006F006E00610072007900200074006F002000620065002000640065007300\
-65007200690061006C0069007A00650064002E00200028007B0030007D00290000477B0030007D00200064006F006500730020006E006F007400200061006300630065007000740020006E0075006C006C00200061007300200061002000760061006C007500650000374500720072006F007200200063006F006E00760065007200740069006E00670020007B0030007D00200074006F0020007B0031007D000080D554007900700065007300200077006800690063006800200069006D0070006C0065006D0065006E0074002000470065006E00650072006900630020004900440069006300740069006F006E006100720079003C0054004B00650079002C0020005400560061006C00750065003E0020006E00650065006400200074006F0020006800610076006500200073007400720069006E00670020006B00650079007300200074006F00200062006500200064006500730065007200690061006C0069007A00650064002E00200028007B0030007D002900001F6100700070006C00690063006100740069006F006E002F0078006D006C00001174006500780074002F0078006D006C0000096900740065006D000013210044004F00430054005900500045002000001521004E004F0054004100540049004F004E00200000092E0078006D006C0000534100740074007200690062007500740065002000760061006C0075006500730020006D0075007300740020006200650020007000720069006D0069007400690076006500200069006E007000750074002E00000D7700720069007400650072000013530070006500630069006600690065006400001F530068006F0075006C006400530065007200690061006C0069007A006500001B6400650063006C006100720069006E006700540079007000650000156D006500740068006F0064004E0061006D00650000156D006500740068006F00640049006E0066006F000009630074006F00720000000000F093AFF59F6BF247A7767096DB5D68E80008B77A5C561934E08907151218011180800715122401118080051512150105071512480111808007151260011180800715127001118080081512808401118080071512808C011300091512809002130013010A15128094021180801300071512809801112108151280AC0111808008151280B40111808008151280BC0111808008151280BC0111816C08151280E00111816C0B151280F00211808011816C0615122501130006151229011300061512150113000615122D011300071512810C0113000715128110011300061512810C010308151280E0011180800B151280F00211816C11808008151280B40111816C0A15121501151139020E0E07151280E001130107151280BC0113000715123D0111818C030612080306124D02060E0520010112510206050306110C0100010101020103010401050106010701080109010A010B010C010D010E010F01100111011201FF017F0306111001802A55006E007400650072006D0069006E006100740065006400200064006F00630075006D0065006E0074002C55006E0065007800700065006300740065006400200074006F006B0065006E00200028007B0030007D00290062450078007000650063007400650064002000760061006C00750065002000640065006C0069006D00690074006500720020006F007200200065006E00640020006F006600200064006F00630075006D0065006E007400200028007B0030007D002900020608040100000004040000000408000000040C000000030611210320000110200201151215011512820001130012550F20011D0515121501151282000113001020011D051512150115128200011180801120020115121501151282000111808012551220020812591512810C0115128200011180801320030812591512810C0115128200011180800E0700030812590E020D000208125915128200011180800720020812591230050001110C1C05000112441C0320000A0F2001151215011512820001130012550F200115121501151282000113001D050328000A3A55006E0065007800700065006300740065006400200065006C0065006D0065006E00740020007400790070006500200028007B0030007D0029000306125D12000301151261011512820001118080125D0211000201151261011512820001118080125D0500010E125D10200115121501151282000111808012551020011512150115128200011180801D05102001151215011512820001118080125D042001010203061165042001010E052001011D050520010111650600011165112C060001112C11650320000E0320000804200011340520010111340F20001512810C011512820001118080102001011512810C011512820001118080030611340E061512810C01151282000111808004280011340F28001512810C0115128200011180800500010E113405000111340E0500010E113805000111380E0420001140052001011140030611400328000E042800114003061D0508200401112108080804200011210500010E114005000111400E0600011D05114006000111401D050420001D05070002020E101140042800112103280008030612440720020111101D05042000111004200105080500010E124405000112440E0600011D05124406000112441D05070002020E101244040001030807200015122D010504200012310428001D05042800111004280105080B2002081512180113001259042000110C052002011C180520011C1D1C09200312691D1C126D1C0520011C12690620021C1C1D1C0A200412691C1D1C126D1C0420011C1C08200312691C126D1C052002011C1C09200412691C1C126D1C0520010112690520001281AC0F20011219151215011512820001130011200212191512150115128200011300127114300101151215011E00151215011512820001130016300102151215011E0015121501151282000113001E000528001281AC3445007800700065006300740065006400200061007200720061007900200073007400610072007400200028007B0030007D002900524500780070006500630074006500640020006100720072006100790020006900740065006D0020006F007200200065006E00640020006F006600200061007200720061007900200028007B0030007D002900664500780070006500630074006500640020006100720072006100790020006900740065006D002000640065006C0069006D00690074006500720020006F007200200065006E00640020006F006600200061007200720061007900200028007B0030007D002900244D0069007300730069006E00670020006100720072006100790020006900740065006D002455006E007400650072006D0069006E006100740065006400200061007200720061007900364500780070006500630074006500640020006F0062006A00650063007400200073007400610072007400200028007B0030007D002900684500780070006500630074006500640020006F0062006A006500630074002000700072006F007000650072007400790020006E0061006D00650020006F007200200065006E00640020006F00660020006F0062006A00650063007400200028007B0030007D0029005E450078007000650063007400650064002000760061006C00750065002000640065006C0069006D00690074006500720020006F007200200065006E00640020006F00660020006F0062006A00650063007400200028007B0030007D0029002E4D0069007300730069006E00670020006F0062006A006500630074002000700072006F00700065007200740079002655006E007400650072006D0069006E00610074006500640020006F0062006A0065006300740004061281AC04061282040D06151215011512808C01118080062001011281AC10200112191512150115128200011180801220021219151215011512820001118080127115300101151215011E0015121501151282000111808017300102151215011E001512150115128200011180801E001220021C1512810C0115128200011180801271122002021512810C011512820001118080101C090615128200011180800B000115128200011180800E0D000315128200011180800E0E0E0D0001151282000111808011818C0B000115128200011180801C072000151215010E093001021E0012751E00073001011E0012750520011C12750720021C12751271083001021E000E1E00063001011E000E0420011C0E0620021C0E127106200112191275072800151215010E1720031C151280E001130015121501151282000113001271092000151280E0011300082000151260011300092000151260011180800620011301130009200312691300126D1C062001130112693C55006E0065007800700065006300740065006400200065006E00640020006F006600200074006F006B0065006E002000730074007200650061006D004449006E00760061006C00690064002000700072006F00700065007200740079002000760061006C0075006500200074006F006B0065006E00200028007B0030007D0029000D061512150115128200011180800F000102151215011512820001118080170002021512150115128200011180801512780211818C021D000215121501151282000111808015121501151282000111808011818C250001151215011511390211818C1512150115128200011180801512150115128200011180802D0002151215011511390211818C1512150115128200011180801512150115128200011180801512780211818C021E000115121501151215011512820001118080151215011512820001118080240002151215011512150115128200011180801512150115128200011180801512780208021B00011512150115128200011180801512810C011512820001118080100001011512810C0115128200011180800406118080040000000004020000000403000000040500000004060000000E200115121501151282000113001C04061281B0062001011281B00F20011512150115128200011180801C1320030115126101151282000111808012819C1C1420030115126101151282000111808012819C12191720040115126101151282000111808012819C11818C12791F20040115126101151282000111808012819C11818C15122D01151139020E1C1520040115126101151282000111808012819C12711C06200111818C1C142003021281AC1512810C0115128200011300101C132003021281B01C101512150115128200011300152003021281AC1512810C0115128200011300101301142003021281B013011015121501151282000113003C790079007900790027002D0027004D004D0027002D002700640064002700540027004800480027003A0027006D006D0027003A002700730073004B0048790079007900790027002D0027004D004D0027002D002700640064002700540027004800480027003A0027006D006D0027003A0027007300730027002E0027006600660066004B0050790079007900790027002D0027004D004D0027002D002700640064002700540027004800480027003A0027006D006D0027003A0027007300730027002E00270046004600460046004600460046004B000520001180A0062001011180A0162003021281AC1512810C011512820001118080101121152003021281B0112110151215011512820001118080070002020E1011210520010E11210528001180A004061180A002060A080028D3ED7CC7FFFF0800DC1FD277E600004A5E002F0044006100740065005C00280028005B002B005C002D005D003F005C0064002B003F00290028005B002B005C002D005D005C0064007B0034007D0029003F005C0029002F0024000C2F00440061007400650028000429002F000306127D0520001280810520001281B0062002011C12490420010E1C0528001280810528001281B009200015128084011300092000151280BC0113000A200015128084011180800C200201151280BC01130012490500020E0E020600030E0E0202050002020E02040001020E0600011280B80E0600010E1280B80D200201151280BC011180801249042001021C10200201151215011512820001130012490E20010E151215011512820001130003061D0E082002011281B01D0E0A2000151280BC01118080020602032000020F20010E1512150115128200011180801120020115121501151282000111808012490620020112491C0620020112490E0920030112491C118085052001011249062002011249080520010E12090800021D120912711C06200102118089032800021A6E00650077002000440061007400650028007B0030007D002900546E00650077002000440061007400650028007B0030003A0030003000300030007D002C007B0031007D002C007B0032007D002C007B0033007D002C007B0034007D002C007B0035007D002C007B0036007D0029000828003F003A002900020603022F00025C00022E003E0D000A002F002A0020006E0061006D0065007300700061006300650020007B0031007D0020002A002F000D000A0076006100720020007B0030007D003B001076006100720020007B0030007D003B0052690066002800220075006E0064006500660069006E006500640022003D003D003D0074007900700065006F00660020007B0030007D0029007B007B007B0030007D003D007B007B007D007D003B007D007D006C0D000A006900660020002800220075006E0064006500660069006E0065006400220020003D003D003D00200074007900700065006F00660020007B0030007D00290020007B007B000D000A0009007B0030007D0020003D0020007B007B007D007D003B000D000A007D007D0003061D030606151225010E0C00040212490E151261010E020700020112491121070002011249127D080003011249127D020C20030211818C11816C1180D40B20030211818C11818C101C0920030211818C0E101C05200102101C0600011180D40E04061180D40410000000042000000004400000000480000000040001000004000200000400800000040612817004061180DC0520001180DC062001011180DC0F20010E15121501151282000111816C1120020115121501151282000111816C12491E200501124911816C11818C1512808D0211818C151282000111816C1281740720030112490E0E0F20040112490E0E151282000111816C0600020112490E0700030112490E020800040112490E02020528001180DC0F2001151215011512820001130012750E200115121501151282000113000E040612811C0806151225011280E808200101151215010E1220020115126101151282000111816C12811C1720031280E815126101151282000111816C12811C1280E80D2001151282000111816C12811C0820030E12811C0E0E0800011280E812811C0A20020212811C1011816C1C20040115126101151282000111816C11816C1280E8151261011280EC1020020115126101151282000111816C0E0600010112811C0620010E12811C040001080E040001020310200115121501151282000111816C12750F200115121501151282000111816C0E090002021280E81280E8062001021280E80C2002021280E815128091010E0520001280E8062001011280E80A2000151282000111816C0B200101151282000111816C04061280E80906151282000111816C0528001280E80A2800151282000111816C18200115121501151282000113011512150115128200011300040611818C1A200115121501151282000111816C1512150115128200011180801C20020115126101151282000111816C1512810C01151282000111808004200101080620011280F8030620011280F80E062001011280950706151261011300070615122D0113000920010115121501130005200108130006200201081300052001130008052001011300052001021300072002011D13000808200015122D01130004200102080528011300080806151280FC0113000A200101151280FC01130004200013000320001C04280013000328001C07061512250113000B20030115122501130008080820001512150113000806151281100113000F00011512810C0113001512150113001000021512810C011300151215011300020306130009200101151225011300040612812007200015121501030320000304061281240306127504061280F80520010112750520020103031275006E0064006500660069006E0065006400086E0075006C006C000A660061006C0073006500087400720075006500064E0061004E001049006E00660069006E00690074007900025B00025D00027B00027D00022C00023A00022200022700022D00022B00042F002A00042A002F00042F002F00082002011281AC1D0E0A2000151280E0011180802A49006C006C006500670061006C0020004A0053004F004E002000730065007100750065006E00630065003455006E007400650072006D0069006E006100740065006400200063006F006D006D0065006E007400200062006C006F0063006B003055006E007400650072006D0069006E00610074006500640020004A0053004F004E00200073007400720069006E0067002649006C006C006500670061006C0020004A0053004F004E0020006E0075006D006200650072002E4D0069007300730069006E0067002000760061006C00750065002000640065006C0069006D00690074006500720034450078007400720061006E0065006F00750073002000760061006C00750065002000640065006C0069006D00690074006500720011200115121501151282000111808012811C0D0001151282000111808012811C0600010E12811C130004151282000111808012811C0E031011813C10200115121501151282000111808012750F20011512150115128200011180800E040611813C022000052000118160062001011181601A200115121501151282000111808015121501151282000111816C04061181600528001181602E4D0069007300730069006E00670020004A0073006F006E004D004C00200074006100670020006E0061006D0065004649006E00760061006C006900640020006100740074007200690062007500740065002000760061006C0075006500200074006F006B0065006E00200028007B0030007D0029004455006E007400650072006D0069006E0061007400650064002000610074007400720069006200750074006500200062006C006F0063006B00200028007B0030007D00290007200202128099020620010212809D0820011281F01280A10C20011512150111818C1280A1102001151215011281F4151215011281F4062003010E0E0E0D200201151280BC0111816C1249023C00023E00023D00022600022300027800025800023B00022100042D002D000E5B00430044004100540041005B00045D005D00023F00043F003D000225000240000224000D0003151282000111816C0E0E0E0D0001151282000111816C11818C0B0001151282000111816C1C040611816C08061512610112817406200101128174052000128174042001020E0520020E0E020620010211818C0520020E0E0E0420010E0E0806151280A5020E0E05200011818C0620010111818C052002010E0E062002020E100E0C200015122D01151139020E0E05280011818C0428010E0E306100700070006C00690063006100740069006F006E002F006F0063007400650074002D00730074007200650061006D00090002151215010E0E0E0400010E0E090002151215010E0E03040611818006200101118180072002011181800E0520011D0E0E0806151280E00113000A06151280F0021300130113200201151280E0011300151280F002130013010F2001151215011512820001130112750E200115121501151282000113010E0806151280BC01130113200201151280BC011301151280F00213001301052001011271072004010E0E0E020500010E12710900020211818C11818C0620010811818C072002010E1280A9092002011280AD1180B1040611819806200101118198072002011181980E0A2003011181980E1280A9052000118198052800118198042001011C03061D1C0520001281FC0528001281FC04061281FC0C2001011D1512808C011180800F200101151215011512808C011180800F2002011281541D1512808C0111808012200201128154151215011512808C011180800F2002011281FC1D1512808C01118080122002011281FC151215011512808C011180800E2000151215011512808C011180800E2800151215011512808C01118080052002010E0A072004010E0A0808082003010E0A1280A90A2005010E0A08081280A9082003010E100810080806151282000113000A200101151282000113000B200201151282000113000E0E200301151282000113000E1280A90920001512820001130009280015128200011300052001126C0E09061512808D020E126C0920010115121501126C0520001280A80620011280A80E0720021280A80E0E0528001280A804061280A80A061512808D020E1280A80A200101151215011280A80520001281D4062001011281D40520001281D8062001011281D80520001281DC062001011281DC0520001281E0062001011281E00520001281E4062001011281E404061281D404061281D804061281DC04061281E004061281E40528001281D40528001281D80528001281DC0528001281E00528001281E40B2004126912809902126D1C0520010212690A2003126912809D126D1C0A200312691280A1126D1C0720011281F012690B20011512150111818C12690E20031269151215011281F4126D1C0B2001151215011281F41269080615121501128154072001011D1281540A2001011512150112815438530079007300740065006D002E00520075006E00740069006D0065002E00530065007200690061006C0069007A006100740069006F006E0064530079007300740065006D002E00520075006E00740069006D0065002E00530065007200690061006C0069007A006100740069006F006E002E00440061007400610043006F006E007400720061006300740041007400740072006900620075007400650060530079007300740065006D002E00520075006E00740069006D0065002E00530065007200690061006C0069007A006100740069006F006E002E0044006100740061004D0065006D006200650072004100740074007200690062007500740065006C530079007300740065006D002E00520075006E00740069006D0065002E00530065007200690061006C0069007A006100740069006F006E002E00490067006E006F007200650044006100740061004D0065006D00620065007200410074007400720069006200750074006500030612710306125803000001052002021C1C04061280A10306125C04061281F0092002011281F411818C0C20030112809911818C1281F00C20030112809D11818C1281F080AC49006E00740065007200660061006300650073002C00200041006200730074007200610063007400200063006C00610073007300650073002C00200061006E006400200075006E0073007500700070006F0072007400650064002000560061006C0075006500540079007000650073002000630061006E006E006F007400200062006500200069006E007300740061006E007400690061007400650064002E00200028007B0030007D0029000A061512808D02127112500306125005061D1280B503061254082000151215011271062001125012710500010212710828001512150112710628011250127111061512808D0212711512808D020E1281F410061512808D0212711512808D0212090E0B061512808D0212711281F80F061512808D0212711512150111818C0406128154062001011281540B20011512150111818C12710D20011512808D020E1281F412710820011281F41280A10C20011512808D0212090E12711520021512150111818C1271101512808D020E1281F41620021512808D020E1281F41271101512808D0212090E0720011281F8127102061C0620020113001C08200201130011818C09200301130011818C1C0A200102151282000113001100020215128200011300151282000113000400010E1C0C30010115128200011E001E00243C003E0066005F005F0041006E006F006E0079006D006F00750073005400790070006500467B0030007D00200064006F006500730020006E006F007400200061006300630065007000740020006E0075006C006C00200061007300200061002000760061006C0075006500809C55006E00610062006C006500200074006F002000660069006E0064002000610020007300750069007400610062006C006500200063006F006E007300740072007500630074006F007200200066006F007200200069006E007300740061006E00740069006100740069006E00670020007400680065002000740061007200670065007400200054007900700065002E00200028007B0030007D00290036540079007000650020007B0030007D0020006900730020006E006F00740020006F0066002000540079007000650020007B0031007D0080E854007900700065007300200077006800690063006800200069006D0070006C0065006D0065006E0074002000470065006E00650072006900630020004900440069006300740069006F006E006100720079003C0054004B00650079002C0020005400560061006C00750065003E00200061006C0073006F0020006E00650065006400200074006F00200069006D0070006C0065006D0065006E00740020004900440069006300740069006F006E00610072007900200074006F00200062006500200064006500730065007200690061006C0069007A00650064002E00200028007B0030007D00290080D454007900700065007300200077006800690063006800200069006D0070006C0065006D0065006E0074002000470065006E00650072006900630020004900440069006300740069006F006E006100720079003C0054004B00650079002C0020005400560061006C00750065003E0020006E00650065006400200074006F0020006800610076006500200073007400720069006E00670020006B00650079007300200074006F00200062006500200064006500730065007200690061006C0069007A00650064002E00200028007B0030007D002900072002011281A802072002011281FC020520011C12710620021C12711C0B2005011C12711281F40E1C063001011E001C0C20021C12711512808D020E1C0820021C12711280B90920031C1271127112190A20031C127112711280BD0920021280C11271121906000112711271070002127112711C07100101021280A1080002021280A11271081001011E001280A109000212351280A112710400010E0B050002080E080400010E081C20021512250115128200011180801512810C01151282000111816C020A200211818C11818C127104061280C5062001011280C511200115121501151282000111816C1280C91F20030115126101151282000111816C1512810C01151282000111808011818C2520040115126101151282000111816C11818C1512808D0211818C151282000111808011816C0F20010115126101151282000111816C122002011280CD15121501151282000111816C132002011280CD1512810C01151282000111816C062001011280CD0520001280CD0420\
-010103052001011D03072003011D03080804061280CD0528001280CD125300700065006300690066006900650064001E530068006F0075006C006400530065007200690061006C0069007A00650007000112581280A1070001125C1280A10700011258128099070001125C128099070001125812809D070001125C12809D0A0003125412710E1D127107000112541280D106000112501271090002125012711D127107000112501280D50620010111811180A0002400000480000094000000060200000024000052534131000400000100010033237E60D1AF2429EE4E6DABE42A2C8A8893EBD630506BA491C63FBFC5D6D0416C540D47A1244C1689482BC752CBAA4E0B95552751626957D1C0BD356D2C5E728A3EA0244C7AC9CC3D4CFB363802B0401245A79C4C7038E7E3901F3C727EC901AF72DAC23D4C6E2CAF8802EDDC1388C628430979DAC9AF0D307CD9527F1FDDC6052000128121042000124D07000112711181250800021235125112711407061281211280F51280E51280E11280ED1280E904200012510D200801080808080808081181310707021281351D050500001280810820020112551280810D151281100115128200011180800D1512810C01151282000111808011070212591512810C01151282000111808008151282000111808008151281B8011180800500020E0E1C04200012550720020A0811813905000012813D0620010E12814504200101051007071512820001118080020A08080E0A042001010D021D0505200011813107200111815111210320000D042001010A0520001181550500020E0E0E2807121512820001118080110C08124C0211211181510A127D0E020E123C1230118080110C021181550520011D050E050702081D0504070112440507030A080A0420001271070001118085127107070212711180850807031244116511650C151261011512820001118080032000050407020A080520011D050805200111210D0420010308072002010E11815529071A110C0E0D0E113411381D050211210E0E1181550803127D0E1D05123C123C0E080A0A110C112103060002081D05080C0005011280C1081280C108080C07060811101D051C1D0511100520011D0308050702081D030620011280950306070212809503062002011D05021C0703151261011512820001118080151215011512820001118080125D040001011C030612550620010111817504070111650715128179011165090000151281790113000615128179010E0600030E1C1C1C060702081181510507020811210807041D051D0308080407011D0504070111400520020E08080500001281910C0004020E11819512814510050607031D0508050715128179011D05090100044974656D00000C151261011512808C011180800C151215011512808C011180800C15122D011512808C01118080220703151261011512808C011180801512808C0111808015122D011512808C0111808005151215011C0515122D011C07200015122D011C030612640500001281A105070112823803070108071512823C0113000907011512823C011300021300071512823C011E000907011512823C011E00040A011E000E07031C1512820001118080118080091512808D020E1281F408200202130010130120070915128200011180801512808D020E1281F412711C0E1281F412711C11808005151261011C042001081C14070615128200011180801271021281A51C118080081512808C011180801707031512808C011180800215122D011512808C011180800307010E06151270011300021E000507021C1E0007151280E0011300090701151280E001130006151260011300140704151280E00113001512600113001280A912190F070515126001130012311C1280A91C0C1512250115128200011180800C1512290115128200011180800C1512150115128200011180800C15122D01151282000111808023070415122501151282000111808015128200011180800215122D011512820001118080081512780211818C021B07041512810C01151282000111808008151282000111808011808017151215011511390211818C1512150115128200011180801715122D011511390211818C151215011512820001118080131511390211818C151215011512820001118080042000130143070515122D011511390211818C1512150115128200011180801512780211818C021282401512150115128200011180801511390211818C1512150115128200011180800D151280FC01151282000111808019200015122D011511390211818C15121501151282000111808014061511390211818C1512150115128200011180801520001511390211818C15121501151282000111808009061512780211818C021528001511390211818C15121501151282000111808005070112824407200201130013010607020811808010151215011512150115128200011180801015122D0115121501151282000111808012200015122D011512150115128200011180800E200015121501151282000111808007061512780208020E280015121501151282000111808005070112824806151278020802180615122D011511390211818C151215011512820001118080110615122D0115121501151282000111808005070112824C2A070402081511390211818C1512150115128200011180801511390211818C151215011512820001118080060704080808080507011282500407020208050701128254052002010E023A010034544F444F3A204C617A7920646F6573206E6F74206D69782077656C6C207769746820736861726564204953747265616D3C543E2E0100000E200015122D0115128200011180800A200015128200011180800A280015128200011180800507011282580907030811808011808011070408151282000111808011808011808014070312819C151261011512820001118080118198040001020D040001020C2D07091512808C0111808015121501151282000111808012710D0C11819815122D011512808C01118080118085020A15122D01151139020E1C07070211818C123106151139020E1C080701151139020E1C08200015122901130107151215011281F40715122D011281F420070611818C1512808D020E1281F4151215011281F41281F41C15122D011281F4071512150111818C0715122D0111818C1607041512150111818C11818C11818C15122D0111818C09151280940213001301021301050702130102050002020E0E0507011180A00A070115128200011180800B07011D15128200011180800C000411210E0E1281451181B5030701020620011281B90E0520001281C10620011281BD080C0004020E118195128145100A0807031281B90A11210607021181510A07151280AC011300071512808401130013070315128084011300151280BC0113001280A914070415128084011300151280BC0113001280A90E0600030E0E0E0E0620011D0E1D030F070A1D0E0E02080803021D031D0E080806151281C9020E0807151281C9020E080407020E080500001281CD052002020E0E0507011280B8042001080E0A0003011280C11280C10805151215010E0515122D010E07200015122D010E04061280C00507011282600507011282640520001280950607021281D10E2E070C0202020815128200011180801271118085151280B40111808015122D011512820001118080118080118085020507011181510720020E0E1281450600011180891C15070F020E0D0C118085050211808906080A0407090B080706080808030308062002021271020600020212711C081512808D0212090E0600020E0E1D0E13070612711512808D0212090E0E1D12091D0E080400010B1C0700011280C11271061512610112090900031C1C12711281450520001D13000420011C080600021C12710B0E07050B1280C1151261011209080B0600010D1180890600011180890D0900020211808911808905151261010E0920021D0E1D031181ED05151229010E0800040E0E1D0E0808062003010E1C1C052002010E1C0707041D0E0E0208062002010E1D1C0807031181510A1D1C0B07070E0E080808118155030607021D031D0E0D1512811001151282000111816C0D1512810C01151282000111816C08151282000111816C10151281C90211818C151282000111816C10151280A50211818C151282000111816C101512808D0211818C151282000111816C08151281B80111816C50070C1512810C01151282000111816C128174151282000111816C11818C11816C0E1512808D0211818C151282000111816C11818C0E151280B40111816C11816C1512808D0211818C151282000111816C0A15122D01151139020E0E06151139020E0E13151215011511390211818C151282000111816C1315122D011511390211818C151282000111816C0F1511390211818C151282000111816C3607060E151139020E0E1511390211818C151282000111816C0E15122D01151139020E0E15122D011511390211818C151282000111816C110704151280B40111816C0E1180DC11816C0707050808080308090707080808030E080304061280E4080615122D011280E805070112826807151215011280E80715122D011280E807151261011280E807151229011280E80807020E15122D010E0C15126101151282000111816C0C07041280E81280E81280A9030400010E030500020E1C1C07151261011280EC23070A151282000111816C1281640311816C1280E80E0E151261011280EC1280EC1280EC0A0708030E0E03030303030420010E0808070603080808080E1607060303151282000111816C0E151282000111816C030A0704030E1280A91280E803070103092000151181F101130008151181F1011280EC1A070712817411818C081280EC1280EC11818C151181F1011280EC0B070208151282000111816C0C0004020E11819512814510080500010E1D1C0A07070E0E030208081D1C11070215126101151282000111816C12811C0507021D0E08050002021C1C0615128091010E07200202130013000407011D030407011D1C1B07021512810C01151282000111808015126101151282000111816C0D07021512820001118080118080050A0111816C0E070315128200011180800211818C100703151282000111808011818C1180800507030808080920031280951D03080805000208080806070308081D030615126101130007151280FC0113000C07040813000815122D0113000B070313000215122D0113000715128100011300071512810401130009070115128104011300071512826C011300031D130007151281FD01130010100104081D1E000808151281FD011E00040A0113000C2003080808151281FD0113002207071D13001512610113000808151281FD011300151281FD0113001512826C01130009200401081D130008080E07051D1300151261011300080808071512810801130007151281180113000715128114011300080701151225011300092000151282010113000807011512150113000A070208151280FC0113000820031280950E080804070208030620010111820919010080010000010054020D416C6C6F774D756C7469706C65001901009C010000010054020D416C6C6F774D756C7469706C6500040612813405070112827004061281380507011282740707050A080803020C00031180890E118195128145060001081180890600010A1180890A00030D0E1181951281450F070B0A080803020208020E1180890D0A0003080E1181951281450620011280950E0F070B0A080803031280950E08080203040702020304061281480D0615121501151282000111816C0E061512810C01151282000111816C04061281740706151139020E0E0B0615122D01151139020E0E050701128278050A011180801F0708020811816C11816C151139020E0E151139020E0E151139020E0E1181600C15121501151282000111816C0C15122D01151282000111816C0E200015122D01151282000111816C040612815005070112827C0520001280D10807021280D11280D1050A0112812C050A011281400920021280990E118211050A0112821516070712711281401280991282151281F01281F012828009200015122D0111818C0406128130040612815C050701128284050A011281300920030113001301130203061301030613020420001302042800130104280013020620010111821D0801000000000000000B15128288031300130113020620011280951C0213020507011280950715128179011300071512817901130107151281790113020D070115128288031300130113020815128288030E0E0E0507011281640715126101128174060702081281740620010212817408151281FD011281740A200108151281FD01130005070112828C050701128290060001021281740906151281FD011281740B20011300151281FD0113000907031281740E1282940907031281740E1282980607020812829C07151280A5020E0E0A2001011512822101130005200102130105200108130108200015122501130005151225010E082000151139020E0E082800151139020E0E0E200015122D0115113902130013010507011282A0060615122D010E0507011282A40907030E0E15122D010E0507011282A8052002080308040612817C0507011282AC04000103030A070608080E0E0811818006070408080E0E050002020E080D0707151261010E0208080802080915128184021300130109151280F002130013010D070115121501151282000113000915128188021300130107151280BC0113010D07011512150115128200011301070002020E11822905200102127106200212710E02082003020E0212813D0420010803080704020E081180850700040E0E0E0E0E052002080E0E060703081D1C080B07011D1512808C011180800300000E07151281B801130008151281C9020E126C0A200101151280910113000615121501126C0615122D01126C081512808D020E126C100704126C0E15122D01126C15122D010E0507020E126C09151281C9020E1280A807151215011280A80715122D011280A8091512808D020E1280A81907071280A80E0E0E15122D011280A815122D010E15122D010E0507011280A80E07041280A80E1280A815122D010E07151215011281540715122D0112815409070115122D011281540D07031281540215122D011281540806151261011281F007151261011281F008151181F1011281F00E07031281F002151181F1011281F01507051281541281F01282B01281F015122D0112815404061281E8080615122D01128154080615122D0111818C0507011282B4070703020811818C04070208080C070212815415122D0112815405000112510E05200112710E0E07051D0E12511280991280991D0304070112710306123504061281EC0507011282B80920011D1280D51182110620001D1280B509151281C90212711250091512808D02127112500620011280D10E24070B1D1280D51280D51280D51D1280B512711280D11D1280B512711D1280B51D1280D50804061D127108200015122901130004070112501220041280D51182111282351D12711D11823910151281C90212711512808D020E1281F40F151281C90212711512808D0212090E0A151281C90212711281F80E151281C90212711512150111818C0E1512808D0212711512150111818C1D07041512150111818C1512808D020E1281F41512150111818C1D11818C101512808D0212711512808D020E1281F41407021512808D020E1281F41512808D020E1281F41807041512808D020E1281F41281F41281F415122D011281F40F1512808D0212711512808D0212090E1207021512808D0212090E1512808D0212090E11151229011511390212711512150111818C13151229011511390212711512808D020E1281F412151229011511390212711512808D0212090E0D151229011511390212711281F8071512808D020E1C09151281C9020E1281F40920011D1280991182110920011D12809D11821180990721021512150111818C11818C1512808D0212090E021280991512150111818C11818C1281F01281F411818C12809D1512150111818C11818C1281F01281F411818C1512150111818C15122D0111818C1D11818C1512808D020E1281F41512150111818C1D1280990815122D0111818C1D11818C15122D0111818C1D12809D0815122D0111818C1D11818C15122D0111818C1512150111818C08151281C90212090E5D0712021512150111818C11818C1512808D020E1281F412809D1512150111818C11818C1281F411818C1512808D020E1281F415122D0111818C1D11818C1D12809D0815122D0111818C1D11818C15122D0111818C1512808D020E1281F40A1512808D0212711281F80B07031281F81281F81281F8071512820001130008070212809511818C0907011512820001130008151281790111818C0615128179011C1D0711127112823D128241118085020511211180890D06080A040C07090B0715128200011E0007151281C9020E1C0507011281F80520001280BD2607111281F81D1C1512808D020E1C08080E12710E1280B908080E12710E15122D010E1231120D0600021C1271020520001D12710700031C12710E020600021C12711C0B000311210E1281451181B50B0003020E118229101281B10400010A0E0600011181510A0600011181510E0600030E0E1C1C1A0708021D127112711512808D020E1281F411211281B11280A91C2B070B1C1512808D020E1281F41512808D020E1C0E1280B90E0E1281F415122D010E15122D010E15122D010E0700020E1C1281452A07101C1512808D020E1281F41512808D020E1C1C0E1280B91C1C0E1281F41231120D1231120D1231120D061512150112710615122D01127120070E1281F812711C1C12711C1280A91C15122D0112711D1C1D1C12311D1C120D0800021280C1127108072002011280C1080507011280C11207061280BD151261011C1C1280C11231120D07200112711D1271021D1C0A070312711D12711D127107070212711D12710407011E00040612820C0507011282BC0B151281840211816C11808004061282100D0615122D0115128200011180800507011282C0160703151282000111816C11816C1D15128200011180801B151229011511390211818C151225011512250115128200011180801B151215011511390211818C151225011512250115128200011180801B15122D011511390211818C15122501151225011512820001118080171511390211818C15122501151225011512820001118080101512290115122501151282000111808010151215011512250115128200011180801015122D01151225011512820001118080101512250115122501151282000111808018151281C90211818C15122501151225011512820001118080181512808D0211818C15122501151225011512820001118080101512610115122501151282000111808081100715151282000111816C11818C021512808D0211818C1512250115122501151282000111808015126101151282000111808011818C1512250115122501151282000111808015122D011511390211818C151225011512250115128200011180801512250115128200011180801511390211818C1512250115122501151282000111808011818C15122501151282000111808011818C1512250115128200011180801511390211818C151225011512250115128200011180801511390211818C1512250115122501151282000111808015122D0115122501151282000111808015122D011511390211818C1512250115122501151282000111808011818C11818C15122D011512250115128200011180801707051512150111818C11818C0E11818C15122D0111818C062001011182510507011280C50A00021280C912751280C50620010111825D0807021280C912825904061280C90A061512808D0211818C0E09061511390211818C0E04061282140D0615122D011511390211818C0E0507011282C405200011826509151280A50211818C0E091512808D0211818C0E0C151215011511390211818C0E0C15122D011511390211818C0E081511390211818C0E1D07071282611280A902081182651511390211818C0E1511390211818C0E0907031282611280A90804061282180507011282C80507011282CC0B151281880211808011816C1F07041512810C01151282000111808015126101151282000111816C0211818C110704151282000111808011818C0211808010151280A50211818C1512820001118080101512808D0211818C15128200011180802207061512820001118080021512808D0211818C15128200011180800211818C11808013151215011511390211818C15128200011180801315122D011511390211818C15128200011180800F1511390211818C151282000111808013151229011511390211818C15128200011180802A07041281741511390211818C151282000111808011816C15122D011511390211818C15128200011180800720021280950308070703021280950810070411818C0E11818C15122D0111818C062001011280810620010111826D0A00021280CD12491282690B07031282241280CD128269260706081512810C01151282000111816C151282000111816C151280B40111816C1280A911816C150703151282000111816C151280B40111816C11816C052000128269050A011282710920021280D10E11821122070B12711280991280D11282151281F01281F01281F01281F01281F01281F01282D004061282750406128279040612827D04061282810406128285040612828904061282280507011282D4050A01128275050A01128279050A0112827D050A01128281050A01128285050A0112828909200015122D011281F404061281F40520001281F40806151215011281F40806151261011281F4080615122D011281F40906151181F1011281F40528001281F40507011282D807151229011281F407151261011281F408151181F1011281F408010045000000000004061280D10620011280D1020507011282DC0507011282E0040612809D0507011282E40507011282E81320051280D10E1182111282351D12711D1182390507011280D10507011282EC0507011280D504061280D50507011282F01001000B53514C232E4A736F6E46780000150100107777772E53514C73686172702E636F6D00000501000000001501001053716C205175616E74756D204C65617000000901000453514C230000808301007E436F7079726967687420C2A920323031332D323031342053716C205175616E74756D204C6561702E20416C6C205269676874732052657365727665642E3B20436F7079726967687420C2A920323030362D32303130205374657068656E204D2E204D634B616D65792E20416C6C207269676874732072657365727665642E00001001000B332E332E38332E3238303200000801000200000000000801000800000000001E01000100540216577261704E6F6E457863657074696F6E5468726F777301000000000000007C21685400000000020000001C010000F8FD0200F8DF0200525344533BC8E4ABA2CF17408A5381DE72D52A610E000000633A5C53514C5175616E74756D4C6561705C50726F6A656374735C53514C73686172705C417070436F64655C7472756E6B5C53514C73686172702E4A736F6E46785C6F626A5C467265655C53514C232E4A736F6E46782E70646200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003CFF020000000000000000005EFF020000200000000000000000000000000000000000000000000050FF02000000000000000000000000000000000000005F436F72446C6C4D61696E006D73636F7265652E646C6C0000000000FF2500200010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100100000001800008000000000000000000000000000000100010000003000008000000000000000000000000000000100000000004800000058000300200400000000000000000000200434000000560053005F00560045005200530049004F004E005F0049004E0046004F0000000000BD04EFFE0000010003000300F20A530003000300F20A53003F000000000000000400000002000000000000000000000000000000440000000100560061007200460069006C00650049006E0066006F00000000002400040000005400720061006E0073006C006100740069006F006E00000000000000B00480030000010053007400720069006E006700460069006C00650049006E0066006F0000005C03000001003000300030003000300034006200300000003C001100010043006F006D006D0065006E007400730000007700770077002E00530051004C00730068006100720070002E0063006F006D000000000044001100010043006F006D00700061006E0079004E0061006D00650000000000530071006C0020005100750061006E00740075006D0020004C006500610070000000000040000C000100460069006C0065004400650073006300720069007000740069006F006E0000000000530051004C0023002E004A0073006F006E0046007800000038000C000100460069006C006500560065007200730069006F006E000000000033002E0033002E00380033002E003200380030003200000040001000010049006E007400650072006E0061006C004E0061006D0065000000530051004C0023002E004A0073006F006E00460078002E0064006C006C00000020017D0001004C006500670061006C0043006F007000790072006900670068007400000043006F0070007900720069006700680074002000A900200032003000310033002D0032003000310034002000530071006C0020005100750061006E00740075006D0020004C006500610070002E00200041006C006C0020005200690067006800740073002000520065007300650072007600650064002E003B00200043006F0070007900720069006700680074002000A900200032003000300036002D00320030003100300020005300740065007000680065006E0020004D002E0020004D0063004B0061006D00650079002E00200041006C006C0020007200690067006800740073002000720065007300650072007600650064002E00000000004800100001004F0072006900670069006E0061006C00460069006C0065006E0061006D0065000000530051004C0023002E004A0073006F006E00460078002E0064006C006C0000002C0005000100500072006F0064007500630074004E0061006D00650000000000530051004C002300000000003C000C000100500072006F006400750063007400560065007200730069006F006E00000033002E0033002E00380033002E\
-00320038003000320000003C000900010041007300730065006D0062006C0079002000560065007200730069006F006E00000033002E0033002E00380033002E00300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F002000C000000703F00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
- WITH PERMISSION_SET = ' + @IsSQLServer2005 + N'SAFE;
- ');
- PRINT 'SQL#.JsonFx Assembly Created.';
- END;
- ELSE
- BEGIN
- PRINT 'Skipping install of SQL#.JsonFx Assembly.';
- END;
- PRINT '';
-
-
- IF (@InstallSQL#Network = 1 OR @InstallSQL#DB = 1)
- BEGIN
- PRINT 'Creating SQL#.Network Assembly ...';
- EXEC(N'
- CREATE ASSEMBLY [SQL#.Network]
- AUTHORIZATION [' + @SQLsharpLogin + N']
-FROM 0x4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000504500004C010300802168540000000000000000E00002210B010B00003C000000060000000000006E5A000000200000006000000000001000200000000200000400000000000000040000000000000000A000000002000047E300000300408500001000001000000000100000100000000000001000000000000000000000001C5A00004F00000000600000F803000000000000000000000000000000000000008000000C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000080000000000000000000000082000004800000000000000000000002E74657874000000743A000000200000003C000000020000000000000000000000000000200000602E72737263000000F80300000060000000040000003E0000000000000000000000000000400000402E72656C6F6300000C0000000080000000020000004200000000000000000000000000004000004200000000000000000000000000000000505A000000000000480000000200050044350000D8240000090000000000000000000000000000005020000080000000000000000000000000000000000000000000000000000000000000000000000052CFC3AA5636B52178FE9C85CB4B5996CE9ACE0483268C9BF73569770EFF8B740E410E68FAE2BAD63D5591E26524164998872F12D70477A6603B2F5A3E129FA319211C1EA0E979ECFDAF343E66406D63C93AFF4D42FBBE524DB6B69F44EED010E3B1EA5314BDF4861DDAF14EA874E7B9C42145D17AE6C9E8DAF319CFA23A703C1B300400BE000000010000110F00281200000A2C0716281300000A2A0F00281400000A6F1500000A6F1600000A1F0F310716281300000A2A0F00281400000A6F1500000A720100007072050000706F1700000A281800000A26DE0A2616281300000A0DDE630F00281400000A6F1500000A178D1D00000113041104161F2E9D11046F1900000A0A068E691A2E0716281300000A2A166A0B160C2B2206089A281800000A0B07166A32090720FF0000006A310716281300000A2A0817580C081A32DA17281300000A2A092A00000110000000002C00234F000A010000011B300400BB000000020000110F00281200000A2D290F00281400000A6F1500000A7E1A00000A281B00000A2D1102280100000613041204281C00000A2C067E1D00000A2A0F00281400000A6F1500000A178D1D00000113051105161F2E9D11056F1900000A0A166A0B166A0C06169A281800000A0B0720000000016A5A0C06179A281800000A0B080720000001006A5A580C06189A281800000A0B080720000100006A5A580C06199A281800000A0B0807580CDE09267E1D00000A0DDE0708281E00000A2A092A00011000000000600049A90009010000011B300300D4000000030000110F00281F00000A2C067E2000000A2A0F00282100000A166A320B0F00282100000A156E31067E2000000A2A72050000700A166A0B0F00282100000A0C0820000000016A5B0B080720000000016A5A590C1201282200000A7201000070282300000A0A0820000001006A5B0B080720000001006A5A590C061201282200000A7201000070282400000A0A0820000100006A5B0B080720000100006A5A590C061201282200000A7201000070282400000A0A080B061201282200000A282300000A0ADE09267E2000000A0DDE0706282500000A2A092A0110000000003C0086C2000901000001860F00281200000A2C067E2000000A2A0F00281400000A282600000A282500000A2A860F00281200000A2C067E2000000A2A0F00281400000A282700000A282500000A2AAA0F00281200000A2C067E2000000A2A0F00281400000A1F2B1F206F2800000A282900000A282500000A2A00133002000409000004000011732A00000A0A7207000070720B00007073100000060B06076F2B00000A7213000070721700007073100000060B06076F2B00000A721D000070722100007073100000060B06076F2B00000A7227000070722B00007073100000060B06076F2B00000A7235000070723900007073100000060B06076F2B00000A7243000070724700007073100000060B06076F2B00000A7253000070725700007073100000060B06076F2B00000A7261000070726500007073100000060B06076F2B00000A7271000070727500007073100000060B06076F2B00000A7283000070728700007073100000060B06076F2B00000A728F000070729300007073100000060B06076F2B00000A72A100007072A500007073100000060B06076F2B00000A72AF00007072B300007073100000060B06076F2B00000A72BB00007072BF00007073100000060B06076F2B00000A72C900007072CD00007073100000060B06076F2B00000A72D700007072DB00007073100000060B06076F2B00000A72E700007072EB00007073100000060B06076F2B00000A72F300007072F700007073100000060B06076F2B00000A72FF000070720301007073100000060B06076F2B00000A720B010070720F01007073100000060B06076F2B00000A7219010070721D01007073100000060B06076F2B00000A7225010070722901007073100000060B06076F2B00000A7237010070723B01007073100000060B06076F2B00000A7245010070724901007073100000060B06076F2B00000A7253010070725701007073100000060B06076F2B00000A7263010070726701007073100000060B06076F2B00000A7273010070727701007073100000060B06076F2B00000A7281010070728501007073100000060B06076F2B00000A7293010070729701007073100000060B06076F2B00000A72A301007072A701007073100000060B06076F2B00000A72B101007072B501007073100000060B06076F2B00000A72BF01007072C301007073100000060B06076F2B00000A72CF01007072D301007073100000060B06076F2B00000A72E101007072E501007073100000060B06076F2B00000A72F301007072F701007073100000060B06076F2B00000A7205020070720902007073100000060B06076F2B00000A7217020070721B02007073100000060B06076F2B00000A7227020070722B02007073100000060B06076F2B00000A7239020070723D02007073100000060B06076F2B00000A724B020070724F02007073100000060B06076F2B00000A725D020070726102007073100000060B06076F2B00000A726D020070727102007073100000060B06076F2B00000A727F020070728302007073100000060B06076F2B00000A728D020070729102007073100000060B06076F2B00000A729D02007072A102007073100000060B06076F2B00000A72AD02007072B102007073100000060B06076F2B00000A72BF02007072C302007073100000060B06076F2B00000A72D102007072D502007073100000060B06076F2B00000A72E302007072E702007073100000060B06076F2B00000A72F302007072F702007073100000060B06076F2B00000A7201030070720503007073100000060B06076F2B00000A7213030070721703007073100000060B06076F2B00000A7225030070722903007073100000060B06076F2B00000A7235030070723903007073100000060B06076F2B00000A7243030070724703007073100000060B06076F2B00000A724F030070725303007073100000060B06076F2B00000A7261030070726503007073100000060B06076F2B00000A7273030070727703007073100000060B06076F2B00000A7285030070728903007073100000060B06076F2B00000A7295030070729903007073100000060B06076F2B00000A72A703007072AB03007073100000060B06076F2B00000A72B503007072B903007073100000060B06076F2B00000A72C703007072CB03007073100000060B06076F2B00000A72D903007072DD03007073100000060B06076F2B00000A72EB03007072EF03007073100000060B06076F2B00000A72FB03007072FF03007073100000060B06076F2B00000A7209040070720D04007073100000060B06076F2B00000A721B040070721F04007073100000060B06076F2B00000A722B040070722F04007073100000060B06076F2B00000A723B040070723F04007073100000060B06076F2B00000A724D040070725104007073100000060B06076F2B00000A725F040070726304007073100000060B06076F2B00000A726F040070727304007073100000060B06076F2B00000A7281040070728504007073100000060B06076F2B00000A728F040070729304007073100000060B06076F2B00000A729F04007072A304007073100000060B06076F2B00000A72AF04007072B304007073100000060B06076F2B00000A72C104007072C504007073100000060B06076F2B00000A72D304007072D704007073100000060B06076F2B00000A72E504007072E904007073100000060B06076F2B00000A72F504007072F904007073100000060B06076F2B00000A7203050070720705007073100000060B06076F2B00000A7215050070721905007073100000060B06076F2B00000A7227050070722B05007073100000060B06076F2B00000A7237050070723B05007073100000060B06076F2B00000A7245050070724905007073100000060B06076F2B00000A7251050070725505007073100000060B06076F2B00000A7263050070726705007073100000060B06076F2B00000A7275050070727905007073100000060B06076F2B00000A7287050070728B05007073100000060B06076F2B00000A7297050070729B05007073100000060B06076F2B00000A72A905007072AD05007073100000060B06076F2B00000A72B705007072BB05007073100000060B06076F2B00000A72C905007072CD05007073100000060B06076F2B00000A72DB05007072DF05007073100000060B06076F2B00000A72ED05007072F105007073100000060B06076F2B00000A72FD050070720106007073100000060B06076F2B00000A720B060070720F06007073100000060B06076F2B00000A721D060070722106007073100000060B06076F2B00000A722D060070723106007073100000060B06076F2B00000A062A1B3004006101000005000011042D6728070000066F2C00000A0D2B1C1203282D00000A0A02067B03000004723B06007017282E00000A10001203282F00000A2DDBDE0E1203FE160200001B6F3000000ADC027275060070723B06007017282E00000A1000027287060070723B060070283100000A100028070000066F2C00000A13042B1C1204282D00000A0B02077B01000004077B020000046F1700000A10001204282F00000A2DDBDE0E1204FE160200001B6F3000000ADC036F1500000A7E1A00000A283200000A3988000000036F1500000A6F3300000A0C0872BF0600706F3400000A2D0D0872C90600706F3400000A2C120272D706007072DB0600706F1700000A10000872BF0600706F3400000A2D0D0872E90600706F3400000A2C360272F906007072FF0600706F1700000A100002720D07007072FF0600706F1700000A100002721107007072FF0600706F1700000A1000042D1202721507007072070000706F1700000A1000022A000000011C000002000E002937000E0000000002007600299F000E00000000DE026F3500000A2C06283600000A2A026F3700000A733800000A0F01281400000A0F02283900000A28080000066F3A00000A733B00000A2A1B3004006800000006000011026F3500000A2C06283600000A2A026F3700000A733800000A0A28070000066F2C00000A0C2B1C1202282D00000A0B06077B02000004077B0100000417282E00000A0A1202282F00000A2DDBDE0E1202FE160200001B6F3000000ADC066F3A00000A733B00000A2A0110000002002500294E000E0000000013300300AD000000070000110F00281200000A2C067E2000000A2A0F01281200000A2C0B724B070070733C00000A7A0F01281400000A6F3300000A250B2C46077283070070281B00000A2D29077297070070281B00000A2D200772A1070070281B00000A2D170772AD070070281B00000A2D0E2B10170A2B28180A2B24190A2B20160A2B1C72BB0700700F01281400000A72FB070070282400000A733C00000A7A0F00281400000A733D00000A06283E00000A282500000A2A00000013300200940100000800001102A5040000020A0312007B04000004282500000A81040000010412007B05000004282500000A81040000010512007B06000004282500000A81040000010E0412007B07000004282500000A81040000010E0512007B08000004282500000A81040000010E0612007B09000004283F00000A81080000010E0712007B0A000004282500000A81040000010E0812007B0B000004282500000A81040000010E0912007B0C000004281300000A81030000010E0A12007B0D000004281300000A81030000010E0B12007B0E000004281300000A81030000010E0C12007B0F000004281300000A81030000010E0D12007B10000004281300000A81030000010E0E12007B11000004281300000A81030000010E0F12007B12000004282500000A81040000010E1012007B13000004282500000A81040000010E1112007B14000004283F00000A81080000010E1212007B15000004282500000A81040000010E1312007B16000004282500000A81040000010E1412007B17000004281300000A81030000010E1512007B18000004282500000A81040000012A133002003C00000009000011284700000A6F4800000A027B1B0000043315027B1A0000041FFE330B02167D1A000004020A2B071673180000060A06027B1D0000047D1C000004062A1E0228110000062A13300200AE0200000A000011027B1A0000040A0645020000000500000090020000389202000002157D1A000004027C1C000004281200000A3A7B02000002027C1C000004281400000A733D00000A7D1E000004027C1F000004FE1504000002027C1F000004027B1E0000046F4900000A7D04000004027C1F000004027B1E0000046F4A00000A7D05000004027C1F000004027B1E0000046F4B00000A7D06000004027C1F000004027B1E0000046F4C00000A7D07000004027C1F000004027B1E0000046F4D00000A7D08000004027C1F000004027B1E0000046F4E00000A7D09000004027C1F000004027B1E0000046F4F00000A7D0A000004027B1E0000046F5000000A0B0745050000004A000000020000001400000026000000380000002B58027C1F00000472750800707D0B0000042B46027C1F00000472810800707D0B0000042B34027C1F00000472890800707D0B0000042B22027C1F00000472930800707D0B0000042B10027C1F000004729D0800707D0B000004027C1F000004027B1E0000046F5100000A7D0C000004027C1F000004027B1E0000046F5200000A7D0D000004027C1F000004027B1E0000046F5300000A7D0E000004027C1F000004027B1E0000046F5400000A7D0F000004027C1F000004027B1E0000046F5500000A7D10000004027C1F000004027B1E0000046F5600000A7D11000004027C1F000004027B1E0000046F5700000A7D12000004027C1F000004027B1E0000046F5800000A7D13000004027C1F000004027B1E0000046F5900000A7D14000004027C1F000004027B1E0000046F5A00000A7D15000004027C1F000004027B1E0000046F5B00000A7D16000004027C1F000004027B1E0000046F5C00000A7D17000004027C1F000004027B1E0000046F5D00000A7D1800000402027B1F0000048C040000027D1900000402177D1A000004172A02157D1A000004162A1E027B190000042A1A735E00000A7A062A1E027B190000042A7A02285F00000A02037D1A00000402284700000A6F4800000A7D1B0000042A00001330020011000000090000111FFE73180000060A06027D1D000004062A1E02285F00000A2A1E02285F00000A2AEA02285F00000A02037D010000040272070000700472AD080070282400000A7D020000040272B10800700472B7080070282400000A7D030000042A42534A4201000100000000000C00000076322E302E35303732370000000005006C0000009C080000237E000008090000F40A000023537472696E677300000000FC130000C008000023555300BC1C0000100000002347554944000000CC1C00000C08000023426C6F6200000000000000020000015717A20B0902000000FA253300160000010000002F000000050000001F000000180000002900000005000000610000001E0000000A000000010000000200000002000000070000000400000001000000030000000300000000000A0001000000000006004700400006004E0040000A00790064000A00840064000A009F00640006000501EA000A00270164000A0052016400060081016E010A0044032903060079035A030600980386030600AF0386030600CC0386030600EB03860306000404860306001D04860306003804860306005304860306006C045A030600800486030600990486030600C604B60406000C05EC0406002C05EC040A005705290306008D0540000600AC0540000600BC0540000600EA0540000E00000640001B003C0600000E00800661060E008606610606009C0640000600E20640000E00F406400006001007EA0006001E07EA0006002C076E0106002509120906004E093D090E00DC09400006009F0A40000600B50A5A030600CB0A5A030600D60AEC040000000001000000000001000100010010001B0000000500010001000300100020000000050001000F000B0110002B00000009000400110003011000FF06000005001900110006009E01A0000600A801A0000600B301A0000600C301A0000600D001A0000600DC01A0000600E601A0000600F201A0000600FB01A90006000402A00006000902A00006001602AC0006002402AC0006003202AC0006003902AC0006004402AC0006004A02AC0006006502A00006006F02A00006007C02A90006008102A00006008702A00006008E02AC0006009A02A0000100A9070E0701003E08A90001004908A90006001903830206008908830206009208150706009E081907D0200000000096008E000A000100AC21000000009600A800110002008422000000009600B800180003007423000000009600C8001F0004009623000000009600D2001F000500B823000000009600E0001F000600E4230000000091000C0126000700F42C0000000096001C012F000700802E000000009600300136000A00B82E0000000096003B0141000D003C2F000000009600460148000E00F82F0000000091005B0151001000DC340000000096008D0195002600F93400000000861898019C002700013500000000861898019C00270009350000000086189801A3002700983100000000E1013807F5062900E03100000000E1017C0708072900E83100000000E1019306B5012900A23400000000E109B60711072900AA3400000000E101F8079C002900B13400000000E10123089C002900B33400000000E1095E0811072900BB340000000086189801CC00290000000100A30200000100A30200000100AD0200000100B60200000100C10200000100D00200000100DB0200000200E70200000300FA0200000100DB0200000200E70200000300FA02000001000D03000001001903000002001D0300000100560302000200C30102000300D00102000400DC0102000500E60102000600F20102000700FB0102000800040202000900090202000A00160202000B00240202000C00320202000D00390202000E00440202000F004A02020010006502020011006F02020012007C02020013008102020014008702020015008E02020016009A02000001001903000001009E0100000200A801000001003E0805000E0005002500050012000500A10005008D00510098019C00590098019C0061009801C20069009801C20071009801C20079009801C20081009801C20089009801C20091009801C20099009801C200A1009801C700A9009801C200B1009801C200B90098019C00C1009801CC00C90098019C00D10098019C0021006C05B50119007705B90121008305BF01D9009405BF01D9009905C301D900A405C701E100B405CD01D900C105D201D900C705A000D900CD0525021900D905B5012900E5052B02290077052F0229006C05B5012100E5058302290083058702F100F005BF01D900F9058B02D900F9059102210077059802F9000406E102F9001406E102D900A4056003F9002506E1020C0098019C000C0038066D030C0047067E031400550690030901A405950314009306B5011901A8069C000901A4059102D900B0062502D900BE06BF01D900C6069F0339006C05B5013900CD06F60339008305FB03D9009801000419008305B501D900D606FB0339009801000421019801C200F9009801C200F90046018F04410077059D041C004706FE0649004706080741019306B50124005506900341011D089C00410155061107490198019C0051015509260751016709C301F9007B09BF01F9008C09BF01F9009C09BF01F900AA09BF01F900BA09BF010900C709C301F900D309BF01F900EC093107F900FD09B501F9000F0AB501F900210AB501F9002C0AB501F9003B0AB501F9004A02B501F900450ABF01F900530ABF01F900640AC301F9006D0ABF01F900770ABF01F900820AB501F900920ABF01610198019C00090098019C00690198013E07790198019C0020008B0073012E00730021072E008300EB072E006B00D6072E007B00E2072E001B0045072E00230057072E002B006D072E00330073072E003B0089072E00430093072E004B006D072E005B006D0740008B00E40160008B00420280008B00A602A0008B00E602A3000B032107C0008B00250320018B00BA0340018B00060460018B004F04A0018B00A804E4010B00AF00200233022107400233022107800233022107A00233022107E00233022107000333022107D90135029E027303A40342049604A3042C073707050001000000AD081D070000EB081D0702001400030002001700050005002200810005002400830005002600850005002800870005002A00890005002C00610005002E008B0066038803E706EE0604800000030003005300000001000000D1004A05000002000000000000000000000001003700000000000200000000000000000000000100580000000000020000000000000000000000010040000000000003000200040002000500020000000000003C4D6F64756C653E0053514C232E4E6574776F726B2E646C6C00494E45540048544D4C456E7469747900494E4554555249496E666F006D73636F726C69620053797374656D004F626A6563740056616C7565547970650053797374656D2E446174610053797374656D2E446174612E53716C54797065730053716C426F6F6C65616E0053716C537472696E6700497356616C69644950416464726573730053716C496E7436340041646472657373546F4E756D626572004E756D626572546F4164647265737300555249456E636F646500555249456E636F646544617461005552494465636F64650053797374656D2E436F6C6C656374696F6E732E47656E65726963004C69737460310047657448544D4C456E74697469657300456E636F646548544D4C0053716C43686172730048544D4C456E636F64650048544D4C4465636F6465004765744C656674506172740053716C496E74333200494E4554555249496E666F46696C6C526F770053797374656D2E436F6C6C656374696F6E730049456E756D657261626C6500555249476574496E666F002E63746F7200456E7469747952617700456E7469747948544D4C00456E7469747948544D4C5265674578004162736F6C75746550617468004162736F6C75746555726900417574686F7269747900446E7353616665486F737400467261676D656E740048617368436F646500486F737400486F73744E616D65547970650049734162736F6C75746555726900497344656661756C74506F727400497346696C650049734C6F6F706261636B004973556E6300497357656C6C466F726D65644F726967696E616C537472696E67004C6F63616C506174680050617468416E64517565727900506F727400517565727900536368656D650055736572457363617065640055736572496E666F004950416464726573730049504E756D626572004465636F646564555249004465636F6465645552494461746100456E636F646564555249004465636F64656448544D4C005768697465537061636548616E646C696E6700436F6E74696E756F7573456E636F64696E6700456E636F64656448544D4C00555249005061727469616C54797065004D6963726F736F66742E53716C5365727665722E5365727665720053716C4661636574417474726962757465006F626A0053797374656D2E52756E74696D652E496E7465726F705365727669636573004F75744174747269627574650053797374656D2E5265666C656374696F6E00417373656D626C795469746C6541747472696275746500417373656D626C794465736372697074696F6E41747472696275746500417373656D626C79436F6E66696775726174696F6E41747472696275746500417373656D626C79436F6D70616E7941747472696275746500417373656D626C7950726F6475637441747472696275746500417373656D626C79436F7079726967687441747472696275746500417373656D626C7954726164656D61726B41747472696275746500417373656D626C7943756C7475726541747472696275746500436F6D56697369626C6541747472696275746500417373656D626C7956657273696F6E41747472696275746500417373656D626C7946696C6556657273696F6E4174747269627574650053797374656D2E536563757269747900416C6C6F775061727469616C6C795472757374656443616C6C6572734174747269627574650053797374656D2E52756E74696D652E436F6D70696C6572536572766963657300436F6D70696C6174696F6E52656C61786174696F6E734174747269627574650052756E74696D65436F6D7061746962696C6974794174747269627574650053514C232E4E6574776F726B0053716C46756E6374696F6E417474726962757465006765745F49734E756C6C006F705F496D706C69636974006765745F56616C756500537472696E67005472696D006765745F4C656E677468005265706C61636500436F6E7665727400546F496E74363400436861720053706C697400456D707479006F705F457175616C697479006765745F497346616C7365004E756C6C00496E74363400546F537472696E6700436F6E6361740055726900457363617065557269537472696E670045736361706544617461537472696E6700556E65736361706544617461537472696E670041646400456E756D657261746F7200476574456E756D657261746F72006765745F43757272656E740053797374656D2E546578742E526567756C617245787072657373696F6E730052656765780052656765784F7074696F6E73004D6F76654E6578740049446973706F7361626C6500446973706F7365006F705F496E657175616C69747900546F4C6F776572\
-00457175616C73006765745F4E756C6C00546F43686172417272617900417267756D656E74457863657074696F6E005572695061727469616C003C555249476574496E666F3E645F5F300049456E756D657261626C6560310049456E756D657261746F7260310049456E756D657261746F720053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261626C653C53797374656D2E4F626A6563743E2E476574456E756D657261746F720053797374656D2E436F6C6C656374696F6E732E49456E756D657261626C652E476574456E756D657261746F72003C3E325F5F63757272656E740053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261746F723C53797374656D2E4F626A6563743E2E6765745F43757272656E740053797374656D2E436F6C6C656374696F6E732E49456E756D657261746F722E52657365740052657365740053797374656D2E49446973706F7361626C652E446973706F7365003C3E315F5F7374617465003C3E6C5F5F696E697469616C54687265616449640053797374656D2E436F6C6C656374696F6E732E49456E756D657261746F722E6765745F43757272656E74003C3E335F5F555249003C5F5F5552493E355F5F31003C5F5F526573756C743E355F5F320053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261746F723C53797374656D2E4F626A6563743E2E43757272656E740053797374656D2E436F6C6C656374696F6E732E49456E756D657261746F722E43757272656E740053797374656D2E446961676E6F737469637300446562756767657248696464656E4174747269627574650053797374656D2E546872656164696E6700546872656164006765745F43757272656E74546872656164006765745F4D616E616765645468726561644964006765745F4162736F6C75746550617468006765745F4162736F6C757465557269006765745F417574686F72697479006765745F446E7353616665486F7374006765745F467261676D656E740047657448617368436F6465006765745F486F737400557269486F73744E616D6554797065006765745F486F73744E616D6554797065006765745F49734162736F6C757465557269006765745F497344656661756C74506F7274006765745F497346696C65006765745F49734C6F6F706261636B006765745F4973556E63006765745F4C6F63616C50617468006765745F50617468416E645175657279006765745F506F7274006765745F5175657279006765745F536368656D65006765745F5573657245736361706564006765745F55736572496E666F004E6F74537570706F72746564457863657074696F6E005374727563744C61796F7574417474726962757465004C61796F75744B696E6400436F6D70696C657247656E6572617465644174747269627574650000000000032E00000100032600000761006D00700000033C0000056C00740000033E00000567007400000322000009710075006F00740000032700010923003000330039000003A100010B69006500780063006C000003A2000109630065006E0074000003A300010B70006F0075006E0064000003A400010D630075007200720065006E000003A5000107790065006E000003A600010D6200720076006200610072000003A700010973006500630074000003A800010775006D006C000003A900010963006F00700079000003AA0001096F007200640066000003AB00010B6C006100710075006F000003AC0001076E006F0074000003AD0001077300680079000003AE0001077200650067000003AF0001096D006100630072000003B00001076400650067000003B100010D70006C00750073006D006E000003B200010973007500700032000003B300010973007500700033000003B400010B610063007500740065000003B500010B6D006900630072006F000003B600010970006100720061000003B700010D6D006900640064006F0074000003B800010B63006500640069006C000003B900010973007500700031000003BA0001096F00720064006D000003BB00010B72006100710075006F000003BC00010D6600720061006300310034000003BD00010D6600720061006300310032000003BE00010D6600720061006300330034000003BF00010D6900710075006500730074000003D700010B740069006D00650073000003F700010D6400690076006900640065000003C000010D4100670072006100760065000003C100010D4100610063007500740065000003C200010B410063006900720063000003C300010D4100740069006C00640065000003C4000109410075006D006C000003C500010B4100720069006E0067000003C600010B410045006C00690067000003C700010D430063006500640069006C000003C800010D4500670072006100760065000003C900010D4500610063007500740065000003CA00010B450063006900720063000003CB000109450075006D006C000003CC00010D4900670072006100760065000003CD00010D4900610063007500740065000003CE00010B490063006900720063000003CF000109490075006D006C000003D00001074500540048000003D100010D4E00740069006C00640065000003D200010D4F00670072006100760065000003D300010D4F00610063007500740065000003D400010B4F0063006900720063000003D500010D4F00740069006C00640065000003D60001094F0075006D006C000003D800010D4F0073006C006100730068000003D900010D5500670072006100760065000003DA00010D5500610063007500740065000003DB00010B550063006900720063000003DC000109550075006D006C000003DD00010D5900610063007500740065000003DE00010B540048004F0052004E000003DF00010B73007A006C00690067000003E000010D6100670072006100760065000003E100010D6100610063007500740065000003E200010B610063006900720063000003E300010D6100740069006C00640065000003E4000109610075006D006C000003E500010B6100720069006E0067000003E600010B610065006C00690067000003E700010D630063006500640069006C000003E800010D6500670072006100760065000003E900010D6500610063007500740065000003EA00010B650063006900720063000003EB000109650075006D006C000003EC00010D6900670072006100760065000003ED00010D6900610063007500740065000003EE00010B690063006900720063000003EF000109690075006D006C000003F00001076500740068000003F100010D6E00740069006C00640065000003F200010D6F00670072006100760065000003F300010D6F00610063007500740065000003F400010B6F0063006900720063000003F500010D6F00740069006C00640065000003F60001096F0075006D006C000003F800010D6F0073006C006100730068000003F900010D7500670072006100760065000003FA00010D7500610063007500740065000003FB00010B750063006900720063000003FC000109750075006D006C000003FD00010D7900610063007500740065000003FE00010B740068006F0072006E000003FF000109790075006D006C0000397B00530051004C00230041006D00700065007200730061006E0064005200650070006C006100630065006D0065006E0074007D00240031000011260028006E006200730070003B002900003726002800280023005B005C0064005D002B003B0029007C002800230078005B0030002D00390061002D0066005D002B003B0029002900010962006F0074006800000D73007000610063006500730000032000000D26006E006200730070003B00000F720065007400750072006E00730000050D000A00000D3C006200720020002F003E0000030D0000030A0000357B00530051004C00230041006D00700065007200730061006E0064005200650070006C006100630065006D0065006E0074007D0000375000610072007400690061006C0054007900700065002000630061006E006E006F00740020006200650020004E0055004C004C002100001361007500740068006F00720069007400790000097000610074006800000B71007500650072007900000D73006300680065006D006500003F49006E00760061006C00690064002000760061006C0075006500200066006F00720020005000610072007400690061006C0054007900700065003A00200000792E000A005000610072007400690061006C00540079007000650020006D0075007300740020006200650020006F006E00650020006F0066003A00200041007500740068006F0072006900740079002C00200050006100740068002C002000510075006500720079002C00200053006300680065006D006500000B42006100730069006300000744004E0053000009490050007600340000094900500076003600000F55006E006B006E006F0077006E0000033B0000052600280000053B002900000000009186F88A30D69947A2D4C1FF2621CA370008B77A5C561934E089060001110D111106000111151111060001111111150600011111111108000015121901120C0600030E0E0E020A0003121D121D1111110D060001121D121D080002111111111111430016011C10111110111110111110111110111110112110111110111110110D10110D10110D10110D10110D10110D10111110111110112110111110111110110D101111060001122511110320000102060E052002010E0E02060802060212010001005408074D617853697A6532000000042001010E0420010102042001010880A0002400000480000094000000060200000024000052534131000400000100010033237E60D1AF2429EE4E6DABE42A2C8A8893EBD630506BA491C63FBFC5D6D0416C540D47A1244C1689482BC752CBAA4E0B95552751626957D1C0BD356D2C5E728A3EA0244C7AC9CC3D4CFB363802B0401245A79C4C7038E7E3901F3C727EC901AF72DAC23D4C6E2CAF8802EDDC1388C628430979DAC9AF0D307CD9527F1FDDC64101000300540E044E616D6515494E45545F497356616C696449504164647265737354020F497344657465726D696E6973746963015402094973507265636973650103200002050001110D020320000E032000080520020E0E0E0400010A0E0620011D0E1D030A07051D0E0A08110D1D034001000300540E044E616D6514494E45545F41646472657373546F4E756D62657254020F497344657465726D696E69737469630154020949735072656369736501050002020E0E0306111505000111150A0C07061D0E0A0A1115110D1D034001000300540E044E616D6514494E45545F4E756D626572546F4164647265737354020F497344657465726D696E69737469630154020949735072656369736501030611110320000A0500020E0E0E0600030E0E0E0E05000111110E0707040E0A0A11113A01000300540E044E616D650E494E45545F555249456E636F646554020F497344657465726D696E697374696301540209497350726563697365010400010E0E3E01000300540E044E616D6512494E45545F555249456E636F64654461746154020F497344657465726D696E697374696301540209497350726563697365013A01000300540E044E616D650E494E45545F5552494465636F646554020F497344657465726D696E697374696301540209497350726563697365010520020E03030615121901120C0520010113000A070215121901120C120C09200015118081011300071511808101120C04200013000900040E0E0E0E118089042001020E150705120C120C0E1511808101120C1511808101120C3B01000300540E044E616D650F494E45545F48544D4C456E636F646554020F497344657465726D696E69737469630154020949735072656369736501040000121D0420001D03052001011D033B01000300540E044E616D650F494E45545F48544D4C4465636F646554020F497344657465726D696E697374696301540209497350726563697365010C07030E120C1511808101120C3F01000300540E044E616D6513494E45545F5552494765744C6566745061727454020F497344657465726D696E697374696301540209497350726563697365010620010E1180950607021180950E0500011121080407011110823D01000500540E044E616D650F494E45545F555249476574496E666F540E1146696C6C526F774D6574686F644E616D6512494E4554555249496E666F46696C6C526F77540E0F5461626C65446566696E6974696F6E81C74162736F6C75746550617468204E564152434841522834303030292C204162736F6C757465557269204E564152434841522834303030292C20417574686F72697479204E564152434841522834303030292C20446E7353616665486F7374204E564152434841522834303030292C20467261676D656E74204E564152434841522834303030292C2048617368436F646520494E542C20486F7374204E564152434841522834303030292C20486F73744E616D6554797065204E56415243484152283530292C2049734162736F6C757465557269204249542C20497344656661756C74506F7274204249542C20497346696C65204249542C2049734C6F6F706261636B204249542C204973556E63204249542C20497357656C6C466F726D65644F726967696E616C537472696E67204249542C204C6F63616C50617468204E564152434841522834303030292C2050617468416E645175657279204E564152434841522834303030292C20506F727420494E542C205175657279204E564152434841522834303030292C20536368656D65204E56415243484152283530292C205573657245736361706564204249542C2055736572496E666F204E5641524348415228343030302954020F497344657465726D696E697374696301540209497350726563697365010615128099011C061512809D011C0820001512809D011C0920001512809D0113000520001280A102061C0320001C0306127D030611100328001C04010000000500001280A904070112140520001180AD060702081180AD062001011180B91101000C53514C232E4E6574776F726B0000150100107777772E53514C73686172702E636F6D00000501000000001501001053716C205175616E74756D204C65617000000901000453514C2300004201003D436F7079726967687420C2A920323030362D323031342053716C205175616E74756D204C6561702E20416C6C205269676874732052657365727665642E00000B010006332E332E383300000801000800000000001E01000100540216577261704E6F6E457863657074696F6E5468726F7773010000445A000000000000000000005E5A0000002000000000000000000000000000000000000000000000505A0000000000000000000000005F436F72446C6C4D61696E006D73636F7265652E646C6C0000000000FF2500200010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001001000000018000080000000000000000000000000000001000100000030000080000000000000000000000000000001000000000048000000586000009C03000000000000000000009C0334000000560053005F00560045005200530049004F004E005F0049004E0046004F0000000000BD04EFFE00000100030003000000530003000300000053003F000000000000000400000002000000000000000000000000000000440000000100560061007200460069006C00650049006E0066006F00000000002400040000005400720061006E0073006C006100740069006F006E00000000000000B004FC020000010053007400720069006E006700460069006C00650049006E0066006F000000D802000001003000300030003000300034006200300000003C001100010043006F006D006D0065006E007400730000007700770077002E00530051004C00730068006100720070002E0063006F006D000000000044001100010043006F006D00700061006E0079004E0061006D00650000000000530071006C0020005100750061006E00740075006D0020004C006500610070000000000044000D000100460069006C0065004400650073006300720069007000740069006F006E0000000000530051004C0023002E004E006500740077006F0072006B0000000000300007000100460069006C006500560065007200730069006F006E000000000033002E0033002E00380033000000000044001100010049006E007400650072006E0061006C004E0061006D0065000000530051004C0023002E004E006500740077006F0072006B002E0064006C006C0000000000A0003D0001004C006500670061006C0043006F007000790072006900670068007400000043006F0070007900720069006700680074002000A900200032003000300036002D0032003000310034002000530071006C0020005100750061006E00740075006D0020004C006500610070002E00200041006C006C0020005200690067006800740073002000520065007300650072007600650064002E00000000004C00110001004F0072006900670069006E0061006C00460069006C0065006E0061006D0065000000530051004C0023002E004E006500740077006F0072006B002E0064006C006C00000000002C0005000100500072006F0064007500630074004E0061006D00650000000000530051004C00230000000000340007000100500072006F006400750063007400560065007200730069006F006E00000033002E0033002E0038003300000000003C000900010041007300730065006D0062006C0079002000560065007200730069006F006E00000033002E0033002E00380033002E00300000000000000000000000000000000000005000000C000000703A00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
- WITH PERMISSION_SET = SAFE;
- ');
- PRINT 'SQL#.Network Assembly Created.';
- END;
- ELSE
- BEGIN
- PRINT 'Skipping install of SQL#.Network Assembly.';
- END;
- PRINT '';
-
-
- IF (@InstallSQL#DB = 1)
- BEGIN
- PRINT 'Creating SQL#.DB Assembly ...';
- EXEC(N'
- CREATE ASSEMBLY [SQL#.DB]
- AUTHORIZATION [' + @SQLsharpLogin + N']
-FROM 0x4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000504500004C010300802168540000000000000000E00002210B010B00002A00000006000000000000AE49000000200000006000000000001000200000000200000400000000000000040000000000000000A0000000020000BF6F00000300408500001000001000000000100000100000000000001000000000000000000000005C4900004F00000000600000D003000000000000000000000000000000000000008000000C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000080000000000000000000000082000004800000000000000000000002E74657874000000B429000000200000002A000000020000000000000000000000000000200000602E72737263000000D00300000060000000040000002C0000000000000000000000000000400000402E72656C6F6300000C000000008000000002000000300000000000000000000000000000400000420000000000000000000000000000000090490000000000004800000002000500802C0000DC1C0000090000000000000000000000000000005020000080000000000000000000000000000000000000000000000000000000000000000000000039FBF9A6759CFE17769B4BF17449B390377C3638081B65AD88181D698459FCC76CEF4BB9AC0D03F122EE05D69FEA5884E4C9AA9F59B70B545A4D211C7E8FE15B42CEF33ADAC320A012C7572D2E663942532445309B23F7F7A2E290664DE64CEC70AFFC4D22CCF456C3BA4A233E69EFCB59CBBC33A37FF35F77EB73F097B04128133004006F01000001000011026F0F00000A7E1000000A281100000A2C02162A160A02178D1A00000113091109161F7C9D11096F1200000A0B160C160D16130416130516130616130707130A16130B381A010000110A110B9A130811086F0F00000A6F1300000A25130C39DD000000FE137E050000042D551C731500000A25720100007016281600000A25722300007017281600000A25723D00007018281600000A25725700007019281600000A25726B0000701A281600000A25727F0000701B281600000AFE138005000004FE137E05000004110C120D281700000A2C6D110D4506000000020000000D000000190000002600000033000000400000002B4C082D650618600A170C2B5D092D5A061F10600A170D2B5111042D4D0617600A1713042B4411052D40061E600A1713052B3711062D33061A600A1713062B2A11072D26061F20600A1713072B1C72AD00007011086F0F00000A72D7000070281800000A731900000A7A110B1758130B110B110A8E693FDBFEFFFF062A00133005008200000002000011281A00000A1E8D190000010A0616281B00000A0B1201281C00000AA2061772F3000070A20618281B00000A0C1202281D00000AA2061972F7000070A2061A036F1E00000A0D1203281F00000AA2061B72FF000070A2061C036F1E00000A176A330772090100702B05720B010070A2061D720F010070A206282000000A6F2100000A2A1E02282300000A2A000013300500A30000000200001102046F1E00000A7D07000004027B07000004027B060000046A5D166A4081000000281A00000A1E8D190000010A0616281B00000A0B1201281C00000AA2061772F3000070A20618281B00000A0C1202281D00000AA2061972F7000070A2061A046F1E00000A0D1203281F00000AA2061B72FF000070A2061C046F1E00000A176A330772090100702B05720B010070A2061D720F010070A206282000000A6F2100000A2A3602046F1E00000A7D070000042A0000001B300500FF0500000300001114131A14131B7311000006131C0F02282400000A2D180F02282500000A6F0F00000A7E1000000A281100000A2C0B721F010070731900000A7A0F02282500000A6F0F00000A13040F04282400000A2D180F04282500000A6F0F00000A7E1000000A281100000A2C0B727B010070731900000A7A0F04282500000A6F0F00000A13060F05282600000A2C04160B2B1F0F05282700000A16320A0F05282700000A0B2B0B72D3010070731900000A7A0F06282600000A2C0A111C167D060000042B250F06282700000A163210111C0F06282700000A7D060000042B0B7237020070731900000A7A0F07282600000A2C0B72A7020070731900000A7A0F07282700000A16310A0F07282700000A0C2B0B72D7020070731900000A7A0F00282400000A2C09720103007013072B3A0F00282500000A6F0F00000A6F1300000A130711077201030070282800000A2C191107720D030070282800000A2C0B721B030070731900000A7A0F01282400000A2D180F01282500000A6F0F00000A7E1000000A281100000A2C0872A20300700D2B0D0F01282500000A6F0F00000A0D0F03282400000A2D180F03282500000A6F0F00000A7E1000000A281100000A2C0972D603007013052B0E0F03282500000A6F0F00000A13050F09282400000A2C04160A2B0D0F09282500000A28010000060A14130814130914130A111C166A7D0700000411077201030070281100000A39E301000009732900000A251309131D11096F2A00000A11041109732B00000A130B110B6F2C00000A130C110506732D00000A251308131E1108076F2E00000A1108086F2F00000A110811066F3000000A0E0A283100000A2D380E0A283200000A156A332D111C7B0600000416316F1108111C7B060000046F3300000A110814FE0602000006733400000A6F3500000A2B4C1108176F3300000A111C7B0600000416311E1108111A2D0F111CFE0612000006733400000A131A111A6F3500000A2B1C1108111B2D0F111CFE0613000006733400000A131B111B6F3500000A0F08282400000A3ACF0000000F08282500000A6F0F00000A7E1000000A282800000A39B40000000F08282500000A178D1A000001131F111F161F7C9D111F6F1200000A130D16130F3883000000733600000A130E110D110F9A178D1A00000113201120161F2C9D11206F1200000A13101110169A1211283700000A2C0D110E111117586F3800000A2B0B110E1110169A6F3900000A1110179A1211283700000A2C0D110E111117586F3A00000A2B0B110E1110179A6F3B00000A11086F3C00000A110E6F3D00000A26110F175868130F110F110D8E693F72FFFFFF1108110C6F3E00000ADE0C111E2C07111E6F3F00000ADC110C6F4000000ADD94010000111D2C07111D6F3F00000ADC09734100000A25130A1321110A6F4200000A172E07110A6F2A00000A1104110A734300000A131211126F4400000A1313110506732D00000A25130813221108076F2E00000A1108086F2F00000A110811066F3000000A111C7B060000041631211108111C7B060000046F3300000A110814FE0602000006733400000A6F3500000A0F08282400000A3ACF0000000F08282500000A6F0F00000A7E1000000A282800000A39B40000000F08282500000A178D1A00000113231123161F7C9D11236F1200000A13141613163883000000733600000A1315111411169A178D1A00000113241124161F2C9D11246F1200000A13171117169A1218283700000A2C0D1115111817586F3800000A2B0B11151117169A6F3900000A1117179A1218283700000A2C0D1115111817586F3A00000A2B0B11151117179A6F3B00000A11086F3C00000A11156F3D00000A2611161758681316111611148E693F72FFFFFF110811136F3E00000ADE0C11222C0711226F3F00000ADC11136F4000000ADE0C11212C0711216F3F00000ADCDE3D1319281A00000A726504007011196F4500000A727D04007072810400706F4600000A7287040070281800000A734700000A6F4800000ADE0326DE00DE00DE4311086F4900000A11092C1011096F4200000A2C0711096F4A00000A110A2C10110A6F4200000A2C07110A6F4A00000A0E0A111C7B07000004284B00000A8106000001DC2A0041AC000002000000420200008C010000CE0300000C00000000000000020000001A020000CC010000E60300000C00000000000000020000002F0400002A010000590500000C0000000000000002000000FD030000710100006E0500000C00000000000000000000007E05000036000000B4050000030000000100000100000000FE0100007E0300007C0500003D0000001D00000102000000FE010000BD030000BB0500004300000000000000DE0F00284D00000A2D090F01284D00000A2C0716284E00000A2A0F00284F00000A0F01284F00000A330716284E00000A2A17284E00000A2A1330050052000000040000110F01282700000A185B6A0A0F02282700000A185B6A0B166A0C0F02282700000A15330B026F5000000A06590C2B040706590C08176A580C08D48D1A0000010D0206091608696F5100000A2609735200000A2A1E02282300000A2A1E02282300000A2A1E02282300000A2A1E02282300000A2A1E027B030000042A1E027B040000042A32027B020000046F5300000A2A0003300400450000000000000002282300000A0F01282400000A2D180F01282500000A6F0F00000A7E1000000A281100000A2C0E027E1000000A0405280E0000062A020F01282500000A0405280E0000062A00000003300200C000000000000000037E1000000A281100000A2C4702735400000A7D02000004042D03052C21027B02000004176F5500000A027B02000004166F5600000A02177D030000042B66027B02000004176F5700000A02177D040000042B510203735800000A7D02000004027B020000046F5900000A2C24042C1A027B02000004176F5500000A027B02000004166F5600000A2B0702177D04000004027B020000046F5A00000A2C0702177D03000004027B030000042C12285B00000A2D0B729B040070731900000A7A2A66027B030000042C1002285B00000A6F5C00000A7D010000042A52027B010000042C0B027B010000046F5D00000A2A0042534A4201000100000000000C00000076322E302E35303732370000000005006C00000018070000237E000084070000C40A000023537472696E677300000000481200008405000023555300CC170000100000002347554944000000DC1700000005000023426C6F6200000000000000020000015715A2090902000000FA25330016000001000000340000000800000007000000130000001E0000005D00000012000000040000000100000003000000030000000100000001000000030000000100000000000A00010000000000060065005E000A008E0078000A00B40078000A00F500E0000A00FF00E0000A000801E0000A001A01E0000A002901E000060066014C010A009A0178000A008E03730306001804060406002F04060406004C04060406006B04060406008404060406009D0406040600B80406040600D304060406000B05EC0406001F0506040600380506040600750555050600950555050600BB055E000600D9055E00060031065505060067064C0606009F065E000A00A90673030A00B40673030600C5065E00060008075E000A001C0773030A00A50778000A00C607B3070A00D80778000A00E30778000A00FF0778000A00560878000A008208780006009B085E000A00FA0878000A0030096C0006004A095E000A005E09B3070E008A0971090A009B096C000E00B50971090E00C30971090A00030A730306008D0A4C01000000000100000000000100010001001000160000000500010001000100100019000000050001000700010010002300000005000100080001001000330000000500010009000100100044000000050001000A0000000000EC0500000500050011000301100032070000050006001100010082014A000100B5014E000100C80152000100DD015200130074064D0106004507C20106005707C501D020000000009100A1000A0001004C22000000009100CB0010000200A4230000000096001101170004005C2A000000009600250132000F00942A00000000960032013B001100F22A000000008618460146001500FA2A000000008618460146001500022B0000000086184601460015000A2B000000008618460146001500122B000000008608F601550015001A2B0000000086080D0255001500222B000000008608280259001500302B00000000861846015D001500842B0000000081003D0265001800502C000000008600430246001B006A2C000000008600590246001B00DA22000000008618460146001B00E4220000000086006407C8011B0093230000000086007307C8011D0000000100A60200000100B20200000200B90200000100BE0200000200C90200000300DA0200000400E60200000500FC02000006001103000007001B03000008002B0300000900330300000A00420300000B005603000001006103000002006A0300000000000000000100A00300000200A80300000300BD0300000100950200000200D00300000300EA0300000100950200000200D00300000300EA0300000100B20200000200B90200000100B20200000200B902590046014600610046018700690046018700710046018700790046018700810046018700890046018700910046018700990046018700A10046018C00A90046018700B10046018700B90046019100C10046014600C900C2055900C900C7053801C900CD053B01C900DE054101C900E4055900D900460146000C00460191000C0088065C010C008C066401C90098066D01E90046018700F100BC0689010101CE068E010101D60659000101E80659001900F906940109010E075900C90098069801F9001707870011014601460009004601460021008207550021008D07590029008207550029008D07CF01C90097073B011901460187002101D307460029014601D3012901F107DB0139014601E10139010B08910039011908910039012D08870031008207550031008D07940139014608910041014601E80139017008EE014901460146005101A108F5014901AA0891004901BC0887004901CD0891004901E408870039011D09FC0159018806020239013C090B0269015609460071016B0946007901460187002101AB0912028901460118028901F1072002E900D4095900C900E0092602290146018700F900E8092C0239016B09460021016B0946003100F70933029901460146003900820755003900F709490339008D0755004100180A94014100230A1E0441004601270409000E0759005100460146005100280A8C0051003F0A8C0051004A0A8C005100460187005100600A55005100760A5500F1009D0A3504A101B10A3B044900BD0A46002E001B004D042E00230063042E006B00D8042E002B0069042E006300CC042E00130040042E007300E1042E0033007F042E003B0089042E00430063042E005300630460001301AA01800063028A02A00063024F03E300A30048010301A300480124020B00740044020B00740074019E0139022D040600010000006B026C0000007E026C0000009502700002000A00030002000B00050002000C0007005501048000000300030053000000010000009600B3050000020000000000000000000000010055000000000002000000000000000000000001006C000000000002000000000000000000000001007109000000000800020000000000003C4D6F64756C653E0053514C232E44422E646C6C004442005175657279496E666F0046756E6374696F6E48656C7065727300526573756C7453657448656C7065727300436F6E6E656374696F6E48656C706572006D73636F726C69620053797374656D004F626A6563740053797374656D2E446174610053797374656D2E446174612E53716C436C69656E740053716C42756C6B436F70794F7074696F6E730047657442756C6B436F70794F7074696F6E730053716C526F7773436F706965644576656E74417267730053716C526F7773436F706965645F4F75747075740053797374656D2E446174612E53716C54797065730053716C537472696E670053716C496E7433320053716C496E7436340042756C6B436F70790053716C426F6F6C65616E00584F520053716C43686172730043757272656E7453514C53746174656D656E74002E63746F720053797374656D2E53656375726974792E5072696E636970616C0057696E646F7773496D706572736F6E6174696F6E436F6E74657874005F5F496D706572736F6E6174696F6E4964656E746974790053716C436F6E6E656374696F6E537472696E674275696C646572005F5F436F6E6E656374696F6E537472696E67005F5F5573696E67496D706572736F6E6174696F6E005F5F5573696E67436F6E74657874436F6E6E656374696F6E006765745F5573696E67496D706572736F6E6174696F6E006765745F5573696E67436F6E74657874436F6E6E656374696F6E006765745F436F6E6E656374696F6E537472696E6700536574757000496D706572736F6E617465496645787465726E616C00556E646F496D706572736F6E6174696F6E005573696E67496D706572736F6E6174696F6E005573696E67436F6E74657874436F6E6E656374696F6E00436F6E6E656374696F6E537472696E67004F7074696F6E734C6973740073656E646572006172677300536F757263655479706500536F75726365436F6E6E656374696F6E00536F7572636551756572790044657374696E6174696F6E436F6E6E656374696F6E0044657374696E6174696F6E5461626C654E616D6500426174636853697A65004E6F746966794166746572526F77730054696D654F757400436F6C756D6E4D617070696E67730042756C6B436F70794F7074696F6E734C69737400526F7773436F706965640056616C75654F6E650056616C756554776F004D6963726F736F66742E53716C5365727665722E5365727665720053716C46616365744174747269627574650053514C546578740053746174656D656E7453746172744F66667365740053746174656D656E74456E644F666673657400446973616C6C6F77436F6E74657874436F6E6E656374696F6E0044656661756C74546F45787465726E616C436F6E6E656374696F6E0053797374656D2E5265666C656374696F6E00417373656D626C795469746C6541747472696275746500417373656D626C794465736372697074696F6E41747472696275746500417373656D626C79436F6E66696775726174696F6E41747472696275746500417373656D626C79436F6D70616E7941747472696275746500417373656D626C7950726F6475637441747472696275746500417373656D626C79436F7079726967687441747472696275746500417373656D626C7954726164656D61726B41747472696275746500417373656D626C7943756C747572654174747269627574650053797374656D2E52756E74696D652E496E7465726F70536572766963657300436F6D56697369626C6541747472696275746500417373656D626C7956657273696F6E41747472696275746500417373656D626C7946696C6556657273696F6E4174747269627574650053797374656D2E52756E74696D652E436F6D70696C6572536572766963657300436F6D70696C6174696F6E52656C61786174696F6E734174747269627574650052756E74696D65436F6D7061746962696C6974794174747269627574650053514C232E444200537472696E67005472696D00456D707479006F705F457175616C69747900436861720053706C697400546F4C6F776572003C50726976617465496D706C656D656E746174696F6E44657461696C733E7B41344136423239462D463933382D344435352D393443342D3543453244354239343237377D00436F6D70696C657247656E6572617465644174747269627574650053797374656D2E436F6C6C656374696F6E732E47656E657269630044696374696F6E61727960320024246D6574686F643078363030303030312D31004164640054727947657456616C756500436F6E63617400457863657074696F6E0053716C436F6E746578740053716C50697065006765745F50697065004461746554696D65006765745F4E6F7700546F53686F727444617465537472696E6700546F4C6F6E6754696D65537472696E67006765745F526F7773436F7069656400496E74363400546F537472696E670053656E640053716C50726F636564757265417474726962757465003C3E635F5F446973706C6179436C61737334005F5F4E6F746966794166746572526F7773005F5F526F7773436F70696564003C42756C6B436F70793E625F5F30003C42756C6B436F70793E625F5F31006765745F49734E756C6C006765745F56616C7565006F705F496E657175616C6974790053716C436F6E6E656374696F6E0053797374656D2E446174612E436F6D6D6F6E004462436F6E6E656374696F6E004F70656E0053716C436F6D6D616E640053716C4461746152656164657200457865637574655265616465720053716C42756C6B436F7079007365745F426174636853697A65007365745F42756C6B436F707954696D656F7574007365745F44657374696E6174696F6E5461626C654E616D65007365745F4E6F7469667941667465720053716C526F7773436F706965644576656E7448616E646C6572006164645F53716C526F7773436F706965640053716C42756C6B436F7079436F6C756D6E4D617070696E6700496E743332005472795061727365007365745F536F757263654F7264696E616C007365745F536F75726365436F6C756D6E007365745F44657374696E6174696F6E4F7264696E616C007365745F44657374696E6174696F6E436F6C756D6E0053716C42756C6B436F7079436F6C756D6E4D617070696E67436F6C6C656374696F6E006765745F436F6C756D6E4D617070696E6773004944617461526561646572005772697465546F5365727665720049446973706F7361626C6500446973706F73650044624461746152656164657200436C6F73650053797374656D2E446174612E4F7261636C65436C69656E74004F7261636C65436F6E6E656374696F6E00436F6E6E656374696F6E5374617465006765745F5374617465004F7261636C65436F6D6D616E64004F7261636C6544617461526561646572006765745F4D657373616765005265706C6163650045786563757465416E6453656E64006F705F496D706C696369740053716C46756E6374696F6E417474726962757465006765745F4C656E6774680052656164007365745F496E74656772617465645365637572697479007365745F456E6C697374007365745F436F6E74657874436F6E6E656374696F6E006765745F436F6E74657874436F6E6E656374696F6E006765745F496E746567726174656453656375726974790057696E646F77734964656E74697479006765745F57696E646F77734964656E7469747900496D706572736F6E61746500556E646F000000002163006800650063006B0063006F006E00730074007200610069006E0074007300001966006900720065007400720069006700670065007200730000196B006500650070006900640065006E00740069007400790000136B006500650070006E0075006C006C00730000137400610062006C0065006C006F0063006B00002D75007300650069006E007400650072006E0061006C007400720061006E00730061006300740069006F006E000029420075006C006B0043006F007000790020006F007000740069006F006E0020006F00660020002700011B2700200069007300200069006E00760061006C0069006400210001032000000720002D0020000109200072006F007700000100037300000F200063006F007000690065006400005B53006F007500720063006500510075006500720079002000630061006E006E006F00740020006200650020004E0055004C004C0020006F007200200065006D00700074007900200073007400720069006E00670020002700270001575400610062006C0065004E0061006D0065002000630061006E006E006F00740020006200650020004E0055004C004C0020006F007200200065006D00700074007900200073007400720069006E006700200027002700016342006100740063006800530069007A00650020006D0075007300740020006200650020003E003D0020003000200028006F00720020004E0055004C004C002000770069006C006C002000650071007500610074006500200074006F00200030002900006F4E006F0074006900660079004100660074006500720052006F007700730020006D0075007300740020006200650020003E003D0020003000200028006F00720020004E0055004C004C002000770069006C006C002000650071007500610074006500200074006F00200030002900002F540069006D0065004F00750074002000630061006E006E006F00740020006200650020004E0055004C004C0021000029540069006D0065004F007500740020006D0075007300740020006200650020003E00200030002100000B6D007300730071006C00000D6F007200610063006C00650000808553006F00750072006300650054007900700065002000630061006E0020006F006E006C00790020006200650020004E0055004C004C002C00200027004D005300530051004C0027002C0020006F007200200027004F007200610063006C0065002700200028004E0055004C004C0020003D00200027004D005300530051004C0027002900013363006F006E007400650078007400200063006F006E006E0065006300740069006F006E0020003D002000740072007500650000808D4400610074006100200053006F0075007200630065003D0028006C006F00630061006C0029003B00200049006E00740065006700720061007400650064002000530065006300750072006900740079003D0074007200750065003B00200049006E0069007400690061006C00200043006100740061006C006F0067003D00740065006D007000640062003B00001752004100490053004500520052004F0052002800270001032700010527002700011327002C002000310036002C002000310029000180E70A000A0020002000430061006E006E006F0074002000750073006500200054007200750073007400650064005F0043006F006E006E0065006300740069006F006E0020002F00200049006E007400650067007200610074006500640020005300650063007500720069007400790020007700680065006E002000630075007200720065006E0074002000750073006500720020006900730020006E006F00740020006100730073006F0063006900610074006500640020007700690074006800200061002000570069006E0064006F007700730020004C006F00670069006E002E000A000A00009FB2A6A438F9554D94C45CE2D5B942770008B77A5C561934E08905000111090E060002011C120D1A000B011111111111111111111111151115111511111111101119080002111D111D111D0A00031221122111151115032000010306122503061229020602032000020320000E0720030111110202062003010E0202032800020328000E12010001005408074D617853697A65FFFFFFFF042001010E0420010102042001010880A00024000004800000940000000602000000240000525341310004000001\
-00010033237E60D1AF2429EE4E6DABE42A2C8A8893EBD630506BA491C63FBFC5D6D0416C540D47A1244C1689482BC752CBAA4E0B95552751626957D1C0BD356D2C5E728A3EA0244C7AC9CC3D4CFB363802B0401245A79C4C7038E7E3901F3C727EC901AF72DAC23D4C6E2CAF8802EDDC1388C628430979DAC9AF0D307CD9527F1FDDC602060E050002020E0E0620011D0E1D0304010000000706151271020E0806151271020E0807200201130013010820020213001013010600030E0E0E0E14070E11091D0E0202020202020E1D031D0E080E08040000127D0500001180810320000A0500010E1D0E0B07041D0E1180811180810A1701000100540E044E616D650B44425F42756C6B436F707902060802060A062002011C120D03200008072002010E12808D052000128099062002010E1109052002011C18062001011280A1060002020E10080520001280AD0820011280A51280A5062001011280B10520001180C1072002010E1280BD0520001280C90520020E0E0E0620010112809505000111190A500725110908080E0E0E0E0E12809D12808D1280BD1280951280991D0E1280A5061D0E081280C51280C91D0E1280A5061D0E0812751280A11280A1122012808D12809D1D031D031280BD12809D1D031D0380BD01000400540E044E616D650644425F584F525455794D6963726F736F66742E53716C5365727665722E5365727665722E446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038390A446174614163636573730000000054020F497344657465726D696E69737469630154020949735072656369736501050001111D0280CD01000400540E044E616D651644425F43757272656E7453514C53746174656D656E745455794D6963726F736F66742E53716C5365727665722E5365727665722E446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038390A446174614163636573730000000054020F497344657465726D696E697374696301540209497350726563697365010820040A0A1D030808052001011D030707040A0A0A1D030500001280D104200012250C01000753514C232E44420000150100107777772E53514C73686172702E636F6D00000501000000001501001053716C205175616E74756D204C65617000000901000453514C2300004201003D436F7079726967687420C2A920323030362D323031342053716C205175616E74756D204C6561702E20416C6C205269676874732052657365727665642E00000B010006332E332E383300000801000800000000001E01000100540216577261704E6F6E457863657074696F6E5468726F7773018449000000000000000000009E49000000200000000000000000000000000000000000000000000090490000000000000000000000005F436F72446C6C4D61696E006D73636F7265652E646C6C0000000000FF25002000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100100000001800008000000000000000000000000000000100010000003000008000000000000000000000000000000100000000004800000058600000780300000000000000000000780334000000560053005F00560045005200530049004F004E005F0049004E0046004F0000000000BD04EFFE00000100030003000000530003000300000053003F000000000000000400000002000000000000000000000000000000440000000100560061007200460069006C00650049006E0066006F00000000002400040000005400720061006E0073006C006100740069006F006E00000000000000B004D8020000010053007400720069006E006700460069006C00650049006E0066006F000000B402000001003000300030003000300034006200300000003C001100010043006F006D006D0065006E007400730000007700770077002E00530051004C00730068006100720070002E0063006F006D000000000044001100010043006F006D00700061006E0079004E0061006D00650000000000530071006C0020005100750061006E00740075006D0020004C0065006100700000000000380008000100460069006C0065004400650073006300720069007000740069006F006E0000000000530051004C0023002E00440042000000300007000100460069006C006500560065007200730069006F006E000000000033002E0033002E00380033000000000038000C00010049006E007400650072006E0061006C004E0061006D0065000000530051004C0023002E00440042002E0064006C006C000000A0003D0001004C006500670061006C0043006F007000790072006900670068007400000043006F0070007900720069006700680074002000A900200032003000300036002D0032003000310034002000530071006C0020005100750061006E00740075006D0020004C006500610070002E00200041006C006C0020005200690067006800740073002000520065007300650072007600650064002E000000000040000C0001004F0072006900670069006E0061006C00460069006C0065006E0061006D0065000000530051004C0023002E00440042002E0064006C006C0000002C0005000100500072006F0064007500630074004E0061006D00650000000000530051004C00230000000000340007000100500072006F006400750063007400560065007200730069006F006E00000033002E0033002E0038003300000000003C000900010041007300730065006D0062006C0079002000560065007200730069006F006E00000033002E0033002E00380033002E00300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000C000000B03900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
- WITH PERMISSION_SET = SAFE;
- ');
- PRINT 'SQL#.DB Assembly Created.';
- END;
- ELSE
- BEGIN
- PRINT 'Skipping install of SQL#.DB Assembly.';
- END;
- PRINT '';
-
-
- IF (@InstallSQL#OS = 1)
- BEGIN
- PRINT 'Creating SQL#.OS Assembly ...';
- EXEC(N'
- CREATE ASSEMBLY [SQL#.OS]
- AUTHORIZATION [' + @SQLsharpLogin + N']
-FROM 0x4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000504500004C0103007D2168540000000000000000E00002210B010B00002A00000006000000000000BE48000000200000006000000000001000200000000200000400000000000000040000000000000000A0000000020000BB890000030040850000100000100000000010000010000000000000100000000000000000000000684800005300000000600000D003000000000000000000000000000000000000008000000C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000080000000000000000000000082000004800000000000000000000002E74657874000000C428000000200000002A000000020000000000000000000000000000200000602E72737263000000D00300000060000000040000002C0000000000000000000000000000400000402E72656C6F6300000C0000000080000000020000003000000000000000000000000000004000004200000000000000000000000000000000A0480000000000004800000002000500602C0000081C0000090000000000000000000000000000005020000080000000000000000000000000000000000000000000000000000000000000000000000002D79EC9D122596F82B900F2B976A42FFBEB88C19112D9819DBECD6C00D6F9FAC2126BF688AC475B693390A419F11045E54698A694C84627EB80B329F738A687C22D8BE2F60355FBA92F00117E8F98329ECAB05167E62BA78001694BEB690E13F696463B020A9C1713E54532E5F04FA78BAE57112167B57FC23D4CD337848D5FEE0F00281100000A2D090F01281100000A2C0B7201000070731200000A7A0F00281300000A0F01281300000A281400000A7257000070281500000A2A2E281600000A281500000A2A2E281700000A281800000A2A13300200BF0000000100001102A5030000020A0312007B01000004281800000A81040000010412007B02000004281500000A81030000010512007B03000004281500000A81030000010E0412007B04000004281900000A81050000010E0512007B05000004281500000A81030000010E0612007B06000004281A00000A81060000010E0712007B07000004281A00000A81060000010E0812007B08000004281500000A81030000010E0912007B09000004281500000A81030000010E0A12007B0A000004731B00000A512A0013300200CC00000002000011282400000A6F2500000A027B0D0000043315027B0C0000041FFE330B02167D0C000004020A2B0716730F0000060A06027B0F0000047D0E00000406027B110000047D1000000406027B130000047D1200000406027B150000047D1400000406027B170000047D1600000406027B190000047D1800000406027B1B0000047D1A00000406027B1D0000047D1C00000406027B1F0000047D1E00000406027B210000047D2000000406027B230000047D2200000406027B250000047D2400000406027B270000047D26000004062A1E0228080000062A1B300300FC05000003000011027B0C0000040C08162E0C08193BAD05000038D805000002157D0C0000040272570000707D2E0000040272570000707D2F000004027C0E000004282600000A2D1C027C0E000004282700000A6F2800000A7E2900000A282A00000A2C0D0272570000707D280000042B1602027C0E000004282700000A6F2800000A7D28000004027C10000004282600000A2D1C027C10000004282700000A6F2800000A7E2900000A282A00000A2C0D0272570000707D290000042B1602027C10000004282700000A6F2800000A7D29000004027C26000004282600000A2C0902167D2A0000042B1602027C26000004282700000A282B00000A7D2A000004027C18000004282600000A2D1C027C18000004282700000A6F2800000A7E2900000A282A00000A2C0D0272570000707D2B0000042B1102027C18000004282700000A7D2B000004027C14000004282600000A2D1C027C14000004282700000A6F2800000A7E2900000A282A00000A2C0D0272570000707D2D0000042B1102027C14000004282700000A7D2D00000402147D30000004027C31000004FE1503000002027B290000047E2900000A282A00000A2C1302027B28000004732C00000A7D300000042B1702027B28000004027B29000004732D00000A7D30000004DE200A027B300000042C0B027B300000046F2E00000A066F2F00000A731200000A7A02027B300000046F3000000A6F3100000A7D3300000402187D0C00000438AD03000002027B330000046F2200000A74250000017D32000004027B320000046F3200000A2D0D0272570000707D2C0000042B1102027B320000046F3200000A7D2C000004027B320000046F3300000A0D09175945040000000B0000003F0000004C00000025000000091E2E2E091F102E0F2B410272590000707D2E0000042B3F0272650000707D2E0000042B320272810000707D2E0000042B250272990000707D2E0000042B180272B50000707D2E0000042B0B0272570000707D2E000004027B320000046F3400000A2D0D0272570000707D2F0000042B1102027B320000046F3400000A7D2F000004027B2C000004027B2B000004027B2A000004283500000A39AA020000027B2E000004027B2D000004027B2A000004283500000A398E020000027C22000004281100000A2D28027C22000004281300000A2C1B027B320000046F3600000A027C22000004281300000A3F59020000027C24000004281100000A2D28027C24000004281300000A2C1B027B320000046F3600000A027C24000004281300000A3D24020000027C1E000004283700000A2D25027B320000046F3800000A13041204027C1E000004283900000A283A00000A163FF2010000027C20000004283700000A2D25027B320000046F3800000A13051205027C20000004283900000A283A00000A163DC0010000027C16000004282600000A2D2F027B320000046F3B00000A13061206283C00000A027C16000004282700000A027B2A000004283500000A3984010000027C12000004282600000A2D26027B320000046F3D00000A027C12000004282700000A027B2A000004283500000A3951010000027C1A000004282600000A2D21027B2F000004027C1A000004282700000A027B2A000004283500000A3923010000027C1C000004282600000A2D26027B320000046F3E00000A027C1C000004282700000A027B2A000004283500000A39F0000000027C31000004027B2C0000047D02000004027C31000004027B320000046F3F00000A7D0A000004027C31000004027B2E0000047D03000004027C31000004027B320000046F3600000A7D01000004027C31000004027B320000046F3B00000A7D04000004027C31000004027B320000046F3E00000A7D09000004027C31000004027B320000046F3D00000A7D05000004027C31000004027B320000046F3800000A7D06000004027C31000004027B320000046F4000000A7D07000004027C31000004027B2F0000047D0800000402027B310000048C030000027D0B00000402197D0C000004170BDE3B02187D0C000004027B330000046F1E00000A3A43FCFFFF022810000006027B300000042C0B027B300000046F2E00000A160BDE0702280D000006DC072A4134000000000000990100003E000000D7010000200000001C0000010400000000000000F3050000F305000007000000000000001E027B0B0000042A1A734100000A7A001B3002002200000004000011027B0C0000040B071859450200000001000000010000002ADE07022810000006DC2A00000110000002001800021A0007000000001E027B0B0000042A7A02284200000A02037D0C00000402282400000A6F2500000A7D0D0000042AB202157D0C00000402027B3300000475220000017D34000004027B340000042C0B027B340000046F2100000A2A133002006E000000020000111FFE730F0000060A06027D0F00000406037D1100000406047D1300000406057D15000004060E047D17000004060E057D19000004060E067D1B000004060E077D1D000004060E087D1F000004060E097D21000004060E0A7D23000004060E0B7D25000004060E0C7D27000004062A00001B30060004020000050000110F00282600000A2C0B72C5000070731200000A7A0F00282700000A6F2800000A7E2900000A282A00000A2C0B72F5000070731200000A7A0F01282600000A2D180F01282700000A6F2800000A7E2900000A282A00000A2C0872570000700A2B0D0F01282700000A6F2800000A0A0F03282600000A2C0B723B010070731200000A7A0F03282700000A6F2800000A7E2900000A282A00000A2C0B726F010070731200000A7A0F05284300000A2C0B723B010070731200000A7A0F04281100000A2C0B723B010070731200000A7A0F03282700000A6F4400000A6F2800000A2513042C5D110472B9010070282A00000A2D3A110472C5010070282A00000A2D30110472E1010070282A00000A2D27110472F9010070282A00000A2D1D11047215020070282A00000A2D132B15170B2B281F100B2B231A0B2B1F1E0B2B1B180B2B1772250200700F03282700000A284500000A731200000A7A140C067E2900000A282A00000A2C0F0F00282700000A732C00000A0C2B0E0F00282700000A06732D00000A0C080F02282700000A6F2800000A6F4600000A0F07284700000A2C1E080F06282700000A070F04281300000A0F05284800000A6F4900000A2B23080F06282700000A070F04281300000A0F05284800000A0F07284A00000A6F4B00000ADE0D0D096F2F00000A731200000A7ADE0A082C06086F2E00000ADC7257000070281500000A2A011C00000000580188E0010D1C0000010200580197EF010A000000001E02284200000A2A42534A4201000100000000000C00000076322E302E35303732370000000005006C000000E8070000237E000054080000AC0A000023537472696E6773000000000013000050020000235553005015000010000000234755494400000060150000A806000023426C6F6200000000000000020000015717A20B0902000000FA253300160000010000003100000004000000340000001000000023000000050000004D0000001800000005000000010000000200000002000000070000000200000001000000040000000200000000000A00010000000000060033002C0006003A002C000A00650050000A006F0050000A00980050000A00A10050000A00AD0050000600DA00C7000A00F30050000A00FC005000060045012C000600B40195010A0038021D0206006702550206007E02550206009B0255020600BA0255020600D30255020600EC02550206000703550206002203550206003B03950106004F0355020600680355020600A50385030600C50385030A00EB031D0206000B042C0006001F042C00060038042C0006009004750406009E0475040600AC04C7000600B8042C000E00570738070E00EF07DC070E001708DC070600BF08DC070600E808D708060015092C001200380900000E006009DC070E009109DC070E00BE0938070600010A2C000600340A2C0006006F0A95010600850A95010600900A8503000000000100000000000100010001001000160000000500010001000B01100019000000090001000800030110006204000005000B00080006001A017800060020017B00060029017B00060033017E0006003E017B0006004E01810006005C018100060068017B00060071017B0006007901850001004C05CE040100F50578000100000678000600C101DA0406004006DA0406008500DA0406004D06DA0406003E01DA0406005E06DA0406002901DA0406006A06DA040600C901DA0406007906DA0406002001DA0406008906DA0406006801DA0406009706DA0406007101DA040600A506DA040600D401DE040600B206DE040600E701DE040600CA06DE040600F801E2040600E006E20406000302E2040600F006E20406000C02DA040600FE06DA04060014077B00060024077B0006006407E604060079077B0006008A077B0006009F077B000600B1077B000600C7077B000600F807EB0406000908F00406002508F40406003608F90406004108FE04D02000000000960078000A0001000C2100000000960085001300030018210000000096009100180003002421000000009100B6001D000300B029000000009600E60040000E002C2A00000000960006015F001B00582C000000008618140174002300F02100000000E101C404B5042300C82200000000E1011605C8042300D02200000000E1014305890123000C2900000000E1095905D1042300142900000000E101A705740023001C2900000000E101D205740023005C2900000000E1091506D104230064290000000086181401A600230083290000000081004C0874002400000001007E01000002008801000001009101020002001A01020003002001020004002901020005003301020006003E01020007004E01020008005C0102000900680102000A00710102000B00790100000100C101000002008500000003003E0100000400290100000500C90100000600200100000700680100000800710100000900D40100000A00E70100000B00F80100000C00030200000D000C0200000100C101000002008500000003003E0100000400290100000500C901000006002001000007007101000008004A0200000100F505040006000400210004000A000400850004008900610014017400690014017400710014019C00790014019C00810014019C00890014019C00910014019C00990014019C00A10014019C00A90014019C00B1001401A100B90014019C00C10014019C00C9001401A600D10014017400D90014017400210000048901E10014019C00210015048D01E9002704910119002C049701F1004404D801F1005404120221002C04160229002C041C0231002C0422023900140129020C000805BE0441000805C80409014305890114009B05D5040901CC0574001101ED05740009019B05D1043101140174003901EF080C05390101098D0119000004890119001504170541011C091705410121097B00410127091B0549013E092A05210114019C0021011401310521014E097400E1005409170521017809370551010805C8042901840917052901A3093D052901B10917056101C40943052901CC098D013100000489012901D6094C05310015044C055900E80951052901F20957056901070A17052901100A170529015409170529011B0A5B052901240A4C0571011401740009001401740049000004890141014A0A17054101520AB2052101590A9C0051000004890149001504B8052101640ABC05510015045B052101640AC60579011401DF05890114017400200083004D012E007B0087062E002B0009062E0033000F062E0073007E062E001B00E6052E002300F3052E0043002F062E003B0025062E004B0009062E005B0009062E006B007206400083009D0160008300DC0183006B020705A00083003402C0008300750500011B01070520011B01070560011B01070580011B010705C0011B010705E0011B0107052404130089002F02120560056F05D2050400010000005A08030500009808030502000B00030002000E000500040010003900040012003B00040014003D00040016003F0004001800410004001A00430004001C004500A804AE0404800000030003005300000001000000AB00E30300000200000000000000000000000100230000000000020000000000000000000000010044000000000002000000000000000000000001002C0000000000030003005300000000000000210533090000000003000200040002000000003C4D6F64756C653E0053514C232E4F532E646C6C004F53004576656E7444617461006D73636F726C69620053797374656D004F626A6563740056616C7565547970650053797374656D2E446174610053797374656D2E446174612E53716C54797065730053716C537472696E670053716C496E7433320047656E6572617465546F6E65004D616368696E654E616D6500557074696D650053716C496E7436340053716C4461746554696D650053716C4279746573004576656E744461746146696C6C526F770053797374656D2E436F6C6C656374696F6E730049456E756D657261626C65004576656E744C6F67526561640053716C496E7431360053716C42696E617279004576656E744C6F675772697465002E63746F7200496E6465780043617465676F727900456E7472795479706500496E7374616E6365496400536F75726365004461746554696D650054696D6547656E6572617465640054696D655772697474656E00557365724E616D65004D6573736167650044617461004672657175656E6379004475726174696F6E006F626A0053797374656D2E52756E74696D652E496E7465726F705365727669636573004F7574417474726962757465004C6F674E616D6500496E7374616E636549440054696D6547656E657261746564426567696E0054696D6547656E657261746564456E6400496E646578426567696E00496E646578456E640052656745784F7074696F6E734C697374004D6963726F736F66742E53716C5365727665722E5365727665720053716C46616365744174747269627574650042696E617279446174610053797374656D2E5265666C656374696F6E00417373656D626C795469746C6541747472696275746500417373656D626C794465736372697074696F6E41747472696275746500417373656D626C79436F6E66696775726174696F6E41747472696275746500417373656D626C79436F6D70616E7941747472696275746500417373656D626C7950726F6475637441747472696275746500417373656D626C79436F7079726967687441747472696275746500417373656D626C7954726164656D61726B41747472696275746500417373656D626C7943756C7475726541747472696275746500436F6D56697369626C6541747472696275746500417373656D626C7956657273696F6E41747472696275746500417373656D626C7946696C6556657273696F6E4174747269627574650053797374656D2E52756E74696D652E436F6D70696C6572536572766963657300436F6D70696C6174696F6E52656C61786174696F6E734174747269627574650052756E74696D65436F6D7061746962696C6974794174747269627574650053514C232E4F530053716C46756E6374696F6E417474726962757465006765745F49734E756C6C00457863657074696F6E006765745F56616C756500436F6E736F6C650042656570006F705F496D706C6963697400456E7669726F6E6D656E74006765745F4D616368696E654E616D65006765745F5469636B436F756E74003C4576656E744C6F67526561643E645F5F300053797374656D2E436F6C6C656374696F6E732E47656E657269630049456E756D657261626C6560310049456E756D657261746F7260310049456E756D657261746F720049446973706F7361626C650053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261626C653C53797374656D2E4F626A6563743E2E476574456E756D657261746F7200476574456E756D657261746F720053797374656D2E436F6C6C656374696F6E732E49456E756D657261626C652E476574456E756D657261746F72004D6F76654E657874003C3E325F5F63757272656E740053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261746F723C53797374656D2E4F626A6563743E2E6765745F43757272656E74006765745F43757272656E740053797374656D2E436F6C6C656374696F6E732E49456E756D657261746F722E52657365740052657365740053797374656D2E49446973706F7361626C652E446973706F736500446973706F7365003C3E315F5F7374617465003C3E6C5F5F696E697469616C54687265616449640053797374656D2E436F6C6C656374696F6E732E49456E756D657261746F722E6765745F43757272656E74003C3E335F5F4C6F674E616D65003C3E335F5F4D616368696E654E616D65003C3E335F5F536F75726365003C3E335F5F456E74727954797065003C3E335F5F496E7374616E63654944003C3E335F5F43617465676F7279003C3E335F5F557365724E616D65003C3E335F5F4D657373616765003C3E335F5F54696D6547656E657261746564426567696E003C3E335F5F54696D6547656E657261746564456E64003C3E335F5F496E646578426567696E003C3E335F5F496E646578456E64003C3E335F5F52656745784F7074696F6E734C697374003C5F5F4C6F674E616D653E355F5F31003C5F5F4D616368696E654E616D653E355F5F320053797374656D2E546578742E526567756C617245787072657373696F6E730052656765784F7074696F6E73003C5F5F52656745784F7074696F6E733E355F5F33003C5F5F43617465676F72793E355F5F34003C5F5F54656D7043617465676F72793E355F5F35003C5F5F456E747279547970653E355F5F36003C5F5F54656D70456E747279547970653E355F5F37003C5F5F54656D70557365724E616D653E355F5F380053797374656D2E446961676E6F7374696373004576656E744C6F67003C5F5F4576656E744C6F673E355F5F39003C5F5F4576656E743E355F5F61004576656E744C6F67456E747279003C5F5F4C6F67456E7472793E355F5F62003C3E375F5F7772617063003C3E375F5F7772617064003C3E6D5F5F46696E616C6C79650053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261746F723C53797374656D2E4F626A6563743E2E43757272656E740053797374656D2E436F6C6C656374696F6E732E49456E756D657261746F722E43757272656E7400446562756767657248696464656E4174747269627574650053797374656D2E546872656164696E6700546872656164006765745F43757272656E74546872656164006765745F4D616E61676564546872656164496400537472696E67005472696D00456D707479006F705F457175616C6974790053514C230052454745580047657452656745784F7074696F6E7300436C6F7365006765745F4D657373616765004576656E744C6F67456E747279436F6C6C656374696F6E006765745F456E7472696573006765745F43617465676F7279004576656E744C6F67456E74727954797065006765745F456E74727954797065006765745F557365724E616D650052656765780049734D61746368006765745F496E646578006765745F54696D6547656E65726174656400436F6D70617265546F006765745F496E7374616E6365496400496E74363400546F537472696E67006765745F536F75726365006765745F44617461006765745F54696D655772697474656E004E6F74537570706F72746564457863657074696F6E00546F4C6F77657200436F6E636174007365745F536F75726365005772697465456E747279005374727563744C61796F7574417474726962757465004C61796F75744B696E6400436F6D70696C657247656E657261746564417474726962757465000000554E0065006900740068006500720020004600720065007100750065006E006300790020006E006F00720020004400750072006100740069006F006E002000630061006E0020006200650020004E0055004C004C000001000B4500720072006F007200001B4600610069006C00750072006500200041007500640069007400001749006E0066006F0072006D006100740069006F006E00001B5300750063006300650073007300200041007500640069007400000F5700610072006E0069006E006700002F4C006F0067004E0061006D0065002000630061006E006E006F00740020006200650020004E0055004C004C00210000454C006F0067004E0061006D0065002000630061006E006E006F007400200062006500200061006E00200065006D00700074007900200073007400720069006E0067002100003345006E0074007200790054007900700065002000630061006E006E006F00740020006200650020004E0055004C004C002100004945006E0074007200790054007900700065002000630061006E006E006F007400200062006500200061006E00200065006D00700074007900200073007400720069006E0067002100000B6500720072006F007200001B6600610069006C00750072006500200061007500640069007400001769006E0066006F0072006D006100740069006F006E00001B7300750063006300650073007300200061007500640069007400000F7700610072006E0069006E006700002749006E00760061006C0069006400200045006E0074007200790054007900700065003A00200000000000B5A2E34A7D6BCA48B33F06F9936CF0070008B77A5C561934E089080002110D11111111040000110D040000111122000B011C10111110110D10110D10111510110D10111910111910110D10110D10121D1E000D1221110D110D110D110D110D110D110D110D1119111911111111110D140008110D110D110D110D110D11111125110D11290320000102060802060E02060A0306112D03061D0512010001005408074D617853697A65FFFFFFFF042001010E0420010102042001010880A0002400000480000094000000060200000024000052534131000400000100010033237E60D1AF2429EE4E6DABE42A2C8A8893EBD630506BA491C63FBFC5D6D0416C540D47A1244C1689482BC752CBAA4E0B95552751626957D1C0BD356D2C5E728A3EA0244C7AC9CC3D4CFB363802B0401245A79C4C7038E7E3901F3C727EC901AF72DAC23D4C6E2CAF8802EDDC1388C628430979DAC9AF0D307CD9527F1FDDC63B01000300540E044E616D650F4F535F47656E6572617465546F6E6554020F497344657465726D696E697374696301540209497350726563697365010320000203200008050002010808050001110D0E3A01000300540E044E616D650E4F535F4D616368696E654E616D6554020F497344657465726D696E697374696301540209497350726563697365010300000E3501000300540E044E616D65094F535F557074696D6554020F497344657465726D696E697374696300540209497350726563697365010300000805000111110805000111150A0600011119112D052001011D05040701110C827201000700540E044E616D650F4F535F4576656E744C6F675265616454020F497344657465726D696E697374696300540209497350726563697365015455794D6963726F736F66742E53716C5365727665722E5365727665722E446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038390A446174614163636573730000000054557F4D6963726F736F66742E53716C5365727665722E5365727665722E53797374656D446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C\
-747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038391053797374656D4461746141636365737300000000540E1146696C6C526F774D6574686F644E616D65104576656E744461746146696C6C526F77540E0F5461626C65446566696E6974696F6E80DC5B496E6465785D20494E542C2043617465676F7279204E5641524348415228353030292C20456E74727954797065204E56415243484152283530292C20496E7374616E6365496420424947494E542C205B536F757263655D204E5641524348415228353030292C2054696D6547656E657261746564204441544554494D452C2054696D655772697474656E204441544554494D452C20557365724E616D65204E5641524348415228313030292C205B4D6573736167655D204E56415243484152284D4158292C205B446174615D2056415242494E415259284D4158290515127D011C0615128081011C08200015128081011C0920001512808101130005200012808502061C0320001C04200013000306110D0306111903061111040611808D04061280910306110C0406128095040612808504061280890328001C040100000005000012809D04070112100320000E050002020E0E08F0A9879D7B87F04806000111808D0E052002010E0E0520001280A90520001180AD080003020E0E11808D042000112D05200108112D0320000A0420001D050E0707127102081180AD112D112D0A0507021271083C01000300540E044E616D65104F535F4576656E744C6F67577269746554020F497344657465726D696E697374696301540209497350726563697365010500020E0E0E03200006092004010E1180AD08060B2005010E1180AD08061D050C07050E1180AD12809112710E062001011180C10C01000753514C232E4F530000150100107777772E53514C73686172702E636F6D00000501000000001501001053716C205175616E74756D204C65617000000901000453514C2300004201003D436F7079726967687420C2A920323030362D323031342053716C205175616E74756D204C6561702E20416C6C205269676874732052657365727665642E00000B010006332E332E383300000801000800000000001E01000100540216577261704E6F6E457863657074696F6E5468726F7773010000904800000000000000000000AE480000002000000000000000000000000000000000000000000000A048000000000000000000000000000000005F436F72446C6C4D61696E006D73636F7265652E646C6C0000000000FF25002000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100100000001800008000000000000000000000000000000100010000003000008000000000000000000000000000000100000000004800000058600000780300000000000000000000780334000000560053005F00560045005200530049004F004E005F0049004E0046004F0000000000BD04EFFE00000100030003000000530003000300000053003F000000000000000400000002000000000000000000000000000000440000000100560061007200460069006C00650049006E0066006F00000000002400040000005400720061006E0073006C006100740069006F006E00000000000000B004D8020000010053007400720069006E006700460069006C00650049006E0066006F000000B402000001003000300030003000300034006200300000003C001100010043006F006D006D0065006E007400730000007700770077002E00530051004C00730068006100720070002E0063006F006D000000000044001100010043006F006D00700061006E0079004E0061006D00650000000000530071006C0020005100750061006E00740075006D0020004C0065006100700000000000380008000100460069006C0065004400650073006300720069007000740069006F006E0000000000530051004C0023002E004F0053000000300007000100460069006C006500560065007200730069006F006E000000000033002E0033002E00380033000000000038000C00010049006E007400650072006E0061006C004E0061006D0065000000530051004C0023002E004F0053002E0064006C006C000000A0003D0001004C006500670061006C0043006F007000790072006900670068007400000043006F0070007900720069006700680074002000A900200032003000300036002D0032003000310034002000530071006C0020005100750061006E00740075006D0020004C006500610070002E00200041006C006C0020005200690067006800740073002000520065007300650072007600650064002E000000000040000C0001004F0072006900670069006E0061006C00460069006C0065006E0061006D0065000000530051004C0023002E004F0053002E0064006C006C0000002C0005000100500072006F0064007500630074004E0061006D00650000000000530051004C00230000000000340007000100500072006F006400750063007400560065007200730069006F006E00000033002E0033002E0038003300000000003C000900010041007300730065006D0062006C0079002000560065007200730069006F006E00000033002E0033002E00380033002E00300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000C000000C03800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
- WITH PERMISSION_SET = SAFE;
- ');
- PRINT 'SQL#.OS Assembly Created.';
- END;
- ELSE
- BEGIN
- PRINT 'Skipping install of SQL#.OS Assembly.';
- END;
- PRINT '';
-
-
- IF (@InstallSQL#Twitterizer = 1)
- BEGIN
- PRINT 'Creating SQL#.Twitterizer Assembly ...';
- EXEC(N'
- CREATE ASSEMBLY [SQL#.Twitterizer]
- AUTHORIZATION [' + @SQLsharpLogin + N']
-FROM 0x4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000504500004C0103007E2168540000000000000000E00002210B010B0000D4010000080000000000009EF3010000200000000002000000001000200000000200000400000000000000040000000000000000400200000200004588020003004085000010000010000000001000001000000000000010000000000000000000000048F3010053000000000002001004000000000000000000000000000000000000002002000C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000080000000000000000000000082000004800000000000000000000002E74657874000000A4D301000020000000D4010000020000000000000000000000000000200000602E7273726300000010040000000002000006000000D60100000000000000000000000000400000402E72656C6F6300000C000000002002000002000000DC0100000000000000000000000000400000420000000000000000000000000000000080F30100000000004800000002000500BCDE00008C140100090000000000000000000000000000005020000080000000000000000000000000000000000000000000000000000000000000000000000015C2B3826ACED9FC93D68B3BF243BA88E6949027BD93D415FE8824B314F61B7B59FC302632D704A3C62C99C4B77DE83B047BB7F9AC36128EB8D558AF0F6286353FA46F49E8250EA158F6816A0F4D1837B44CA138F1B8EAEC65E4104586E99B062F82E99D48FAF40910B00948F2F9108CE56095751F77004C760BFF587D9000721E027B050000042A2202037D050000042A1E027B060000042A2202037D060000042A5602281200000A02032802000006020428040000062A1B300500550100000100001102281400000A2D02032A7E1500000A0A02281600000A6F1700000A0C38FA0000001202281800000A0B070D0945090000005F000000050000001D00000074000000350000004A000000890000009E000000B300000038C10000007201000070060207281900000A281A00000A0A38A9000000721D000070060207281900000A281A00000A0A3891000000723F000070060207281900000A281A00000A0A2B7C725B000070060207281900000A281A00000A0A2B677275000070060207281900000A281A00000A0A2B52728B000070060207281900000A281A00000A0A2B3D72A9000070060207281900000A281A00000A0A2B2872C9000070060207281900000A281A00000A0A2B1372F1000070060207281900000A281A00000A0A1202281B00000A3AFAFEFFFFDE0E1202FE160300001B6F1C00000ADC06281D00000A2C02032A720F010070030616176F1E00000A281A00000A2A000000411C0000020000001C0000000D010000290100000E00000000000000133004004200000002000011030B0717332E04750A0000012D0B721F010070731F00000A7A04A50A0000010A02031200726B010070282000000A282100000A2A0203046F2200000A282100000A2A1E02282300000A2A1E027B180000042A2202037D180000042A1E027B190000042A2202037D190000042A1E027B1A0000042A2202037D1A0000042A1E027B1B0000042A2202037D1B0000042A1E027B1C0000042A2202037D1C0000042A1E027B1D0000042A2202037D1D0000042A1E027B1E0000042A2202037D1E0000042A1E027B1F0000042A2202037D1F0000042A1E027B200000042A2202037D200000042A1E027B210000042A2202037D210000042A1E027B220000042A2202037D220000042A1E027B230000042A2202037D230000042A1E027B240000042A2202037D240000042A1E027B250000042A2202037D250000042A1E027B260000042A2202037D260000042A1E02282400000A2A1E027B270000042A2202037D270000042A1E027B280000042A2202037D280000042A1E027B290000042A2202037D290000042A1E027B2A0000042A2202037D2A0000042A1E027B2B0000042A2202037D2B0000042A1E027B2C0000042A2202037D2C0000042A1E027B2D0000042A2202037D2D0000042A1E027B2E0000042A2202037D2E0000042A1E027B2F0000042A2202037D2F0000042A1E027B300000042A2202037D300000042A1E027B310000042A2202037D310000042A1E027B320000042A2202037D320000042A1E027B330000042A2202037D330000042A1E027B340000042A2202037D340000042A1E027B350000042A2202037D350000042A1E027B360000042A2202037D360000042A1E027B370000042A2202037D370000042A1E027B380000042A2202037D380000042A1E027B390000042A2202037D390000042A1E027B3A0000042A2202037D3A0000042A1E027B3B0000042A2202037D3B0000042A1E027B3C0000042A2202037D3C0000042A1E02282400000A2A1E027B3D0000042A2202037D3D0000042A1E027B3E0000042A2202037D3E0000042A1E027B3F0000042A2202037D3F0000042A4A02282600000A036F2700000A74080000022A3A02282600000A03046F2800000A2A3602282600000A036F2900000A2A3602282600000A036F2A00000A2A3A02282600000A03046F2B00000A2A3602282600000A036F2C00000A2A3602282600000A036F2D00000A2A1E02282E00000A2A1E027B400000042A2202037D400000042A1E027B410000042A2202037D410000042A1E027B420000042A2202037D420000042A1E027B430000042A2202037D430000042A1E027B440000042A2202037D440000042A1E027B450000042A2202037D450000042A1E027B460000042A2202037D460000042A1E027B470000042A2202037D470000042A1E027B480000042A2202037D480000042A1E027B490000042A2202037D490000042A1E027B4A0000042A2202037D4A0000042A1E027B4B0000042A2202037D4B0000042A1E027B4C0000042A2202037D4C0000042A1E027B4D0000042A2202037D4D0000042A1E027B4E0000042A2202037D4E0000042A1E027B4F0000042A2202037D4F0000042A1E027B500000042A2202037D500000042A1E027B510000042A2202037D510000042A1E027B520000042A2202037D520000042A1E027B530000042A2202037D530000042A1E027B540000042A2202037D540000042A1E027B550000042A2202037D550000042A1E027B560000042A2202037D560000042A1E027B570000042A2202037D570000042A1E027B580000042A2202037D580000042A1E027B590000042A2202037D590000042A1E027B5A0000042A2202037D5A0000042A6E022865000006281D00000A2D070228650000062A0228670000062A1E02282400000A2A1E027B5B0000042A2202037D5B0000042A1E027B5C0000042A2202037D5C0000042A1E027B5D0000042A2202037D5D0000042A1E027B5E0000042A2202037D5E0000042A1E027B5F0000042A2202037D5F0000042A4A02282600000A036F2700000A740A0000022A3A02282600000A03046F2800000A2A3602282600000A036F2900000A2A3602282600000A036F2A00000A2A3A02282600000A03046F2B00000A2A3602282600000A036F2C00000A2A3602282600000A036F2D00000A2A1E02282E00000A2A9202282400000A02037D6000000402047D6100000402057D62000004020E047D630000042A0000001B300400C900000003000011731E0100060A73270000060B07027B600000046F0C00000607027B610000046F0E00000607027B620000046F1000000607027B630000046F12000006032C64036F2F00000A16315B07733000000A6F1A000006036F3100000A6F3200000A0D2B24096F3300000A742C0000010C076F190000060803086F3400000A742C0000016F3500000A096F3600000A2DD4DE1409752F000001130411042C0711046F1C00000ADC07726F0100706F1600000607196F0A000006060772990100706F200100060B076F1D0000062A0000000110000002005F00308F0014000000001B300400C900000003000011731E0100060A73270000060B07027B600000046F0C00000607027B610000046F0E00000607027B620000046F1000000607027B630000046F12000006032C64036F2F00000A16315B07733000000A6F1A000006036F3100000A6F3200000A0D2B24096F3300000A742C0000010C076F190000060803086F3400000A742C0000016F3500000A096F3600000A2DD4DE1409752F000001130411042C0711046F1C00000ADC0772A10100706F1600000607196F0A000006060772990100706F200100060B076F1D0000062A0000000110000002005F00308F001400000000133003009000000004000011731E0100060A73270000060B07027B600000046F0C00000607027B610000046F0E00000607027B620000046F1000000607027B630000046F120000060772D50100706F1600000607196F0A00000607733000000A6F1A000006076F190000067207020070036F3500000A076F19000006721F020070046F3500000A06076F1F0100060B076F1D000006166F5B0000062A133003008A00000004000011731E0100060A73270000060B07027B600000046F0C00000607027B610000046F0E00000607027B620000046F1000000607027B630000046F1200000607733000000A6F1A000006076F1900000672290200700F01283700000A6F3500000A07722F0200706F1600000607196F0A000006060772690200706F200100060B076F1D000006166F5B0000062A9202282400000A02037D6400000402047D6500000402057D66000004020E047D670000042A001B300400C900000003000011731E0100060A73270000060B032C64036F2F00000A16315B07733000000A6F1A000006036F3100000A6F3200000A0D2B24096F3300000A742C0000010C076F190000060803086F3400000A742C0000016F3500000A096F3600000A2DD4DE1409752F000001130411042C0711046F1C00000ADC07027B640000046F0C00000607027B650000046F0E00000607027B660000046F1000000607027B670000046F120000060772730200706F1600000607166F0A000006060772990100706F200100060B076F1D0000062A0000000110000002002F00305F0014000000001B300400C900000003000011731E0100060A73270000060B07027B640000046F0C00000607027B650000046F0E00000607027B660000046F1000000607027B670000046F12000006032C64036F2F00000A16315B07733000000A6F1A000006036F3100000A6F3200000A0D2B24096F3300000A742C0000010C076F190000060803086F3400000A742C0000016F3500000A096F3600000A2DD4DE1409752F000001130411042C0711046F1C00000ADC0772AB0200706F1600000607166F0A000006060772990100706F200100060B076F1D0000062A0000000110000002005F00308F0014000000001B300400C900000003000011731E0100060A73270000060B07027B640000046F0C00000607027B650000046F0E00000607027B660000046F1000000607027B670000046F12000006032C64036F2F00000A16315B07733000000A6F1A000006036F3100000A6F3200000A0D2B24096F3300000A742C0000010C076F190000060803086F3400000A742C0000016F3500000A096F3600000A2DD4DE1409752F000001130411042C0711046F1C00000ADC0772E30200706F1600000607166F0A000006060772990100706F200100060B076F1D0000062A0000000110000002005F00308F00140000000013300300F100000004000011731E0100060A73270000060B07027B640000046F0C00000607027B650000046F0E00000607027B660000046F1000000607027B670000046F120000060772230300706F1600000607166F0A00000607733000000A6F1A000006076F19000006724D030070036F3500000A0F02283800000A2C1D076F19000006725B0300700F02FE160500001B6F2200000A6F3500000A0F03283900000A2C430F04283900000A2C3A076F1900000672870300700F03FE160600001B6F2200000A6F3500000A076F19000006728F0300700F04FE160600001B6F2200000A6F3500000A06076F1F0100060B076F1D000006166F5B0000062A000000133003007400000004000011731E0100060A73270000060B07027B640000046F0C00000607027B650000046F0E00000607027B660000046F1000000607027B670000046F120000060772990300700F01283700000A283A00000A6F1600000607166F0A000006060772690200706F200100060B076F1D000006166F5B0000062A133003008A00000004000011731E0100060A73270000060B07027B640000046F0C00000607027B650000046F0E00000607027B660000046F1000000607027B670000046F1200000607733000000A6F1A000006076F1900000672290200700F01283700000A6F3500000A0772CD0300706F1600000607166F0A000006060772990100706F200100060B076F1D000006166F5B0000062A00001B300400C900000003000011731E0100060A73270000060B07027B640000046F0C00000607027B650000046F0E00000607027B660000046F1000000607027B670000046F12000006032C64036F2F00000A16315B07733000000A6F1A000006036F3100000A6F3200000A0D2B24096F3300000A742C0000010C076F190000060803086F3400000A742C0000016F3500000A096F3600000A2DD4DE1409752F000001130411042C0711046F1C00000ADC0772F30300706F1600000607166F0A000006060772990100706F200100060B076F1D0000062A0000000110000002005F00308F001400000000133003008A00000004000011731E0100060A73270000060B07027B640000046F0C00000607027B650000046F0E00000607027B660000046F1000000607027B670000046F1200000607733000000A6F1A000006076F1900000672290200700F01283700000A6F3500000A07721B0400706F1600000607166F0A000006060772690200706F200100060B076F1D000006166F5B0000062A0000133003008A00000004000011731E0100060A73270000060B07027B640000046F0C00000607027B650000046F0E00000607027B660000046F1000000607027B670000046F1200000607733000000A6F1A000006076F1900000672290200700F01283700000A6F3500000A0772470400706F1600000607166F0A000006060772690200706F200100060B076F1D000006166F5B0000062A00001B300400C900000003000011731E0100060A73270000060B07027B640000046F0C00000607027B650000046F0E00000607027B660000046F1000000607027B670000046F12000006032C64036F2F00000A16315B07733000000A6F1A000006036F3100000A6F3200000A0D2B24096F3300000A742C0000010C076F190000060803086F3400000A742C0000016F3500000A096F3600000A2DD4DE1409752F000001130411042C0711046F1C00000ADC0772750400706F1600000607166F0A000006060772990100706F200100060B076F1D0000062A0000000110000002005F00308F0014000000001B300400D900000003000011731E0100060A73270000060B07027B640000046F0C00000607027B650000046F0E00000607027B660000046F1000000607027B670000046F12000006042C64046F2F00000A16315B07733000000A6F1A000006046F3100000A6F3200000A0D2B24096F3300000A742C0000010C076F190000060804086F3400000A742C0000016F3500000A096F3600000A2DD4DE1409752F000001130411042C0711046F1C00000ADC0772AF040070038C3500000172D5040070283B00000A6F1600000607166F0A000006060772990100706F200100060B076F1D0000062A0000000110000002005F00308F001400000000133004007800000004000011731E0100060A73270000060B07027B640000046F0C00000607027B650000046F0E00000607027B660000046F1000000607027B670000046F120000060772E1040070038C3500000172D5040070283B00000A6F1600000607166F0A000006060772690200706F200100060B076F1D000006166F5B0000062A9202282400000A02037D6800000402047D6900000402057D6A000004020E047D6B0000042A000000133003008900000004000011731E0100060A73270000060B07027B680000046F0C00000607027B690000046F0E00000607027B6A0000046F1000000607027B6B0000046F1200000607733000000A6F1A000006076F190000067205050070036F2200000A6F3500000A0772150500706F1600000607176F0A000006060772990100706F200100060B076F1F000006166FA50000062A000000133004007200000004000011731E0100060A73270000060B07027B680000046F0C00000607027B690000046F0E00000607027B6A0000046F1000000607027B6B0000046F120000060772AF040070038C3500000172D5040070283B00000A6F16000006071A6F0A000006060772990100706F200100060B076F1F0000062A0000133003006200000004000011731E0100060A73270000060B07027B680000046F0C00000607027B690000046F0E00000607027B6A0000046F1000000607027B6B0000046F120000060772350500706F1600000607186F0A000006060772990100706F200100060B076F1F0000062A0000133003006200000004000011731E0100060A73270000060B07027B680000046F0C00000607027B690000046F0E00000607027B6A0000046F1000000607027B6B0000046F1200000607725D0500706F1600000607186F0A000006060772990100706F200100060B076F1F0000062A0000133003007E00000004000011731E0100060A73270000060B07027B680000046F0C00000607027B690000046F0E00000607027B6A0000046F1000000607027B6B0000046F1200000607733000000A6F1A000006076F190000067207020070036F670000066F3500000A0772810500706F1600000607176F0A00000606076F1F0100060B076F1F0000062A0000133003007900000004000011731E0100060A73270000060B07027B680000046F0C00000607027B690000046F0E00000607027B6A0000046F1000000607027B6B0000046F1200000607733000000A6F1A000006076F190000067207020070036F3500000A0772B10500706F1600000607176F0A00000606076F1F0100060B076F1F0000062A000000133003007F00000004000011731E0100060A73270000060B07027B680000046F0C00000607027B690000046F0E00000607027B6A0000046F1000000607027B6B0000046F1200000607733000000A6F1A000006076F1900000672050500700F01283700000A6F3500000A0772B10500706F1600000607176F0A00000606076F1F0100060B076F1F0000062A00133003006200000004000011731E0100060A73270000060B07027B680000046F0C00000607027B690000046F0E00000607027B6A0000046F1000000607027B6B0000046F120000060772E30500706F1600000607186F0A000006060772990100706F200100060B076F1F0000062A0000133003007900000004000011731E0100060A73270000060B07027B680000046F0C00000607027B690000046F0E00000607027B6A0000046F1000000607027B6B0000046F1200000607733000000A6F1A000006076F190000067207020070036F3500000A0772050600706F1600000607176F0A00000606076F1F0100060B076F1F0000062A000000133003007900000004000011731E0100060A73270000060B07027B680000046F0C00000607027B690000046F0E00000607027B6A0000046F1000000607027B6B0000046F1200000607733000000A6F1A000006076F190000067207020070036F3500000A07722B0600706F1600000607176F0A00000606076F1F0100060B076F1F0000062A000000133003007900000004000011731E0100060A73270000060B07027B680000046F0C00000607027B690000046F0E00000607027B6A0000046F1000000607027B6B0000046F1200000607733000000A6F1A000006076F190000067207020070036F3500000A0772530600706F1600000607176F0A00000606076F1F0100060B076F1F0000062A000000133003007F00000004000011731E0100060A73270000060B07027B680000046F0C00000607027B690000046F0E00000607027B6A0000046F1000000607027B6B0000046F1200000607733000000A6F1A000006076F1900000672050500700F01283700000A6F3500000A0772530600706F1600000607176F0A00000606076F1F0100060B076F1F0000062A00133003007900000004000011731E0100060A73270000060B07027B680000046F0C00000607027B690000046F0E00000607027B6A0000046F1000000607027B6B0000046F1200000607733000000A6F1A000006076F190000067207020070036F3500000A0772830600706F1600000607176F0A00000606076F1F0100060B076F1F0000062A000000133003007F00000004000011731E0100060A73270000060B07027B680000046F0C00000607027B690000046F0E00000607027B6A0000046F1000000607027B6B0000046F1200000607733000000A6F1A000006076F1900000672050500700F01283700000A6F3500000A0772830600706F1600000607176F0A00000606076F1F0100060B076F1F0000062A00133003006200000004000011731E0100060A73270000060B07027B680000046F0C00000607027B690000046F0E00000607027B6A0000046F1000000607027B6B0000046F120000060772B50600706F1600000607186F0A000006060772990100706F200100060B076F1F0000062A1E027B6C0000042A2202037D6C0000042A1E027B6D0000042A2202037D6D0000042A1E027B6E0000042A2202037D6E0000042A1E027B6F0000042A2202037D6F0000042A1E027B700000042A2202037D700000042A1E02282400000A2A1E027B710000042A2202037D710000042A1E027B720000042A2202037D720000042A1E027B730000042A2202037D730000042A1E027B740000042A2202037D740000042A1E02282400000A2A3602037E1500000A28E40000062A0000001B300700E50000000500001102281D00000A2C0B72E1060070733C00000A7A03281D00000A2C0B72F9060070733C00000A7A73D90000060A733000000A0B04281D00000A2D0C077217070070046F3500000A72350700700772690200700203141428E90000060C086F3D00000A733E00000A6F3F00000A0D09728D070070284000000A13040611046F4100000A72520800706F4200000A6F4300000A6FD00000060611046F4100000A725E0800706F4200000A6F4300000A6FD20000060611046F4100000A726C0800706F4200000A6F4300000A6FD8000006DE14130511056F4400000A7327000006731B0100067A062A000000011000000000460089CF0014080000011B3007002E0100000600001102281D00000A2C0B72E1060070733C00000A7A03281D00000A2C0B72F9060070733C00000A7A04281D00000A2C0B727E080070733C00000A7A73D90000060A733000000A0B05281D00000A2D0C077298080070056F3500000A72B60800700772690200700203047E1500000A28E90000060C086F3D00000A733E00000A6F3F00000A0D0609720C090070284000000A6F4100000A176F4500000A6F4300000A6FD000000606097234090070284000000A6F4100000A176F4500000A6F4300000A6FD20000060609726A090070284000000A6F4100000A176F4500000A6F4300000A284600000A284700000A284800000A6FD40000060609728A090070284000000A6F4100000A176F4500000A6F4300000A6FD6000006DE14130411046F4400000A7327000006731B0100067A062A00000110000000003F00D91801140800000113300300A20000000700001102281D00000A2C067E1500000A2A02284900000A100014FE06EA000006734A00000A0A0272B209007006284B00000A10000272DA09007072DE0900706F4C00000A72E609007072EA0900706F4C00000A72F209007072F60900706F4C00000A72FE09007072020A00706F4C00000A720A0A0070720E0A00706F4C00000A72160A0070721A0A00706F4C00000A10000272220A0070722A0A00706F4C00000A1000022A22021628E80000062A00133003004100000008000011722E0A0070734D00000A0A032C0E0672640A00706F4E00000A262B0C06727E0A00706F4E00000A260672920A0070026F4F00000A26066F2200000A735000000A2A0000001B3006006402000009000011733000000A0A032C3F036F5100000A13082B1C1208285200000A0B061201285300000A1201285400000A6F3500000A1208285500000A2DDBDE0E1208FE160700001B6F1C00000ADC0672B40A007072D00A00706F3500000A0672D80A007028EE0000066F3500000A0672F00A007028ED0000066F3500000A0672100B0070723E0B00706F3500000A0672520B0070056F3500000A0672780B00700E046F3500000A0E05281D00000A2D0D0672A40B00700E056F3500000A0E06281D00000A2D0D0672BC0B00700E066F3500000A02735000000A06040E040E0628EF000006735600000A0C081F4072E20B00706F5700000A081F4072120C00706F5700000A081F40724A0C00706F5700000A086F5800000A047269020070285900000A39A6000000735A00000A1304066F5100000A13092B661209285200000A13051205285300000A72880C00706F5B00000A2C131205285300000A7298080070285900000A2C3711046F5C00000A16310D110472960C00706F4E00000A261104729A0C00701205285300000A1205285400000A28E60000066F5D00000A261209285500000A2D91DE0E1209FE160700001B6F1C00000ADC0272AA0C007011046F2200000A285E00000A10002B200628EB00000613061106281D00000A2D0F0272AA0C00701106285E00000A100002285F00000A744900000113071107046F6000000A1107286100000A72AE0C0070178D04000001130A110A1628F5000006A2110A286200000A6F6300000A11076F6400000A72C80C00700628EC0000066F6500000A047269020070285900000A2C0C110772E40C00706F6600000A11076F6700000A740E0000010D092A011C000002001100293A000E000000000200300173A3010E0000000032026F4300000A6F6800000A2A0000001B300400850000000A000011735A00000A0A02736900000A0B076F6A00000A0D2B4F1203286B00000A0C1202285300000A72880C00706F5B00000A2D34066F5C00000A16310C0672960C00706F4E00000A2606729A0C00701202285300000A1202285400000A28E60000066F5D00000A261203286C00000A2DA8DE0E1203FE160A00001B6F1C00000ADC066F2200000A2A00000001100000020014005C70000E000000001B300400E70000000B00001172280D0070734D00000A0A02736900000A0B076F6A00000A130438870000001204286B00000A0C1202285300000A72880C00706F6D00000A2C6C1202285300000A725C0D00701B6F6E00000A2D581202285300000A726C0D0070286F00000A2C451202285300000A7298080070286F00000A2C321202285400000A281D00000A2D2406728C\
-0D00701202285300000A28E60000061202285400000A28E60000066F5D00000A261204286C00000A3A6DFFFFFFDE0E1204FE160A00001B6F1C00000ADC0672A20D007002726C0D00706F7000000A28E60000066F4F00000A26066F2200000A0D092A000110000002001A009AB4000E00000000133008003F0000000C000011287100000A20B2070000171716161616737200000A287300000A0A1200287400000A8C51000001284600000A287500000A0B1201284600000A287600000A2A0013300300270000000D000011737700000A2008E2010020FFFFFF7F6F7800000A0A120072D00D0070286100000A287900000A2A001B3006003F0100000E0000110228F00000060A733000000A0B03736900000A0C086F6A00000A13082B581208286B00000A0D1203285300000A725C0D00701B6F6E00000A2C281203285300000A72880C00701B6F7A00000A2C141203285300000A72D40D00701B6F6E00000A2C14071203285300000A1203285400000A6F3500000A1208286C00000A2D9FDE0E1208FE160A00001B6F1C00000ADC286100000A72E80D0070198D04000001130911091604286100000A6F7B00000AA21109170628E6000006A21109180728F1000006A21109286200000A1304737C00000A1305286100000A72000E0070188D04000001130A110A160528E6000006A2110A170E0428E6000006A2110A286200000A13061105287D00000A11066F7E00000A6F7F00000A1105287D00000A11046F7E00000A6F8000000A288100000A130703726C0D007011076F3500000A2A000110000002001C006581000E00000000133005008B0000000F000011286100000A72100E0070188D040000010B0716026F8200000AA20717026F8300000AA207286200000A0A026F8200000A72240E0070285900000A2C0A026F8400000A1F502E36026F8200000A722E0E0070285900000A2C0D026F8400000A20BB0100002E1706723A0E0070026F8400000A8C54000001283B00000A0A06026F8500000A288600000A0A062A001B3006009800000010000011735A00000A0A02736900000A0B076F6A00000A0D2B5D1203286B00000A0C066F5C00000A16310C0672960C00706F4E00000A2606286100000A729A0C0070188D0400000113041104161202285300000A28E6000006A21104171202285400000A28E6000006A21104286200000A6F4E00000A261203286C00000A2D9ADE0E1203FE160A00001B6F1C00000ADC066F2200000A28E60000062A01100000020014006A7E000E000000001B300700590100000600001102281D00000A2C0B72E1060070733C00000A7A03281D00000A2C0B72F9060070733C00000A7A04281D00000A2C0B723E0E0070733C00000A7A05281D00000A2C0B72500E0070733C00000A7A73D90000060A733000000A0B0772620E0070046F3500000A0772820E0070056F3500000A0772A20E007072BA0E00706F3500000A72B608007007726902007002037E1500000A7E1500000A28E90000060C086F3D00000A733E00000A6F3F00000A0D0609720C090070284000000A6F4100000A176F4500000A6F4300000A6FD000000606097234090070284000000A6F4100000A176F4500000A6F4300000A6FD20000060609726A090070284000000A6F4100000A176F4500000A6F4300000A284600000A284700000A284800000A6FD40000060609728A090070284000000A6F4100000A176F4500000A6F4300000A6FD6000006DE14130411046F4400000A7327000006731B0100067A062A0000000110000000008000C343011408000001033001004C00000000000000288800000A6F8900000A6F8A00000A6F8B00000A8076000004288800000A6F8900000A6F8A00000A6F8C00000A8077000004288800000A6F8900000A6F8A00000A6F8D00000A80780000042ADE02282400000A020304050E0473AD0000067D79000004020304050E0473BF0000067D7B000004020304050E0473B20000067D7A0000042A133003004E000000110000111B8D2C0000010A06167E760000040B1201288E00000AA2061772D20E0070A206187E770000040C1202288E00000AA2061972D20E0070A2061A7E780000040D1203288E00000AA206288F00000A2A00001330050052010000120000110F00289100000A2D180F00289200000A6F9300000A7E1500000A285900000A2C0B72D60E0070739400000A7A0F01289100000A2D180F01289200000A6F9300000A7E1500000A285900000A2C0B72340F0070739400000A7A0F02289100000A2D180F02289200000A6F9300000A7E1500000A285900000A2C0B72980F0070739400000A7A0F03289100000A2D180F03289200000A6F9300000A7E1500000A285900000A2C0B72F60F0070739400000A7A0F00289200000A0F01289200000A0F02289200000A0F03289200000A73F40000060B1202FE150500001B1203FE150600001B1204FE150600001B0F05289500000A2D0E12020F05289600000A289700000A0F06289800000A2D0E12030F06289900000A289A00000A0F07289800000A2D0E12040F07289900000A289A00000A077B7A0000040F04289200000A080911046FB60000060A066F2A000006289B00000A2A00001330040004010000130000110F00289100000A2D180F00289200000A6F9300000A7E1500000A285900000A2C0B72D60E0070739400000A7A0F01289100000A2D180F01289200000A6F9300000A7E1500000A285900000A2C0B72340F0070739400000A7A0F02289100000A2D180F02289200000A6F9300000A7E1500000A285900000A2C0B72980F0070739400000A7A0F03289100000A2D180F03289200000A6F9300000A7E1500000A285900000A2C0B72F60F0070739400000A7A0F04289500000A2C0B7260100070739400000A7A0F00289200000A0F01289200000A0F02289200000A0F03289200000A73F40000060A067B7A0000040F04289600000A6FB7000006267292100070289C00000A2A1330040024010000140000110F00289100000A2D180F00289200000A6F9300000A7E1500000A285900000A2C0B72D60E0070739400000A7A0F01289100000A2D180F01289200000A6F9300000A7E1500000A285900000A2C0B72340F0070739400000A7A0F02289100000A2D180F02289200000A6F9300000A7E1500000A285900000A2C0B72980F0070739400000A7A0F03289100000A2D180F03289200000A6F9300000A7E1500000A285900000A2C0B72F60F0070739400000A7A0F05289100000A2D180F05289200000A6F9300000A7E1500000A285900000A2C0B7294100070739400000A7A0F00289200000A0F01289200000A0F02289200000A0F03289200000A73F40000060B077B790000040F05289200000A0F04289200000A6FB00000060A066F2A000006289B00000A2A1330040004010000130000110F00289100000A2D180F00289200000A6F9300000A7E1500000A285900000A2C0B72D60E0070739400000A7A0F01289100000A2D180F01289200000A6F9300000A7E1500000A285900000A2C0B72340F0070739400000A7A0F02289100000A2D180F02289200000A6F9300000A7E1500000A285900000A2C0B72980F0070739400000A7A0F03289100000A2D180F03289200000A6F9300000A7E1500000A285900000A2C0B72F60F0070739400000A7A0F04289500000A2C0B7260100070739400000A7A0F00289200000A0F01289200000A0F02289200000A0F03289200000A73F40000060A067B790000040F04289600000A6FB1000006267292100070289C00000A2A13300400680200001500001102A5160000020A0312007B7C000004289B00000A81100000010412007B7D000004289D00000A81130000010512007B7E000004289B00000A81100000010E0412007B7F000004289B00000A81100000010E0512007B80000004289E00000A81140000010E0612007B81000004289E00000A81140000010E0712007B82000004289C00000A81110000010E0812007B83000004289C00000A81110000010E0912007B84000004289B00000A81100000010E0A12007B85000004289C00000A81110000010E0B12007B86000004289C00000A81110000010E0C12007B87000004289C00000A81110000010E0D12007B88000004289B00000A81100000010E0E12007B89000004289C00000A81110000010E0F12007B8A000004289C00000A81110000010E1012007B8B000004289C00000A81110000010E1112007B8C000004289C00000A81110000010E1212007B8D000004289C00000A81110000010E1312007B8E000004289C00000A811100000112007C8F000004283900000A2C1B0E1412007C8F000004289F00000A6C28A000000A81120000012B0C0E147EA100000A811200000112007C90000004283900000A2C1B0E1512007C90000004289F00000A6C28A000000A81120000012B0C0E157EA100000A811200000112007B9100000415330E0E167EA200000A81150000012B130E1612007B9100000428A300000A811500000112007B9200000415330E0E177EA200000A81150000012B130E1712007B9200000428A300000A811500000112007B93000004206C070000171773A400000A28A500000A2C0D0E187EA600000A81130000012A0E1812007B93000004289D00000A81130000012A13300200780000001600001128AB00000A6FAC00000A027BB50000043315027BB40000041FFE330B02167DB4000004020A2B0716733A0100060A06027BB70000047DB600000406027BB90000047DB800000406027BBB0000047DBA00000406027BBD0000047DBC00000406027BBF0000047DBE00000406027BC10000047DC0000004062A1E0228330100062A1B3005001705000017000011027BB40000040B07450300000005000000F1040000D404000038EC04000002157DB400000402147DC300000402027BB6000004027BB8000004027BBA000004027BBC00000473F40000067DC4000004027BBE000004250C397B010000FE137EC80000042D611D73AD00000A2572EE1000701628AE00000A2572141100701728AE00000A2572321100701828AE00000A25724C1100701928AE00000A25725E1100701A28AE00000A2572721100701B28AE00000A25728C1100701C28AE00000AFE1380C8000004FE137EC800000408120328AF00000A39FD0000000945070000000500000026000000470000006500000083000000A1000000BF00000038D600000002027BC40000047B79000004027BC00000046FAF0000067DC300000438B500000002027BC40000047B79000004027BC00000046FAE0000067DC3000004389400000002027BC40000047B7A000004027BC00000046FB30000067DC30000042B7602027BC40000047B7A000004027BC00000046FB50000067DC30000042B5802027BC40000047B7A000004027BC00000046FB90000067DC30000042B3A02027BC40000047B7A000004027BC00000046FB40000067DC30000042B1C02027BC40000047B7A000004027BC00000046FBC0000067DC300000402027BC30000046FB000000A7DC600000402177DB4000004380003000002027BC60000046F3300000A74080000027DC5000004027CC2000004FE1516000002027CC2000004027BC50000046F2A0000067D7C000004027CC2000004027BC50000046F280000067D7D000004027CC2000004027BC50000046F360000067D7E000004027CC2000004027BC50000046F380000067D7F000004027CC2000004027BC50000046F340000067D80000004027CC2000004027BC50000046F320000067D81000004027CC2000004027BC50000046F2E0000067D82000004027CC2000004027BC50000046F2C0000067D83000004027CC2000004027BC50000046F300000067D84000004027CC2000004027BC50000046F3A0000066F670000067D86000004027CC2000004027BC50000046F3A0000066F650000067D87000004027CC2000004027BC50000046F3A0000066F630000067D88000004027CC2000004027BC50000046F3A0000066F870000067D85000004027CC2000004027BC50000046F3A0000066F690000067D89000004027CC2000004027BC50000046F400000067D8A000004027CC2000004027BC50000046F420000067D8B000004027CC2000004027BC50000046F440000067D8C000004027CC2000004027BC50000046F460000067D8D000004027CC2000004027BC50000046F480000067D8E000004027CC2000004027BC50000046F4A0000067D8F000004027CC2000004027BC50000046F4C0000067D90000004027BC50000046F4E0000061304120428B100000A2D0E027CC2000004157D910000042B1F027CC2000004027BC50000046F4E0000061305120528B200000A7D91000004027BC50000046F500000061306120628B100000A2D0E027CC2000004157D920000042B1F027CC2000004027BC50000046F500000061307120728B200000A7D92000004027BC50000046F520000061308120828B300000A2D19027CC2000004206C070000171773A400000A7D930000042B1F027CC2000004027BC50000046F520000061309120928B400000A7D9300000402027BC20000048C160000027DB300000402187DB4000004170ADE2802177DB4000004027BC60000046F3600000A3AF0FCFFFF02283B010006160ADE07022838010006DC062A00411C000004000000000000000E0500000E05000007000000000000001E027BB30000042A1A73B500000A7A001B300200220000000D000011027BB40000040A061759450200000001000000010000002ADE0702283B010006DC2A00000110000002001800021A0007000000001E027BB30000042A7A02282400000A02037DB40000040228AB00000A6FAC00000A7DB50000042AB202157DB400000402027BC6000004752F0000017DC7000004027BC70000042C0B027BC70000046F1C00000A2A1330020036000000160000111FFE733A0100060A06027DB700000406037DB900000406047DBB00000406057DBD000004060E047DBF000004060E057DC1000004062A000003300600DE000000000000000F00289100000A2D180F00289200000A6F9300000A7E1500000A285900000A2C0B72D60E0070739400000A7A0F01289100000A2D180F01289200000A6F9300000A7E1500000A285900000A2C0B72340F0070739400000A7A0F02289100000A2D180F02289200000A6F9300000A7E1500000A285900000A2C0B72980F0070739400000A7A0F03289100000A2D180F03289200000A6F9300000A7E1500000A285900000A2C0B72F60F0070739400000A7A0F00289200000A0F01289200000A0F02289200000A0F03289200000A72EE1000700F0428B600000A28FB0000062A000003300600DE000000000000000F00289100000A2D180F00289200000A6F9300000A7E1500000A285900000A2C0B72D60E0070739400000A7A0F01289100000A2D180F01289200000A6F9300000A7E1500000A285900000A2C0B72340F0070739400000A7A0F02289100000A2D180F02289200000A6F9300000A7E1500000A285900000A2C0B72980F0070739400000A7A0F03289100000A2D180F03289200000A6F9300000A7E1500000A285900000A2C0B72F60F0070739400000A7A0F00289200000A0F01289200000A0F02289200000A0F03289200000A72141100700F0428B600000A28FB0000062A000003300600DE000000000000000F00289100000A2D180F00289200000A6F9300000A7E1500000A285900000A2C0B72D60E0070739400000A7A0F01289100000A2D180F01289200000A6F9300000A7E1500000A285900000A2C0B72340F0070739400000A7A0F02289100000A2D180F02289200000A6F9300000A7E1500000A285900000A2C0B72980F0070739400000A7A0F03289100000A2D180F03289200000A6F9300000A7E1500000A285900000A2C0B72F60F0070739400000A7A0F00289200000A0F01289200000A0F02289200000A0F03289200000A72321100700F0428B600000A28FB0000062A000003300600DE000000000000000F00289100000A2D180F00289200000A6F9300000A7E1500000A285900000A2C0B72D60E0070739400000A7A0F01289100000A2D180F01289200000A6F9300000A7E1500000A285900000A2C0B72340F0070739400000A7A0F02289100000A2D180F02289200000A6F9300000A7E1500000A285900000A2C0B72980F0070739400000A7A0F03289100000A2D180F03289200000A6F9300000A7E1500000A285900000A2C0B72F60F0070739400000A7A0F00289200000A0F01289200000A0F02289200000A0F03289200000A724C1100700F0428B600000A28FB0000062A000003300600DE000000000000000F00289100000A2D180F00289200000A6F9300000A7E1500000A285900000A2C0B72D60E0070739400000A7A0F01289100000A2D180F01289200000A6F9300000A7E1500000A285900000A2C0B72340F0070739400000A7A0F02289100000A2D180F02289200000A6F9300000A7E1500000A285900000A2C0B72980F0070739400000A7A0F03289100000A2D180F03289200000A6F9300000A7E1500000A285900000A2C0B72F60F0070739400000A7A0F00289200000A0F01289200000A0F02289200000A0F03289200000A725E1100700F0428B600000A28FB0000062A000003300600DE000000000000000F00289100000A2D180F00289200000A6F9300000A7E1500000A285900000A2C0B72D60E0070739400000A7A0F01289100000A2D180F01289200000A6F9300000A7E1500000A285900000A2C0B72340F0070739400000A7A0F02289100000A2D180F02289200000A6F9300000A7E1500000A285900000A2C0B72980F0070739400000A7A0F03289100000A2D180F03289200000A6F9300000A7E1500000A285900000A2C0B72F60F0070739400000A7A0F00289200000A0F01289200000A0F02289200000A0F03289200000A72721100700F0428B600000A28FB0000062A000003300600DE000000000000000F00289100000A2D180F00289200000A6F9300000A7E1500000A285900000A2C0B72D60E0070739400000A7A0F01289100000A2D180F01289200000A6F9300000A7E1500000A285900000A2C0B72340F0070739400000A7A0F02289100000A2D180F02289200000A6F9300000A7E1500000A285900000A2C0B72980F0070739400000A7A0F03289100000A2D180F03289200000A6F9300000A7E1500000A285900000A2C0B72F60F0070739400000A7A0F00289200000A0F01289200000A0F02289200000A0F03289200000A728C1100700F0428B600000A28FB0000062A000013300200780000001800001128AB00000A6FAC00000A027BCB0000043315027BCA0000041FFE330B02167DCA000004020A2B071673430100060A06027BCD0000047DCC00000406027BCF0000047DCE00000406027BD10000047DD000000406027BD30000047DD200000406027BD50000047DD400000406027BD70000047DD6000004062A1E02283C0100062A1B3005009D04000019000011027BCA0000040B07450300000005000000770400005A040000387204000002157DCA000004027CCC000004289100000A2D1C027CCC000004289200000A6F9300000A7E1500000A285900000A2C0B72D60E0070739400000A7A027CCE000004289100000A2D1C027CCE000004289200000A6F9300000A7E1500000A285900000A2C0B72340F0070739400000A7A027CD0000004289100000A2D1C027CD0000004289200000A6F9300000A7E1500000A285900000A2C0B72980F0070739400000A7A027CD2000004289100000A2D1C027CD2000004289200000A6F9300000A7E1500000A285900000A2C0B72F60F0070739400000A7A02147DD900000402027CCC000004289200000A027CCE000004289200000A027CD0000004289200000A027CD2000004289200000A73F40000067DDA00000402027BDA0000047B7A000004027CD4000004289600000A027CD600000428B600000A6FBD0000067DD900000402027BD90000046FB000000A7DDC00000402177DCA00000438FE02000002027BDC0000046F3300000A74080000027DDB000004027CD8000004FE1516000002027CD8000004027BDB0000046F2A0000067D7C000004027CD8000004027BDB0000046F280000067D7D000004027CD8000004027BDB0000046F360000067D7E000004027CD8000004027BDB0000046F380000067D7F000004027CD8000004027BDB0000046F340000067D80000004027CD8000004027BDB0000046F320000067D81000004027CD8000004027BDB0000046F2E0000067D82000004027CD8000004027BDB0000046F2C0000067D83000004027CD8000004027BDB0000046F300000067D84000004027CD8000004027BDB0000046F3A0000066F670000067D86000004027CD8000004027BDB0000046F3A0000066F650000067D87000004027CD8000004027BDB0000046F3A0000066F630000067D88000004027CD8000004027BDB0000046F3A0000066F870000067D85000004027CD8000004027BDB0000046F3A0000066F690000067D89000004027CD8000004027BDB0000046F400000067D8A000004027CD8000004027BDB0000046F420000067D8B000004027CD8000004027BDB0000046F440000067D8C000004027CD8000004027BDB0000046F460000067D8D000004027CD8000004027BDB0000046F480000067D8E000004027CD8000004027BDB0000046F4A0000067D8F000004027CD8000004027BDB0000046F4C0000067D90000004027BDB0000046F4E0000060C120228B100000A2D0E027CD8000004157D910000042B1E027CD8000004027BDB0000046F4E0000060D120328B200000A7D91000004027BDB0000046F500000061304120428B100000A2D0E027CD8000004157D920000042B1F027CD8000004027BDB0000046F500000061305120528B200000A7D92000004027BDB0000046F520000061306120628B300000A2D19027CD8000004206C070000171773A400000A7D930000042B1F027CD8000004027BDB0000046F520000061307120728B400000A7D9300000402027BD80000048C160000027DC900000402187DCA000004170ADE2802177DCA000004027BDC0000046F3600000A3AF2FCFFFF022844010006160ADE07022841010006DC062A000000411C00000400000000000000940400009404000007000000000000001E027BC90000042A1A73B500000A7A001B300200220000000D000011027BCA0000040A061759450200000001000000010000002ADE07022844010006DC2A00000110000002001800021A0007000000001E027BC90000042A7A02282400000A02037DCA0000040228AB00000A6FAC00000A7DCB0000042AB202157DCA00000402027BDC000004752F0000017DDD000004027BDD0000042C0B027BDD0000046F1C00000A2A1330020036000000180000111FFE73430100060A06027DCD00000406037DCF00000406047DD100000406057DD3000004060E047DD5000004060E057DD7000004062A0000133002006C0000001A00001128AB00000A6FAC00000A027BE00000043315027BDF0000041FFE330B02167DDF000004020A2B0716734C0100060A06027BE20000047DE100000406027BE40000047DE300000406027BE60000047DE500000406027BE80000047DE700000406027BEA0000047DE9000004062A1E0228450100062A13300500240400001B000011027BDF0000040A0645020000000500000006040000380804000002157DDF000004027CE1000004289100000A2D1C027CE1000004289200000A6F9300000A7E1500000A285900000A2C0B72D60E0070739400000A7A027CE3000004289100000A2D1C027CE3000004289200000A6F9300000A7E1500000A285900000A2C0B72340F0070739400000A7A027CE5000004289100000A2D1C027CE5000004289200000A6F9300000A7E1500000A285900000A2C0B72980F0070739400000A7A027CE7000004289100000A2D1C027CE7000004289200000A6F9300000A7E1500000A285900000A2C0B72F60F0070739400000A7A02027CE1000004289200000A027CE3000004289200000A027CE5000004289200000A027CE7000004289200000A73F40000067DED00000402027BED0000047B7A000004027CE9000004289600000A6FB80000067DEC000004027CEB000004027BEC0000046F2A0000067D7C000004027CEB000004027BEC0000046F280000067D7D000004027CEB000004027BEC0000046F360000067D7E000004027CEB000004027BEC0000046F380000067D7F000004027CEB000004027BEC0000046F340000067D80000004027CEB000004027BEC0000046F320000067D81000004027CEB000004027BEC0000046F2E0000067D82000004027CEB000004027BEC0000046F2C0000067D83000004027CEB000004027BEC0000046F300000067D84000004027CEB000004027BEC0000046F3A0000066F670000067D86000004027CEB000004027BEC0000046F3A0000066F650000067D87000004027CEB000004027BEC0000046F3A0000066F630000067D88000004027CEB000004027BEC0000046F3A0000066F870000067D85000004027CEB000004027BEC0000046F3A0000066F690000067D89000004027CEB000004027BEC0000046F400000067D8A000004027CEB000004027BEC0000046F420000067D8B000004027CEB000004027BEC0000046F440000067D8C000004027CEB000004027BEC0000046F460000067D8D000004027CEB000004027BEC0000046F480000067D8E000004027CEB000004027BEC0000046F4A0000067D8F000004027CEB000004027BEC0000046F4C0000067D90000004027BEC0000046F4E0000060B120128B100000A2D0E027CEB000004157D910000042B1E027CEB000004027BEC0000046F4E0000060C120228B200000A7D91000004027BEC0000046F500000060D120328B100000A2D0E027CEB000004157D920000042B1F027CEB000004027BEC0000046F500000061304120428B200000A7D92000004027BEC0000046F520000061305120528B300000A2D19027CEB000004206C070000171773A400000A7D930000042B1F027CEB000004027BEC0000046F520000061306120628B400000A7D9300000402027BEB0000048C160000027DDE00000402177DDF000004172A02157DDF000004162A1E027BDE0000042A1A73B500000A7A062A1E027BDE0000042A7A02282400000A02037DDF0000040228AB00000A6FAC00000A7DE00000042A133002002E0000001A0000111FFE734C0100060A06027DE200000406037DE400000406047DE600000406057DE8000004060E047DEA000004062A0000133002006C0000001C00001128AB00000A6FAC00000A027BF00000043315027BEF0000041FFE330B02167DEF000004020A2B071673540100060A06027BF20000047DF100000406027BF40000047DF300000406027BF60000047DF500000406027BF80000047DF700000406027BFA0000047DF9000004062A1E02284D0100062A13300500240400001B000011027BEF0000040A0645020000000500000006040000380804000002157DEF000004027CF1000004289100000A2D1C027CF1000004289200000A6F9300000A7E1500000A285900000A2C0B72D60E0070739400000A7A027CF3000004289100000A2D1C027CF3000004289200000A6F9300000A7E1500000A285900000A2C0B72340F0070739400000A7A027CF5000004289100000A2D1C027CF5000004289200000A6F9300000A7E1500000A285900000A2C0B72980F0070739400000A7A027CF7000004289100000A2D1C027CF7000004289200000A6F930000\
-0A7E1500000A285900000A2C0B72F60F0070739400000A7A02027CF1000004289200000A027CF3000004289200000A027CF5000004289200000A027CF7000004289200000A73F40000067DFD00000402027BFD0000047B7A000004027CF9000004289600000A6FBA0000067DFC000004027CFB000004027BFC0000046F2A0000067D7C000004027CFB000004027BFC0000046F280000067D7D000004027CFB000004027BFC0000046F360000067D7E000004027CFB000004027BFC0000046F380000067D7F000004027CFB000004027BFC0000046F340000067D80000004027CFB000004027BFC0000046F320000067D81000004027CFB000004027BFC0000046F2E0000067D82000004027CFB000004027BFC0000046F2C0000067D83000004027CFB000004027BFC0000046F300000067D84000004027CFB000004027BFC0000046F3A0000066F670000067D86000004027CFB000004027BFC0000046F3A0000066F650000067D87000004027CFB000004027BFC0000046F3A0000066F630000067D88000004027CFB000004027BFC0000046F3A0000066F870000067D85000004027CFB000004027BFC0000046F3A0000066F690000067D89000004027CFB000004027BFC0000046F400000067D8A000004027CFB000004027BFC0000046F420000067D8B000004027CFB000004027BFC0000046F440000067D8C000004027CFB000004027BFC0000046F460000067D8D000004027CFB000004027BFC0000046F480000067D8E000004027CFB000004027BFC0000046F4A0000067D8F000004027CFB000004027BFC0000046F4C0000067D90000004027BFC0000046F4E0000060B120128B100000A2D0E027CFB000004157D910000042B1E027CFB000004027BFC0000046F4E0000060C120228B200000A7D91000004027BFC0000046F500000060D120328B100000A2D0E027CFB000004157D920000042B1F027CFB000004027BFC0000046F500000061304120428B200000A7D92000004027BFC0000046F520000061305120528B300000A2D19027CFB000004206C070000171773A400000A7D930000042B1F027CFB000004027BFC0000046F520000061306120628B400000A7D9300000402027BFB0000048C160000027DEE00000402177DEF000004172A02157DEF000004162A1E027BEE0000042A1A73B500000A7A062A1E027BEE0000042A7A02282400000A02037DEF0000040228AB00000A6FAC00000A7DF00000042A133002002E0000001C0000111FFE73540100060A06027DF200000406037DF400000406047DF600000406057DF8000004060E047DFA000004062A0000133002006C0000001D00001128AB00000A6FAC00000A027B000100043315027BFF0000041FFE330B02167DFF000004020A2B0716735C0100060A06027B020100047D0101000406027B040100047D0301000406027B060100047D0501000406027B080100047D0701000406027B0A0100047D09010004062A1E0228550100062A13300500240400001B000011027BFF0000040A0645020000000500000006040000380804000002157DFF000004027C01010004289100000A2D1C027C01010004289200000A6F9300000A7E1500000A285900000A2C0B72D60E0070739400000A7A027C03010004289100000A2D1C027C03010004289200000A6F9300000A7E1500000A285900000A2C0B72340F0070739400000A7A027C05010004289100000A2D1C027C05010004289200000A6F9300000A7E1500000A285900000A2C0B72980F0070739400000A7A027C07010004289100000A2D1C027C07010004289200000A6F9300000A7E1500000A285900000A2C0B72F60F0070739400000A7A02027C01010004289200000A027C03010004289200000A027C05010004289200000A027C07010004289200000A73F40000067D0D01000402027B0D0100047B7A000004027C09010004289600000A6FBB0000067D0C010004027C0B010004027B0C0100046F2A0000067D7C000004027C0B010004027B0C0100046F280000067D7D000004027C0B010004027B0C0100046F360000067D7E000004027C0B010004027B0C0100046F380000067D7F000004027C0B010004027B0C0100046F340000067D80000004027C0B010004027B0C0100046F320000067D81000004027C0B010004027B0C0100046F2E0000067D82000004027C0B010004027B0C0100046F2C0000067D83000004027C0B010004027B0C0100046F300000067D84000004027C0B010004027B0C0100046F3A0000066F670000067D86000004027C0B010004027B0C0100046F3A0000066F650000067D87000004027C0B010004027B0C0100046F3A0000066F630000067D88000004027C0B010004027B0C0100046F3A0000066F870000067D85000004027C0B010004027B0C0100046F3A0000066F690000067D89000004027C0B010004027B0C0100046F400000067D8A000004027C0B010004027B0C0100046F420000067D8B000004027C0B010004027B0C0100046F440000067D8C000004027C0B010004027B0C0100046F460000067D8D000004027C0B010004027B0C0100046F480000067D8E000004027C0B010004027B0C0100046F4A0000067D8F000004027C0B010004027B0C0100046F4C0000067D90000004027B0C0100046F4E0000060B120128B100000A2D0E027C0B010004157D910000042B1E027C0B010004027B0C0100046F4E0000060C120228B200000A7D91000004027B0C0100046F500000060D120328B100000A2D0E027C0B010004157D920000042B1F027C0B010004027B0C0100046F500000061304120428B200000A7D92000004027B0C0100046F520000061305120528B300000A2D19027C0B010004206C070000171773A400000A7D930000042B1F027C0B010004027B0C0100046F520000061306120628B400000A7D9300000402027B0B0100048C160000027DFE00000402177DFF000004172A02157DFF000004162A1E027BFE0000042A1A73B500000A7A062A1E027BFE0000042A7A02282400000A02037DFF0000040228AB00000A6FAC00000A7D000100042A133002002E0000001D0000111FFE735C0100060A06027D0201000406037D0401000406047D0601000406057D08010004060E047D0A010004062A0000133002006C0000001E00001128AB00000A6FAC00000A027B100100043315027B0F0100041FFE330B02167D0F010004020A2B071673640100060A06027B120100047D1101000406027B140100047D1301000406027B160100047D1501000406027B180100047D1701000406027B1A0100047D19010004062A1E02285D0100062A13300500240400001B000011027B0F0100040A0645020000000500000006040000380804000002157D0F010004027C11010004289100000A2D1C027C11010004289200000A6F9300000A7E1500000A285900000A2C0B72D60E0070739400000A7A027C13010004289100000A2D1C027C13010004289200000A6F9300000A7E1500000A285900000A2C0B72340F0070739400000A7A027C15010004289100000A2D1C027C15010004289200000A6F9300000A7E1500000A285900000A2C0B72980F0070739400000A7A027C17010004289100000A2D1C027C17010004289200000A6F9300000A7E1500000A285900000A2C0B72F60F0070739400000A7A02027C11010004289200000A027C13010004289200000A027C15010004289200000A027C17010004289200000A73F40000067D1D01000402027B1D0100047B7A000004027C19010004289600000A6FBE0000067D1C010004027C1B010004027B1C0100046F2A0000067D7C000004027C1B010004027B1C0100046F280000067D7D000004027C1B010004027B1C0100046F360000067D7E000004027C1B010004027B1C0100046F380000067D7F000004027C1B010004027B1C0100046F340000067D80000004027C1B010004027B1C0100046F320000067D81000004027C1B010004027B1C0100046F2E0000067D82000004027C1B010004027B1C0100046F2C0000067D83000004027C1B010004027B1C0100046F300000067D84000004027C1B010004027B1C0100046F3A0000066F670000067D86000004027C1B010004027B1C0100046F3A0000066F650000067D87000004027C1B010004027B1C0100046F3A0000066F630000067D88000004027C1B010004027B1C0100046F3A0000066F870000067D85000004027C1B010004027B1C0100046F3A0000066F690000067D89000004027C1B010004027B1C0100046F400000067D8A000004027C1B010004027B1C0100046F420000067D8B000004027C1B010004027B1C0100046F440000067D8C000004027C1B010004027B1C0100046F460000067D8D000004027C1B010004027B1C0100046F480000067D8E000004027C1B010004027B1C0100046F4A0000067D8F000004027C1B010004027B1C0100046F4C0000067D90000004027B1C0100046F4E0000060B120128B100000A2D0E027C1B010004157D910000042B1E027C1B010004027B1C0100046F4E0000060C120228B200000A7D91000004027B1C0100046F500000060D120328B100000A2D0E027C1B010004157D920000042B1F027C1B010004027B1C0100046F500000061304120428B200000A7D92000004027B1C0100046F520000061305120528B300000A2D19027C1B010004206C070000171773A400000A7D930000042B1F027C1B010004027B1C0100046F520000061306120628B400000A7D9300000402027B1B0100048C160000027D0E01000402177D0F010004172A02157D0F010004162A1E027B0E0100042A1A73B500000A7A062A1E027B0E0100042A7A02282400000A02037D0F0100040228AB00000A6FAC00000A7D100100042A133002002E0000001E0000111FFE73640100060A06027D1201000406037D1401000406047D1601000406057D18010004060E047D1A010004062A0000133004006E0200001F00001102A5170000020A0312007B94000004289B00000A81100000010512007B95000004289C00000A81110000010412007B96000004289C00000A81110000010E0412007B97000004289E00000A81140000010E0512007B98000004289E00000A81140000010E0612007B99000004289C00000A811100000112007B9A000004206C070000171773A400000A28A500000A2C0E0E077EA600000A81130000012B130E0712007B9A000004289D00000A81130000010E0812007B9B000004289C00000A81110000010E0912007B9C000004289C00000A811100000112007C9D00000428B100000A2C1A0E0A12007C9D00000428B200000A28A300000A81150000012B0C0E0A7EA200000A81150000010E0B12007BA0000004289C00000A81110000010E0C12007BA1000004289C00000A81110000010E0D12007BA200000428A300000A81150000010E0E12007BA300000428A300000A81150000010E0F12007BA400000428A300000A81150000010E1012007BA6000004289C00000A811100000112007BA900000415330E0E117EA200000A81150000012B130E1112007BA900000428A300000A811500000112007BAA00000415330E0E127EA200000A81150000012B130E1212007BAA00000428A300000A811500000112007BAB000004206C070000171773A400000A28A500000A2C0E0E137EA600000A81130000012B130E1312007BAB000004289D00000A81130000010E1412007B9F000004289C00000A81110000010E1512007BA500000428A300000A81150000010E1612007B9E000004289E00000A81140000010E1712007BA7000004289E00000A81140000010E1812007BA8000004289E00000A81140000012A000013300200600000002000001128AB00000A6FAC00000A027B200100043315027B1F0100041FFE330B02167D1F010004020A2B0716736C0100060A06027B220100047D2101000406027B240100047D2301000406027B260100047D2501000406027B280100047D27010004062A1E0228650100062A1B300500C304000021000011027B1F0100040B074503000000050000009D04000080040000389804000002157D1F010004027C21010004289100000A2D1C027C21010004289200000A6F9300000A7E1500000A285900000A2C0B72D60E0070739400000A7A027C23010004289100000A2D1C027C23010004289200000A6F9300000A7E1500000A285900000A2C0B72340F0070739400000A7A027C25010004289100000A2D1C027C25010004289200000A6F9300000A7E1500000A285900000A2C0B72980F0070739400000A7A027C27010004289100000A2D1C027C27010004289200000A6F9300000A7E1500000A285900000A2C0B72F60F0070739400000A7A02027C21010004289200000A027C23010004289200000A027C25010004289200000A027C27010004289200000A73F40000067D290100040273AC0000067D2A01000402027B290100047B7B0000046FC20000067D2A010004027C2B010004FE151700000202027B2A0100046FB000000A7D2D01000402177D1F010004382A03000002027B2D0100046F3300000A740A0000027D2C010004027C2B010004027B2C0100046F630000067D94000004027C2B010004027B2C0100046F650000067D95000004027C2B010004027B2C0100046F670000067D96000004027C2B010004027B2C0100046F830000067D97000004027C2B010004027B2C0100046F790000067D98000004027C2B010004027B2C0100046F6B0000067D99000004027C2B010004027B2C0100046F710000067DA2000004027C2B010004027B2C0100046F6F0000067DA3000004027C2B010004027B2C0100046F730000067DA4000004027C2B010004027B2C0100046F7B0000067DA0000004027C2B010004027B2C0100046F7D0000067DA1000004027C2B010004027B2C0100046F690000067D9B000004027C2B010004027B2C0100046F870000067D9C000004027C2B010004027B2C0100046F850000067D9D000004027B2C0100046F6D0000060C120228B300000A2D19027C2B010004206C070000171773A400000A7D9A0000042B1E027C2B010004027B2C0100046F6D0000060D120328B400000A7D9A000004027C2B010004027B2C0100046F770000062D0772921000702B10027B2C0100046F770000066F2C0000067DA6000004027C2B010004027B2C0100046F8F0000067DA7000004027C2B010004027B2C0100046F8B0000067D9F000004027C2B010004027B2C0100046F750000067DA5000004027C2B010004027B2C0100046F890000067D9E000004027C2B010004027B2C0100046F910000067DA8000004027B2C0100046F930000061304120428B100000A2D0E027C2B010004157DA90000042B1F027C2B010004027B2C0100046F930000061305120528B200000A7DA9000004027B2C0100046F950000061306120628B100000A2D0E027C2B010004157DAA0000042B1F027C2B010004027B2C0100046F950000061307120728B200000A7DAA000004027B2C0100046F970000061308120828B300000A2D19027C2B010004206C070000171773A400000A7DAB0000042B1F027C2B010004027B2C0100046F970000061309120928B400000A7DAB00000402027B2B0100048C170000027D1E01000402187D1F010004170ADE2802177D1F010004027B2D0100046F3600000A3AC6FCFFFF02286D010006160ADE0702286A010006DC062A00411C00000400000000000000BA040000BA04000007000000000000001E027B1E0100042A1A73B500000A7A001B300200220000000D000011027B1F0100040A061759450200000001000000010000002ADE0702286D010006DC2A00000110000002001800021A0007000000001E027B1E0100042A7A02282400000A02037D1F0100040228AB00000A6FAC00000A7D200100042AB202157D1F01000402027B2D010004752F0000017D2E010004027B2E0100042C0B027B2E0100046F1C00000A2A1330020026000000200000111FFE736C0100060A06027D2201000406037D2401000406047D2601000406057D28010004062A000013300200600000002200001128AB00000A6FAC00000A027B310100043315027B300100041FFE330B02167D30010004020A2B071673750100060A06027B330100047D3201000406027B350100047D3401000406027B370100047D3601000406027B390100047D38010004062A1E02286E0100062A1B300500C304000021000011027B300100040B074503000000050000009D04000080040000389804000002157D30010004027C32010004289100000A2D1C027C32010004289200000A6F9300000A7E1500000A285900000A2C0B72D60E0070739400000A7A027C34010004289100000A2D1C027C34010004289200000A6F9300000A7E1500000A285900000A2C0B72340F0070739400000A7A027C36010004289100000A2D1C027C36010004289200000A6F9300000A7E1500000A285900000A2C0B72980F0070739400000A7A027C38010004289100000A2D1C027C38010004289200000A6F9300000A7E1500000A285900000A2C0B72F60F0070739400000A7A02027C32010004289200000A027C34010004289200000A027C36010004289200000A027C38010004289200000A73F40000067D3A0100040273AC0000067D3B01000402027B3A0100047B7B0000046FC30000067D3B010004027C3C010004FE151700000202027B3B0100046FB000000A7D3E01000402177D30010004382A03000002027B3E0100046F3300000A740A0000027D3D010004027C3C010004027B3D0100046F630000067D94000004027C3C010004027B3D0100046F650000067D95000004027C3C010004027B3D0100046F670000067D96000004027C3C010004027B3D0100046F830000067D97000004027C3C010004027B3D0100046F790000067D98000004027C3C010004027B3D0100046F6B0000067D99000004027C3C010004027B3D0100046F710000067DA2000004027C3C010004027B3D0100046F6F0000067DA3000004027C3C010004027B3D0100046F730000067DA4000004027C3C010004027B3D0100046F7B0000067DA0000004027C3C010004027B3D0100046F7D0000067DA1000004027C3C010004027B3D0100046F690000067D9B000004027C3C010004027B3D0100046F870000067D9C000004027C3C010004027B3D0100046F850000067D9D000004027B3D0100046F6D0000060C120228B300000A2D19027C3C010004206C070000171773A400000A7D9A0000042B1E027C3C010004027B3D0100046F6D0000060D120328B400000A7D9A000004027C3C010004027B3D0100046F770000062D0772921000702B10027B3D0100046F770000066F2C0000067DA6000004027C3C010004027B3D0100046F8F0000067DA7000004027C3C010004027B3D0100046F8B0000067D9F000004027C3C010004027B3D0100046F750000067DA5000004027C3C010004027B3D0100046F890000067D9E000004027C3C010004027B3D0100046F910000067DA8000004027B3D0100046F930000061304120428B100000A2D0E027C3C010004157DA90000042B1F027C3C010004027B3D0100046F930000061305120528B200000A7DA9000004027B3D0100046F950000061306120628B100000A2D0E027C3C010004157DAA0000042B1F027C3C010004027B3D0100046F950000061307120728B200000A7DAA000004027B3D0100046F970000061308120828B300000A2D19027C3C010004206C070000171773A400000A7DAB0000042B1F027C3C010004027B3D0100046F970000061309120928B400000A7DAB00000402027B3C0100048C170000027D2F01000402187D30010004170ADE2802177D30010004027B3E0100046F3600000A3AC6FCFFFF022876010006160ADE07022873010006DC062A00411C00000400000000000000BA040000BA04000007000000000000001E027B2F0100042A1A73B500000A7A001B300200220000000D000011027B300100040A061759450200000001000000010000002ADE07022876010006DC2A00000110000002001800021A0007000000001E027B2F0100042A7A02282400000A02037D300100040228AB00000A6FAC00000A7D310100042AB202157D3001000402027B3E010004752F0000017D3F010004027B3F0100042C0B027B3F0100046F1C00000A2A1330020026000000220000111FFE73750100060A06027D3301000406037D3501000406047D3701000406057D39010004062A0000133002006C0000002300001128AB00000A6FAC00000A027B420100043315027B410100041FFE330B02167D41010004020A2B0716737E0100060A06027B440100047D4301000406027B460100047D4501000406027B480100047D4701000406027B4A0100047D4901000406027B4C0100047D4B010004062A1E0228770100062A133005006804000024000011027B410100040A064502000000050000004A040000384C04000002157D41010004027C43010004289100000A2D1C027C43010004289200000A6F9300000A7E1500000A285900000A2C0B72D60E0070739400000A7A027C45010004289100000A2D1C027C45010004289200000A6F9300000A7E1500000A285900000A2C0B72340F0070739400000A7A027C47010004289100000A2D1C027C47010004289200000A6F9300000A7E1500000A285900000A2C0B72980F0070739400000A7A027C49010004289100000A2D1C027C49010004289200000A6F9300000A7E1500000A285900000A2C0B72F60F0070739400000A7A02027C43010004289200000A027C45010004289200000A027C47010004289200000A027C49010004289200000A73F40000067D4D010004027C4F010004FE151700000202027B4D0100047B7B000004027C4B010004289200000A6FC00000067D4E010004027C4F010004027B4E0100046F630000067D94000004027C4F010004027B4E0100046F650000067D95000004027C4F010004027B4E0100046F670000067D96000004027C4F010004027B4E0100046F830000067D97000004027C4F010004027B4E0100046F790000067D98000004027C4F010004027B4E0100046F6B0000067D99000004027C4F010004027B4E0100046F710000067DA2000004027C4F010004027B4E0100046F6F0000067DA3000004027C4F010004027B4E0100046F730000067DA4000004027C4F010004027B4E0100046F7B0000067DA0000004027C4F010004027B4E0100046F7D0000067DA1000004027C4F010004027B4E0100046F690000067D9B000004027C4F010004027B4E0100046F870000067D9C000004027C4F010004027B4E0100046F850000067D9D000004027B4E0100046F6D0000060B120128B300000A2D19027C4F010004206C070000171773A400000A7D9A0000042B1E027C4F010004027B4E0100046F6D0000060C120228B400000A7D9A000004027C4F010004027B4E0100046F770000062D0772921000702B10027B4E0100046F770000066F2C0000067DA6000004027C4F010004027B4E0100046F8F0000067DA7000004027C4F010004027B4E0100046F8B0000067D9F000004027C4F010004027B4E0100046F750000067DA5000004027C4F010004027B4E0100046F890000067D9E000004027C4F010004027B4E0100046F910000067DA8000004027B4E0100046F930000060D120328B100000A2D0E027C4F010004157DA90000042B1F027C4F010004027B4E0100046F930000061304120428B200000A7DA9000004027B4E0100046F950000061305120528B100000A2D0E027C4F010004157DAA0000042B1F027C4F010004027B4E0100046F950000061306120628B200000A7DAA000004027B4E0100046F970000061307120728B300000A2D19027C4F010004206C070000171773A400000A7DAB0000042B1F027C4F010004027B4E0100046F970000061308120828B400000A7DAB00000402027B4F0100048C170000027D4001000402177D41010004172A02157D41010004162A1E027B400100042A1A73B500000A7A062A1E027B400100042A7A02282400000A02037D410100040228AB00000A6FAC00000A7D420100042A133002002E000000230000111FFE737E0100060A06027D4401000406037D4601000406047D4801000406057D4A010004060E047D4C010004062A0000133002006C0000002500001128AB00000A6FAC00000A027B520100043315027B510100041FFE330B02167D51010004020A2B071673860100060A06027B540100047D5301000406027B560100047D5501000406027B580100047D5701000406027B5A0100047D5901000406027B5C0100047D5B010004062A1E02287F0100062A1B3005001E05000021000011027B510100040B07450300000005000000F8040000DB04000038F304000002157D51010004027C53010004289100000A2D1C027C53010004289200000A6F9300000A7E1500000A285900000A2C0B72D60E0070739400000A7A027C55010004289100000A2D1C027C55010004289200000A6F9300000A7E1500000A285900000A2C0B72340F0070739400000A7A027C57010004289100000A2D1C027C57010004289200000A6F9300000A7E1500000A285900000A2C0B72980F0070739400000A7A027C59010004289100000A2D1C027C59010004289200000A6F9300000A7E1500000A285900000A2C0B72F60F0070739400000A7A027C5B010004289100000A2D1C027C5B010004289200000A6F9300000A7E1500000A285900000A2C0B72A6110070739400000A7A02027C53010004289200000A027C55010004289200000A027C57010004289200000A027C59010004289200000A73F40000067D5D01000402739A0000067D5E010004027B5E010004027C5B010004289200000A6F680000060273AC0000067D5F01000402027B5D0100047B7B000004027B5E0100046FC40000067D5F010004027C60010004FE151700000202027B5F0100046FB000000A7D6201000402177D51010004382A03000002027B620100046F3300000A740A0000027D61010004027C60010004027B610100046F630000067D94000004027C60010004027B610100046F650000067D95000004027C60010004027B610100046F670000067D96000004027C60010004027B610100046F830000067D97000004027C60010004027B610100046F790000067D98000004027C60010004027B610100046F6B0000067D99000004027C60010004027B610100046F710000067DA2000004027C60010004027B610100046F6F0000067DA3000004027C60010004027B610100046F730000067DA4000004027C60010004027B610100046F7B0000067DA0000004027C60010004027B610100046F7D0000067DA1000004027C60010004027B610100046F690000067D9B000004027C60010004027B610100046F870000067D9C000004027C60010004027B610100046F850000067D9D000004027B610100046F6D0000060C120228B300000A2D19027C60010004206C070000171773A400000A7D9A0000042B1E027C60010004027B610100046F6D0000060D120328B400000A7D9A000004027C60010004027B610100046F770000062D0772921000702B10027B610100046F770000066F2C0000067DA6000004027C60010004027B610100046F8F0000067DA7000004027C60010004027B610100046F8B0000067D9F000004027C60010004027B610100046F750000067DA5000004027C60010004027B610100046F890000067D9E000004027C60010004027B610100046F910000067DA8000004027B610100046F930000061304120428B100000A2D0E027C60010004157DA90000042B1F02\
-7C60010004027B610100046F930000061305120528B200000A7DA9000004027B610100046F950000061306120628B100000A2D0E027C60010004157DAA0000042B1F027C60010004027B610100046F950000061307120728B200000A7DAA000004027B610100046F970000061308120828B300000A2D19027C60010004206C070000171773A400000A7DAB0000042B1F027C60010004027B610100046F970000061309120928B400000A7DAB00000402027B600100048C170000027D5001000402187D51010004170ADE2802177D51010004027B620100046F3600000A3AC6FCFFFF022887010006160ADE07022884010006DC062A0000411C00000400000000000000150500001505000007000000000000001E027B500100042A1A73B500000A7A001B300200220000000D000011027B510100040A061759450200000001000000010000002ADE07022887010006DC2A00000110000002001800021A0007000000001E027B500100042A7A02282400000A02037D510100040228AB00000A6FAC00000A7D520100042AB202157D5101000402027B62010004752F0000017D63010004027B630100042C0B027B630100046F1C00000A2A133002002E000000250000111FFE73860100060A06027D5401000406037D5601000406047D5801000406057D5A010004060E047D5C010004062A000013300200780000002600001128AB00000A6FAC00000A027B660100043315027B650100041FFE330B02167D65010004020A2B0716738F0100060A06027B680100047D6701000406027B6A0100047D6901000406027B6C0100047D6B01000406027B6E0100047D6D01000406027B700100047D6F01000406027B720100047D71010004062A1E0228880100062A1B3005006A05000021000011027B650100040B074503000000050000004405000027050000383F05000002157D65010004027C67010004289100000A2D1C027C67010004289200000A6F9300000A7E1500000A285900000A2C0B72D60E0070739400000A7A027C69010004289100000A2D1C027C69010004289200000A6F9300000A7E1500000A285900000A2C0B72340F0070739400000A7A027C6B010004289100000A2D1C027C6B010004289200000A6F9300000A7E1500000A285900000A2C0B72980F0070739400000A7A027C6D010004289100000A2D1C027C6D010004289200000A6F9300000A7E1500000A285900000A2C0B72F60F0070739400000A7A027C6F010004289100000A2D1C027C6F010004289200000A6F9300000A7E1500000A285900000A2C27027C71010004289500000A2D0F027C71010004289600000A166A330B7202120070739400000A7A02027C67010004289200000A027C69010004289200000A027C6B010004289200000A027C6D010004289200000A73F40000067D730100040273AC0000067D74010004027C6F010004289100000A2D3F027C6F010004289200000A6F9300000A7E1500000A286F00000A2C2302027B730100047B7B000004027C6F010004289200000A6FC50000067D740100042B2102027B730100047B7B000004027C71010004289600000A6FC60000067D74010004027C75010004FE151700000202027B740100046FB000000A7D7701000402177D65010004382A03000002027B770100046F3300000A740A0000027D76010004027C75010004027B760100046F630000067D94000004027C75010004027B760100046F650000067D95000004027C75010004027B760100046F670000067D96000004027C75010004027B760100046F830000067D97000004027C75010004027B760100046F790000067D98000004027C75010004027B760100046F6B0000067D99000004027C75010004027B760100046F710000067DA2000004027C75010004027B760100046F6F0000067DA3000004027C75010004027B760100046F730000067DA4000004027C75010004027B760100046F7B0000067DA0000004027C75010004027B760100046F7D0000067DA1000004027C75010004027B760100046F690000067D9B000004027C75010004027B760100046F870000067D9C000004027C75010004027B760100046F850000067D9D000004027B760100046F6D0000060C120228B300000A2D19027C75010004206C070000171773A400000A7D9A0000042B1E027C75010004027B760100046F6D0000060D120328B400000A7D9A000004027C75010004027B760100046F770000062D0772921000702B10027B760100046F770000066F2C0000067DA6000004027C75010004027B760100046F8F0000067DA7000004027C75010004027B760100046F8B0000067D9F000004027C75010004027B760100046F750000067DA5000004027C75010004027B760100046F890000067D9E000004027C75010004027B760100046F910000067DA8000004027B760100046F930000061304120428B100000A2D0E027C75010004157DA90000042B1F027C75010004027B760100046F930000061305120528B200000A7DA9000004027B760100046F950000061306120628B100000A2D0E027C75010004157DAA0000042B1F027C75010004027B760100046F950000061307120728B200000A7DAA000004027B760100046F970000061308120828B300000A2D19027C75010004206C070000171773A400000A7DAB0000042B1F027C75010004027B760100046F970000061309120928B400000A7DAB00000402027B750100048C170000027D6401000402187D65010004170ADE2802177D65010004027B770100046F3600000A3AC6FCFFFF022890010006160ADE0702288D010006DC062A0000411C00000400000000000000610500006105000007000000000000001E027B640100042A1A73B500000A7A001B300200220000000D000011027B650100040A061759450200000001000000010000002ADE07022890010006DC2A00000110000002001800021A0007000000001E027B640100042A7A02282400000A02037D650100040228AB00000A6FAC00000A7D660100042AB202157D6501000402027B77010004752F0000017D78010004027B780100042C0B027B780100046F1C00000A2A1330020036000000260000111FFE738F0100060A06027D6801000406037D6A01000406047D6C01000406057D6E010004060E047D70010004060E057D72010004062A000013300200600000002700001128AB00000A6FAC00000A027B7B0100043315027B7A0100041FFE330B02167D7A010004020A2B071673980100060A06027B7D0100047D7C01000406027B7F0100047D7E01000406027B810100047D8001000406027B830100047D82010004062A1E0228910100062A1B300500C304000021000011027B7A0100040B074503000000050000009D04000080040000389804000002157D7A010004027C7C010004289100000A2D1C027C7C010004289200000A6F9300000A7E1500000A285900000A2C0B72D60E0070739400000A7A027C7E010004289100000A2D1C027C7E010004289200000A6F9300000A7E1500000A285900000A2C0B72340F0070739400000A7A027C80010004289100000A2D1C027C80010004289200000A6F9300000A7E1500000A285900000A2C0B72980F0070739400000A7A027C82010004289100000A2D1C027C82010004289200000A6F9300000A7E1500000A285900000A2C0B72F60F0070739400000A7A02027C7C010004289200000A027C7E010004289200000A027C80010004289200000A027C82010004289200000A73F40000067D840100040273AC0000067D8501000402027B840100047B7B0000046FC70000067D85010004027C86010004FE151700000202027B850100046FB000000A7D8801000402177D7A010004382A03000002027B880100046F3300000A740A0000027D87010004027C86010004027B870100046F630000067D94000004027C86010004027B870100046F650000067D95000004027C86010004027B870100046F670000067D96000004027C86010004027B870100046F830000067D97000004027C86010004027B870100046F790000067D98000004027C86010004027B870100046F6B0000067D99000004027C86010004027B870100046F710000067DA2000004027C86010004027B870100046F6F0000067DA3000004027C86010004027B870100046F730000067DA4000004027C86010004027B870100046F7B0000067DA0000004027C86010004027B870100046F7D0000067DA1000004027C86010004027B870100046F690000067D9B000004027C86010004027B870100046F870000067D9C000004027C86010004027B870100046F850000067D9D000004027B870100046F6D0000060C120228B300000A2D19027C86010004206C070000171773A400000A7D9A0000042B1E027C86010004027B870100046F6D0000060D120328B400000A7D9A000004027C86010004027B870100046F770000062D0772921000702B10027B870100046F770000066F2C0000067DA6000004027C86010004027B870100046F8F0000067DA7000004027C86010004027B870100046F8B0000067D9F000004027C86010004027B870100046F750000067DA5000004027C86010004027B870100046F890000067D9E000004027C86010004027B870100046F910000067DA8000004027B870100046F930000061304120428B100000A2D0E027C86010004157DA90000042B1F027C86010004027B870100046F930000061305120528B200000A7DA9000004027B870100046F950000061306120628B100000A2D0E027C86010004157DAA0000042B1F027C86010004027B870100046F950000061307120728B200000A7DAA000004027B870100046F970000061308120828B300000A2D19027C86010004206C070000171773A400000A7DAB0000042B1F027C86010004027B870100046F970000061309120928B400000A7DAB00000402027B860100048C170000027D7901000402187D7A010004170ADE2802177D7A010004027B880100046F3600000A3AC6FCFFFF022899010006160ADE07022896010006DC062A00411C00000400000000000000BA040000BA04000007000000000000001E027B790100042A1A73B500000A7A001B300200220000000D000011027B7A0100040A061759450200000001000000010000002ADE07022899010006DC2A00000110000002001800021A0007000000001E027B790100042A7A02282400000A02037D7A0100040228AB00000A6FAC00000A7D7B0100042AB202157D7A01000402027B88010004752F0000017D89010004027B890100042C0B027B890100046F1C00000A2A1330020026000000270000111FFE73980100060A06027D7D01000406037D7F01000406047D8101000406057D83010004062A0000133002006C0000002800001128AB00000A6FAC00000A027B8C0100043315027B8B0100041FFE330B02167D8B010004020A2B071673A10100060A06027B8E0100047D8D01000406027B900100047D8F01000406027B920100047D9101000406027B940100047D9301000406027B960100047D95010004062A1E02289A0100062A1B3005000205000021000011027B8B0100040B07450300000005000000DC040000BF04000038D704000002157D8B010004027C8D010004289100000A2D1C027C8D010004289200000A6F9300000A7E1500000A285900000A2C0B72D60E0070739400000A7A027C8F010004289100000A2D1C027C8F010004289200000A6F9300000A7E1500000A285900000A2C0B72340F0070739400000A7A027C91010004289100000A2D1C027C91010004289200000A6F9300000A7E1500000A285900000A2C0B72980F0070739400000A7A027C93010004289100000A2D1C027C93010004289200000A6F9300000A7E1500000A285900000A2C0B72F60F0070739400000A7A027C95010004289100000A2D1C027C95010004289200000A6F9300000A7E1500000A285900000A2C0B72A6110070739400000A7A02027C8D010004289200000A027C8F010004289200000A027C91010004289200000A027C93010004289200000A73F40000067D970100040273AC0000067D9801000402027B970100047B7B000004027C95010004289200000A6FC80000067D98010004027C99010004FE151700000202027B980100046FB000000A7D9B01000402177D8B010004382A03000002027B9B0100046F3300000A740A0000027D9A010004027C99010004027B9A0100046F630000067D94000004027C99010004027B9A0100046F650000067D95000004027C99010004027B9A0100046F670000067D96000004027C99010004027B9A0100046F830000067D97000004027C99010004027B9A0100046F790000067D98000004027C99010004027B9A0100046F6B0000067D99000004027C99010004027B9A0100046F710000067DA2000004027C99010004027B9A0100046F6F0000067DA3000004027C99010004027B9A0100046F730000067DA4000004027C99010004027B9A0100046F7B0000067DA0000004027C99010004027B9A0100046F7D0000067DA1000004027C99010004027B9A0100046F690000067D9B000004027C99010004027B9A0100046F870000067D9C000004027C99010004027B9A0100046F850000067D9D000004027B9A0100046F6D0000060C120228B300000A2D19027C99010004206C070000171773A400000A7D9A0000042B1E027C99010004027B9A0100046F6D0000060D120328B400000A7D9A000004027C99010004027B9A0100046F770000062D0772921000702B10027B9A0100046F770000066F2C0000067DA6000004027C99010004027B9A0100046F8F0000067DA7000004027C99010004027B9A0100046F8B0000067D9F000004027C99010004027B9A0100046F750000067DA5000004027C99010004027B9A0100046F890000067D9E000004027C99010004027B9A0100046F910000067DA8000004027B9A0100046F930000061304120428B100000A2D0E027C99010004157DA90000042B1F027C99010004027B9A0100046F930000061305120528B200000A7DA9000004027B9A0100046F950000061306120628B100000A2D0E027C99010004157DAA0000042B1F027C99010004027B9A0100046F950000061307120728B200000A7DAA000004027B9A0100046F970000061308120828B300000A2D19027C99010004206C070000171773A400000A7DAB0000042B1F027C99010004027B9A0100046F970000061309120928B400000A7DAB00000402027B990100048C170000027D8A01000402187D8B010004170ADE2802177D8B010004027B9B0100046F3600000A3AC6FCFFFF0228A2010006160ADE0702289F010006DC062A0000411C00000400000000000000F9040000F904000007000000000000001E027B8A0100042A1A73B500000A7A001B300200220000000D000011027B8B0100040A061759450200000001000000010000002ADE070228A2010006DC2A00000110000002001800021A0007000000001E027B8A0100042A7A02282400000A02037D8B0100040228AB00000A6FAC00000A7D8C0100042AB202157D8B01000402027B9B010004752F0000017D9C010004027B9C0100042C0B027B9C0100046F1C00000A2A133002002E000000280000111FFE73A10100060A06027D8E01000406037D9001000406047D9201000406057D94010004060E047D96010004062A0000133002006C0000002900001128AB00000A6FAC00000A027B9F0100043315027B9E0100041FFE330B02167D9E010004020A2B071673AA0100060A06027BA10100047DA001000406027BA30100047DA201000406027BA50100047DA401000406027BA70100047DA601000406027BA90100047DA8010004062A1E0228A30100062A1B3005000205000021000011027B9E0100040B07450300000005000000DC040000BF04000038D704000002157D9E010004027CA0010004289100000A2D1C027CA0010004289200000A6F9300000A7E1500000A285900000A2C0B72D60E0070739400000A7A027CA2010004289100000A2D1C027CA2010004289200000A6F9300000A7E1500000A285900000A2C0B72340F0070739400000A7A027CA4010004289100000A2D1C027CA4010004289200000A6F9300000A7E1500000A285900000A2C0B72980F0070739400000A7A027CA6010004289100000A2D1C027CA6010004289200000A6F9300000A7E1500000A285900000A2C0B72F60F0070739400000A7A027CA8010004289100000A2D1C027CA8010004289200000A6F9300000A7E1500000A285900000A2C0B72A6110070739400000A7A02027CA0010004289200000A027CA2010004289200000A027CA4010004289200000A027CA6010004289200000A73F40000067DAA0100040273AC0000067DAB01000402027BAA0100047B7B000004027CA8010004289200000A6FC90000067DAB010004027CAC010004FE151700000202027BAB0100046FB000000A7DAE01000402177D9E010004382A03000002027BAE0100046F3300000A740A0000027DAD010004027CAC010004027BAD0100046F630000067D94000004027CAC010004027BAD0100046F650000067D95000004027CAC010004027BAD0100046F670000067D96000004027CAC010004027BAD0100046F830000067D97000004027CAC010004027BAD0100046F790000067D98000004027CAC010004027BAD0100046F6B0000067D99000004027CAC010004027BAD0100046F710000067DA2000004027CAC010004027BAD0100046F6F0000067DA3000004027CAC010004027BAD0100046F730000067DA4000004027CAC010004027BAD0100046F7B0000067DA0000004027CAC010004027BAD0100046F7D0000067DA1000004027CAC010004027BAD0100046F690000067D9B000004027CAC010004027BAD0100046F870000067D9C000004027CAC010004027BAD0100046F850000067D9D000004027BAD0100046F6D0000060C120228B300000A2D19027CAC010004206C070000171773A400000A7D9A0000042B1E027CAC010004027BAD0100046F6D0000060D120328B400000A7D9A000004027CAC010004027BAD0100046F770000062D0772921000702B10027BAD0100046F770000066F2C0000067DA6000004027CAC010004027BAD0100046F8F0000067DA7000004027CAC010004027BAD0100046F8B0000067D9F000004027CAC010004027BAD0100046F750000067DA5000004027CAC010004027BAD0100046F890000067D9E000004027CAC010004027BAD0100046F910000067DA8000004027BAD0100046F930000061304120428B100000A2D0E027CAC010004157DA90000042B1F027CAC010004027BAD0100046F930000061305120528B200000A7DA9000004027BAD0100046F950000061306120628B100000A2D0E027CAC010004157DAA0000042B1F027CAC010004027BAD0100046F950000061307120728B200000A7DAA000004027BAD0100046F970000061308120828B300000A2D19027CAC010004206C070000171773A400000A7DAB0000042B1F027CAC010004027BAD0100046F970000061309120928B400000A7DAB00000402027BAC0100048C170000027D9D01000402187D9E010004170ADE2802177D9E010004027BAE0100046F3600000A3AC6FCFFFF0228AB010006160ADE070228A8010006DC062A0000411C00000400000000000000F9040000F904000007000000000000001E027B9D0100042A1A73B500000A7A001B300200220000000D000011027B9E0100040A061759450200000001000000010000002ADE070228AB010006DC2A00000110000002001800021A0007000000001E027B9D0100042A7A02282400000A02037D9E0100040228AB00000A6FAC00000A7D9F0100042AB202157D9E01000402027BAE010004752F0000017DAF010004027BAF0100042C0B027BAF0100046F1C00000A2A133002002E000000290000111FFE73AA0100060A06027DA101000406037DA301000406047DA501000406057DA7010004060E047DA9010004062A0000133002006C0000002A00001128AB00000A6FAC00000A027BB20100043315027BB10100041FFE330B02167DB1010004020A2B071673B30100060A06027BB40100047DB301000406027BB60100047DB501000406027BB80100047DB701000406027BBA0100047DB901000406027BBC0100047DBB010004062A1E0228AC0100062A1B300500CE04000021000011027BB10100040B07450300000005000000A80400008B04000038A304000002157DB1010004027CB3010004289100000A2D1C027CB3010004289200000A6F9300000A7E1500000A285900000A2C0B72D60E0070739400000A7A027CB5010004289100000A2D1C027CB5010004289200000A6F9300000A7E1500000A285900000A2C0B72340F0070739400000A7A027CB7010004289100000A2D1C027CB7010004289200000A6F9300000A7E1500000A285900000A2C0B72980F0070739400000A7A027CB9010004289100000A2D1C027CB9010004289200000A6F9300000A7E1500000A285900000A2C0B72F60F0070739400000A7A02027CB3010004289200000A027CB5010004289200000A027CB7010004289200000A027CB9010004289200000A73F40000067DBD0100040273AC0000067DBE01000402027BBD0100047B7B000004027CBB010004289600000A6FC10000067DBE010004027CBF010004FE151700000202027BBE0100046FB000000A7DC101000402177DB1010004382A03000002027BC10100046F3300000A740A0000027DC0010004027CBF010004027BC00100046F630000067D94000004027CBF010004027BC00100046F650000067D95000004027CBF010004027BC00100046F670000067D96000004027CBF010004027BC00100046F830000067D97000004027CBF010004027BC00100046F790000067D98000004027CBF010004027BC00100046F6B0000067D99000004027CBF010004027BC00100046F710000067DA2000004027CBF010004027BC00100046F6F0000067DA3000004027CBF010004027BC00100046F730000067DA4000004027CBF010004027BC00100046F7B0000067DA0000004027CBF010004027BC00100046F7D0000067DA1000004027CBF010004027BC00100046F690000067D9B000004027CBF010004027BC00100046F870000067D9C000004027CBF010004027BC00100046F850000067D9D000004027BC00100046F6D0000060C120228B300000A2D19027CBF010004206C070000171773A400000A7D9A0000042B1E027CBF010004027BC00100046F6D0000060D120328B400000A7D9A000004027CBF010004027BC00100046F770000062D0772921000702B10027BC00100046F770000066F2C0000067DA6000004027CBF010004027BC00100046F8F0000067DA7000004027CBF010004027BC00100046F8B0000067D9F000004027CBF010004027BC00100046F750000067DA5000004027CBF010004027BC00100046F890000067D9E000004027CBF010004027BC00100046F910000067DA8000004027BC00100046F930000061304120428B100000A2D0E027CBF010004157DA90000042B1F027CBF010004027BC00100046F930000061305120528B200000A7DA9000004027BC00100046F950000061306120628B100000A2D0E027CBF010004157DAA0000042B1F027CBF010004027BC00100046F950000061307120728B200000A7DAA000004027BC00100046F970000061308120828B300000A2D19027CBF010004206C070000171773A400000A7DAB0000042B1F027CBF010004027BC00100046F970000061309120928B400000A7DAB00000402027BBF0100048C170000027DB001000402187DB1010004170ADE2802177DB1010004027BC10100046F3600000A3AC6FCFFFF0228B4010006160ADE070228B1010006DC062A0000411C00000400000000000000C5040000C504000007000000000000001E027BB00100042A1A73B500000A7A001B300200220000000D000011027BB10100040A061759450200000001000000010000002ADE070228B4010006DC2A00000110000002001800021A0007000000001E027BB00100042A7A02282400000A02037DB10100040228AB00000A6FAC00000A7DB20100042AB202157DB101000402027BC1010004752F0000017DC2010004027BC20100042C0B027BC20100046F1C00000A2A133002002E0000002A0000111FFE73B30100060A06027DB401000406037DB601000406047DB801000406057DBA010004060E047DBC010004062A000013300200780000002B00001128AB00000A6FAC00000A027BC50100043315027BC40100041FFE330B02167DC4010004020A2B071673BC0100060A06027BC70100047DC601000406027BC90100047DC801000406027BCB0100047DCA01000406027BCD0100047DCC01000406027BCF0100047DCE01000406027BD10100047DD0010004062A1E0228B50100062A1B3005006A05000021000011027BC40100040B074503000000050000004405000027050000383F05000002157DC4010004027CC6010004289100000A2D1C027CC6010004289200000A6F9300000A7E1500000A285900000A2C0B72D60E0070739400000A7A027CC8010004289100000A2D1C027CC8010004289200000A6F9300000A7E1500000A285900000A2C0B72340F0070739400000A7A027CCA010004289100000A2D1C027CCA010004289200000A6F9300000A7E1500000A285900000A2C0B72980F0070739400000A7A027CCC010004289100000A2D1C027CCC010004289200000A6F9300000A7E1500000A285900000A2C0B72F60F0070739400000A7A027CCE010004289100000A2D1C027CCE010004289200000A6F9300000A7E1500000A285900000A2C27027CD0010004289500000A2D0F027CD0010004289600000A166A330B7202120070739400000A7A02027CC6010004289200000A027CC8010004289200000A027CCA010004289200000A027CCC010004289200000A73F40000067DD20100040273AC0000067DD3010004027CCE010004289100000A2D3F027CCE010004289200000A6F9300000A7E1500000A286F00000A2C2302027BD20100047B7B000004027CCE010004289200000A6FCA0000067DD30100042B2102027BD20100047B7B000004027CD0010004289600000A6FCB0000067DD3010004027CD4010004FE151700000202027BD30100046FB000000A7DD601000402177DC4010004382A03000002027BD60100046F3300000A740A0000027DD5010004027CD4010004027BD50100046F630000067D94000004027CD4010004027BD50100046F650000067D95000004027CD4010004027BD50100046F670000067D96000004027CD4010004027BD50100046F830000067D97000004027CD4010004027BD50100046F790000067D98000004027CD4010004027BD50100046F6B0000067D99000004027CD4010004027BD50100046F710000067DA2000004027CD4010004027BD50100046F6F0000067DA3000004027CD4010004027BD50100046F730000067DA4000004027CD4010004027BD50100046F7B0000067DA0000004027CD4010004027BD50100046F7D0000067DA1000004027CD4010004027BD50100046F690000067D9B000004027CD4010004027BD50100046F870000067D9C000004027CD4010004027BD50100046F850000067D9D000004027BD50100046F6D0000060C120228B300000A2D19027CD4010004206C070000171773A400000A7D9A0000042B1E027CD4010004027BD50100046F6D0000060D120328B400000A7D9A000004027CD4010004027BD50100046F770000062D0772921000702B10027BD50100046F77\
-0000066F2C0000067DA6000004027CD4010004027BD50100046F8F0000067DA7000004027CD4010004027BD50100046F8B0000067D9F000004027CD4010004027BD50100046F750000067DA5000004027CD4010004027BD50100046F890000067D9E000004027CD4010004027BD50100046F910000067DA8000004027BD50100046F930000061304120428B100000A2D0E027CD4010004157DA90000042B1F027CD4010004027BD50100046F930000061305120528B200000A7DA9000004027BD50100046F950000061306120628B100000A2D0E027CD4010004157DAA0000042B1F027CD4010004027BD50100046F950000061307120728B200000A7DAA000004027BD50100046F970000061308120828B300000A2D19027CD4010004206C070000171773A400000A7DAB0000042B1F027CD4010004027BD50100046F970000061309120928B400000A7DAB00000402027BD40100048C170000027DC301000402187DC4010004170ADE2802177DC4010004027BD60100046F3600000A3AC6FCFFFF0228BD010006160ADE070228BA010006DC062A0000411C00000400000000000000610500006105000007000000000000001E027BC30100042A1A73B500000A7A001B300200220000000D000011027BC40100040A061759450200000001000000010000002ADE070228BD010006DC2A00000110000002001800021A0007000000001E027BC30100042A7A02282400000A02037DC40100040228AB00000A6FAC00000A7DC50100042AB202157DC401000402027BD6010004752F0000017DD7010004027BD70100042C0B027BD70100046F1C00000A2A13300200360000002B0000111FFE73BC0100060A06027DC701000406037DC901000406047DCB01000406057DCD010004060E047DCF010004060E057DD1010004062A000013300200780000002C00001128AB00000A6FAC00000A027BDA0100043315027BD90100041FFE330B02167DD9010004020A2B071673C50100060A06027BDC0100047DDB01000406027BDE0100047DDD01000406027BE00100047DDF01000406027BE20100047DE101000406027BE40100047DE301000406027BE60100047DE5010004062A1E0228BE0100062A1B3005006A05000021000011027BD90100040B074503000000050000004405000027050000383F05000002157DD9010004027CDB010004289100000A2D1C027CDB010004289200000A6F9300000A7E1500000A285900000A2C0B72D60E0070739400000A7A027CDD010004289100000A2D1C027CDD010004289200000A6F9300000A7E1500000A285900000A2C0B72340F0070739400000A7A027CDF010004289100000A2D1C027CDF010004289200000A6F9300000A7E1500000A285900000A2C0B72980F0070739400000A7A027CE1010004289100000A2D1C027CE1010004289200000A6F9300000A7E1500000A285900000A2C0B72F60F0070739400000A7A027CE3010004289100000A2D1C027CE3010004289200000A6F9300000A7E1500000A285900000A2C27027CE5010004289500000A2D0F027CE5010004289600000A166A330B7202120070739400000A7A02027CDB010004289200000A027CDD010004289200000A027CDF010004289200000A027CE1010004289200000A73F40000067DE70100040273AC0000067DE8010004027CE3010004289100000A2D3F027CE3010004289200000A6F9300000A7E1500000A286F00000A2C2302027BE70100047B7B000004027CE3010004289200000A6FCC0000067DE80100042B2102027BE70100047B7B000004027CE5010004289600000A6FCD0000067DE8010004027CE9010004FE151700000202027BE80100046FB000000A7DEB01000402177DD9010004382A03000002027BEB0100046F3300000A740A0000027DEA010004027CE9010004027BEA0100046F630000067D94000004027CE9010004027BEA0100046F650000067D95000004027CE9010004027BEA0100046F670000067D96000004027CE9010004027BEA0100046F830000067D97000004027CE9010004027BEA0100046F790000067D98000004027CE9010004027BEA0100046F6B0000067D99000004027CE9010004027BEA0100046F710000067DA2000004027CE9010004027BEA0100046F6F0000067DA3000004027CE9010004027BEA0100046F730000067DA4000004027CE9010004027BEA0100046F7B0000067DA0000004027CE9010004027BEA0100046F7D0000067DA1000004027CE9010004027BEA0100046F690000067D9B000004027CE9010004027BEA0100046F870000067D9C000004027CE9010004027BEA0100046F850000067D9D000004027BEA0100046F6D0000060C120228B300000A2D19027CE9010004206C070000171773A400000A7D9A0000042B1E027CE9010004027BEA0100046F6D0000060D120328B400000A7D9A000004027CE9010004027BEA0100046F770000062D0772921000702B10027BEA0100046F770000066F2C0000067DA6000004027CE9010004027BEA0100046F8F0000067DA7000004027CE9010004027BEA0100046F8B0000067D9F000004027CE9010004027BEA0100046F750000067DA5000004027CE9010004027BEA0100046F890000067D9E000004027CE9010004027BEA0100046F910000067DA8000004027BEA0100046F930000061304120428B100000A2D0E027CE9010004157DA90000042B1F027CE9010004027BEA0100046F930000061305120528B200000A7DA9000004027BEA0100046F950000061306120628B100000A2D0E027CE9010004157DAA0000042B1F027CE9010004027BEA0100046F950000061307120728B200000A7DAA000004027BEA0100046F970000061308120828B300000A2D19027CE9010004206C070000171773A400000A7DAB0000042B1F027CE9010004027BEA0100046F970000061309120928B400000A7DAB00000402027BE90100048C170000027DD801000402187DD9010004170ADE2802177DD9010004027BEB0100046F3600000A3AC6FCFFFF0228C6010006160ADE070228C3010006DC062A0000411C00000400000000000000610500006105000007000000000000001E027BD80100042A1A73B500000A7A001B300200220000000D000011027BD90100040A061759450200000001000000010000002ADE070228C6010006DC2A00000110000002001800021A0007000000001E027BD80100042A7A02282400000A02037DD90100040228AB00000A6FAC00000A7DDA0100042AB202157DD901000402027BEB010004752F0000017DEC010004027BEC0100042C0B027BEC0100046F1C00000A2A13300200360000002C0000111FFE73C50100060A06027DDC01000406037DDE01000406047DE001000406057DE2010004060E047DE4010004060E057DE6010004062A000013300200600000002D00001128AB00000A6FAC00000A027BEF0100043315027BEE0100041FFE330B02167DEE010004020A2B071673CE0100060A06027BF10100047DF001000406027BF30100047DF201000406027BF50100047DF401000406027BF70100047DF6010004062A1E0228C70100062A1B300500C304000021000011027BEE0100040B074503000000050000009D04000080040000389804000002157DEE010004027CF0010004289100000A2D1C027CF0010004289200000A6F9300000A7E1500000A285900000A2C0B72D60E0070739400000A7A027CF2010004289100000A2D1C027CF2010004289200000A6F9300000A7E1500000A285900000A2C0B72340F0070739400000A7A027CF4010004289100000A2D1C027CF4010004289200000A6F9300000A7E1500000A285900000A2C0B72980F0070739400000A7A027CF6010004289100000A2D1C027CF6010004289200000A6F9300000A7E1500000A285900000A2C0B72F60F0070739400000A7A02027CF0010004289200000A027CF2010004289200000A027CF4010004289200000A027CF6010004289200000A73F40000067DF80100040273AC0000067DF901000402027BF80100047B7B0000046FCE0000067DF9010004027CFA010004FE151700000202027BF90100046FB000000A7DFC01000402177DEE010004382A03000002027BFC0100046F3300000A740A0000027DFB010004027CFA010004027BFB0100046F630000067D94000004027CFA010004027BFB0100046F650000067D95000004027CFA010004027BFB0100046F670000067D96000004027CFA010004027BFB0100046F830000067D97000004027CFA010004027BFB0100046F790000067D98000004027CFA010004027BFB0100046F6B0000067D99000004027CFA010004027BFB0100046F710000067DA2000004027CFA010004027BFB0100046F6F0000067DA3000004027CFA010004027BFB0100046F730000067DA4000004027CFA010004027BFB0100046F7B0000067DA0000004027CFA010004027BFB0100046F7D0000067DA1000004027CFA010004027BFB0100046F690000067D9B000004027CFA010004027BFB0100046F870000067D9C000004027CFA010004027BFB0100046F850000067D9D000004027BFB0100046F6D0000060C120228B300000A2D19027CFA010004206C070000171773A400000A7D9A0000042B1E027CFA010004027BFB0100046F6D0000060D120328B400000A7D9A000004027CFA010004027BFB0100046F770000062D0772921000702B10027BFB0100046F770000066F2C0000067DA6000004027CFA010004027BFB0100046F8F0000067DA7000004027CFA010004027BFB0100046F8B0000067D9F000004027CFA010004027BFB0100046F750000067DA5000004027CFA010004027BFB0100046F890000067D9E000004027CFA010004027BFB0100046F910000067DA8000004027BFB0100046F930000061304120428B100000A2D0E027CFA010004157DA90000042B1F027CFA010004027BFB0100046F930000061305120528B200000A7DA9000004027BFB0100046F950000061306120628B100000A2D0E027CFA010004157DAA0000042B1F027CFA010004027BFB0100046F950000061307120728B200000A7DAA000004027BFB0100046F970000061308120828B300000A2D19027CFA010004206C070000171773A400000A7DAB0000042B1F027CFA010004027BFB0100046F970000061309120928B400000A7DAB00000402027BFA0100048C170000027DED01000402187DEE010004170ADE2802177DEE010004027BFC0100046F3600000A3AC6FCFFFF0228CF010006160ADE070228CC010006DC062A00411C00000400000000000000BA040000BA04000007000000000000001E027BED0100042A1A73B500000A7A001B300200220000000D000011027BEE0100040A061759450200000001000000010000002ADE070228CF010006DC2A00000110000002001800021A0007000000001E027BED0100042A7A02282400000A02037DEE0100040228AB00000A6FAC00000A7DEF0100042AB202157DEE01000402027BFC010004752F0000017DFD010004027BFD0100042C0B027BFD0100046F1C00000A2A13300200260000002D0000111FFE73CE0100060A06027DF101000406037DF301000406047DF501000406057DF7010004062A0000133002002C0000002E00001102A5180000020A0312007BAC000004289C00000A81110000010412007BAD000004289C00000A81110000012A1B300400180100002F0000110F00289100000A2D180F00289200000A6F9300000A7E1500000A285900000A2C0B72D60E0070739400000A7A0F01289100000A2D180F01289200000A6F9300000A7E1500000A285900000A2C0B72340F0070739400000A7A0F02289100000A2D180F02289200000A6F9300000A7E1500000A285900000A2C0B727A120070739400000A7A0F03289100000A2D180F03289200000A6F9300000A7E1500000A285900000A2C0B72D2120070739400000A7A73D90000060A0F00289200000A0F01289200000A0F02289200000A0F03289200000A28F20000060ADE0D0B076F4400000A739400000A7A1202FE15180000021202066FCF0000067DAC0000041202066FD10000067DAD00000473B700000A0D09086FB800000A092A011000000000B60024DA000D070000011E02282400000A2A1E027BAE0000042A2202037DAE0000042A6A0228180100062C0C0228180100066F170000062A7E1500000A2A3E0203289400000A020428190100062A4202030528B900000A020428190100062AD202281D00000A2C067E1500000A2A02722A1300701728BA00000A2D067E1500000A2A02724E1300701728BB00000A6F4300000A2A1E02282400000A2A3E02037269020070282001000626032A00001B3008000902000030000011140B7282130070036F15000006288600000A036F1900000604036F0B000006036F0D000006036F0F000006036F1100000628E90000060BDE690C086FBC00000A6FBD00000A72BC130070285900000A2C0B72D813007073BE00000A7A086F4400000A0308731C0100067A0D030928210100060373AC0000066F200000060373620000066F1E00000603130BDD76010000130411046F4400000A031104731C0100067A076FBF00000A72DB1400706FC000000A281D00000A2D2003076FBF00000A72DB1400706FC000000A28C100000A73C200000A6F22000006076FBF00000A72011500706FC000000A281D00000A2D2003076FBF00000A72011500706FC000000A28C100000A73C200000A6F24000006076FBF00000A722F1500706FC000000A281D00000A2D390320B2070000171716161616737200000A130C120C076FBF00000A722F1500706FC000000A28C300000A28C400000A73C500000A6F26000006076F3D00000A130572921000701306110528C600000A73C700000A0A066F3F00000A1306066FC800000A110672551500706F5B00000A2D13725515007011067259150070285E00000A130673C900000A130773CA00000A1308110773CB00000A1309110873CC00000A130A03110A110911066FCD00000A6FCE00000A6F18000006DE0C11052C0711056F1C00000ADC020328220100061001DE0A072C06076FCF00000ADC032A110B2A000000417C00000000000002000000370000003900000031000000660000010000000002000000370000006A000000260000000800000100000000020000003700000090000000120000000700000102000000680100007B000000E30100000C0000000000000002000000A200000058010000FA0100000A00000000000000133003002501000031000011036FD000000A1D330F036FD100000A6FD200000A166A330E036F4400000A0203731C0100067A036FD100000A740E0000010A066FD200000A166A311D066F3D00000A28C600000A73C700000A0B02076F3F00000A6F1800000602036F1C000006026F1700000673320100060C086F310100062C1B086F2F010006201001000033012A086F3001000602731B0100067A066FD300000A0D0920300100003B830000000920900100005945050000001E00000031000000550000001E000000630000000920F40100005945040000002100000039000000210000002D0000002B37026F17000006281D0100060203731C0100067A725D15007002731B0100067A728715007002731B0100067A72CB15007002731B0100067A036F4400000A0203731C0100067A2A00000013300300EA00000032000011032C12036F170000067E1500000A285900000A2C02142A73D400000A0A06036F170000066FD500000A066FD600000A39AE000000036F090000060B07450600000002000000150000003B00000028000000580000006B0000002B7C03066FD600000A28240100066F1E0000062B7403066FD600000A28290100066F200000062B6103066FD600000A28270100066F1E0000062B4E03066FD600000A72351600706FD700000A282A0100066F200000062B3103066FD600000A282B0100066F200000062B1E03066FD600000A28250100066F1E0000062B0B7259160070739400000A7A032823010006032A00001B3002006F01000033000011026F210000060C120228B100000A2D22026F230000060D120328B100000A2D12026F250000061304120428B300000A2D012A026F1D0000063993000000026F1D000006026F210000066F56000006026F1D000006026F230000066F58000006026F1D000006026F250000066F5A000006026F1D0000066FB000000A13052B3111056F3300000A74080000020A06026F210000066F4F00000606026F230000066F5100000606026F250000066F5300000611056F3600000A2DC6DE151105752F000001130611062C0711066F1C00000ADC026F1F0000063993000000026F1F000006026F210000066F9C000006026F1F000006026F230000066F9E000006026F1F000006026F250000066FA0000006026F1F0000066FB000000A13072B3111076F3300000A740A0000020B07026F210000066F9400000607026F230000066F9600000607026F250000066F9800000611076F3600000A2DC6DE151107752F000001130811082C0711086F1C00000ADC2A00011C000002007D003EBB00150000000002001B013E590115000000001B300400760000003400001173620000060A0272951600706FD800000A6FD900000A0D2B3D096F3300000A74180000010B060728260100066F5D00000626DE220C72AD160070086F4400000A72CD160070076FDA00000A28DB00000A739400000A7A096F3600000A2DBBDE1409752F000001130411042C0711046F1C00000ADC062A0000011C0000000025000F340022070000010200170049600014000000001B300400760000003400001173620000060A0272D31600706FD800000A6FD900000A0D2B3D096F3300000A74180000010B060728260100066F5D00000626DE220C7207170070086F4400000A72CD160070076FDA00000A28DB00000A739400000A7A096F3600000A2DBBDE1409752F000001130411042C0711046F1C00000ADC062A0000011C0000000025000F340022070000010200170049600014000000001B300400DD0200003500001173540000060A06166F3F000006022D02142A060272290200706FDC00000A6FDD00000A28DE00000A6F2B0000060602723B1700706FDC00000A6FDD00000A282D0100066F290000060602721F0200706FDC00000A6FDD00000A6F2D000006060272511700706FDC00000A6FDD00000A6F2F00000602725F1700706FDC00000A6FDD00000A120128DF00000A2C0906076F330000062B0706166F3300000602725B0300706FDC00000A6FDD00000A7E1500000A286F00000A2C1B0602725B0300706FDC00000A6FDD00000A28DE00000A6F370000060272731700706FDC00000A6FDD00000A7E1500000A286F00000A2C1B060272731700706FDC00000A6FDD00000A28DE00000A6F3900000602729B1700706FDC00000A6FDD00000A120228DF00000A2606086F35000006060272AF1700706FDC00000A282C0100066F3B0000060272B91700706FDC00000A2C16060272B91700706FDC00000A282C0100066F3B0000060272C71700706FDC00000A2C16060272C71700706FDC00000A282C0100066F3D0000060272DB1700706FDC00000A6FDD00000A7E1500000A286F00000A2C7A0272DB1700706FDC00000A0D060972290200706FDC00000A6FDD00000A6F41000006060972E71700706FDC00000A6FDD00000A6F43000006060972F11700706FDC00000A6FDD00000A6F45000006060972051800706FDC00000A6FDD00000A6F470000060609721B1800706FDC00000A6FDD00000A6F4900000602722B1800706FDC00000A39AF00000002722B1800706FDC00000A6FDD00000A7E1500000A286F00000A3990000000161304188D2C000001130502722B1800706FDC00000A72431800706FE000000A6FD900000A13072B1F11076F3300000A7419000001130611051104251758130411066FDD00000AA211076F3600000A2DD8DE151107752F000001130811082C0711086F1C00000ADC061105169A28C300000A739A00000A6F4D000006061105179A28C300000A739A00000A6F4B000006062A00000001100000020072022C9E0215000000001B300400760000003400001173620000060A0272951600706FD800000A6FD900000A0D2B3D096F3300000A74180000010B060728280100066F5D00000626DE220C724D180070086F4400000A72CD160070076FDA00000A28DB00000A739400000A7A096F3600000A2DBBDE1409752F000001130411042C0711046F1C00000ADC062A0000011C0000000025000F3400220700000102001700496000140000000013300300EC00000036000011022D02142A73540000060A06176F3F000006060272290200706FDC00000A6FDD00000A28DE00000A6F2B0000060602723B1700706FDC00000A6FDD00000A282D0100066F290000060602721F0200706FDC00000A6FDD00000A6F2D00000602729B1700706FDC00000A2C3702725B0300706FDC00000A6FDD00000A7E1500000A286F00000A2C1B0602729B1700706FDC00000A6FDD00000A28E100000A6F35000006060272B91700706FDC00000A282C0100066F3B000006060272791800706FDC00000A6FDD00000A28C100000A6A6F31000006060272C71700706FDC00000A282C0100066F3D000006062A1B3004007B00000037000011022D02142A73AC0000060A0272951600706FD800000A6FD900000A0D2B3D096F3300000A74180000010B0607282C0100066FA700000626DE220C7293180070086F4400000A72CD160070076FDA00000A28DB00000A739400000A7A096F3600000A2DBBDE1409752F000001130411042C0711046F1C00000ADC062A00011C000000002A000F3900220700000102001C0049650014000000001B3004007B00000037000011022D02142A73AC0000060A0272AD1800706FD800000A6FD900000A0D2B3D096F3300000A74180000010B0607282C0100066FA700000626DE220C72BB180070086F4400000A72CD160070076FDA00000A28DB00000A739400000A7A096F3600000A2DBBDE1409752F000001130411042C0711046F1C00000ADC062A00011C000000002A000F3900220700000102001C0049650014000000001B3004007B00000037000011022D02142A73AC0000060A0272DD1800706FD800000A6FD900000A0D2B3D096F3300000A74180000010B0607282C0100066FA700000626DE220C72FF180070086F4400000A72CD160070076FDA00000A28DB00000A739400000A7A096F3600000A2DBBDE1409752F000001130411042C0711046F1C00000ADC062A00011C000000002A000F3900220700000102001C004965001400000000133003001203000038000011022D02142A739A0000060A060272290200706FDC00000A6FDD00000A28DE00000A6F64000006060272E71700706FDC00000A6FDD00000A6F66000006060272070200706FDC00000A6FDD00000A6F68000006060272271900706FDC00000A6FDD00000A6F6A000006060272391900706FDC00000A6FDD00000A6F6C0000060602723B1700706FDC00000A6FDD00000A282D01000673C500000A6F6E000006060272511900706FDC00000A6FDD00000A28E100000A6F7A000006060272631900706FDC00000A6FDD00000A6F7C000006060272871900706FDC00000A6FDD00000A6F7E0000060602728F1900706FDC00000A6FDD00000A6F80000006060272C91900706FDC00000A6FDD00000A28E100000A6F82000006060272F91900706FDC00000A6FDD00000A28E100000A6F8400000602720D1A00706FDC00000A6FDD00000A120128E200000A2C0C060773C200000A6F86000006060272231A00706FDC00000A6FDD00000A6F88000006060272371A00706FDC00000A6FDD00000A28E100000A6F8A0000060602724F1A00706FDC00000A6FDD00000A6F8C0000060272591A00706FDC00000A6FDD00000A281D00000A2D1B060272591A00706FDC00000A6FDD00000A28E100000A6F8E0000060272751A00706FDC00000A6FDD00000A281D00000A2D1B060272751A00706FDC00000A6FDD00000A28E100000A6F900000060272891A00706FDC00000A2C1B060272891A00706FDC00000A6FDD00000A28E100000A6F920000060272971A00706FDC00000A2C1D060272971A00706FDC00000A6FDD00000A28C100000A6F700000062B0706156F700000060272B71A00706FDC00000A2C1D060272B71A00706FDC00000A6FDD00000A28C100000A6F720000062B0706156F720000060272D31A00706FDC00000A2C1D060272D31A00706FDC00000A6FDD00000A28C100000A6F740000062B0706156F740000060272F11A00706FDC00000A2C1D060272F11A00706FDC00000A6FDD00000A28C100000A6F760000062B0706156F7600000602724D0300706FDC00000A2C160602724D0300706FDC00000A28260100066F78000006062A000013300500BD00000039000011720B1B007073E300000A0A06026FE400000A0B72541C00701C8D040000010D0916076F4100000A72841C00706F4200000A6F4300000AA20917076F4100000A72981C00706F4200000A6F4300000AA20918076F4100000A72A01C00706F4200000A6F4300000AA20919076F4100000A72AA1C00706F4200000A6F4300000AA2091A076F4100000A72B41C00706F4200000A6F4300000AA2091B076F4100000A72C21C00706F4200000A6F4300000AA20928E500000A28E600000A0C082A92026FE700000A2C0902036FDC00000A2D067E1500000A2A02036FDC00000A6FE800000A2A1E027BB00000042A1E027BB10000042A1E027BB20000042A000003300400430000000000000002282400000A0372D01C00701728BB00000A6F4300000A027CB000000428E200000A2C1E02177DB2000004020372081D00701728BB00000A6F4300000A7DB10000042A0042534A4201000100000000000C00000076322E302E35303732370000000005006C00000038560000237E0000A45600005035000023537472696E677300000000F48B0000481D0000235553003CA900001000000023475549440000004CA90000406B000023426C6F620000000000000002000001579FA20B0902000000FA25330016000001000000740000002E000000FD010000CF010000B80100005A000000E8000000140000002402000001000000390000001C0000007E000000D40000007E0000001200000001000000060000001500000000000A00010000000000060013020C02060018020C02060045022A02060052020C0206006C02590206007B020C02060085020C020A0031052605060098050C020600ED050C020600B41559020600FC160C020A001E180C020A00381826050A00871868180E00761961190E007F1961190E00891961190E00C81961190E00D41961190E00DF1961190600FD1959021200341A00001600341C291C1600651C291C0E00631E481E0600981E791E06003F1F2D1F0600561F2D1F0600731F2D1F0600921F2D1F0600AB1F2D1F0600C41F2D1F0600DF1F2D1F0600FA1F2D1F06001320791E06002720791E060035202D1F06004E202D1F06008B206B200600AB206B200600DA206B200600F5200C02060015210C020F0022210000B7003921000006006E210C02060090210C020600A5212D1F0600BC2159020600CB2159020600D72159020600E3210C020600FD210C020A0013222605060029221F22060042221F2206004F221F220A00642268180A006A2268180A00852268180A008B2268180600B2229D220600D1220C020A0004236818060027231B230F0039210000060049232A020A00602326050A006E23260506009A238A230A00D82326050A00EA2326050A\
-00272426050A00662447240A009E242A020600B1242A023301392100000600BF240C020600F2240C0206001B250C02060022250C02060032250C0206003E250C0206006125442506006A251B230600862544250600A12544250600F825791E06000E26791E060020262D1F06003E262D1F060053260C020E008526481E0600C8262A020600D6262A0206009C2989290600C529B4290600572A0C0206003D332A020A0044336818060059338A2306006B330C02060083332D1F1A00D633C1331A00E933C1331A000834FC331A001E3413341A002834C1331A00423435341A005634C1330A00693426050A008E3426051600AC34291C1600E534291C060018350C020000000001000000000001000100010100001F003D000500010001000100100053003D000900050001000101000074003D00050007000600012010008A003D00060011000600010100009C003D0005001100090001201000BB003D0011001800090001201000CE003D0011002700280001201000DC003D0015003D00550001201000F4003D001100400063000120100000013D0015005B009B000100100016013D0011006000AD000100100032013D0011006400B2000100100047013D0011006800BF00010010005A013D0011006C00CF00012010006D013D0011007100DA008101100079013D0011007500E3008101100086013D0011007600F2000801100093013D0019007600F300010010009D013D0011007900F40001001000A501000011007C00F6000B011000AD01000019007C0018010B011000BB0100001900940018010B011000C80100001900AC00180101001000D2013D001D00AE00180100001000E7013D001100AF001E0100001000F6013D001100B0002F0103011000AF2600001100B300330100000000F22900001100C8003C0103011000812A00001100C9003C01030110001C2B00001100DE00450103011000652B00001100EE004D0103011000B32B00001100FE00550103011000022C000011000E015D0103011000492C000011001E01650103011000DF2C000011002F016E0103011000732D000011004001770103011000D62D0000110050017F0103011000902E000011006401880103011000322F000011007901910103011000C52F000011008A019A01030110005830000011009D01A30103011000ED3000001100B001AC0103011000853100001100C301B50103011000173200001100D801BE0103011000AB3200001100ED01C70106068F0212005680970215005680B00215005680C002150001000E03460001002903150006068F02120056805203460056805503460056805B03460056806303460056806903460056806F03460056807403460056807B03460056808603460006068F0212005680A00382005680A70382005680AD0382005680B70382005680C60382005680D303820001001C06820001004B06F20001006806F20001008806F2000100A506F2000100C806F2000100E006F2000100FB06F20001001507F50001003107FD0001005407010101006E0705010100850709010100A00709010100C40710010100D70A83010100F00A87010100040BF2000100C806F20001001A0B87010100370B8A010100540B8A010100710B87010100940B87010100B50B8D010100D20B8D010100ED0B8A0101000E0CF2000100270CF2000100420CF2000100610CF20001007C0CF20001009A0C91010100B90C91010100850709010100A00709010100C40710010100850709010100A00709010100C40710010100F00A87010100FB10F20001001511F20001003111F20001004B11F2000100681110010100831112000100A61112000100C71112000100E911120001001812E501010030128A0101004C12F20001006D12F20001008912F2000100B4128A010100DB128A010100F812090101001313F20001002D138A0101004B13F200010065138A01010084138A0101009F138A010100850709010100A00709010100C40710010100850709010100A00709010100C407100101002515870101004115870121007B15F20021008715F20021009615F2002100A215F20021007B15F20021008715F20021009615F2002100A215F20021007B15F20021008715F20021009615F2002100A215F20001004817F20001005F17F20001007C176E0201001511F20001009417F20001008806F2000100A506F20001004B06F20001006806F2005180E417F20036003319120036003919120036003F1912000600B703EE0206003014F20206004519F6020600520387010600D90C830106000A0D870106001C0D87010600FE0C8A010600F20C8A0106003B08F2000600E10CF2000600E60C87010600A314F20006007B03F2000600B713F2000600740387010600C013F2000600460DF20006004E0DF2000600580DF2000600660DF2000600700DF20006007D0D910106008B0D910106007B0812000600850812000600980883010600520387010600B713F20006007B03F20006008D148A01060037148A010600C913F20006002E1B83010600C013F2000600A314F2000600991409010600AC148A010600B914F20006004214F20006005214F2000600381B12000600DF1312000600011412000600121412000600451BF2000600501B8A010600DA148A0106007B08120006008508120006009808830106001D08F20006002908F2000100991B60045180C91BF2000100071D120001000E1DF2000100181D8A0101005527F40C0100EA2712000100F527120006000208F20006003528F20006000E08F20006004628F20006001D08F20006005A28F20006002908F20006006B28F2000600A51EF20006008228F2000600831DF70C06009328F70C0600AB28FB0C0600BA2801010600DA28FF0C0600EA28E50106000029030D06000B29080D1300372A1C0D01005527F40C0100EA2712000100F5271200060002082E2B060035282E2B06000E082E2B060046282E2B06001D082E2B06005A282E2B060029082E2B06006B282E2B0600B61D322B0600932A322B0600831D362B06009328362B0600A12AFB0C0600B02A01010600D02AFF0C0600E02AE5010600F62A030D0600012B080D01005527F40C0100EA2712000100F5271200060002082E2B060035282E2B06000E082E2B060046282E2B06001D082E2B06005A282E2B060029082E2B06006B282E2B0600B61D322B0600932A322B06002D2BFB0C06003D2BE5010600542BFF0C01005527F40C0100EA2712000100F5271200060002082E2B060035282E2B06000E082E2B060046282E2B06001D082E2B06005A282E2B060029082E2B06006B282E2B0600B61D322B0600932A322B06007B2BFB0C06008B2BE5010600A22BFF0C01005527F40C0100EA2712000100F5271200060002082E2B060035282E2B06000E082E2B060046282E2B06001D082E2B06005A282E2B060029082E2B06006B282E2B0600B61D322B0600932A322B0600CA2BFB0C0600DA2BE5010600F12BFF0C01005527F40C0100EA2712000100F5271200060002082E2B060035282E2B06000E082E2B060046282E2B06001D082E2B06005A282E2B060029082E2B06006B282E2B0600B61D322B0600932A322B0600112CFB0C0600212CE5010600382CFF0C01005527F40C0100EA2712000100F5271200060002082E2B060035282E2B06000E082E2B060046282E2B06001D082E2B06005A282E2B060029082E2B06006B282E2B06005D2CFF0C06006E2C050106008D2C273E0600A32C8D010600B82C030D0600C42C080D01005527F40C0100EA2712000100F5271200060002082E2B060035282E2B06000E082E2B060046282E2B06001D082E2B06005A282E2B060029082E2B06006B282E2B0600F12CFF0C0600022D05010600212D273E0600372D8D0106004C2D030D0600582D080D01005527F40C0100EA2712000100F5271200060002082E2B060035282E2B06000E082E2B060046282E2B06001D082E2B06005A282E2B060029082E2B06006B282E2B0600B11E2E2B0600822D2E2B06009A2DFF0C0600AB2D8D010600C02D273E01005527F40C0100EA2712000100F5271200060002082E2B060035282E2B06000E082E2B060046282E2B06001D082E2B06005A282E2B060029082E2B06006B282E2B06007B032E2B0600E82D2E2B0600F82DFF0C0600092E8D0106001F2E050106003E2E273E0600542E8D010600692E030D0600752E080D01005527F40C0100EA2712000100F5271200060002082E2B060035282E2B06000E082E2B060046282E2B06001D082E2B06005A282E2B060029082E2B06006B282E2B06007B032E2B0600E82D2E2B06007403322B0600A42E322B0600B02EFF0C0600C12E05010600E02E273E0600F62E8D0106000B2F030D0600172F080D01005527F40C0100EA2712000100F5271200060002082E2B060035282E2B06000E082E2B060046282E2B06001D082E2B06005A282E2B060029082E2B06006B282E2B0600432FFF0C0600542F05010600732F273E0600892F8D0106009E2F030D0600AA2F080D01005527F40C0100EA2712000100F5271200060002082E2B060035282E2B06000E082E2B060046282E2B06001D082E2B06005A282E2B060029082E2B06006B282E2B06007B032E2B0600E82D2E2B0600D62FFF0C0600E72F050106000630273E06001C308D0106003130030D06003D30080D01005527F40C0100EA2712000100F5271200060002082E2B060035282E2B06000E082E2B060046282E2B06001D082E2B06005A282E2B060029082E2B06006B282E2B06007B032E2B0600E82D2E2B06006B30FF0C06007C30050106009B30273E0600B1308D010600C630030D0600D230080D01005527F40C0100EA2712000100F5271200060002082E2B060035282E2B06000E082E2B060046282E2B06001D082E2B06005A282E2B060029082E2B06006B282E2B0600B61D322B0600932A322B06000331FF0C06001431050106003331273E060049318D0106005E31030D06006A31080D01005527F40C0100EA2712000100F5271200060002082E2B060035282E2B06000E082E2B060046282E2B06001D082E2B06005A282E2B060029082E2B06006B282E2B06007B032E2B0600E82D2E2B06007403322B0600A42E322B06009531FF0C0600A63105010600C531273E0600DB318D010600F031030D0600FC31080D01005527F40C0100EA2712000100F5271200060002082E2B060035282E2B06000E082E2B060046282E2B06001D082E2B06005A282E2B060029082E2B06006B282E2B06007B032E2B0600E82D2E2B06007403322B0600A42E322B06002932FF0C06003A32050106005932273E06006F328D0106008432030D06009032080D01005527F40C0100EA2712000100F5271200060002082E2B060035282E2B06000E082E2B060046282E2B06001D082E2B06005A282E2B060029082E2B06006B282E2B0600BB32FF0C0600CC3205010600EB32273E060001338D0106001633030D06002233080DD020000000008608D60228000100D820000000008608E4022D000100E120000000008608F20233000200E920000000008608FD0238000200F22000000000861808033E00030008210000000086008D037200050088220000000086009C0377000600D62200000000861808037E000800DE22000000008308E60386000800E62200000000830808048B000800EF220000000086082A0491000900F7220000000086083A049500090000230000000086084A0491000A0008230000000086085D0495000A001123000000008608700491000B001923000000008608800495000B002223000000008608900491000C002A23000000008608A60495000C003323000000008608BC0491000D003B23000000008608C70495000D004423000000008608D20491000E004C23000000008608E00495000E005523000000008608EE0491000F005D23000000008608FB0495000F00662300000000860808059A0010006E230000000086081705A300100077230000000086083E05AD0011007F230000000086085405B200110088230000000086086A05B800120090230000000086087705BD00120099230000000086088405C3001300A1230000000086088E05C8001300AA23000000008608A305CE001400B223000000008608B105D6001400BB23000000008608BF05CE001500C323000000008608D605D6001500CC23000000008608F605DF001600D4230000000086080906E8001600DD2300000000861808037E001700E523000000008608A7084A011700ED23000000008608B3084F011700F623000000008608BF0855011800FE23000000008608C608590118000724000000008608CD08910019000F24000000008608D608950019001824000000008608BC0491001A002024000000008608C70495001A002924000000008608DF0855011B003124000000008608EF0859011B003A24000000008608FF085E011C0042240000000086080F0962011C004B240000000086081F095E011D0053240000000086082F0962011D005C240000000086083F0955011E006424000000008608550959011E006D240000000086086B0955011F0075240000000086087F0959011F007E240000000086089309670120008624000000008608A3096C0120008F24000000008608B309670121009724000000008608C1096C012100A024000000008608CF095E012200A824000000008608E30962012200B124000000008608F70991002300B924000000008608030A95002300C2240000000086080F0A91002400CA240000000086081D0A95002400D3240000000086082B0A91002500DB240000000086083D0A95002500E4240000000086084F0A91002600EC240000000086085D0A95002600F5240000000086086B0A91002700FD240000000086087C0A9500270006250000000086088D0A720128000E250000000086089F0A7A0128001725000000008608B10A720129001F25000000008608C40A7A0129002825000000008608A305CE002A003025000000008608B105D6002A003925000000008608BF05CE002B004125000000008608D605D6002B004A25000000008608F605DF002C0052250000000086080906E8002C005B2500000000861808037E002D006325000000008608A305CE002D006B25000000008608B105D6002D007425000000008608BF05CE002E007C25000000008608D605D6002E008525000000008608F605DF002F008D250000000086080906E8002F0096250000000086089A0DB2013000A925000000008608A30DB8013100B8250000000086009C03BF013300C625000000008600AC0DBF013400D425000000008600B40DB8013500E325000000008600BB0DC5013700F125000000008600C20DCB013800FF2500000000861808037E0039000726000000008608BF08550139000F26000000008608C608590139001826000000008608D00D91003A002026000000008608DD0D95003A002926000000008608EA0D91003B003126000000008608F90D95003B003A26000000008608080E91003C004226000000008608150E95003C004B26000000008608220E91003D005326000000008608320E95003D005C26000000008608420EDF003E006426000000008608500EE8003E006D260000000086085E0ED7013F007526000000008608740EDB013F007E260000000086088A0ED701400086260000000086089E0EDB0140008F26000000008608B20ED70141009726000000008608C70EDB014100A026000000008608DC0ED7014200A826000000008608FE0EDB014200B126000000008608200FE0014300B9260000000086082B0FC5014300C226000000008608360F5E014400CA26000000008608450F62014400D326000000008608540F91004500DB26000000008608680F95004500E4260000000086087C0F91004600EC260000000086088B0F95004600F5260000000086089A0F91004700FD26000000008608B80F950047000627000000008608D60F5E0148000E27000000008608F00F6201480017270000000086080A105E0149001F270000000086081A106201490028270000000086082A10CE004A0030270000000086083810D6004A003927000000008608461091004B004127000000008608531095004B004A2700000000860860105E014C005227000000008608711062014C005B27000000008608821091004D0063270000000086088F1095004D006C270000000086089C105E014E007427000000008608AE1062014E007D27000000008608C0105E014F008527000000008608CE1062014F008E27000000008608DC105E0150009627000000008608E710620150009F27000000008608A305CE005100A727000000008608B105D6005100B027000000008608BF05CE005200B827000000008608D605D6005200C127000000008608F605DF005300C9270000000086080906E8005300D22700000000C600F21091005400EE2700000000861808037E005400F627000000008608A305CE005400FE27000000008608B105D60054000728000000008608BF05CE0055000F28000000008608D605D60055001828000000008608F605DF00560020280000000086080906E80056002928000000008608E114550157003128000000008608F014590157003A28000000008608FF145501580042280000000086081215590158004B280000000086089A0DF20159005E28000000008608A30DF8015A006D280000000086009C03FF015C007B28000000008600AC0DFF015D008928000000008600B40DF8015E009828000000008600BB0D6C016000A628000000008600C20D05026100B42800000000861808037E006200BC28000000008618080311026200E428000000008600B70319026600CC29000000008600BE1519026700B42A000000008600D11520026800502B000000008600D51527026A00E62B000000008618080311026B000C2C000000008600DD1519026F00F42C000000008600EA1519027000DC2D000000008600F71519027100C42E00000000860000162D027200C42F000000008600D515270276004430000000008600071627027700DC300000000086000C1619027800C4310000000086001E16270279005C320000000086002D1627027A00F4320000000086003D1619027B00DC330000000086004A1642027C00D434000000008600531627027E005835000000008618080311027F00803500000000860007164A02830018360000000086005B165002840098360000000086006716C300850008370000000086007116C30085007837000000008600791656028500043800000000860084165D0286008C3800000000860084165002870018390000000086009116C3008800883900000000860098165D028800103A000000008600A2165D028900983A000000008600AE165D028A00203B000000008600AE1650028B00AC3B000000008600B7165D028C00343C000000008600B71650028D00C03C000000008600C216C3008E002E3D000000008608C81691008E00363D000000008608D21695008E003F3D000000008608DC1691008F00473D000000008608EC1695008F00503D000000008608041763029000583D0000000086080F1768029000613D000000008608EA0D91009100693D000000008608F90D95009100723D0000000086081A17910092007A3D000000008608311795009200833D00000000861808037E0093008B3D000000008608700491009300933D0000000086088004950093009C3D000000008608900491009400A43D000000008608A60495009400AD3D0000000086082A0491009500B53D0000000086083A0495009500BE3D0000000086084A0491009600C63D0000000086085D0495009600CF3D00000000861808037E009700D73D000000009600F2178A029700E83D000000009600F21791029900EC3E000000009600021899029C0038400000000096001118A202A000E6400000000096002218A702A100F0400000000096002218AD02A20040410000000093004818B402A400CC430000000091008D18C502AB00DC43000000009100A018CB02AC008044000000009100B718CB02AD008445000000009100D318D502AE00D045000000009100E518D502AE000446000000009100F318D902AE0060470000000091000C19E802B300F8470000000091001919CB02B400AC4800000000960023199902B500244A00000000911819260609B9007C4A00000000861808031102B900B44A0000000093004A19D502BD00104B0000000096000016FA02BD00704C00000000960093190F03C500804D000000009600A1191E03CA00B04E000000009600B3190F03D000C04F000000009100E8192F03D500A458000000009100091A7C03EE00E858000000009600431A9103F400D459000000009600531A9103F900C05A0000000096005F1A9103FE00AC5B0000000096006F1A91030301985C0000000096007B1A91030801845D000000009600881A91030D01705E000000009600981A910312015465000000009600A81AA0031701806A000000009600B41AB1031D01A46F0000000096001E16B1032201C8740000000096002D16B1032701EC790000000096005316B1032C01287A000000009100BE1AC0033101A882000000009600D21A0D044A01E088000000009600DF1A0D044E01408E000000009600EA1A1A045201E89400000000960079161A045701E89B000000009600841629045C0130A2000000009600F21A0D046201B4A800000000960098161A04660140AF000000009600A2161A046B0198B5000000009600FC1AB103700198BC000000009600AE1629047501A0C3000000009600B71629047B01E8C90000000096000B1B0D0481011CCA000000009100141B3A04850154CA000000009600281B0D04880188CB00000000861808037E008C0190CB0000000086085C1B45048C0198CB0000000086086C1B4A048C01A1CB0000000086087C1B91008D01BCCB000000008618080350048D01CCCB000000008618080357048F01DDCB000000009600871BA202920112CC00000000861808037E0093011ACC000000008600D81BA20493012CCC000000008600D81BA9049401C0CE000000009100EA1BB1049601F4CF000000008100FD1BA2049801ECD00000000091000F1CB904990184D20000000091003F1CBF049A0124D30000000091004D1CBF049B01C4D30000000091006D1CC6049C01C0D60000000091007D1CBF049D0160D7000000009100911CC6049E0158D8000000009100A81CCD049F01FCD8000000009100B31CD404A001A0D9000000009100C21CCD04A10144DA000000009100D41CDB04A20164DD000000009100E21CE204A3012DDE000000009100F21CE804A40152DE000000008608291DD701A6015ADE000000008608321D9100A60162DE0000000086083E1D5E01A6016CDE00000000861808039500A601345200000000E101E426E10CA701B85200000000E10128276806A701C05200000000E10165215E01A701005800000000E10962276E06A701085800000000E101A4277E00A701105800000000E101CF277E00A701505800000000E1090A286E06A70158580000000086180803DB01A701775800000000810016297E00A8015C5F00000000E101E426E10CA801E05F00000000E10128276806A801E85F00000000E10165215E01A801B06400000000E10962276E06A801B86400000000E101A4277E00A801C06400000000E101CF277E00A801006500000000E1090A286E06A80108650000000086180803DB01A80127650000000081000D2B7E00A901986500000000E101E426E10CA901106600000000E10128276806A901186600000000E10165215E01A901486A00000000E10962276E06A901506A00000000E101A4277E00A901576A00000000E101CF277E00A901596A00000000E1090A286E06A901616A0000000086180803DB01A901BC6A00000000E101E426E10CAA01346B00000000E10128276806AA013C6B00000000E10165215E01AA016C6F00000000E10962276E06AA01746F00000000E101A4277E00AA017B6F00000000E101CF277E00AA017D6F00000000E1090A286E06AA01856F0000000086180803DB01AA01E06F00000000E101E426E10CAB01587000000000E10128276806AB01607000000000E10165215E01AB01907400000000E10962276E06AB01987400000000E101A4277E00AB019F7400000000E101CF277E00AB01A17400000000E1090A286E06AB01A9740000000086180803DB01AB01047500000000E101E426E10CAC017C7500000000E10128276806AC01847500000000E10165215E01AC01B47900000000E10962276E06AC01BC7900000000E101A4277E00AC01C37900000000E101CF277E00AC01C57900000000E1090A286E06AC01CD790000000086180803DB01AC01A47C00000000E101E426E10CAD01107D00000000E10128276806AD01187D00000000E10165215E01AD01048200000000E10962276E06AD010C8200000000E101A4277E00AD01148200000000E101CF277E00AD01548200000000E1090A286E06AD015C820000000086180803DB01AD017B82000000008100D02C7E00AE01DC8200000000E101E426E10CAE01488300000000E10128276806AE01508300000000E10165215E01AE013C8800000000E10962276E06AE01448800000000E101A4277E00AE014C8800000000E101CF277E00AE018C8800000000E1090A286E06AE0194880000000086180803DB01AE01B388000000008100642D7E00AF01148900000000E101E426E10CAF018C8900000000E10128276806AF01948900000000E10165215E01AF01088E00000000E10962276E06AF01108E00000000E101A4277E00AF01178E00000000E101CF277E00AF01198E00000000E1090A286E06AF01218E0000000086180803DB01AF017C8E00000000E101E426E10CB001F48E00000000E10128276806B001FC8E00000000E10165215E01B001449400000000E10962276E06B0014C9400000000E101A4277E00B001549400000000E101CF277E00B001949400000000E1090A286E06B0019C940000000086180803DB01B001BB94000000008100812E7E00B101249500000000E101E426E10CB101A89500000000E10128276806B101B09500000000E10165215E01B101449B00000000E10962276E06B1014C9B00000000E101A4277E00B101549B00000000E101CF277E00B101949B00000000E1090A286E06B1019C9B0000000086180803DB01B101BB9B000000008100232F7E00B2012C9C00000000E101E426E10CB201989C00000000E10128276806B201A09C00000000E10165215E01B2018CA100000000E10962276E06B20194A100000000E101A4277E00B2019CA100000000E101CF277E00B201DCA100000000E1090A286E06B201E4A10000000086180803DB01B20103A2000000008100B62F7E00B30164A200000000E101E426E10CB301DCA200000000E10128276806B301E4A200000000E10165215E01B30110A800000000E10962276E06B30118A800000000E101A4277E00B30120A800000000E101CF277E00B30160A800000000E1090A286E06B30168A80000000086180803DB01B30187A800000000810049307E00B401F0A800000000E101E426E10CB40168A900000000E10128276806B40170A900000000E10165215E01B4019CAE00000000E10962276E06B401A4AE00000000E101A4277E00B401ACAE00000000E101CF277E00B401ECAE00000000E1090A286E06B401F4AE0000000086180803DB01B40113AF000000008100DE307E00B5017CAF00000000E101E426E10CB501F4AF00000000E10128276806B501FCAF00000000E10165215E01B501F4B400000000E10962276E06B501FCB400000000E101A4277E\
-00B50104B500000000E101CF277E00B50144B500000000E1090A286E06B5014CB50000000086180803DB01B5016BB500000000810076317E00B601D4B500000000E101E426E10CB60158B600000000E10128276806B60160B600000000E10165215E01B601F4BB00000000E10962276E06B601FCBB00000000E101A4277E00B60104BC00000000E101CF277E00B60144BC00000000E1090A286E06B6014CBC0000000086180803DB01B6016BBC00000000810008327E00B701DCBC00000000E101E426E10CB70160BD00000000E10128276806B70168BD00000000E10165215E01B701FCC200000000E10962276E06B70104C300000000E101A4277E00B7010CC300000000E101CF277E00B7014CC300000000E1090A286E06B70154C30000000086180803DB01B70173C30000000081009C327E00B801E4C300000000E101E426E10CB80150C400000000E10128276806B80158C400000000E10165215E01B80144C900000000E10962276E06B8014CC900000000E101A4277E00B80154C900000000E101CF277E00B80194C900000000E1090A286E06B8019CC90000000086180803DB01B801BBC90000000081002E337E00B901000001006D1D000001006D1D000001004103000002004B03000001001E1800000100731D00000200771D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001007D1D000001007D1D000002006D1D000001006D1D000001006D1D000001007D1D000002006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001007D1D000001007D1D000002006D1D000001006D1D000001006D1D000001007D1D000002006D1D000001006D1D000001006D1D000001000208000002000E08000003001D0800000400290800000100831D00000100831D00000100961D000002009B1D000001005203000001000208000002000E08000003001D0800000400290800000100831D00000100831D00000100831D000001003014000002000A0D00000300A31D00000400AC1D00000100520300000100520300000100831D00000100B61D00000100B61D00000100831D00000100B61D00000200831D00000100B61D000001000208000002000E08000003001D0800000400290800000100520300000100B61D000001004519000001007B03000001007403000001007B03000001007B03000001007B03000001007403000001007B03000001007403000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001006D1D000001007B15000002008715000001007B1500000200871500000300BF1D000001007B1500000200871500000300CF1D00000400DC1D000001006D1D00000100CF1D00000100CF1D00000200E51D00000100F21D00000200550800000300FA1D000004007B1500000500871500000600051E000007000B1E00000100171E00000100550800000100241E00000100321E00000200550800000300FA1D000004008715000005000B1E00000100321E000001005508000001007B1500000200871500000300361E000004003F1E000001000208000002000E08000003001D08000004002908000001000208000002000E08000003001D0800000400290800000500561D000006000A0D00000700A31D00000800AC1D000001000208000002000E08000003001D0800000400290800000500B61D000001000208000002000E08000003001D0800000400290800000500561D000006002C0D000001000208000002000E08000003001D0800000400290800000500B61D00000100751E02000200520302000300D90C020004000A0D020005001C0D02000600FE0C02000700F20C020008003B0802000900E10C02000A00E60C02000B00A31402000C007B0302000D00B71302000E00740302000F00C01302001000460D020011004E0D02001200580D02001300660D02001400700D020015007D0D020016008B0D020017007B08020018008508020019009808000001000208000002000E08000003001D0800000400290800000500A51E00000600831D000001000208000002000E08000003001D0800000400290800000500831D000001000208000002000E08000003001D0800000400290800000500831D000001000208000002000E08000003001D0800000400290800000500831D000001000208000002000E08000003001D0800000400290800000500831D000001000208000002000E08000003001D0800000400290800000500831D000001000208000002000E08000003001D0800000400290800000500831D000001000208000002000E08000003001D0800000400290800000500831D000001000208000002000E08000003001D0800000400290800000500B61D00000600831D000001000208000002000E08000003001D0800000400290800000500B61D000001000208000002000E08000003001D0800000400290800000500B61D000001000208000002000E08000003001D0800000400290800000500B61D000001000208000002000E08000003001D0800000400290800000500B61D00000100751E020002005203020003007B0302000400B713020005008D1402000600371402000700C913020008002E1B02000900C01302000A00A31402000B00991402000C00421402000D00521402000E00381B02000F00DF1302001000011402001100451B020012007B0802001300850802001400980802001500B91402001600121402001700AC1402001800D01402001900DA14000001000208000002000E08000003001D08000004002908000001000208000002000E08000003001D08000004002908000001000208000002000E08000003001D0800000400290800000500B11E000001000208000002000E08000003001D08000004002908000005007B03000001000208000002000E08000003001D08000004002908000005007B03000006007403000001000208000002000E08000003001D08000004002908000001000208000002000E08000003001D08000004002908000005007B03000001000208000002000E08000003001D08000004002908000005007B03000001000208000002000E08000003001D0800000400290800000500B61D000001000208000002000E08000003001D08000004002908000005007B03000006007403000001000208000002000E08000003001D08000004002908000005007B03000006007403000001000208000002000E08000003001D0800000400290800000100751E020002001D08020003002908000001000208000002000E0800000300B71300000400C41E000001006D1D00000100561D00000200B61B00000100561D00000200B61B00000300CD1E00000100DC1E00000100E01E00000100E01E00000200E51E00000100E01E00000200F01E00000100E01E00000100E01E00000100F41E00000100F41E00000100F41E00000100F41E00000100F41E00000100F41E00000100F41E00000100F41E00000100F41E00000100FC1E00000100071F000002000C1F00000100181F00000100EA2700000100EA2700000100EA2700000100EA2700000100EA2700000100EA2700000100EA2700000100EA2700000100EA2700000100EA2700000100EA2700000100EA2700000100EA2700000100EA2700000100EA2700000100EA2700000100EA2700000100EA271C002E001C0059001C0032001C00D1001C00BD001E002E001E0059001E0032001E00D1001E00BD001F002E001F0059001F0032001F00D1001F00BD0020002E0020005900200032002000D1002000BD0021002E0021005900210032002100D1002100BD0022002E0022005900220032002200D1002200BD0023002E0023005900230032002300D1002300BD0024002E0024005900240032002400D1002400BD0025002E0025005900250032002500D1002500BD0026002E0026005900260032002600D1002600BD0027002E0027005900270032002700D1002700BD0028002E0028005900280032002800D1002800BD0029002E0029005900290032002900D1002900BD002A002E002A0059002A0032002A00D1002A00BD002B002E002B0059002B0032002B00D1002B00BD002C002E002C0059002C0032002C00D1002C00BD002D002E002D0059002D0032002D00D1002D00BD002E002E002E0059002E0032002E00D1002E00BD00D10008037E00D90008037E00E10008039500E90008039500F10008039500F9000803950001010803950009010803950011010803950019010803950021010803620129010803950031010803950039010803950041010803DB01490108037E00510108037E00110008037E00590108037E000C000B21D70161011C21F2000C003021CA0514004421DF051C005221F4050C009A0DF90561015E2100061C0065215E0179017A217E006101822107066101BB0D0C068101080395005100F21072000C009C0322062100F21091000C0008037E00210008037E008901080395002900C2213B0691019A0D41069101A30D460691019C034C069101AC0D4C069101B40D46069101BB0D51069101C20D5606290008037E0059000B21D701240008037E00590030216206B10044216806A10152216E0659009A0D720624009C032206A10165215E01A901F21091002C00E9215E013400E9215E0161015E2198066101F6219E06B10108039500B9013022A506C9010803AB06D1015A229100D9018718B20679007A22B906E1019A0DBF06F101932291003900321D9100E1019A0DD806F901BE22DF06A901E122E5066100E722ED066900F322A202090208030307D90113230907610113231207110208039500110235231E0711023C2325076900080395002400442133073C005221470744005823F405440093225B073C0065215E01290208037E0029027C2360073902AF237E006101B6236807110208037E006101C2236E071102CD23D70111023C2373076101F6217C074102E32383074102F9239500F9010424DF0661015E218A0749021924950041023B24940759029C039A0741027A24950041028A24A0076101962491004C000803E1074C004421EE07540052214707540065215E016101C20D6E076101D0241D086101D924680724009A0DF9055100E72441085100080346085100FB24510881020A255B0891022A255F08A901F2106708990208037E00990239257508A102F2107B086101C2231D08610196248708A90208037E00B10273258E08B1027D259408B90299259A08C102AF25A0089102BB25A7086900CA2591006900D52591006900DE25D7016900E72591006101F621D608C9020803FF08D90229260A09D9024B261009E1025B261609E9026726D701E9027126D701E9027B26D701A102F21091006101F6211C09F10208037E0089009A265E018900932291006101A526910039000803950081009A265E018100932255012C000803F10991009A265E01910093225B0834000803F1098100E722F7098900E722E10A9900E7229A0CA100E722A10C34009322F4059100E722A70C9100AA26AD0CA900AA26B10CA900E722B50C51000803BB0C5100B623C20C9900AA26CA0C5C004421EA0C64005221F405A101C9277E00090308037E001103CC29110D1103DE29D7016C000803DB016C009C0322066C004B2A2B0D2900442168067400E9215E0174009322F4057C00E9215E017C009322F405190308037E00B9006D2A2211840008037E0084009C03F10939000803F968D90151330069D9018718096931037033136941038E339100310308039500B9013B249407590297337200A102E122196974000803F1098902E1221E6951009B3323697C000803F109B102A6338E08C90108032969D101AF337E00490308037E00510308037E00590308033369610308033A698C0051344A69940063345869B901AF337E004100200F80694100EE04A007B9017C34550171009D348669910308037E009103B83495009103C0349969C900D4349E69C900F134CF69990344216806C900FD3491006101F621D669C9009A0DED69C9000A359100A901E122F369A1032035F869C1002935CF69A103E1220706A1022035276AD90108039500D9018718346A61015E213A6A5100E122E204C9003E355E01C9009322910008000800190008000C001E00080010002300080020001900080024001E0008002800230008002C005400080030005900080034005E0008003800630008003C006800080040006D0008004800190008004C001E0008005000230008005400540008005800590008005C005E000E00D40177020E00BC02690420008B001E002E0033007F6A2E0043009F6A2E002B00796A2E003B00956A2E004B00796A2E005B00796A2E006300E26A2E0073000C6B2E007B00186B2E008300216B2E001B004D6A2E002300636A40008B001E0060008B001E0080008B001E00A1008B001E00C1008B001E0020018B001E0023012B01310640018B001E0060018B001E0063012B01310680018B001E00A0018B001E00C0018B001E00E0018B001E0000028B001E0020028B001E0040028B001E0060028B001E0080028B001E00A0028B001E00C0028B001E00E0028B001E0000038B001E0001038B001E0020038B001E0021038B001E0040038B001E0041038B001E0060038B001E0061038B001E0080038B001E0081038B001E0083038B001E00A0038B001E00A1038B001E00A3038B001E00C0038B001E00C1038B001E00C3038B001E00E0038B001E00E1038B001E00E3038B001E0000048B001E0001048B001E0003048B001E0020048B001E0021048B001E0023048B001E0040048B001E0041048B001E0043048B001E0060048B001E0061048B001E0063048B001E0080048B001E0081048B001E0083048B001E00A0048B001E00A1048B001E00A3048B001E00C0048B001E00C1048B001E00C3048B001E00E1048B001E00E3048B001E0000058B001E0001058B001E0003058B001E0020058B001E0021058B001E0023058B001E0040058B001E0041058B001E0043058B001E0060058B001E0061058B001E0063058B001E0080058B001E0081058B001E0083058B001E00A0058B001E00A1058B001E00A3058B001E00C0058B001E00C1058B001E00C3058B001E00E0058B001E00E1058B001E0000068B001E0001068B001E0020068B001E0021068B001E0040068B001E0041068B001E0060068B001E0061068B001E0080068B001E0081068B001E00A0068B001E00A1068B001E00C0068B001E00C1068B001E00E0068B001E00E1068B001E0000078B001E0001078B001E0020078B001E0021078B001E0040078B001E0041078B001E0060078B001E0061078B001E0080078B001E0081078B001E00A0078B001E00A1078B001E00C0078B001E00C1078B001E00E0078B001E00E1078B001E0000088B001E0001088B001E0020088B001E0021088B001E0040088B001E0041088B001E0060088B001E0061088B001E0080088B001E0081088B001E00A0088B001E00A1088B001E00C0088B001E00C1088B001E00E0088B001E00E1088B001E0000098B001E0001098B001E0020098B001E0021098B001E0040098B001E0041098B001E0060098B001E0061098B001E0080098B001E0081098B001E00A0098B001E00A1098B001E00C0098B001E00C1098B001E00E0098B001E00E1098B001E00000A8B001E00010A8B001E00200A8B001E00210A8B001E00400A8B001E00410A8B001E00600A8B001E00610A8B001E00810A8B001E00A00A8B001E00A10A8B001E00C00A8B001E00C10A8B001E00E00A8B001E00E10A8B001E00000B8B001E00010B8B001E00200B8B001E00210B8B001E00400B8B001E00410B8B001E00610B8B001E00810B8B001E00A10B8B001E00C10B8B001E00E10B8B001E00600C8B001E00800C8B001E00A00C8B001E00C00C8B001E00E00C8B001E00000D8B001E00200D8B001E00400D8B001E00600D8B001E00800D8B001E00810D8B001E00A00D8B001E00A10D8B001E00C00D8B001E00C10D8B001E00E00D8B001E00E10D8B001E00000E8B001E00010E8B001E00200E8B001E00210E8B001E00400E8B001E00410E8B001E00600E8B001E00610E8B001E00800E8B001E00810E8B001E00A00E8B001E00C00E8B001E00E00E8B001E00000F8B001E00200F8B001E00400F8B001E00600F8B001E00800F8B001E00A00F8B001E00C00F8B001E00E00F8B001E0000108B001E0020108B001E0040108B001E0060108B001E0080108B001E00A0108B001E00C0108B001E00E0108B001E0000118B001E0020118B001E0040118B001E0060118B001E0080118B001E00A0118B001E00C0118B001E00E0118B001E0000128B001E0020128B001E0040128B001E0060128B001E0080128B001E00A0128B001E00C0128B001E00E0128B001E0000138B001E0060138B001E0080138B001E00A0138B001E00C0138B001E00E0138B001E0000148B001E0020148B001E0040148B001E0060148B001E0080148B001E00C1158B001E00A4170B00EF04C4170B00EF04E4170B00EF0404180B00EF0424180B000205A4180B00EF04C4180B00EF04E4180B00EF0404190B00EF0444190B00EF0464190B00EF0484190B00EF04A4190B00EF04C4190B000205E0198B001E00E4190B001505001A8B001E00041A0B00EF04201A8B001E00241A0B00EF04401A8B001E00441A0B00EF04601A8B001E00641A0B00EF04801A8B001E00A01A8B001E00C01A8B001E00E01A8B001E00001B8B001E00401B8B001E00601B8B001E00801B8B001E00A01B8B001E00C01B8B001E00E01B8B001E00001C8B001E00201C8B001E00841E0B00EF04A41E0B00EF04C01E83042A09C41E0B00EF04E01E8304130AE41E0B00EF04001F8304EC0A201F8304C50B241F0B00EF04441F0B00EF04641F0B00EF04801F8304680D841F0B00EF04A01F83042711C01F8304DD14C41F0B00EF04E01F83049718E41F0B00EF04002083044D1C04200B00EF0420208304042024200B00EF0440208304BE2360208304782764200B00EF0480208304642B84200B00EF04A0208304412FA4200B00EF04C02083040033C4200B00EF04E0208304C03604210B00EF04202183047D3A24210B00EF0440218304623E44210B00EF0460218304104264210B00EF0480218304EB45A02183049949A4210B00EF04C0218304494DC4210B00EF04E0218304F650E4210B00EF0400228304A35404220B00EF0420228304525840228304045C44220B00EF0460228304B05F64220B00EF04802283045E6384220B00EF04A4220B00EF04C02283040F67E4220B00EF0400238B001E0004230B00EF0420238B001E0024230B00EF0444230B00EF04A4230B00EF04C4230B00EF04E4230B00EF0404240B00EF0444240B00EF0464240B00EF0484240B00EF04A4240B00EF04E4240B00EF0404250B00EF0424250B00EF0444250B00EF0484250B00EF04A4250B00EF04C4250B00EF04E4250B00EF04602653051E00802653051E00C02653051E00E02653051E00202753051E00402753051E00802753051E00A02753051E00E02753051E00002853051E00402853051E00602853051E00A02853051E00C02853051E00002953051E00202953051E0044290B00EF04602953051E0064290B00EF04802953051E0084290B00EF04A02953051E00A4290B00EF04C02953051E00C4290B00EF04E4290B00EF04002A53051E00042A0B00EF04202A53051E00242A0B00EF04442A0B00EF04602A53051E00642A0B00EF04802A53051E00842A0B00EF04A02A53051E00A42A0B00EF04C02A53051E00C42A0B001505E42A0B00EF04002B53051E00042B0B00EF04202B53051E00242B0B00EF04442B0B00EF04602B53051E00642B0B001505802B53051E00842B0B00EF04A02B53051E00A42B0B00EF04C02B53051E00C42B0B00EF04E42B0B00EF04002C53051E00042C0B001505202C53051E00442C0B00EF04602C53051E00642C0B00EF04802C53051E00842C0B00EF04A02C53051E00A42C0B00EF04C02C53051E00C42C0B00EF04E42C0B00EF04002D53051E00042D0B00EF04202D53051E00242D0B00EF04442D0B001505602D53051E00642D0B00EF04802D53051E00842D0B00EF04A42D0B00EF04C02D53051E00C42D0B00EF04E02D53051E00E42D0B001505042E0B00EF04202E53051E00242E0B00EF04402E53051E00442E0B00EF04642E0B00EF04802E53051E00A02E53051E00A42E0B00EF04C42E0B00EF04E02E53051E00E42E0B00EF04002F53051E00042F0B00EF04242F0B001505402F53051E00602F53051E00642F0B00EF04842F0B00EF04A02F53051E00A42F0B00EF04C02F53051E00C42F0B00EF04E02F53051E00E42F0B001505003053051E0024300B00EF04403053051E0044300B00EF04603053051E0064300B00EF0484300B00EF04A03053051E00C03053051E00003153051E0004310B00EF04203153051E0024310B00EF0444310B00EF04603153051E0064310B00EF04803153051E00C03153051E00E03153051E00203253051E00403253051E00803253051E00A03253051E00E03253051E00003353051E00403353051E00603353051E00A03353051E00C03353051E00003453051E00203453051E00603453051E00803453051E00C03453051E00E03453051E00203553051E00403553051E00803553051E00A03553051E00E03553051E00003653051E00403653051E00603653051E00A03653051E00C03653051E00003753051E00203753051E00603753051E00803753051E00C03753051E00E03753051E00203853051E00403853051E00803853051E00A03853051E00E03853051E00003953051E00403953051E00603953051E00A03953051E00C03953051E00000001000000130012062A0677068506C606F30618072D07A607020825086E088308AD08DC08E2082209FD09E70ABE0BCE0C170D410D3A2B3F2B182F1D2FFA32BA36723A783A2B3E313E0A42B545BB459349434DF0509D544C58FE5BAA5F586304670A67E9685D698C69A469AC69DE69FF69136A186A2E6A416A030001000700030008001200090028000A002C000B0047000F004D0010005200190056001B0058001C005B001E005D001F005F00200061002100630022006500230067002400690025006B0026006D0027006F0028007100290073002A0075002B0077002C0079002D007B002E007D00000041034A0000004B034F000000E4071801000002081D0100000E081D0100001D081D01000029081D0100003B081D01000042081D0100004C081D01000055082101000060082A01000072082F010000A703340100007B0839010000850839010000980841010000D90C9801000052039D010000E10C1D0100003B081D010000E60C9D010000F20CA1010000FE0CA10100000A0D9D0100001C0D9D010000F400A50100002C0DA5010000360DA1010000460D1D0100004E0D1D010000580D1D010000660D1D010000700D1D0100007D0DAA0100008B0DAA0100007B08390100008508390100009808410100007B0839010000850839010000980841010000CB0DD101000052039D010000B7131D0100007B031D010000C0131D010000C9131D010000D51341010000DF13E9010000F113E90100000114E90100001214E90100003014ED0100003714A101000042141D01000052141D0100005D141D0100007714A10100008D14A1010000991439010000A3141D010000AC14A1010000B9141D010000C214A1010000D014A1010000DA14A10100007B08390100008508390100009808410100007B083901000085083901000098084101000061159D0100006C159D010000CB0D0B020000B8171D010000BE171D010000CA17720200007B031D010000D1171D0100001D081D01000029081D01000002081D0100000E081D010000B61B64040000C21B1D010000511DE9010000561D1D0100005E1DA101000024290D0D000062290D0D000024290D0D000062290D0D000024290D0D000062290D0D000024290D0D000062290D0D000024290D0D000062290D0D000024290D0D000062290D0D000024290D0D000062290D0D000024290D0D000062290D0D000024290D0D000062290D0D000024290D0D000062290D0D000024290D0D000062290D0D000024290D0D000062290D0D000024290D0D000062290D0D000024290D0D000062290D0D000024290D0D000062290D0D000024290D0D000062290D0D000024290D0D000062290D0D000024290D0D000062290D0D02000100030001000200030002000300050001000400050002000900070001000A00070001000C00090002000B00090002000D000B0001000E000B00010010000D0002000F000D00010012000F00020011000F0002001300110001001400110001001600130002001500130002001700150001001800150002001900170001001A00170002001B00190001001C00190002001D001B0001001E001B00010020001D0002001F001D00020021001F00010022001F0002002300210001002400210001002600230002002500230002002800250001002900250001002B00270002002A00270001002D00290002002C00290002002E002B0001002F002B00010031002D00020030002D00020032002F00010033002F0002003400310001003500310002003600330001003700330001003900350002003800350001003B00370002003A00370002003C00390001003D00390002003E003B0001003F003B00010041003D00020040003D00020042003F00010043003F0001004500410002004400410001004700430002004600430002004800450001004900450001004B00470002004A00470002004C00490001004D00490002004E004B0001004F004B00020050004D00010051004D00010053004F00020052004F0001005600510002005500510002005700530001005800530001005A00550002005900550002005B00570001005C005700020063005900010064005900020065005B00010066005B00020067005D00010068005D0001006A005F00020069005F0002006B00610001006C00610001006E00630002006D00630002006F006500010070006500020071006700010072006700020073006900010074006900010076006B00020075006B00010078006D00020077006D00020079006F0001007A006F0002007B00710001007C00710001007E00730002007D00730002007F007500010080007500010082007700020081007700010084007900020083007900020085007B00010086007B00010088007D00020087007D00020089007F0001008A007F0002008B00810001008C00810002008D0083\
-0001008E00830001009000850002008F008500010092008700020091008700020093008900010094008900010096008B00020095008B00020097008D00010098008D0002009B008F0001009C008F0002009D00910001009E00910002009F0093000100A00093000100A20095000200A10095000200A30097000100A40097000100A60099000200A50099000200CF009B000100D0009B000200D1009D000100D2009D000200D3009F000100D4009F000200D500A1000100D600A1000100D800A3000200D700A3000200DA00A5000100DB00A5000200DC00A7000100DD00A7000100DF00A9000200DE00A9000200E000AB000100E100AB0001001901AD0002001801AD0002001A01AF0002002F01B10002003001B30002003101B50002003601B70002003901B90002003F01BB0002004201BD0002004801BF0002004B01C10002005001C30002005301C50002005801C70002005B01C90002006001CB0002006301CD0002006801CF0002006B01D10002007101D30002007401D50002007A01D70002007D01D90002008201DB0002008501DD0002008B01DF0002008E01E10002009401E30002009701E50002009D01E7000200A001E9000200A601EB000200A901ED000200AF01EF000200B201F1000200B801F3000200BB01F5000200C101F7000200C401F9000200CA01FB000200CD01FD001C0066024F011C00680265001C006A026D001C006C0251011C006E0253011C00700239001C00720267001E007E0251011E007A0265001E007C026D001E0078024F011E00800253011E00820239001E00840267001F008A024F011F008C0265001F008E026D001F00900251011F00920253011F00940239001F00960267002000A602670020009C02650020009E026D002000A00251012000A20253012000A402390020009A024F012100AA024F012100AC0265002100AE026D002100B00251012100B20253012100B40239002100B60267002200C00251012200BC0265002200BE026D002200BA024F012200C20253012200C40239002200C60267002300D00251012300CC0265002300CE026D002300CA024F012300D20253012300D40239002300D60267002400DC024F012400DE0265002400E0026D002400E20251012400E40253012400E60239002400E80267002500FA0267002500F00265002500F2026D002500F40251012500F60253012500F80239002500EE024F012600FE024F01260000036500260002036D0026000403510126000603530126000803390026000A036700270016035101270012036500270014036D00270010034F0127001803530127001A03390027001C036700280028035101280024036500280026036D00280022034F0128002A03530128002C03390028002E036700290034034F01290036036500290038036D0029003A03510129003C03530129003E0339002900400367002A0046034F012A00480365002A004A036D002A004C0351012A004E0353012A00500339002A00520367002B0058034F012B005A0365002B005C036D002B005E0351012B00600353012B00620339002B00640367002C00700351012C006C0365002C006E036D002C006A034F012C00720353012C00740339002C00760367002D00820351012D007E0365002D0080036D002D007C034F012D00840353012D00860339002D00880367002E008E034F012E00900365002E0092036D002E00940351012E00960353012E00980339002E009A0367000A00D605EB055B068C0692063F075307D907FA07D30CDA0C240D340D3A0DE16841694F69048000000300030053000000010000002805C9200000020000000000000000000000010003020000000002000000000000000000000001000C0200000000020000000000000000000000010055190000000003000300530000000000000088031C1A000000000200000000000000000000000100291C000000000300030053000000000000008803B533000000001600150017001500180015001C0015001E0015001F001500200015002100150022001500230015002400150025001500260015002700150028001500290015002A0015002B0015002C0015002D0015002E0015000000003C4D6F64756C653E0053514C232E54776974746572697A65722E646C6C00496E76616C696454776974746572506172616D65746572526561736F6E0054776974746572697A65722E4672616D65776F726B00496E76616C696454776974746572506172616D65746572457863657074696F6E0054776974746572506172616D657465724E616D65730054776974746572506172616D657465727300547769747465724578706563746564526573706F6E73654F626A656374730054776974746572526571756573744461746100547769747465725374617475730054776974746572537461747573436F6C6C656374696F6E005477697474657255736572005477697474657255736572436F6C6C656374696F6E00547769747465724469726563744D6573736167654D6574686F647300547769747465725374617475734D6574686F64730054776974746572557365724D6574686F6473004F41757468546F6B656E526573706F6E7365004F41757468546F6B656E73004F417574685574696C6974790058417574685574696C697479005F5F56657273696F6E00547769747465720054574954544552005477697474657253746174696900547769747465725573657273005841757468496E666F0054776974746572697A6572457863657074696F6E00547769747465725265717565737400547769747465724572726F72006D73636F726C69620053797374656D00456E756D00417267756D656E74457863657074696F6E0053797374656D2E436F6C6C656374696F6E732E47656E657269630044696374696F6E6172796032004F626A6563740053797374656D2E436F6C6C656374696F6E7300436F6C6C656374696F6E426173650056616C75655479706500457863657074696F6E0076616C75655F5F004D697373696E675265717569726564506172616D657465720056616C75654F75744F6652616E676500506172616D657465724E6F74537570706F72746564006765745F506172616D65746572007365745F506172616D65746572006765745F526561736F6E007365745F526561736F6E002E63746F72003C506172616D657465723E6B5F5F4261636B696E674669656C64003C526561736F6E3E6B5F5F4261636B696E674669656C6400506172616D6574657200526561736F6E0049440053696E63650053696E63654944004D6178494400436F756E740050616765005573657249440053637265656E4E616D6500437572736F72004275696C64416374696F6E55726900416464005477656574730055736572730055736572734C697374004469726563744D6573736167657300526574776565745573657273005477656574536561726368526573756C7473006765745F547769747465724578706563746564526573706F6E73654F626A656374007365745F547769747465724578706563746564526573706F6E73654F626A656374006765745F436F6E73756D65724B6579007365745F436F6E73756D65724B6579006765745F436F6E73756D6572536563726574007365745F436F6E73756D6572536563726574006765745F416363657373546F6B656E007365745F416363657373546F6B656E006765745F416363657373546F6B656E536563726574007365745F416363657373546F6B656E536563726574006765745F536F75726365007365745F536F75726365006765745F416374696F6E557269007365745F416374696F6E557269006765745F526573706F6E7365007365745F526573706F6E7365006765745F706172616D6574657273007365745F706172616D65746572730053797374656D2E4E657400576562457863657074696F6E006765745F526573706F6E7365457863657074696F6E007365745F526573706F6E7365457863657074696F6E006765745F5374617475736573007365745F5374617475736573006765745F5573657273007365745F5573657273004E756C6C61626C656031006765745F526174654C696D6974007365745F526174654C696D6974006765745F526174654C696D697452656D61696E696E67007365745F526174654C696D697452656D61696E696E67004461746554696D65006765745F526174654C696D69745265736574007365745F526174654C696D69745265736574003C547769747465724578706563746564526573706F6E73654F626A6563743E6B5F5F4261636B696E674669656C64003C436F6E73756D65724B65793E6B5F5F4261636B696E674669656C64003C436F6E73756D65725365637265743E6B5F5F4261636B696E674669656C64003C416363657373546F6B656E3E6B5F5F4261636B696E674669656C64003C416363657373546F6B656E5365637265743E6B5F5F4261636B696E674669656C64003C536F757263653E6B5F5F4261636B696E674669656C64003C416374696F6E5572693E6B5F5F4261636B696E674669656C64003C526573706F6E73653E6B5F5F4261636B696E674669656C64003C706172616D65746572733E6B5F5F4261636B696E674669656C64003C526573706F6E7365457863657074696F6E3E6B5F5F4261636B696E674669656C64003C53746174757365733E6B5F5F4261636B696E674669656C64003C55736572733E6B5F5F4261636B696E674669656C64003C526174654C696D69743E6B5F5F4261636B696E674669656C64003C526174654C696D697452656D61696E696E673E6B5F5F4261636B696E674669656C64003C526174654C696D697452657365743E6B5F5F4261636B696E674669656C6400547769747465724578706563746564526573706F6E73654F626A65637400436F6E73756D65724B657900436F6E73756D657253656372657400416363657373546F6B656E00416363657373546F6B656E53656372657400536F7572636500416374696F6E55726900526573706F6E736500706172616D657465727300526573706F6E7365457863657074696F6E00537461747573657300526174654C696D697400526174654C696D697452656D61696E696E6700526174654C696D69745265736574006765745F43726561746564007365745F43726561746564006765745F4944007365745F4944006765745F54657874007365745F54657874006765745F526563697069656E744944007365745F526563697069656E744944006765745F49735472756E6361746564007365745F49735472756E6361746564006765745F49734661766F7269746564007365745F49734661766F7269746564006765745F496E5265706C79546F5374617475734944007365745F496E5265706C79546F5374617475734944006765745F496E5265706C79546F557365724944007365745F496E5265706C79546F557365724944006765745F5477697474657255736572007365745F5477697474657255736572006765745F526563697069656E74007365745F526563697069656E74006765745F49734469726563744D657373616765007365745F49734469726563744D657373616765006765745F506C6163654944007365745F506C6163654944006765745F506C6163654E616D65007365745F506C6163654E616D65006765745F506C61636546756C6C4E616D65007365745F506C61636546756C6C4E616D65006765745F506C61636554797065007365745F506C61636554797065006765745F506C616365436F756E747279007365745F506C616365436F756E747279006765745F506C6163654C61746974756465007365745F506C6163654C61746974756465006765745F506C6163654C6F6E676974756465007365745F506C6163654C6F6E676974756465003C437265617465643E6B5F5F4261636B696E674669656C64003C49443E6B5F5F4261636B696E674669656C64003C546578743E6B5F5F4261636B696E674669656C64003C526563697069656E7449443E6B5F5F4261636B696E674669656C64003C49735472756E63617465643E6B5F5F4261636B696E674669656C64003C49734661766F72697465643E6B5F5F4261636B696E674669656C64003C496E5265706C79546F53746174757349443E6B5F5F4261636B696E674669656C64003C496E5265706C79546F5573657249443E6B5F5F4261636B696E674669656C64003C54776974746572557365723E6B5F5F4261636B696E674669656C64003C526563697069656E743E6B5F5F4261636B696E674669656C64003C49734469726563744D6573736167653E6B5F5F4261636B696E674669656C64003C506C61636549443E6B5F5F4261636B696E674669656C64003C506C6163654E616D653E6B5F5F4261636B696E674669656C64003C506C61636546756C6C4E616D653E6B5F5F4261636B696E674669656C64003C506C616365547970653E6B5F5F4261636B696E674669656C64003C506C616365436F756E7472793E6B5F5F4261636B696E674669656C64003C506C6163654C617469747564653E6B5F5F4261636B696E674669656C64003C506C6163654C6F6E6769747564653E6B5F5F4261636B696E674669656C640043726561746564005465787400526563697069656E7449440049735472756E63617465640049734661766F726974656400496E5265706C79546F537461747573494400496E5265706C79546F55736572494400526563697069656E740049734469726563744D65737361676500506C616365494400506C6163654E616D6500506C61636546756C6C4E616D6500506C6163655479706500506C616365436F756E74727900506C6163654C6174697475646500506C6163654C6F6E676974756465006765745F4974656D007365745F4974656D00496E6465784F6600496E736572740052656D6F766500436F6E7461696E73004974656D006765745F557365724E616D65007365745F557365724E616D65006765745F53637265656E4E616D65007365745F53637265656E4E616D65006765745F4C6F636174696F6E007365745F4C6F636174696F6E006765745F4465736372697074696F6E007365745F4465736372697074696F6E006765745F437265617465644174007365745F437265617465644174006765745F4E756D6265724F66466F6C6C6F77657273007365745F4E756D6265724F66466F6C6C6F77657273006765745F4E756D6265724F66467269656E6473007365745F4E756D6265724F66467269656E6473006765745F4E756D6265724F665374617475736573007365745F4E756D6265724F665374617475736573006765745F4E756D6265724F665075626C69634C6973744D656D6265727368697073007365745F4E756D6265724F665075626C69634C6973744D656D6265727368697073006765745F537461747573007365745F537461747573006765745F49735665726966696564007365745F49735665726966696564006765745F50726F66696C65496D616765557269007365745F50726F66696C65496D616765557269006765745F50726F66696C65557269007365745F50726F66696C65557269006765745F50726F66696C654261636B67726F756E64496D616765557269007365745F50726F66696C654261636B67726F756E64496D616765557269006765745F50726F66696C654261636B67726F756E6454696C65007365745F50726F66696C654261636B67726F756E6454696C65006765745F497350726F746563746564007365745F497350726F746563746564006765745F5554434F6666736574007365745F5554434F6666736574006765745F54696D655A6F6E65007365745F54696D655A6F6E65006765745F497347656F456E61626C6564007365745F497347656F456E61626C6564006765745F4C616E6775616765007365745F4C616E6775616765006765745F4E6F74696669636174696F6E73007365745F4E6F74696669636174696F6E73006765745F466F6C6C6F77696E67007365745F466F6C6C6F77696E67006765745F4D7574696E67007365745F4D7574696E6700546F537472696E67003C557365724E616D653E6B5F5F4261636B696E674669656C64003C53637265656E4E616D653E6B5F5F4261636B696E674669656C64003C4C6F636174696F6E3E6B5F5F4261636B696E674669656C64003C4465736372697074696F6E3E6B5F5F4261636B696E674669656C64003C4372656174656441743E6B5F5F4261636B696E674669656C64003C4E756D6265724F66466F6C6C6F776572733E6B5F5F4261636B696E674669656C64003C4E756D6265724F66467269656E64733E6B5F5F4261636B696E674669656C64003C4E756D6265724F6653746174757365733E6B5F5F4261636B696E674669656C64003C4E756D6265724F665075626C69634C6973744D656D62657273686970733E6B5F5F4261636B696E674669656C64003C5374617475733E6B5F5F4261636B696E674669656C64003C497356657269666965643E6B5F5F4261636B696E674669656C64003C50726F66696C65496D6167655572693E6B5F5F4261636B696E674669656C64003C50726F66696C655572693E6B5F5F4261636B696E674669656C64003C50726F66696C654261636B67726F756E64496D6167655572693E6B5F5F4261636B696E674669656C64003C50726F66696C654261636B67726F756E6454696C653E6B5F5F4261636B696E674669656C64003C497350726F7465637465643E6B5F5F4261636B696E674669656C64003C5554434F66667365743E6B5F5F4261636B696E674669656C64003C54696D655A6F6E653E6B5F5F4261636B696E674669656C64003C497347656F456E61626C65643E6B5F5F4261636B696E674669656C64003C4C616E67756167653E6B5F5F4261636B696E674669656C64003C4E6F74696669636174696F6E733E6B5F5F4261636B696E674669656C64003C466F6C6C6F77696E673E6B5F5F4261636B696E674669656C64003C4D7574696E673E6B5F5F4261636B696E674669656C6400557365724E616D65004C6F636174696F6E004465736372697074696F6E00437265617465644174004E756D6265724F66466F6C6C6F77657273004E756D6265724F66467269656E6473004E756D6265724F665374617475736573004E756D6265724F665075626C69634C6973744D656D62657273686970730053746174757300497356657269666965640050726F66696C65496D6167655572690050726F66696C655572690050726F66696C654261636B67726F756E64496D6167655572690050726F66696C654261636B67726F756E6454696C6500497350726F746563746564005554434F66667365740054696D655A6F6E6500497347656F456E61626C6564004C616E6775616765004E6F74696669636174696F6E7300466F6C6C6F77696E67004D7574696E67006765745F4E657874437572736F72007365745F4E657874437572736F72006765745F50726576696F7573437572736F72007365745F50726576696F7573437572736F72003C4E657874437572736F723E6B5F5F4261636B696E674669656C64003C50726576696F7573437572736F723E6B5F5F4261636B696E674669656C64004E657874437572736F720050726576696F7573437572736F7200636F6E73756D65724B657900636F6E73756D657253656372657400616363657373546F6B656E00616363657373546F6B656E53656372657400486173687461626C65004469726563744D6573736167657353656E74004E65770044657374726F79005573657254696D656C696E6500486F6D6554696D656C696E65004D656E74696F6E73005570646174650053686F77004661766F726974657354696D656C696E65004372656174654661766F726974650044657374726F794661766F726974650052657477656574734F664D65005265747765657473005265747765657400526574776565746564427900466F6C6C6F7765727300467269656E647300466F6C6C6F775573657200556E466F6C6C6F775573657200426C6F636B7300426C6F636B5573657200556E426C6F636B55736572004D7574655573657200556E4D75746555736572004D75746573006765745F546F6B656E007365745F546F6B656E006765745F546F6B656E536563726574007365745F546F6B656E53656372657400446563696D616C006765745F557365724964007365745F557365724964006765745F566572696669636174696F6E537472696E67007365745F566572696669636174696F6E537472696E67003C546F6B656E3E6B5F5F4261636B696E674669656C64003C546F6B656E5365637265743E6B5F5F4261636B696E674669656C64003C5573657249643E6B5F5F4261636B696E674669656C64003C566572696669636174696F6E537472696E673E6B5F5F4261636B696E674669656C6400546F6B656E00546F6B656E5365637265740055736572496400566572696669636174696F6E537472696E67005369676E6174757265547970650047657452657175657374546F6B656E00476574416363657373546F6B656E00456E636F6465466F7255726C00557269004275696C64417574686F72697A6174696F6E5572690048747470576562526573706F6E7365004275696C644F4175746852657175657374416E64476574526573706F6E73650053797374656D2E546578742E526567756C617245787072657373696F6E73004D6174636800557070657243617365456E636F64696E67730047656E65726174654765745175657279537472696E670047656E6572617465417574686F72697A6174696F6E4865616465720047656E657261746554696D655374616D700047656E65726174654E6F6E6365004164645369676E6174757265546F506172616D6574657273004E6F726D616C697A6555726C0055726C456E636F646500476574416363657373546F6B656E73004D616A6F72004D696E6F72004275696C6400557365720047657456657273696F6E0053797374656D2E446174610053797374656D2E446174612E53716C54797065730053716C496E7436340053716C537472696E670053716C446F75626C650044657374726F795374617475730053656E644469726563744D6573736167650044657374726F794469726563744D6573736167650053716C4461746554696D650053716C426F6F6C65616E0053716C496E743332005477697474657253746174696946696C6C526F770049456E756D657261626C6500476574547769747465724D657373616765730053514C232E5479706573416E644167677265676174657300547970655F486173685461626C650047657453656E744D65737361676573004765744D65737361676573004765745573657254696D656C696E65004765744D656E74696F6E73004765744661766F726974657300476574486F6D6554696D656C696E650047657452657477656574734F664D65004765745265747765657473004765745374617475730054776974746572557365727346696C6C526F7700476574466F6C6C6F7765727300476574467269656E6473004765745573657200476574426C6F636B73004765745265747765657465644279004765744D757465730054776974746572584175746846696C6C526F7700784175746800437265617465644F6E00467269656E6473436F756E740053746174757354657874004973466F6C6C6F77696E67006765745F5265717565737444617461007365745F5265717565737444617461006765745F526177584D4C0050617273654572726F724D657373616765003C52657175657374446174613E6B5F5F4261636B696E674669656C6400526571756573744461746100526177584D4C00626173655477697474657255726900506572666F726D576562526571756573740048616E646C65576562457863657074696F6E005061727365526573706F6E7365446174610050726F706167617465526174654C696D697444657461696C730053797374656D2E586D6C00586D6C456C656D656E7400506172736553746174757365730050617273655477656574536561726368526573756C747300586D6C4E6F64650050617273655374617475734E6F64650050617273654469726563744D657373616765730050617273654469726563744D6573736167654E6F6465005061727365557365727300506172736555736572734C697374005061727365526574776565745573657273005061727365557365724E6F646500506172736544617465537472696E6700456C656D656E7456616C75654966457869737473005F5F436F6465005F5F4D657373616765005F5F4973547769747465724572726F72006765745F436F6465006765745F4D657373616765006765745F4973547769747465724572726F7200436F6465004D657373616765004973547769747465724572726F720076616C7565004B65790056616C756500696E646578004F7074696F6E616C506172616D65746572730075736572006D657373616765004C61746974756465004C6F6E6769747564650053746174757349440063616C6C6261636B416464726573730072657175657374546F6B656E0076657269666965720061757468656E746963617465006261736555726C00687474704D6574686F6400746F6B656E00746F6B656E53656372657400456E636F64656456616C7565006E6577506172616D65746572730075726C00757365726E616D650070617373776F7264004D6963726F736F66742E53716C5365727665722E5365727665720053716C4661636574417474726962757465006F626A0053797374656D2E52756E74696D652E496E7465726F705365727669636573004F7574417474726962757465004D65737361676554797065005573657249446F7253637265656E4E616D650050617373776F726400496E6E6572457863657074696F6E00584D4C004461746100485454504D6574686F640077657800456C656D656E740044617465537472696E67004E6F646500456C656D656E744E616D6500547769747465724572726F72526573706F6E73650053797374656D2E5265666C656374696F6E00417373656D626C795469746C6541747472696275746500417373656D626C794465736372697074696F6E41747472696275746500417373656D626C79436F6E66696775726174696F6E41747472696275746500417373656D626C79436F6D70616E7941747472696275746500417373656D626C7950726F6475637441747472696275746500417373656D626C79436F7079726967687441747472696275746500417373656D626C7954726164656D61726B41747472696275746500417373656D626C7943756C7475726541747472696275746500436F6D56697369626C65417474726962757465004775696441747472696275746500417373656D626C7956657273696F6E41747472696275746500417373656D626C7946696C6556657273696F6E4174747269627574650053797374656D2E52756E74696D652E436F6D70696C6572536572766963657300436F6D70696C6174696F6E52656C61786174696F6E734174747269627574650052756E74696D65436F6D7061746962696C6974794174747269627574650053514C232E54776974746572697A657200436F6D70696C657247656E6572617465644174747269627574650053657269616C697A61626C65417474726962757465006765745F436F756E7400537472696E6700456D707479\
-004B6579436F6C6C656374696F6E006765745F4B65797300456E756D657261746F7200476574456E756D657261746F72006765745F43757272656E7400466F726D6174004D6F76654E6578740049446973706F7361626C6500446973706F73650049734E756C6C4F72456D707479004170706C69636174696F6E457863657074696F6E0044656661756C744D656D62657241747472696275746500494C697374006765745F4C6973740049436F6C6C656374696F6E0049456E756D657261746F7200496E743634006765745F48617356616C756500436F6E63617400417267756D656E744E756C6C457863657074696F6E00576562526573706F6E73650053797374656D2E494F0053747265616D00476574526573706F6E736553747265616D0053747265616D52656164657200546578745265616465720052656164546F456E640052656765780047726F7570436F6C6C656374696F6E006765745F47726F7570730047726F75700043617074757265006765745F56616C75650053797374656D2E476C6F62616C697A6174696F6E0043756C74757265496E666F006765745F43757272656E7443756C747572650049466F726D617450726F7669646572005061727365006F705F496D706C696369740045736361706544617461537472696E67004D617463684576616C7561746F72005265706C6163650053797374656D2E5465787400537472696E674275696C64657200417070656E6400417070656E64466F726D6174004B657956616C7565506169726032006765745F4B6579005765625065726D697373696F6E004E6574776F726B416363657373004164645065726D697373696F6E0053797374656D2E536563757269747900436F64654163636573735065726D697373696F6E0044656D616E64006F705F457175616C6974790053746172747357697468006765745F4C656E677468005765625265717565737400437265617465004874747057656252657175657374007365745F4D6574686F64006765745F496E76617269616E7443756C74757265007365745F557365724167656E7400576562486561646572436F6C6C656374696F6E006765745F486561646572730053797374656D2E436F6C6C656374696F6E732E5370656369616C697A6564004E616D6556616C7565436F6C6C656374696F6E007365745F436F6E74656E745479706500476574526573706F6E736500546F557070657200536F7274656444696374696F6E6172796032004944696374696F6E617279603200537472696E67436F6D70617269736F6E00456E647357697468006F705F496E657175616C697479006765745F5574634E6F770054696D655370616E006F705F5375627472616374696F6E006765745F546F74616C5365636F6E647300446F75626C6500436F6E7665727400546F496E7436340052616E646F6D004E65787400496E7433320053797374656D2E53656375726974792E43727970746F67726170687900484D41435348413100456E636F64696E67006765745F4153434949004765744279746573004B6579656448617368416C676F726974686D007365745F4B65790048617368416C676F726974686D00436F6D707574654861736800546F426173653634537472696E67006765745F536368656D65006765745F486F7374006765745F506F7274006765745F4162736F6C75746550617468005374727563744C61796F7574417474726962757465004C61796F75744B696E64002E6363746F7200417373656D626C7900476574457865637574696E67417373656D626C7900417373656D626C794E616D65004765744E616D650056657273696F6E006765745F56657273696F6E006765745F4D616A6F72006765745F4D696E6F72006765745F4275696C640053716C46756E6374696F6E417474726962757465006765745F49734E756C6C005472696D004E756C6C003C476574547769747465724D657373616765733E645F5F300049456E756D657261626C6560310049456E756D657261746F7260310053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261626C653C53797374656D2E4F626A6563743E2E476574456E756D657261746F720053797374656D2E436F6C6C656374696F6E732E49456E756D657261626C652E476574456E756D657261746F72003C3E325F5F63757272656E740053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261746F723C53797374656D2E4F626A6563743E2E6765745F43757272656E740053797374656D2E436F6C6C656374696F6E732E49456E756D657261746F722E52657365740052657365740053797374656D2E49446973706F7361626C652E446973706F7365003C3E315F5F7374617465003C3E6C5F5F696E697469616C54687265616449640053797374656D2E436F6C6C656374696F6E732E49456E756D657261746F722E6765745F43757272656E74003C3E335F5F436F6E73756D65724B6579003C3E335F5F436F6E73756D6572536563726574003C3E335F5F416363657373546F6B656E003C3E335F5F416363657373546F6B656E536563726574003C3E335F5F4D65737361676554797065003C3E335F5F4F7074696F6E616C506172616D6574657273003C5F5F5374617475733E355F5F31003C5F5F54776974746572537461747573436F6C6C656374696F6E3E355F5F32003C5F5F547769747465723E355F5F33003C5F5F547769747465725374617475733E355F5F34003C3E375F5F7772617035003C3E375F5F7772617036003C3E6D5F5F46696E616C6C79370053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261746F723C53797374656D2E4F626A6563743E2E43757272656E740053797374656D2E436F6C6C656374696F6E732E49456E756D657261746F722E43757272656E740053797374656D2E446961676E6F737469637300446562756767657248696464656E4174747269627574650053797374656D2E546872656164696E6700546872656164006765745F43757272656E74546872656164006765745F4D616E616765645468726561644964003C50726976617465496D706C656D656E746174696F6E44657461696C733E7B44383141423634432D324643382D344630342D384346442D3733464334343531394632437D0024246D6574686F643078363030303133352D310054727947657456616C7565004E6F74537570706F72746564457863657074696F6E006765745F4E6174697665486173687461626C65003C47657452657477656574733E645F5F61003C3E335F5F5374617475734944003C5F5F5374617475733E355F5F62003C5F5F54776974746572537461747573436F6C6C656374696F6E3E355F5F63003C5F5F547769747465723E355F5F64003C5F5F547769747465725374617475733E355F5F65003C3E375F5F7772617066003C3E375F5F777261703130003C3E6D5F5F46696E616C6C793131003C4765745374617475733E645F5F3134003C5F5F5374617475733E355F5F3135003C5F5F547769747465725374617475733E355F5F3136003C5F5F547769747465723E355F5F3137003C4372656174654661766F726974653E645F5F3161003C5F5F5374617475733E355F5F3162003C5F5F547769747465725374617475733E355F5F3163003C5F5F547769747465723E355F5F3164003C44657374726F794661766F726974653E645F5F3230003C5F5F5374617475733E355F5F3231003C5F5F547769747465725374617475733E355F5F3232003C5F5F547769747465723E355F5F3233003C526574776565743E645F5F3236003C5F5F5374617475733E355F5F3237003C5F5F547769747465725374617475733E355F5F3238003C5F5F547769747465723E355F5F3239003C476574466F6C6C6F776572733E645F5F3263003C5F5F547769747465723E355F5F3264003C5F5F5477697474657255736572436F6C6C656374696F6E3E355F5F3265003C5F5F5477697474657255736572733E355F5F3266003C5F5F54776974746572557365723E355F5F3330003C3E375F5F777261703331003C3E375F5F777261703332003C3E6D5F5F46696E616C6C793333003C476574467269656E64733E645F5F3336003C5F5F547769747465723E355F5F3337003C5F5F5477697474657255736572436F6C6C656374696F6E3E355F5F3338003C5F5F5477697474657255736572733E355F5F3339003C5F5F54776974746572557365723E355F5F3361003C3E375F5F777261703362003C3E375F5F777261703363003C3E6D5F5F46696E616C6C793364003C476574557365723E645F5F3430003C3E335F5F5573657249446F7253637265656E4E616D65003C5F5F547769747465723E355F5F3431003C5F5F54776974746572557365723E355F5F3432003C5F5F5477697474657255736572733E355F5F3433003C466F6C6C6F77557365723E645F5F3436003C3E335F5F53637265656E4E616D65003C5F5F547769747465723E355F5F3437003C5F5F55736572546F466F6C6C6F773E355F5F3438003C5F5F5477697474657255736572436F6C6C656374696F6E3E355F5F3439003C5F5F5477697474657255736572733E355F5F3461003C5F5F54776974746572557365723E355F5F3462003C3E375F5F777261703463003C3E375F5F777261703464003C3E6D5F5F46696E616C6C793465003C556E466F6C6C6F77557365723E645F5F3531003C3E335F5F557365724944003C5F5F547769747465723E355F5F3532003C5F5F5477697474657255736572436F6C6C656374696F6E3E355F5F3533003C5F5F5477697474657255736572733E355F5F3534003C5F5F54776974746572557365723E355F5F3535003C3E375F5F777261703536003C3E375F5F777261703537003C3E6D5F5F46696E616C6C793538003C476574426C6F636B733E645F5F3562003C5F5F547769747465723E355F5F3563003C5F5F5477697474657255736572436F6C6C656374696F6E3E355F5F3564003C5F5F5477697474657255736572733E355F5F3565003C5F5F54776974746572557365723E355F5F3566003C3E375F5F777261703630003C3E375F5F777261703631003C3E6D5F5F46696E616C6C793632003C426C6F636B557365723E645F5F3635003C5F5F547769747465723E355F5F3636003C5F5F5477697474657255736572436F6C6C656374696F6E3E355F5F3637003C5F5F5477697474657255736572733E355F5F3638003C5F5F54776974746572557365723E355F5F3639003C3E375F5F777261703661003C3E375F5F777261703662003C3E6D5F5F46696E616C6C793663003C556E426C6F636B557365723E645F5F3666003C5F5F547769747465723E355F5F3730003C5F5F5477697474657255736572436F6C6C656374696F6E3E355F5F3731003C5F5F5477697474657255736572733E355F5F3732003C5F5F54776974746572557365723E355F5F3733003C3E375F5F777261703734003C3E375F5F777261703735003C3E6D5F5F46696E616C6C793736003C47657452657477656574656442793E645F5F3739003C5F5F547769747465723E355F5F3761003C5F5F5477697474657255736572436F6C6C656374696F6E3E355F5F3762003C5F5F5477697474657255736572733E355F5F3763003C5F5F54776974746572557365723E355F5F3764003C3E375F5F777261703765003C3E375F5F777261703766003C3E6D5F5F46696E616C6C793830003C4D757465557365723E645F5F3833003C5F5F547769747465723E355F5F3834003C5F5F5477697474657255736572436F6C6C656374696F6E3E355F5F3835003C5F5F5477697474657255736572733E355F5F3836003C5F5F54776974746572557365723E355F5F3837003C3E375F5F777261703838003C3E375F5F777261703839003C3E6D5F5F46696E616C6C793861003C556E4D757465557365723E645F5F3864003C5F5F547769747465723E355F5F3865003C5F5F5477697474657255736572436F6C6C656374696F6E3E355F5F3866003C5F5F5477697474657255736572733E355F5F3930003C5F5F54776974746572557365723E355F5F3931003C3E375F5F777261703932003C3E375F5F777261703933003C3E6D5F5F46696E616C6C793934003C4765744D757465733E645F5F3937003C5F5F547769747465723E355F5F3938003C5F5F5477697474657255736572436F6C6C656374696F6E3E355F5F3939003C5F5F5477697474657255736572733E355F5F3961003C5F5F54776974746572557365723E355F5F3962003C3E375F5F777261703963003C3E375F5F777261703964003C3E6D5F5F46696E616C6C793965004C69737460310052656765784F7074696F6E730049734D61746368005365637572697479457863657074696F6E0054797065006765745F5065726D697373696F6E54797065004D656D626572496E666F006765745F4E616D6500476574004164645365636F6E6473006765745F5554463800436C6F73650053514C232E4A736F6E4678004A736F6E46782E53657269616C697A6174696F6E004461746152656164657253657474696E6773004461746157726974657253657474696E6773004A736F6E46782E4A736F6E004A736F6E526561646572004A736F6E46782E586D6C00586D6C57726974657200446174615265616465726031004A736F6E46782E4D6F64656C004D6F64656C546F6B656E5479706500526561640044617461577269746572603100577269746500576562457863657074696F6E537461747573006765745F436F6E74656E744C656E6774680048747470537461747573436F6465006765745F537461747573436F646500586D6C446F63756D656E74004C6F6164586D6C006765745F446F63756D656E74456C656D656E740053656C65637453696E676C654E6F646500586D6C4E6F64654C6973740053656C6563744E6F646573006765745F4F75746572586D6C006765745F496E6E65725465787400426F6F6C65616E00547279506172736500476574456C656D656E747342795461674E616D65006765745F4861734368696C644E6F64657300001B7B0030007D002600730069006E00630065003D007B0031007D0000217B0030007D002600730069006E00630065005F00690064003D007B0031007D00001B7B0030007D00260063006F0075006E0074003D007B0031007D0000197B0030007D00260070006100670065003D007B0031007D0000157B0030007D002600690064003D007B0031007D00001D7B0030007D0026006D00610078005F00690064003D007B0031007D00001F7B0030007D00260075007300650072005F00690064003D007B0031007D0000277B0030007D002600730063007200650065006E005F006E0061006D0065003D007B0031007D00001D7B0030007D00260063007500720073006F0072003D007B0031007D00000F7B0030007D003F007B0031007D00004B560061006C0075006500200067006900760065006E00200066006F0072002000730069006E0063006500200077006100730020006E006F00740020006100200044006100740065002E000003720000296400690072006500630074005F006D0065007300730061006700650073002E006A0073006F006E00000747004500540000336400690072006500630074005F006D0065007300730061006700650073002F00730065006E0074002E006A0073006F006E0000316400690072006500630074005F006D0065007300730061006700650073002F006E00650077002E006A0073006F006E000017730063007200650065006E005F006E0061006D0065000009740065007800740000056900640000396400690072006500630074005F006D0065007300730061006700650073002F00640065007300740072006F0079002E006A0073006F006E00000950004F00530054000037730074006100740075007300650073002F0075007300650072005F00740069006D0065006C0069006E0065002E006A0073006F006E000037730074006100740075007300650073002F0068006F006D0065005F00740069006D0065006C0069006E0065002E006A0073006F006E00003F730074006100740075007300650073002F006D0065006E00740069006F006E0073005F00740069006D0065006C0069006E0065002E006A0073006F006E000029730074006100740075007300650073002F007500700064006100740065002E006A0073006F006E00000D730074006100740075007300002B69006E005F007200650070006C0079005F0074006F005F007300740061007400750073005F006900640000076C006100740000096C006F006E0067000033730074006100740075007300650073002F00640065007300740072006F0079002F007B0030007D002E006A0073006F006E000025730074006100740075007300650073002F00730068006F0077002E006A0073006F006E0000276600610076006F00720069007400650073002F006C006900730074002E006A0073006F006E00002B6600610076006F00720069007400650073002F006300720065006100740065002E006A0073006F006E00002D6600610076006F00720069007400650073002F00640065007300740072006F0079002E006A0073006F006E000039730074006100740075007300650073002F00720065007400770065006500740073005F006F0066005F006D0065002E006A0073006F006E000025730074006100740075007300650073002F00720065007400770065006500740073002F00000B2E006A0073006F006E000023730074006100740075007300650073002F0072006500740077006500650074002F00000F75007300650072005F0069006400001F750073006500720073002F00730068006F0077002E006A0073006F006E00002766006F006C006C006F0077006500720073002F006C006900730074002E006A0073006F006E00002366007200690065006E00640073002F006C006900730074002E006A0073006F006E00002F66007200690065006E006400730068006900700073002F006300720065006100740065002E006A0073006F006E00003166007200690065006E006400730068006900700073002F00640065007300740072006F0079002E006A0073006F006E00002162006C006F0063006B0073002F006C006900730074002E006A0073006F006E00002562006C006F0063006B0073002F006300720065006100740065002E006A0073006F006E00002762006C006F0063006B0073002F00640065007300740072006F0079002E006A0073006F006E00002F6D0075007400650073002F00750073006500720073002F006300720065006100740065002E006A0073006F006E0000316D0075007400650073002F00750073006500720073002F00640065007300740072006F0079002E006A0073006F006E00002B6D0075007400650073002F00750073006500720073002F006C006900730074002E006A0073006F006E00001763006F006E00730075006D00650072004B0065007900001D63006F006E00730075006D0065007200530065006300720065007400001D6F0061007500740068005F00630061006C006C006200610063006B000057680074007400700073003A002F002F006100700069002E0074007700690074007400650072002E0063006F006D002F006F0061007500740068002F0072006500710075006500730074005F0074006F006B0065006E000080C36F0061007500740068005F0074006F006B0065006E003D0028003F003C0074006F006B0065006E003E005B005E0026005D002B0029007C006F0061007500740068005F0074006F006B0065006E005F007300650063007200650074003D0028003F003C007300650063007200650074003E005B005E0026005D002B0029007C006F0061007500740068005F00760065007200690066006900650072003D0028003F003C00760065007200690066006900650072003E005B005E0026005D002B002900000B74006F006B0065006E00000D7300650063007200650074000011760065007200690066006900650072000019720065007100750065007300740054006F006B0065006E00001D6F0061007500740068005F00760065007200690066006900650072000055680074007400700073003A002F002F006100700069002E0074007700690074007400650072002E0063006F006D002F006F0061007500740068002F006100630063006500730073005F0074006F006B0065006E0000276F0061007500740068005F0074006F006B0065006E003D0028005B005E0026005D002B00290000356F0061007500740068005F0074006F006B0065006E005F007300650063007200650074003D0028005B005E0026005D002B002900001F75007300650072005F00690064003D0028005B005E0026005D002B0029000027730063007200650065006E005F006E0061006D0065003D0028005B005E0026005D002B0029000027280025005B0030002D00390061002D0066005D005B0030002D00390061002D0066005D00290001032800000725003200380000032900000725003200390000032400000725003200340000032100000725003200310000032A000007250032004100000327000107250032003700000725003700450000037E000035680074007400700073003A002F002F0074007700690074007400650072002E0063006F006D002F006F0061007500740068002F000019610075007400680065006E00740069006300610074006500001361007500740068006F00720069007A00650000213F006F0061007500740068005F0074006F006B0065006E003D007B0030007D00001B6F0061007500740068005F00760065007200730069006F006E00000731002E00300000176F0061007500740068005F006E006F006E0063006500001F6F0061007500740068005F00740069006D0065007300740061006D007000002D6F0061007500740068005F007300690067006E00610074007500720065005F006D006500740068006F006400001348004D00410043002D00530048004100310001256F0061007500740068005F0063006F006E00730075006D00650072005F006B0065007900002B6F0061007500740068005F0063006F006E00730075006D00650072005F0073006500630072006500740000176F0061007500740068005F0074006F006B0065006E0000256F0061007500740068005F0074006F006B0065006E005F00730065006300720065007400002F680074007400700073003F003A002F002F0074007700690074007400650072002E0063006F006D002F002E002A000037680074007400700073003F003A002F002F006100700069002E0074007700690074007400650072002E0063006F006D002F002E002A00003D680074007400700073003F003A002F002F007300650061007200630068002E0074007700690074007400650072002E0063006F006D002F002E002A00000D6F0061007500740068005F0000032600000F7B0030007D003D007B0031007D0000033F000019530051004C00730068006100720070002F007B0030007D00001B41007500740068006F00720069007A006100740069006F006E0000436100700070006C00690063006100740069006F006E002F0078002D007700770077002D0066006F0072006D002D00750072006C0065006E0063006F0064006500640001334F00410075007400680020007200650061006C006D003D002200540077006900740074006500720020004100500049002200000F5F00730065006300720065007400001F6F0061007500740068005F007300690067006E006100740075007200650000152C007B0030007D003D0022007B0031007D002200002D2C006F0061007500740068005F007300690067006E00610074007500720065003D0022007B0030007D0022000003580000135F007600650072006900660069006500720000177B0030007D0026007B0031007D0026007B0032007D00000F7B0030007D0026007B0031007D0000137B0030007D003A002F002F007B0031007D0000096800740074007000000B6800740074007000730000033A00001175007300650072006E0061006D0065000011700061007300730077006F0072006400001F78005F0061007500740068005F0075007300650072006E0061006D006500001F78005F0061007500740068005F00700061007300730077006F0072006400001778005F0061007500740068005F006D006F0064006500001763006C00690065006E0074005F00610075007400680000032E00005D43006F006E00730075006D00650072004B00650079002000630061006E006E006F00740020006200650020004E0055004C004C0020006F007200200065006D00700074007900200073007400720069006E0067002000270027002100016343006F006E00730075006D00650072005300650063007200650074002000630061006E006E006F00740020006200650020004E0055004C004C0020006F007200200065006D00700074007900200073007400720069006E0067002000270027002100015D41006300630065007300730054006F006B0065006E002000630061006E006E006F00740020006200650020004E0055004C004C0020006F007200200065006D00700074007900200073007400720069006E0067002000270027002100016941006300630065007300730054006F006B0065006E005300650063007200650074002000630061006E006E006F00740020006200650020004E0055004C004C0020006F007200200065006D00700074007900200073007400720069006E00670020002700270021000131530074006100740075007300490044002000630061006E006E006F00740020006200650020004E0055004C004C0021000001005952006500630069007000690065006E0074002000630061006E006E006F00740020006200650020004E0055004C004C0020006F007200200065006D00700074007900200073007400720069006E006700200027002700210001254400690072006500630074004D006500730073006100670065007300530065006E007400001D4400690072006500630074004D00650073007300610067006500730000195500730065007200540069006D0065006C0069006E00650000114D0065006E00740069006F006E00730000134600610076006F0072006900740065007300001948006F006D006500540069006D0065006C0069006E0065000019520065007400770065006500740073004F0066004D006500005B530063007200650065006E004E0061006D0065002000630061006E006E006F00740020006200650020004E0055004C004C0020006F007200200065006D00700074007900200073007400720069006E0067002000270027002100017759006F00750020006D007500730074002000730070006500630069006600790020006500690074006800650072002000530063007200650065006E004E0061006D00650020006F00720020005500730065007200490044002C00200062007500740020006E006F007400200062006F00740068002100005755007300650072004E0061006D0065002000630061006E006E006F00740020006200650020004E0055004C004C0020006F007200200065006D00700074007900200073007400720069006E00670020002700270021000157500061007300730077006F007200\
-64002000630061006E006E006F00740020006200650020004E0055004C004C0020006F007200200065006D00700074007900200073007400720069006E006700200027002700210001233C006500720072006F0072003E002E002B003C002F006500720072006F0072003E00003328003F003A003C006500720072006F0072003E0029002E002B0028003F003A003C002F006500720072006F0072003E0029000039680074007400700073003A002F002F006100700069002E0074007700690074007400650072002E0063006F006D002F0031002E0031002F00001B5700650062005000650072006D0069007300730069006F006E000081010A000A005700650062005000650072006D0069007300730069006F006E00200065007800630065007000740069006F006E002E000A000A0059006F00750020006D006F007300740020006C0069006B0065006C00790020006E00650065006400200074006F002000720075006E002000740068006500200066006F006C006C006F00770069006E0067003A000A000A00090045005800450043002000530051004C0023002E00530051004C00730068006100720070005F0053006500740053006500630075007200690074007900200032002C0020004E002700530051004C0023002E00540077006900740074006500720069007A006500720027000A000A00012558002D0052006100740065002D004C0069006D00690074002D004C0069006D0069007400012D58002D0052006100740065002D004C0069006D00690074002D00520065006D00610069006E0069006E006700012558002D0052006100740065002D004C0069006D00690074002D005200650073006500740001035B0000035D00002941007500740068006F00720069007A006100740069006F006E0020004600610069006C0065006400004354007700690074007400650072002000690073002000630075007200720065006E0074006C007900200075006E0061007600610069006C00610062006C0065002E000069540077006900740074006500720020006900730020006F007600650072006C006F00610064006500640020006F007200200079006F007500200061007200650020006200650069006E0067002000720061007400650020006C0069006D0069007400650064002E0000232F00610072007200610079002F006900740065006D002F0075007300650072007300003B49006E00760061006C0069006400200072006500730070006F006E00730065002000660072006F006D002000540077006900740074006500720000172F00610072007200610079002F006900740065006D00001F50006100720073006500530074006100740075007300650073000A000A0000050A000A0000332F00610072007200610079002F006900740065006D002F00730074006100740075007300650073002F006900740065006D000033500061007200730065005400770065006500740053006500610072006300680052006500730075006C00740073000A000A00001563007200650061007400650064005F0061007400000D73006F00750072006300650000137400720075006E0063006100740065006400002769006E005F007200650070006C0079005F0074006F005F0075007300650072005F006900640000136600610076006F007200690074006500640000097500730065007200000D730065006E00640065007200001372006500630069007000690065006E007400000B70006C0061006300650000096E0061006D0065000013660075006C006C005F006E0061006D006500001570006C006100630065005F007400790070006500000F63006F0075006E00740072007900001763006F006F007200640069006E00610074006500730000096900740065006D00002B500061007200730065004400690072006500630074004D0065007300730061006700650073000A000A00001972006500630069007000690065006E0074005F0069006400001950006100720073006500550073006500720073000A000A00000D2E002F006900740065006D00002150006100720073006500550073006500720073004C006900730074000A000A0000212F00610072007200610079002F006900740065006D002F0075007300650072000027500061007200730065005200650074007700650065007400550073006500720073000A000A0000116C006F0063006100740069006F006E0000176400650073006300720069007000740069006F006E000011760065007200690066006900650064000023700072006F00660069006C0065005F0069006D006100670065005F00750072006C000007750072006C000039700072006F00660069006C0065005F006200610063006B00670072006F0075006E0064005F0069006D006100670065005F00750072006C00002F700072006F00660069006C0065005F006200610063006B00670072006F0075006E0064005F00740069006C0065000013700072006F0074006500630074006500640000157500740063005F006F00660066007300650074000013740069006D0065005F007A006F006E0065000017670065006F005F0065006E00610062006C006500640000096C0061006E006700001B6E006F00740069006600690063006100740069006F006E007300001366006F006C006C006F00770069006E006700000D6D007500740069006E006700001F66006F006C006C006F0077006500720073005F0063006F0075006E007400001B66007200690065006E00640073005F0063006F0075006E007400001D730074006100740075007300650073005F0063006F0075006E00740000196C00690073007400650064005F0063006F0075006E00740000814728003F003C004400610079004E0061006D0065003E005B005E0020005D002B002900200028003F003C004D006F006E00740068004E0061006D0065003E005B005E0020005D002B002900200028003F003C004400610079003E005B005E0020005D007B0031002C0032007D002900200028003F003C0048006F00750072003E005B0030002D0039005D007B0031002C0032007D0029003A0028003F003C004D0069006E007500740065003E005B0030002D0039005D007B0031002C0032007D0029003A0028003F003C005300650063006F006E0064003E005B0030002D0039005D007B0031002C0032007D002900200028003F003C00540069006D0065005A006F006E0065003E005B002B002D005D005B0030002D0039005D007B0034007D002900200028003F003C0059006500610072003E005B0030002D0039005D007B0034007D002900012F7B0030007D0020007B0031007D0020007B0032007D0020007B0033007D003A007B0034007D003A007B0035007D0000134D006F006E00740068004E0061006D006500000744006100790000095900650061007200000948006F0075007200000D4D0069006E00750074006500000D5300650063006F006E006400003728003F003C003D005B002C007B005D00220063006F006400650022003A0029005C0064002B0028003F003D005B002C007D005D002900003F28003F003C003D005B002C007B005D0022006D0065007300730061006700650022003A00220029002E002B0028003F003D0022005B002C007D005D002900004CB61AD8C82F044F8CFD73FC44519F2C0008B77A5C561934E0890715120D0211101C0206080306110804000000000401000000040200000004200011100520010111100420001108052001011108072002011110110803061110042800111004280011080403000000040400000004050000000406000000040700000004080000000420010E0E0620020111101C032000010306111804200011180520010111180320000E042001010E08200015120D020E0E0920010115120D020E0E04200012210520010112210420001224052001011224042000122C05200101122C07200015112501080820010115112501080820001511250111290920010115112501112902060E070615120D020E0E03061221030612240306122C06061511250108070615112501112904280011180328000E08280015120D020E0E04280012210428001224042800122C072800151125010808280015112501112904200011290520010111290320000A042001010A0320000204200101020420001228052001011228072000151125010D08200101151125010D0306112902060A020602030612280606151125010D04280011290328000A032800020428001228072800151125010D0520011220080620020108122005200108122005200101122005200102122005280112200803200008042001010804200012200306122003280008042800122005200112280806200201081228052001081228052001021228052801122808072004010E0E0E0E0620011224122D06200212200E0E05200112200A14200412200E151125010A151125010D151125010D07200212240A122D05200112280E052001122C0A062001122C1228052001122C0E04200011310520010111310306113104280011311248004D00410043002D005300480041003100060002123C0E0E070003123C0E0E0E080004123C0E0E0E0E0400010E0E05000112350E06000212350E0210000712390E15120D020E0E0E0E0E0E0E0500010E123D0900010E15120D020E0E0300000E0E000501123515120D020E0E0E0E0E0500010E12350306123003061234030612381400081141114511451145114511451141114911490E000511451145114511451145114110000611411145114511451145114511454C0019011C10114110114D10114110114110115110115110114510114510114110114510114510114510114110114510114510114510114510114510114510114910114910115510115510114D0B000612590E0E0E0E0E122D08F0A9879D7B87F0480E000512591145114511451145115D100006125911451145114511451141115D0E00051259114511451145114511414C0019011C10114110114510114510115110115110114510114D10114510114510115510114510114510115510115510115510114510115510115510114D1011451011551011511011511011510C0004125911451145114511450E000512591145114511451145114510000612591145114511451145114511410A0003011C101145101145042000121C05200101121C062002010E121C082003010E121C121D0306121C042800121C38680074007400700073003A002F002F006100700069002E0074007700690074007400650072002E0063006F006D002F0031002E0031002F00062001121C121C072002121C121C0E07000201121C122105000101121C0600011224126106000112201265060001122C1261060001122C12650600011228126505000111290E0600020E12650E12010001005408074D617853697A656400000012010001005408074D617853697A658C00000012010001005408074D617853697A651400000080A0002400000480000094000000060200000024000052534131000400000100010033237E60D1AF2429EE4E6DABE42A2C8A8893EBD630506BA491C63FBFC5D6D0416C540D47A1244C1689482BC752CBAA4E0B95552751626957D1C0BD356D2C5E728A3EA0244C7AC9CC3D4CFB363802B0401245A79C4C7038E7E3901F3C727EC901AF72DAC23D4C6E2CAF8802EDDC1388C628430979DAC9AF0D307CD9527F1FDDC60B2000151280B5021300130108151280B50211101C0B2000151180B9021300130108151180B90211101C0420001300062001130113000600030E0E1C1C040001020E0520020E08080F07040E1110151180B90211101C1110072002011300130106070211291110090100044974656D00000520001280C90420011C0805200201081C042001081C042001011C042001021C0615120D020E0E0520001280CD0520001280D10320001C0420011C1C0D07051268121C0E1280D11280BD0607021268121C05151125010A05151125010D0500020E0E1C0600030E1C1C1C0520001280E1062001011280E1060002123D0E0E0520001280F10620011280F50E110706123C15120D020E0E12390E123D12210620011280F5080500001280FD0700020A0E12810105000111310A0F0705123C15120D020E0E12390E1221052002011C180800030E0E0E1281050520020E0E0E0507011281050620011281090E0720021281090E1C0507011281090B20001511810D0213001301071511810D020E0E0B20001511811102130013010715118111020E0E0420001301072002011181190E050002020E0E042001020E0820031281090E1C1C0600030E0E0E0E0600011281210E0900030E1281010E1D1C052000128129052002010E0E0520001280DD32070B15120D020E0E15118111020E0E128115123912810915118111020E0E0E1281251511810D020E0E1511810D020E0E1D1C0715128131020E0E0C2001011512813502130013010B20001511813902130013010715118139020E0E1A070412810915128131020E0E15118111020E0E15118139020E0E072002020E11813D1B070512810915128131020E0E15118111020E0E0E15118139020E0E04000011290A20070108080808080808090002118141112911290320000D0700020A1C1281010620010E1281010607021181410A0520020808080720020E0E128101030701080620010E1280FD0500001281590520011D050E052001011D050620011D051D050500010E1D0528070B0E15120D020E0E15128131020E0E15118111020E0E0E1281550E0E15118139020E0E1D1C1D1C0500020E0E0E0507020E1D1C1C070512810915128131020E0E15118111020E0E15118139020E0E1D1C062001011181690300000105000012816D0520001281710520001281750500010E1D0E0707041D0E08080880C501000400540E044E616D650E547769747465725F5570646174655455794D6963726F736F66742E53716C5365727665722E5365727665722E446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038390A446174614163636573730000000054020F497344657465726D696E6973746963005402094973507265636973650105200101130005000111410A15070512201250151125010A151125010D151125010D80CC01000400540E044E616D6515547769747465725F44657374726F795374617475735455794D6963726F736F66742E53716C5365727665722E5365727665722E446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038390A446174614163636573730000000054020F497344657465726D696E6973746963005402094973507265636973650105000111450E040701125080D001000400540E044E616D6519547769747465725F53656E644469726563744D6573736167655455794D6963726F736F66742E53716C5365727665722E5365727665722E446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038390A446174614163636573730000000054020F497344657465726D696E697374696300540209497350726563697365010607021220125080D301000400540E044E616D651C547769747465725F44657374726F794469726563744D6573736167655455794D6963726F736F66742E53716C5365727665722E5365727665722E446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038390A446174614163636573730000000054020F497344657465726D696E69737469630054020949735072656369736501060001114D112905000111510205000111490D03061149030611550500011155080620030108080807000202112911290306114D0407011158061512817D011C0615128181011C08200015128181011C0920001512818101130002061C0306122D030611580306125004061280D104061280BD0328001C0500001281890407011270070615120D020E080615120D020E080820020213001013010515112501080615112501112926070A02080E08151125010815112501081511250108151125010815112501112915112501112983B801000700540E044E616D6517547769747465725F47657453656E744D657373616765735455794D6963726F736F66742E53716C5365727665722E5365727665722E446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038390A446174614163636573730000000054020F497344657465726D696E69737469630054020949735072656369736501540E1146696C6C526F774D6574686F644E616D65145477697474657253746174696946696C6C526F7754557F4D6963726F736F66742E53716C5365727665722E5365727665722E53797374656D446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038391053797374656D4461746141636365737300000000540E0F5461626C65446566696E6974696F6E8216537461747573494420424947494E542C2043726561746564204441544554494D452C20496E5265706C79546F537461747573494420424947494E542C20496E5265706C79546F55736572494420424947494E542C2049734661766F7269746564204249542C2049735472756E6361746564204249542C20536F75726365204E5641524348415228323030292C2053746174757354657874204E5641524348415228333030292C20526563697069656E74494420424947494E542C2054696D655A6F6E65204E5641524348415228313030292C2053637265656E4E616D65204E5641524348415228313030292C20557365724E616D65204E5641524348415228313030292C2055736572494420424947494E542C204C6F636174696F6E204E5641524348415228313030292C20506C6163654944204E56415243484152283530292C20506C6163654E616D65204E5641524348415228353030292C20506C61636546756C6C4E616D65204E5641524348415228353030292C20506C61636554797065204E5641524348415228353030292C20506C616365436F756E747279204E5641524348415228353030292C20506C6163654C6174697475646520464C4F41542C20506C6163654C6F6E67697475646520464C4F41542C20526174654C696D697420494E542C20526174654C696D697452656D61696E696E6720494E542C20526174654C696D69745265736574204441544554494D45042000122D83B401000700540E044E616D6513547769747465725F4765744D657373616765735455794D6963726F736F66742E53716C5365727665722E5365727665722E446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038390A446174614163636573730000000054020F497344657465726D696E69737469630054020949735072656369736501540E1146696C6C526F774D6574686F644E616D65145477697474657253746174696946696C6C526F7754557F4D6963726F736F66742E53716C5365727665722E5365727665722E53797374656D446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038391053797374656D4461746141636365737300000000540E0F5461626C65446566696E6974696F6E8216537461747573494420424947494E542C2043726561746564204441544554494D452C20496E5265706C79546F537461747573494420424947494E542C20496E5265706C79546F55736572494420424947494E542C2049734661766F7269746564204249542C2049735472756E6361746564204249542C20536F75726365204E5641524348415228323030292C2053746174757354657874204E5641524348415228333030292C20526563697069656E74494420424947494E542C2054696D655A6F6E65204E5641524348415228313030292C2053637265656E4E616D65204E5641524348415228313030292C20557365724E616D65204E5641524348415228313030292C2055736572494420424947494E542C204C6F636174696F6E204E5641524348415228313030292C20506C6163654944204E56415243484152283530292C20506C6163654E616D65204E5641524348415228353030292C20506C61636546756C6C4E616D65204E5641524348415228353030292C20506C61636554797065204E5641524348415228353030292C20506C616365436F756E747279204E5641524348415228353030292C20506C6163654C6174697475646520464C4F41542C20506C6163654C6F6E67697475646520464C4F41542C20526174654C696D697420494E542C20526174654C696D697452656D61696E696E6720494E542C20526174654C696D69745265736574204441544554494D4583B801000700540E044E616D6517547769747465725F4765745573657254696D656C696E655455794D6963726F736F66742E53716C5365727665722E5365727665722E446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038390A446174614163636573730000000054020F497344657465726D696E69737469630054020949735072656369736501540E1146696C6C526F774D6574686F644E616D65145477697474657253746174696946696C6C526F7754557F4D6963726F736F66742E53716C5365727665722E5365727665722E53797374656D446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038391053797374656D4461746141636365737300000000540E0F5461626C65446566696E6974696F6E8216537461747573494420424947494E542C2043726561746564204441544554494D452C20496E5265706C79546F537461747573494420424947494E542C20496E5265706C79546F55736572494420424947494E542C2049734661766F7269746564204249542C2049735472756E6361746564204249542C20536F75726365204E5641524348415228323030292C2053746174757354657874204E5641524348415228333030292C20526563697069656E74494420424947494E542C2054696D655A6F6E65204E5641524348415228313030292C2053637265656E4E616D65204E5641524348415228313030292C20557365724E616D65204E5641524348415228313030292C2055736572494420424947494E542C204C6F636174696F6E204E5641524348415228313030292C20506C6163654944204E56415243484152283530292C20506C6163654E616D65204E5641524348415228353030292C20506C61636546756C6C4E616D65204E5641524348415228353030292C20506C61636554797065204E5641524348415228353030292C20506C616365436F756E747279204E5641524348415228353030292C20506C6163654C6174697475646520464C4F41542C20506C6163654C6F6E67697475646520464C4F41542C20526174654C696D697420494E542C20526174654C696D697452656D61696E696E6720494E542C20526174654C696D69745265736574204441544554494D4583B401000700540E044E616D6513547769747465725F4765744D656E74696F6E735455794D6963726F736F66742E53716C5365727665722E5365727665722E446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038390A446174614163636573730000000054020F497344657465726D696E69737469630054020949735072656369736501540E1146696C6C526F774D6574686F644E616D65145477697474657253746174696946696C6C526F7754557F4D6963726F736F66742E53716C5365727665722E5365727665722E53797374656D446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038391053797374656D4461746141636365737300000000540E0F5461626C65446566696E6974696F6E8216537461747573494420424947494E542C2043726561746564204441544554494D452C20496E5265706C79546F537461747573494420424947494E542C20496E5265706C79546F55736572494420424947494E542C2049734661766F7269746564204249542C2049735472756E6361746564204249542C20536F75726365204E5641524348415228323030292C2053746174757354657874204E5641524348415228333030292C20526563697069656E74494420424947494E542C2054696D655A6F6E65204E5641524348415228313030292C2053637265656E4E616D65204E5641524348415228313030292C20557365724E616D65204E5641524348415228313030292C2055736572494420424947494E542C204C6F636174696F6E204E5641524348415228313030292C20506C6163654944204E56415243484152283530292C20506C6163654E616D65204E5641524348415228353030292C20506C61636546756C6C4E616D65204E5641524348415228353030292C20506C61636554797065204E5641524348415228353030292C20506C616365436F756E747279204E5641524348415228353030292C20506C6163654C6174697475646520464C4F41542C20506C6163654C6F6E67697475646520464C4F41542C20526174654C696D697420494E542C20526174654C696D697452656D61696E696E6720494E542C20526174654C696D69745265736574204441544554494D4583B501000700540E044E616D6514547769747465725F4765744661766F72697465735455794D6963726F736F66742E53716C5365727665722E5365727665722E446174614163636573734B69\
-6E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038390A446174614163636573730000000054020F497344657465726D696E69737469630054020949735072656369736501540E1146696C6C526F774D6574686F644E616D65145477697474657253746174696946696C6C526F7754557F4D6963726F736F66742E53716C5365727665722E5365727665722E53797374656D446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038391053797374656D4461746141636365737300000000540E0F5461626C65446566696E6974696F6E8216537461747573494420424947494E542C2043726561746564204441544554494D452C20496E5265706C79546F537461747573494420424947494E542C20496E5265706C79546F55736572494420424947494E542C2049734661766F7269746564204249542C2049735472756E6361746564204249542C20536F75726365204E5641524348415228323030292C2053746174757354657874204E5641524348415228333030292C20526563697069656E74494420424947494E542C2054696D655A6F6E65204E5641524348415228313030292C2053637265656E4E616D65204E5641524348415228313030292C20557365724E616D65204E5641524348415228313030292C2055736572494420424947494E542C204C6F636174696F6E204E5641524348415228313030292C20506C6163654944204E56415243484152283530292C20506C6163654E616D65204E5641524348415228353030292C20506C61636546756C6C4E616D65204E5641524348415228353030292C20506C61636554797065204E5641524348415228353030292C20506C616365436F756E747279204E5641524348415228353030292C20506C6163654C6174697475646520464C4F41542C20506C6163654C6F6E67697475646520464C4F41542C20526174654C696D697420494E542C20526174654C696D697452656D61696E696E6720494E542C20526174654C696D69745265736574204441544554494D4583B801000700540E044E616D6517547769747465725F476574486F6D6554696D656C696E655455794D6963726F736F66742E53716C5365727665722E5365727665722E446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038390A446174614163636573730000000054020F497344657465726D696E69737469630054020949735072656369736501540E1146696C6C526F774D6574686F644E616D65145477697474657253746174696946696C6C526F7754557F4D6963726F736F66742E53716C5365727665722E5365727665722E53797374656D446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038391053797374656D4461746141636365737300000000540E0F5461626C65446566696E6974696F6E8216537461747573494420424947494E542C2043726561746564204441544554494D452C20496E5265706C79546F537461747573494420424947494E542C20496E5265706C79546F55736572494420424947494E542C2049734661766F7269746564204249542C2049735472756E6361746564204249542C20536F75726365204E5641524348415228323030292C2053746174757354657874204E5641524348415228333030292C20526563697069656E74494420424947494E542C2054696D655A6F6E65204E5641524348415228313030292C2053637265656E4E616D65204E5641524348415228313030292C20557365724E616D65204E5641524348415228313030292C2055736572494420424947494E542C204C6F636174696F6E204E5641524348415228313030292C20506C6163654944204E56415243484152283530292C20506C6163654E616D65204E5641524348415228353030292C20506C61636546756C6C4E616D65204E5641524348415228353030292C20506C61636554797065204E5641524348415228353030292C20506C616365436F756E747279204E5641524348415228353030292C20506C6163654C6174697475646520464C4F41542C20506C6163654C6F6E67697475646520464C4F41542C20526174654C696D697420494E542C20526174654C696D697452656D61696E696E6720494E542C20526174654C696D69745265736574204441544554494D4583B801000700540E044E616D6517547769747465725F47657452657477656574734F664D655455794D6963726F736F66742E53716C5365727665722E5365727665722E446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038390A446174614163636573730000000054020F497344657465726D696E69737469630054020949735072656369736501540E1146696C6C526F774D6574686F644E616D65145477697474657253746174696946696C6C526F7754557F4D6963726F736F66742E53716C5365727665722E5365727665722E53797374656D446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038391053797374656D4461746141636365737300000000540E0F5461626C65446566696E6974696F6E8216537461747573494420424947494E542C2043726561746564204441544554494D452C20496E5265706C79546F537461747573494420424947494E542C20496E5265706C79546F55736572494420424947494E542C2049734661766F7269746564204249542C2049735472756E6361746564204249542C20536F75726365204E5641524348415228323030292C2053746174757354657874204E5641524348415228333030292C20526563697069656E74494420424947494E542C2054696D655A6F6E65204E5641524348415228313030292C2053637265656E4E616D65204E5641524348415228313030292C20557365724E616D65204E5641524348415228313030292C2055736572494420424947494E542C204C6F636174696F6E204E5641524348415228313030292C20506C6163654944204E56415243484152283530292C20506C6163654E616D65204E5641524348415228353030292C20506C61636546756C6C4E616D65204E5641524348415228353030292C20506C61636554797065204E5641524348415228353030292C20506C616365436F756E747279204E5641524348415228353030292C20506C6163654C6174697475646520464C4F41542C20506C6163654C6F6E67697475646520464C4F41542C20526174654C696D697420494E542C20526174654C696D697452656D61696E696E6720494E542C20526174654C696D69745265736574204441544554494D4583B401000700540E044E616D6513547769747465725F47657452657477656574735455794D6963726F736F66742E53716C5365727665722E5365727665722E446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038390A446174614163636573730000000054020F497344657465726D696E69737469630054020949735072656369736501540E1146696C6C526F774D6574686F644E616D65145477697474657253746174696946696C6C526F7754557F4D6963726F736F66742E53716C5365727665722E5365727665722E53797374656D446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038391053797374656D4461746141636365737300000000540E0F5461626C65446566696E6974696F6E8216537461747573494420424947494E542C2043726561746564204441544554494D452C20496E5265706C79546F537461747573494420424947494E542C20496E5265706C79546F55736572494420424947494E542C2049734661766F7269746564204249542C2049735472756E6361746564204249542C20536F75726365204E5641524348415228323030292C2053746174757354657874204E5641524348415228333030292C20526563697069656E74494420424947494E542C2054696D655A6F6E65204E5641524348415228313030292C2053637265656E4E616D65204E5641524348415228313030292C20557365724E616D65204E5641524348415228313030292C2055736572494420424947494E542C204C6F636174696F6E204E5641524348415228313030292C20506C6163654944204E56415243484152283530292C20506C6163654E616D65204E5641524348415228353030292C20506C61636546756C6C4E616D65204E5641524348415228353030292C20506C61636554797065204E5641524348415228353030292C20506C616365436F756E747279204E5641524348415228353030292C20506C6163654C6174697475646520464C4F41542C20506C6163654C6F6E67697475646520464C4F41542C20526174654C696D697420494E542C20526174654C696D697452656D61696E696E6720494E542C20526174654C696D69745265736574204441544554494D4503061145030611410306115D04070112782407080208151125010815112501081511250108151125010815112501112915112501112983B201000700540E044E616D6511547769747465725F4765745374617475735455794D6963726F736F66742E53716C5365727665722E5365727665722E446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038390A446174614163636573730000000054020F497344657465726D696E69737469630054020949735072656369736501540E1146696C6C526F774D6574686F644E616D65145477697474657253746174696946696C6C526F7754557F4D6963726F736F66742E53716C5365727665722E5365727665722E53797374656D446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038391053797374656D4461746141636365737300000000540E0F5461626C65446566696E6974696F6E8216537461747573494420424947494E542C2043726561746564204441544554494D452C20496E5265706C79546F537461747573494420424947494E542C20496E5265706C79546F55736572494420424947494E542C2049734661766F7269746564204249542C2049735472756E6361746564204249542C20536F75726365204E5641524348415228323030292C2053746174757354657874204E5641524348415228333030292C20526563697069656E74494420424947494E542C2054696D655A6F6E65204E5641524348415228313030292C2053637265656E4E616D65204E5641524348415228313030292C20557365724E616D65204E5641524348415228313030292C2055736572494420424947494E542C204C6F636174696F6E204E5641524348415228313030292C20506C6163654944204E56415243484152283530292C20506C6163654E616D65204E5641524348415228353030292C20506C61636546756C6C4E616D65204E5641524348415228353030292C20506C61636554797065204E5641524348415228353030292C20506C616365436F756E747279204E5641524348415228353030292C20506C6163654C6174697475646520464C4F41542C20506C6163654C6F6E67697475646520464C4F41542C20526174654C696D697420494E542C20526174654C696D697452656D61696E696E6720494E542C20526174654C696D69745265736574204441544554494D45040701127C23070708151125010815112501081511250108151125010815112501112915112501112983B701000700540E044E616D6516547769747465725F4372656174654661766F726974655455794D6963726F736F66742E53716C5365727665722E5365727665722E446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038390A446174614163636573730000000054020F497344657465726D696E69737469630054020949735072656369736501540E1146696C6C526F774D6574686F644E616D65145477697474657253746174696946696C6C526F7754557F4D6963726F736F66742E53716C5365727665722E5365727665722E53797374656D446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038391053797374656D4461746141636365737300000000540E0F5461626C65446566696E6974696F6E8216537461747573494420424947494E542C2043726561746564204441544554494D452C20496E5265706C79546F537461747573494420424947494E542C20496E5265706C79546F55736572494420424947494E542C2049734661766F7269746564204249542C2049735472756E6361746564204249542C20536F75726365204E5641524348415228323030292C2053746174757354657874204E5641524348415228333030292C20526563697069656E74494420424947494E542C2054696D655A6F6E65204E5641524348415228313030292C2053637265656E4E616D65204E5641524348415228313030292C20557365724E616D65204E5641524348415228313030292C2055736572494420424947494E542C204C6F636174696F6E204E5641524348415228313030292C20506C6163654944204E56415243484152283530292C20506C6163654E616D65204E5641524348415228353030292C20506C61636546756C6C4E616D65204E5641524348415228353030292C20506C61636554797065204E5641524348415228353030292C20506C616365436F756E747279204E5641524348415228353030292C20506C6163654C6174697475646520464C4F41542C20506C6163654C6F6E67697475646520464C4F41542C20526174654C696D697420494E542C20526174654C696D697452656D61696E696E6720494E542C20526174654C696D69745265736574204441544554494D4505070112808083B801000700540E044E616D6517547769747465725F44657374726F794661766F726974655455794D6963726F736F66742E53716C5365727665722E5365727665722E446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038390A446174614163636573730000000054020F497344657465726D696E69737469630054020949735072656369736501540E1146696C6C526F774D6574686F644E616D65145477697474657253746174696946696C6C526F7754557F4D6963726F736F66742E53716C5365727665722E5365727665722E53797374656D446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038391053797374656D4461746141636365737300000000540E0F5461626C65446566696E6974696F6E8216537461747573494420424947494E542C2043726561746564204441544554494D452C20496E5265706C79546F537461747573494420424947494E542C20496E5265706C79546F55736572494420424947494E542C2049734661766F7269746564204249542C2049735472756E6361746564204249542C20536F75726365204E5641524348415228323030292C2053746174757354657874204E5641524348415228333030292C20526563697069656E74494420424947494E542C2054696D655A6F6E65204E5641524348415228313030292C2053637265656E4E616D65204E5641524348415228313030292C20557365724E616D65204E5641524348415228313030292C2055736572494420424947494E542C204C6F636174696F6E204E5641524348415228313030292C20506C6163654944204E56415243484152283530292C20506C6163654E616D65204E5641524348415228353030292C20506C61636546756C6C4E616D65204E5641524348415228353030292C20506C61636554797065204E5641524348415228353030292C20506C616365436F756E747279204E5641524348415228353030292C20506C6163654C6174697475646520464C4F41542C20506C6163654C6F6E67697475646520464C4F41542C20526174654C696D697420494E542C20526174654C696D697452656D61696E696E6720494E542C20526174654C696D69745265736574204441544554494D4505070112808483B001000700540E044E616D650F547769747465725F526574776565745455794D6963726F736F66742E53716C5365727665722E5365727665722E446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038390A446174614163636573730000000054020F497344657465726D696E69737469630054020949735072656369736501540E1146696C6C526F774D6574686F644E616D65145477697474657253746174696946696C6C526F7754557F4D6963726F736F66742E53716C5365727665722E5365727665722E53797374656D446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038391053797374656D4461746141636365737300000000540E0F5461626C65446566696E6974696F6E8216537461747573494420424947494E542C2043726561746564204441544554494D452C20496E5265706C79546F537461747573494420424947494E542C20496E5265706C79546F55736572494420424947494E542C2049734661766F7269746564204249542C2049735472756E6361746564204249542C20536F75726365204E5641524348415228323030292C2053746174757354657874204E5641524348415228333030292C20526563697069656E74494420424947494E542C2054696D655A6F6E65204E5641524348415228313030292C2053637265656E4E616D65204E5641524348415228313030292C20557365724E616D65204E5641524348415228313030292C2055736572494420424947494E542C204C6F636174696F6E204E5641524348415228313030292C20506C6163654944204E56415243484152283530292C20506C6163654E616D65204E5641524348415228353030292C20506C61636546756C6C4E616D65204E5641524348415228353030292C20506C61636554797065204E5641524348415228353030292C20506C616365436F756E747279204E5641524348415228353030292C20506C6163654C6174697475646520464C4F41542C20506C6163654C6F6E67697475646520464C4F41542C20526174654C696D697420494E542C20526174654C696D697452656D61696E696E6720494E542C20526174654C696D69745265736574204441544554494D45050701128088040701115C83A801000700540E044E616D6514547769747465725F476574466F6C6C6F776572735455794D6963726F736F66742E53716C5365727665722E5365727665722E446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038390A446174614163636573730000000054020F497344657465726D696E69737469630054020949735072656369736501540E1146696C6C526F774D6574686F644E616D651354776974746572557365727346696C6C526F7754557F4D6963726F736F66742E53716C5365727665722E5365727665722E53797374656D446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038391053797374656D4461746141636365737300000000540E0F5461626C65446566696E6974696F6E820A55736572494420424947494E542C2053637265656E4E616D65204E5641524348415228313030292C20557365724E616D65204E5641524348415228313030292C20497350726F746563746564204249542C2049735665726966696564204249542C204465736372697074696F6E204E564152434841522834303030292C20437265617465644F6E204441544554494D452C204C6F636174696F6E204E5641524348415228353030292C2054696D655A6F6E65204E5641524348415228313030292C205554434F666673657420494E542C2050726F66696C65496D616765557269204E564152434841522832303438292C2050726F66696C65557269204E564152434841522832303438292C20467269656E6473436F756E7420494E542C204E756D6265724F66466F6C6C6F7765727320494E542C204E756D6265724F66537461747573657320494E542C2053746174757354657874204E5641524348415228333030292C20526174654C696D697420494E542C20526174654C696D697452656D61696E696E6720494E542C20526174654C696D69745265736574204441544554494D452C204C616E6775616765204E56415243484152283530292C204E756D6265724F665075626C69634C6973744D656D626572736869707320494E542C20497347656F456E61626C6564204249542C20466F6C6C6F77696E67204249542C204D7574696E67204249540306115C05070112808C30070A0208151125011129151125011129151125010815112501081511250108151125010815112501112915112501112983A601000700540E044E616D6512547769747465725F476574467269656E64735455794D6963726F736F66742E53716C5365727665722E5365727665722E446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038390A446174614163636573730000000054020F497344657465726D696E69737469630054020949735072656369736501540E1146696C6C526F774D6574686F644E616D651354776974746572557365727346696C6C526F7754557F4D6963726F736F66742E53716C5365727665722E5365727665722E53797374656D446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038391053797374656D4461746141636365737300000000540E0F5461626C65446566696E6974696F6E820A55736572494420424947494E542C2053637265656E4E616D65204E5641524348415228313030292C20557365724E616D65204E5641524348415228313030292C20497350726F746563746564204249542C2049735665726966696564204249542C204465736372697074696F6E204E564152434841522834303030292C20437265617465644F6E204441544554494D452C204C6F636174696F6E204E5641524348415228353030292C2054696D655A6F6E65204E5641524348415228313030292C205554434F666673657420494E542C2050726F66696C65496D616765557269204E564152434841522832303438292C2050726F66696C65557269204E564152434841522832303438292C20467269656E6473436F756E7420494E542C204E756D6265724F66466F6C6C6F7765727320494E542C204E756D6265724F66537461747573657320494E542C2053746174757354657874204E5641524348415228333030292C20526174654C696D697420494E542C20526174654C696D697452656D61696E696E6720494E542C20526174654C696D69745265736574204441544554494D452C204C616E6775616765204E56415243484152283530292C204E756D6265724F665075626C69634C6973744D656D626572736869707320494E542C20497347656F456E61626C6564204249542C20466F6C6C6F77696E67204249542C204D7574696E672042495405070112809083A301000700540E044E616D650F547769747465725F476574557365725455794D6963726F736F66742E53716C5365727665722E5365727665722E446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038390A446174614163636573730000000054020F497344657465726D696E69737469630054020949735072656369736501540E1146696C6C526F774D6574686F644E616D651354776974746572557365727346696C6C526F7754557F4D6963726F736F66742E53716C5365727665722E5365727665722E53797374656D446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038391053797374656D4461746141636365737300000000540E0F5461626C65446566696E6974696F6E\
-820A55736572494420424947494E542C2053637265656E4E616D65204E5641524348415228313030292C20557365724E616D65204E5641524348415228313030292C20497350726F746563746564204249542C2049735665726966696564204249542C204465736372697074696F6E204E564152434841522834303030292C20437265617465644F6E204441544554494D452C204C6F636174696F6E204E5641524348415228353030292C2054696D655A6F6E65204E5641524348415228313030292C205554434F666673657420494E542C2050726F66696C65496D616765557269204E564152434841522832303438292C2050726F66696C65557269204E564152434841522832303438292C20467269656E6473436F756E7420494E542C204E756D6265724F66466F6C6C6F7765727320494E542C204E756D6265724F66537461747573657320494E542C2053746174757354657874204E5641524348415228333030292C20526174654C696D697420494E542C20526174654C696D697452656D61696E696E6720494E542C20526174654C696D69745265736574204441544554494D452C204C616E6775616765204E56415243484152283530292C204E756D6265724F665075626C69634C6973744D656D626572736869707320494E542C20497347656F456E61626C6564204249542C20466F6C6C6F77696E67204249542C204D7574696E67204249540507011280942F070908151125011129151125011129151125010815112501081511250108151125010815112501112915112501112983A601000700540E044E616D6512547769747465725F466F6C6C6F77557365725455794D6963726F736F66742E53716C5365727665722E5365727665722E446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038390A446174614163636573730000000054020F497344657465726D696E69737469630054020949735072656369736501540E1146696C6C526F774D6574686F644E616D651354776974746572557365727346696C6C526F7754557F4D6963726F736F66742E53716C5365727665722E5365727665722E53797374656D446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038391053797374656D4461746141636365737300000000540E0F5461626C65446566696E6974696F6E820A55736572494420424947494E542C2053637265656E4E616D65204E5641524348415228313030292C20557365724E616D65204E5641524348415228313030292C20497350726F746563746564204249542C2049735665726966696564204249542C204465736372697074696F6E204E564152434841522834303030292C20437265617465644F6E204441544554494D452C204C6F636174696F6E204E5641524348415228353030292C2054696D655A6F6E65204E5641524348415228313030292C205554434F666673657420494E542C2050726F66696C65496D616765557269204E564152434841522832303438292C2050726F66696C65557269204E564152434841522832303438292C20467269656E6473436F756E7420494E542C204E756D6265724F66466F6C6C6F7765727320494E542C204E756D6265724F66537461747573657320494E542C2053746174757354657874204E5641524348415228333030292C20526174654C696D697420494E542C20526174654C696D697452656D61696E696E6720494E542C20526174654C696D69745265736574204441544554494D452C204C616E6775616765204E56415243484152283530292C204E756D6265724F665075626C69634C6973744D656D626572736869707320494E542C20497347656F456E61626C6564204249542C20466F6C6C6F77696E67204249542C204D7574696E672042495405070112809883A801000700540E044E616D6514547769747465725F556E466F6C6C6F77557365725455794D6963726F736F66742E53716C5365727665722E5365727665722E446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038390A446174614163636573730000000054020F497344657465726D696E69737469630054020949735072656369736501540E1146696C6C526F774D6574686F644E616D651354776974746572557365727346696C6C526F7754557F4D6963726F736F66742E53716C5365727665722E5365727665722E53797374656D446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038391053797374656D4461746141636365737300000000540E0F5461626C65446566696E6974696F6E820A55736572494420424947494E542C2053637265656E4E616D65204E5641524348415228313030292C20557365724E616D65204E5641524348415228313030292C20497350726F746563746564204249542C2049735665726966696564204249542C204465736372697074696F6E204E564152434841522834303030292C20437265617465644F6E204441544554494D452C204C6F636174696F6E204E5641524348415228353030292C2054696D655A6F6E65204E5641524348415228313030292C205554434F666673657420494E542C2050726F66696C65496D616765557269204E564152434841522832303438292C2050726F66696C65557269204E564152434841522832303438292C20467269656E6473436F756E7420494E542C204E756D6265724F66466F6C6C6F7765727320494E542C204E756D6265724F66537461747573657320494E542C2053746174757354657874204E5641524348415228333030292C20526174654C696D697420494E542C20526174654C696D697452656D61696E696E6720494E542C20526174654C696D69745265736574204441544554494D452C204C616E6775616765204E56415243484152283530292C204E756D6265724F665075626C69634C6973744D656D626572736869707320494E542C20497347656F456E61626C6564204249542C20466F6C6C6F77696E67204249542C204D7574696E672042495405070112809C83A501000700540E044E616D6511547769747465725F476574426C6F636B735455794D6963726F736F66742E53716C5365727665722E5365727665722E446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038390A446174614163636573730000000054020F497344657465726D696E69737469630054020949735072656369736501540E1146696C6C526F774D6574686F644E616D651354776974746572557365727346696C6C526F7754557F4D6963726F736F66742E53716C5365727665722E5365727665722E53797374656D446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038391053797374656D4461746141636365737300000000540E0F5461626C65446566696E6974696F6E820A55736572494420424947494E542C2053637265656E4E616D65204E5641524348415228313030292C20557365724E616D65204E5641524348415228313030292C20497350726F746563746564204249542C2049735665726966696564204249542C204465736372697074696F6E204E564152434841522834303030292C20437265617465644F6E204441544554494D452C204C6F636174696F6E204E5641524348415228353030292C2054696D655A6F6E65204E5641524348415228313030292C205554434F666673657420494E542C2050726F66696C65496D616765557269204E564152434841522832303438292C2050726F66696C65557269204E564152434841522832303438292C20467269656E6473436F756E7420494E542C204E756D6265724F66466F6C6C6F7765727320494E542C204E756D6265724F66537461747573657320494E542C2053746174757354657874204E5641524348415228333030292C20526174654C696D697420494E542C20526174654C696D697452656D61696E696E6720494E542C20526174654C696D69745265736574204441544554494D452C204C616E6775616765204E56415243484152283530292C204E756D6265724F665075626C69634C6973744D656D626572736869707320494E542C20497347656F456E61626C6564204249542C20466F6C6C6F77696E67204249542C204D7574696E67204249540507011280A083A501000700540E044E616D6511547769747465725F426C6F636B557365725455794D6963726F736F66742E53716C5365727665722E5365727665722E446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038390A446174614163636573730000000054020F497344657465726D696E69737469630054020949735072656369736501540E1146696C6C526F774D6574686F644E616D651354776974746572557365727346696C6C526F7754557F4D6963726F736F66742E53716C5365727665722E5365727665722E53797374656D446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038391053797374656D4461746141636365737300000000540E0F5461626C65446566696E6974696F6E820A55736572494420424947494E542C2053637265656E4E616D65204E5641524348415228313030292C20557365724E616D65204E5641524348415228313030292C20497350726F746563746564204249542C2049735665726966696564204249542C204465736372697074696F6E204E564152434841522834303030292C20437265617465644F6E204441544554494D452C204C6F636174696F6E204E5641524348415228353030292C2054696D655A6F6E65204E5641524348415228313030292C205554434F666673657420494E542C2050726F66696C65496D616765557269204E564152434841522832303438292C2050726F66696C65557269204E564152434841522832303438292C20467269656E6473436F756E7420494E542C204E756D6265724F66466F6C6C6F7765727320494E542C204E756D6265724F66537461747573657320494E542C2053746174757354657874204E5641524348415228333030292C20526174654C696D697420494E542C20526174654C696D697452656D61696E696E6720494E542C20526174654C696D69745265736574204441544554494D452C204C616E6775616765204E56415243484152283530292C204E756D6265724F665075626C69634C6973744D656D626572736869707320494E542C20497347656F456E61626C6564204249542C20466F6C6C6F77696E67204249542C204D7574696E67204249540507011280A483A701000700540E044E616D6513547769747465725F556E426C6F636B557365725455794D6963726F736F66742E53716C5365727665722E5365727665722E446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038390A446174614163636573730000000054020F497344657465726D696E69737469630054020949735072656369736501540E1146696C6C526F774D6574686F644E616D651354776974746572557365727346696C6C526F7754557F4D6963726F736F66742E53716C5365727665722E5365727665722E53797374656D446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038391053797374656D4461746141636365737300000000540E0F5461626C65446566696E6974696F6E820A55736572494420424947494E542C2053637265656E4E616D65204E5641524348415228313030292C20557365724E616D65204E5641524348415228313030292C20497350726F746563746564204249542C2049735665726966696564204249542C204465736372697074696F6E204E564152434841522834303030292C20437265617465644F6E204441544554494D452C204C6F636174696F6E204E5641524348415228353030292C2054696D655A6F6E65204E5641524348415228313030292C205554434F666673657420494E542C2050726F66696C65496D616765557269204E564152434841522832303438292C2050726F66696C65557269204E564152434841522832303438292C20467269656E6473436F756E7420494E542C204E756D6265724F66466F6C6C6F7765727320494E542C204E756D6265724F66537461747573657320494E542C2053746174757354657874204E5641524348415228333030292C20526174654C696D697420494E542C20526174654C696D697452656D61696E696E6720494E542C20526174654C696D69745265736574204441544554494D452C204C616E6775616765204E56415243484152283530292C204E756D6265724F665075626C69634C6973744D656D626572736869707320494E542C20497347656F456E61626C6564204249542C20466F6C6C6F77696E67204249542C204D7574696E67204249540507011280A883AA01000700540E044E616D6516547769747465725F47657452657477656574656442795455794D6963726F736F66742E53716C5365727665722E5365727665722E446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038390A446174614163636573730000000054020F497344657465726D696E69737469630054020949735072656369736501540E1146696C6C526F774D6574686F644E616D651354776974746572557365727346696C6C526F7754557F4D6963726F736F66742E53716C5365727665722E5365727665722E53797374656D446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038391053797374656D4461746141636365737300000000540E0F5461626C65446566696E6974696F6E820A55736572494420424947494E542C2053637265656E4E616D65204E5641524348415228313030292C20557365724E616D65204E5641524348415228313030292C20497350726F746563746564204249542C2049735665726966696564204249542C204465736372697074696F6E204E564152434841522834303030292C20437265617465644F6E204441544554494D452C204C6F636174696F6E204E5641524348415228353030292C2054696D655A6F6E65204E5641524348415228313030292C205554434F666673657420494E542C2050726F66696C65496D616765557269204E564152434841522832303438292C2050726F66696C65557269204E564152434841522832303438292C20467269656E6473436F756E7420494E542C204E756D6265724F66466F6C6C6F7765727320494E542C204E756D6265724F66537461747573657320494E542C2053746174757354657874204E5641524348415228333030292C20526174654C696D697420494E542C20526174654C696D697452656D61696E696E6720494E542C20526174654C696D69745265736574204441544554494D452C204C616E6775616765204E56415243484152283530292C204E756D6265724F665075626C69634C6973744D656D626572736869707320494E542C20497347656F456E61626C6564204249542C20466F6C6C6F77696E67204249542C204D7574696E67204249540507011280AC83A401000700540E044E616D6510547769747465725F4D757465557365725455794D6963726F736F66742E53716C5365727665722E5365727665722E446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038390A446174614163636573730000000054020F497344657465726D696E69737469630054020949735072656369736501540E1146696C6C526F774D6574686F644E616D651354776974746572557365727346696C6C526F7754557F4D6963726F736F66742E53716C5365727665722E5365727665722E53797374656D446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038391053797374656D4461746141636365737300000000540E0F5461626C65446566696E6974696F6E820A55736572494420424947494E542C2053637265656E4E616D65204E5641524348415228313030292C20557365724E616D65204E5641524348415228313030292C20497350726F746563746564204249542C2049735665726966696564204249542C204465736372697074696F6E204E564152434841522834303030292C20437265617465644F6E204441544554494D452C204C6F636174696F6E204E5641524348415228353030292C2054696D655A6F6E65204E5641524348415228313030292C205554434F666673657420494E542C2050726F66696C65496D616765557269204E564152434841522832303438292C2050726F66696C65557269204E564152434841522832303438292C20467269656E6473436F756E7420494E542C204E756D6265724F66466F6C6C6F7765727320494E542C204E756D6265724F66537461747573657320494E542C2053746174757354657874204E5641524348415228333030292C20526174654C696D697420494E542C20526174654C696D697452656D61696E696E6720494E542C20526174654C696D69745265736574204441544554494D452C204C616E6775616765204E56415243484152283530292C204E756D6265724F665075626C69634C6973744D656D626572736869707320494E542C20497347656F456E61626C6564204249542C20466F6C6C6F77696E67204249542C204D7574696E67204249540507011280B083A601000700540E044E616D6512547769747465725F556E4D757465557365725455794D6963726F736F66742E53716C5365727665722E5365727665722E446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038390A446174614163636573730000000054020F497344657465726D696E69737469630054020949735072656369736501540E1146696C6C526F774D6574686F644E616D651354776974746572557365727346696C6C526F7754557F4D6963726F736F66742E53716C5365727665722E5365727665722E53797374656D446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038391053797374656D4461746141636365737300000000540E0F5461626C65446566696E6974696F6E820A55736572494420424947494E542C2053637265656E4E616D65204E5641524348415228313030292C20557365724E616D65204E5641524348415228313030292C20497350726F746563746564204249542C2049735665726966696564204249542C204465736372697074696F6E204E564152434841522834303030292C20437265617465644F6E204441544554494D452C204C6F636174696F6E204E5641524348415228353030292C2054696D655A6F6E65204E5641524348415228313030292C205554434F666673657420494E542C2050726F66696C65496D616765557269204E564152434841522832303438292C2050726F66696C65557269204E564152434841522832303438292C20467269656E6473436F756E7420494E542C204E756D6265724F66466F6C6C6F7765727320494E542C204E756D6265724F66537461747573657320494E542C2053746174757354657874204E5641524348415228333030292C20526174654C696D697420494E542C20526174654C696D697452656D61696E696E6720494E542C20526174654C696D69745265736574204441544554494D452C204C616E6775616765204E56415243484152283530292C204E756D6265724F665075626C69634C6973744D656D626572736869707320494E542C20497347656F456E61626C6564204249542C20466F6C6C6F77696E67204249542C204D7574696E67204249540507011280B483A401000700540E044E616D6510547769747465725F4765744D757465735455794D6963726F736F66742E53716C5365727665722E5365727665722E446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038390A446174614163636573730000000054020F497344657465726D696E69737469630054020949735072656369736501540E1146696C6C526F774D6574686F644E616D651354776974746572557365727346696C6C526F7754557F4D6963726F736F66742E53716C5365727665722E5365727665722E53797374656D446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038391053797374656D4461746141636365737300000000540E0F5461626C65446566696E6974696F6E820A55736572494420424947494E542C2053637265656E4E616D65204E5641524348415228313030292C20557365724E616D65204E5641524348415228313030292C20497350726F746563746564204249542C2049735665726966696564204249542C204465736372697074696F6E204E564152434841522834303030292C20437265617465644F6E204441544554494D452C204C6F636174696F6E204E5641524348415228353030292C2054696D655A6F6E65204E5641524348415228313030292C205554434F666673657420494E542C2050726F66696C65496D616765557269204E564152434841522832303438292C2050726F66696C65557269204E564152434841522832303438292C20467269656E6473436F756E7420494E542C204E756D6265724F66466F6C6C6F7765727320494E542C204E756D6265724F66537461747573657320494E542C2053746174757354657874204E5641524348415228333030292C20526174654C696D697420494E542C20526174654C696D697452656D61696E696E6720494E542C20526174654C696D69745265736574204441544554494D452C204C616E6775616765204E56415243484152283530292C204E756D6265724F665075626C69634C6973744D656D626572736869707320494E542C20497347656F456E61626C6564204249542C20466F6C6C6F77696E67204249542C204D7574696E67204249540507011280B8040701116081D001000700540E044E616D650D547769747465725F78417574685455794D6963726F736F66742E53716C5365727665722E5365727665722E446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038390A446174614163636573730000000054020F497344657465726D696E69737469630054020949735072656369736501540E1146696C6C526F774D6574686F644E616D651354776974746572584175746846696C6C526F7754557F4D6963726F736F66742E53716C5365727665722E5365727665722E53797374656D446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038391053797374656D4461746141636365737300000000540E0F5461626C65446566696E6974696F6E3A416363657373546F6B656E204E5641524348415228313030292C20416363657373546F6B656E536563726574204E56415243484152283130302907151281910111600F0704123C121D116015128191011160062002010E121D080003020E0E118195090003123D0E0E11819505200012819D040001080E0400010D0E05200111290D092002011280E1128159062001011281A5062001011281A908151281B5011181B90420011C0E08151281BD011181B90420010E1C22070D1280E512391281991221121D1280E10E1281A51281A91281AD1281B1121C11290520001181C10520001181C50C070412391280E5126C1181C5042000126105200112650E0707021281C9111822070912201228151125010815112501081511250111291280D11280BD1280D11280BD0620011281CD0E0700040E0E0E0E0E0E070512241261121D1280D11280BD05200112610E0400010A0E060002020E1002130709122002021265081D0E12651280D11280BD04070112200E0705122C1261121D1280D11280BD060002020E1008050702122808052001123D0E0600020E0E1D1C0B07041280ED123D11291D1C1501001053514C232E54776974746572697A65720000150100107777772E53514C73686172702E636F6D00000501000000001501001053716C205175616E74756D204C65617000000901000453514C2300004201003D436F7079726967687420C2A920323030362D32303134\
-2053716C205175616E74756D204C6561702E20416C6C205269676874732052657365727665642E00002901002437313761636437332D316364632D343539352D626134632D34336434616539613838346200000B010006332E332E383300000801000800000000001E01000100540216577261704E6F6E457863657074696F6E5468726F77730170F3010000000000000000008EF3010000200000000000000000000000000000000000000000000080F3010000000000000000000000000000005F436F72446C6C4D61696E006D73636F7265652E646C6C0000000000FF2500200010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100100000001800008000000000000000000000000000000100010000003000008000000000000000000000000000000100000000004800000058000200B40300000000000000000000B40334000000560053005F00560045005200530049004F004E005F0049004E0046004F0000000000BD04EFFE00000100030003000000530003000300000053003F000000000000000400000002000000000000000000000000000000440000000100560061007200460069006C00650049006E0066006F00000000002400040000005400720061006E0073006C006100740069006F006E00000000000000B00414030000010053007400720069006E006700460069006C00650049006E0066006F000000F002000001003000300030003000300034006200300000003C001100010043006F006D006D0065006E007400730000007700770077002E00530051004C00730068006100720070002E0063006F006D000000000044001100010043006F006D00700061006E0079004E0061006D00650000000000530071006C0020005100750061006E00740075006D0020004C00650061007000000000004C0011000100460069006C0065004400650073006300720069007000740069006F006E0000000000530051004C0023002E00540077006900740074006500720069007A006500720000000000300007000100460069006C006500560065007200730069006F006E000000000033002E0033002E0038003300000000004C001500010049006E007400650072006E0061006C004E0061006D0065000000530051004C0023002E00540077006900740074006500720069007A00650072002E0064006C006C0000000000A0003D0001004C006500670061006C0043006F007000790072006900670068007400000043006F0070007900720069006700680074002000A900200032003000300036002D0032003000310034002000530071006C0020005100750061006E00740075006D0020004C006500610070002E00200041006C006C0020005200690067006800740073002000520065007300650072007600650064002E00000000005400150001004F0072006900670069006E0061006C00460069006C0065006E0061006D0065000000530051004C0023002E00540077006900740074006500720069007A00650072002E0064006C006C00000000002C0005000100500072006F0064007500630074004E0061006D00650000000000530051004C00230000000000340007000100500072006F006400750063007400560065007200730069006F006E00000033002E0033002E0038003300000000003C000900010041007300730065006D0062006C0079002000560065007200730069006F006E00000033002E0033002E00380033002E00300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F001000C000000A03300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
- WITH PERMISSION_SET = ' + @IsSQLServer2005 + N'SAFE;
- ')
- PRINT 'SQL#.Twitterizer Assembly Created.';
- END;
- ELSE
- BEGIN
- PRINT 'Skipping install of SQL#.Twitterizer Assembly.';
- END;
- PRINT '';
-
-
- IF (@InstallSQL#SgmlReader = 1)
- BEGIN
- PRINT 'Creating SQL#.SgmlReader Assembly ...';
- EXEC(N'
- CREATE ASSEMBLY [SQL#.SgmlReader]
- AUTHORIZATION [' + @SQLsharpLogin + N']
-FROM 0x4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000504500004C0103007F2168540000000000000000E00002210B010B0000D200000008000000000000EEF00000002000000000010000000010002000000002000004000000000000000400000000000000004001000002000003AB010003004085000010000010000000001000001000000000000010000000000000000000000094F0000057000000000001007804000000000000000000000000000000000000002001000C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000080000000000000000000000082000004800000000000000000000002E74657874000000F4D000000020000000D2000000020000000000000000000000000000200000602E7273726300000078040000000001000006000000D40000000000000000000000000000400000402E72656C6F6300000C000000002001000002000000DA00000000000000000000000000004000004200000000000000000000000000000000D0F0000000000000480000000200050074810000206F0000090000000000000000000000000000005020000080000000000000000000000000000000000000000000000000000000000000000000000032CDAB84FF6BB0E39A3831143E68BC29C98F8E34FADA1FDAC53F9F4433BA5BA964BA69750892FDA4BD6387F85372696E9686C0E2359E62D727CD85848756BE49BE91EDF19FFA0E855891EE2DB18C0A8FFB48FF114A466E9E850E628282F88BEFA20D81DEE36079B20A5E8C75FA42AB05CC3D88437A010D70D72407EE33D8A59E1E02281200000A2A220203281300000A2A5E0203281300000A042C0C02046F270000067D010000042A26020304281400000A2A76020304281500000A032C11020372010000706F1600000A7D010000042A1E027B010000042AA2032D0B721D000070731800000A7A037201000070027B010000046F1900000A020304281A00000A2AEE02281B00000A02037D0800000402047D0A00000402057D0B000004020E047D0700000402032C0D03722700007028950000062B01167D0F0000042A7202281B00000A02037D0800000402047D0C00000402177D090000042A0003300500450000000000000002281B00000A02037D0800000402177D0900000402057D1500000402047D14000004020E047D070000040203722700007017281C00000A281D00000A16FE017D0F0000042A1E027B080000042A1E027B0F0000042A2202037D0F0000042A1E027B0A0000042A1E027B0B0000042AAE027B1400000414281E00000A2C07027B140000042A027B0E0000042C0C027B0E0000046F100000062A142A1E027B0E0000042A1E027B110000042A1E027B100000042A42027B18000004027B170000045917582A1E027B090000042A1E027B0C0000042A1E027B0D0000042A1E027B120000042A1E027B070000042A0013300300C400000001000011027B150000046F1F00000AD10A062D031F200A02257B1800000417587D18000004061F0A332502177D1200000402027B1800000417587D1700000402257B1000000417587D100000042B70061F202E05061F09332D02177D12000004027B110000041F0D335502027B180000047D1700000402257B1000000417587D100000042B39061F0D330902177D120000042B2B02167D12000004027B110000041F0D331A02257B1000000417587D1000000402027B180000047D1700000402067D11000004062A1B3004003E0200000200001102037D0E000004032C0C02036F0C0000067D0F00000402177D10000004027B090000042C1D027B0C000004390D02000002027B0C000004732000000A7D150000042A027B0B0000042D12027231000070027B0800000428260000062A0414281E00000A2C140204027B0B000004732100000A7D140000042B1102027B0B000004732200000A7D14000004140A282300000A0B027B140000046F2400000A25130D2C28110D7265000070282500000A2C1A027B140000046F2600000A0C081917732700000A0A384E010000022810000006282800000A74330000010D09726F0000706F2900000A0920102700006F2A00000A027B070000042C1109027B07000004732B00000A6F2C00000A09166F2D00000A09282E00000A6F2F00000A096F3000000A130411046F3100000A130511056F3200000A027B140000046F3200000A17281C00000A281D00000A2C080211057D1400000411046F3300000A281C00000A6F3400000A13061106130711061F3B6F3500000A1308110816320C11061611086F3600000A1307110772A500007028950000062C0702177D0F000004110672B90000706F3700000A1308282300000A0B110816325B110672C900007011086F3800000A1309110672CD00007011096F3800000A130A110A162F0911066F3900000A130A110916312811091758130911061109110A1109596F3600000A6F3A00000A130B110B283B00000A0BDE0326DE0011046F3C00000A0A02177D160000040607732D000006130C02110C6F2E0000067D1300000402110C7D150000042A000001100000000003020A0D0203390000011E027B130000042A52027B160000042C0B027B150000046F3D00000A2A000000133002002E00000001000011027B110000040A2B0702281A0000060A0620FFFF00002E14061F202EEC061F0D2EE7061F0A2EE2061F092EDD062A000013300500D500000003000011032D0B72D1000070731800000A7A042D0B72D7000070731800000A7A03166F3E00000A027B110000040A05398C000000061F5F3B8400000006283F00000A2D7C284000000A72E1000070178D030000010B0716068C3A000001A207284100000A73020000067A052C1C061F5F2E17061F2E2E12061F2D2E0D061F3A2E0806284200000A2C0A03066F4300000A262B26284000000A7227010070178D030000010C0816068C3A000001A208284100000A73020000067A02281A0000060A0620FFFF00002E0A04066F3500000A163298036F4400000A2A000000133002008A00000004000011032D0B72D1000070731800000A7A03166F3E00000A02281A0000060A2B52061F26333E02281A0000060A061F2333180228220000060B03076F4500000A26027B110000040A2B29031F266F4300000A2603066F4300000A2602281A0000060A2B0F03066F4300000A2602281A0000060A0620FFFF00002E04060433A202281A00000626036F4400000A2A0000133004005001000005000011052D0B7261010070731800000A7A032C0703166F3E00000A027B100000040A02281A0000060B160C05086F4600000A0D38E40000000709331D0817580C08056F3900000A3CDB00000005086F4600000A0D38BC00000008163EAA00000008175913041613052B490511046F4600000A0733381713062B1D0511041106596F4600000A05081106596F4600000A330E1106175813061104110659162FDB11061104310E1104175813052B06110417591304110416320411052CAE032C3D1104163203162B011713041613072B15030511076F4600000A6F4300000A2611071758130711070811055911045931E0110416310803076F4300000A2611050C0511056F4600000A0D2B0B032C0803076F4300000A2602281A0000060B0720FFFF00004011FFFFFF072D1202047279010070284700000A06282500000602281A00000626032C07036F4400000A2A7E4800000A2A133003000B0100000600001102281A0000060A160B061F78337A02281A0000060A2B47160C061F30320C061F393007061F30590C2B26061F61320F061F66300A061F61591F0A580C2B12061F413252061F46304D061F41591F0A580C071F105A08580B02281A0000060A0620FFFF00002E2F061F3B33AC2B28061F303223061F39301E071F0A5A061F3059580B02281A0000060A0620FFFF00002E05061F3B33D8062D0E0272C70100700628240000062B0C061F3B330702281A00000626027B0F0000042C41072080000000FE0416FE0107209F000000FE0216FE015F2C287E1900000426072080000000590D7E19000004099413041104284900000A13051205284A00000A2A07284900000A13061206284A00000A2A22030273030000067A1330050034000000070000110420FFFF00002E0804284B00000A2B0572150200700A284000000A03178D030000010B071606A207284100000A0273030000067A133005002300000008000011284000000A03178D030000010A0616048C3D000001A206284100000A0273030000067A00133005001E00000008000011284000000A03178D030000010A061604A206284100000A0273030000067A000013300500C100000009000011020A734C00000A0B38A7000000067B090000042C3F281C00000A721D020070198D030000010D0916067B100000048C3D000001A20917066F140000068C3D000001A20918067B08000004A209284100000A0C2B51281C00000A729B0200701A8D030000011304110416067B100000048C3D000001A2110417066F140000068C3D000001A2110418067B08000004A2110419066F100000066F4D00000AA21104284100000A0C07086F4500000A26066F110000060A063A53FFFFFF076F4400000A2AF602721903007017281C00000A281D00000A2C2802722503007017281C00000A281D00000A2C1502723103007017281C00000A281D00000A16FE012A172A0013300200450000000A00001103250A2C3F067219030070282500000A2D1B067225030070282500000A2D16067231030070282500000A2D112A02167D0D0000042A02177D0D0000042A02187D0D0000042A3A02176F2B00000602284E00000A2A7A032C1A027B150000042C12027B150000046F4F00000A02147D150000042A0000000000AC200000810000001A200000920100001E200000262000002020000021200000C6020000302000006001000039200000520100008D0000007D0100008F0000009000000018200000192000001C2000001D200000222000001320000014200000DC02000022210000610100003A200000530100009D0000007E01000078010000621F208D3D00000125D0B7000004285100000A80190000042A000000133006000C0100000B00001102285200000A042D07285300000A1002036F5400000A2D0803282F000006100102037D1C0000040220004000008D440000017D1D0000040203027B1D000004161A6F5500000A7D1F0000040220004000008D3A0000017D2200000402027B1D000004027C1E000004027B1F00000428310000067D21000004027B1E0000040A027B210000042D4202046F5600000A7D2100000402257B1F00000403027B1D0000041A20FC3F00006F5500000A587D1F00000402283000000602283A0000060B072C0702077D21000004027B1C000004166A166F5700000A26020216250C7D23000004087D240000040616310F03027B1D00000416066F5500000A26020216250D7D1F000004097D1E0000042A1E027B200000042A133004003E0000000C00001120A08601000A068D440000010B735800000A0D2B09090716086F5900000A020716066F5500000A250C1630E909166A166F5700000A26026F5A00000A092A000013300800100100000D000011027B2400000416314D027B24000004027B230000042F25027B22000004027B24000004027B2200000416027B23000004027B2400000459285B00000A02257B23000004027B24000004597D2300000402167D24000004027B21000004027B1D000004027B1E000004027B1F000004027B1E000004596F5C00000A0A027B220000048E69027B23000004590B07062F37027B220000048E6906588D3A0000010C027B22000004027B240000040816027B23000004027B2400000459285B00000A02087D2200000402027B24000004027B21000004027B1D000004027B1E000004027B1F000004027B1E00000459027B22000004027B240000046F5D00000A587D2300000402027B1F0000047D1E0000042A13300400E10000000E0000111A04034A593DD500000002034A911F186202034A1758911F10626002034A1858911E626002034A195891600A060B07200000003C350F071F3C2E2807200000003C2E142B2A0720FFFEFFFE2E0A0720FEFFFEFF2E0E2B1803254A1A5854734D0000062A03254A1A5854734F0000062A061E640A0620BFBBEF00331103254A195854285300000A6F5600000A2A061E640A060C0820003C0000350F081F3C2E2D0820003C00002E142B360820FFFE00002E0A0820FEFF00002E132B2403254A185854285E00000A6F5600000A2A03254A1858541616735F00000A6F5600000A2A142A00000013300400290000000F000011027B24000004027B230000042F19027B2200000402257B24000004250A17587D2400000406932A152A000000133003001B0000000F0000110228320000060A06152E0E02257B2400000417597D24000004062A001330030041000000100000110228330000060A0603166F4600000A2E02162A160B036F3900000A0C2B190228320000060A03076F4600000A0D06092E02162A0717580B06152E04070832DF172A000000133002004900000011000011022833000006D10A2B2A027B240000040B022832000006D10A061F202E16061F092E11061F0D2E0C061F0A2E0702077D24000004061F202ED1061F092ECC061F0D2EC7061F0A2EC22A000000133004005F000000120000110228330000060A061F272E05061F22334C02283200000626027B240000040B0228320000060C2B070228320000060C08152E04080633F1027B2400000407300672370300702A027B2200000407027B2400000407591759736000000A2A142A00133004003E0000000A00001102283500000602283C0000060A030617281C00000A281D00000A2D200228350000060272C900007028340000062C0D0228350000060228360000062A142AD20228350000060302283C0000065103502C200228350000060272C900007028340000062C0D0228350000060228360000062A142A001330020037000000120000110228320000060A160B036F3900000A0C2B1C03076F4600000A0633090717580B070833032A160B0228320000060A07082F04061533DC2A001B3002006700000013000011140A02723903007028340000062C4902724503007028370000060B072C3A02725503007028370000060C082C2008283B00000A0D092C1102097D20000004096F5600000A1304DE1CDE0326DE000272670300702839000006062D0702283B0000062A142A11042A000110000000002D001D4A0003390000011B3004001B010000140000110228320000060A380301000006D10B071F3C40F100000002283C0000060C0839E400000008726B030070289500000639D4000000140D14130402120228380000061305082C2508727503007028950000062C0511050D2BE108728B03007028950000062CD4110513042BCE09399700000009729B0300702895000006398700000011043980000000110472B90000706F3700000A1306110616326D110472C900007011066F3800000A13061106163258110617581306110472CD00007011066F3800000A13071107162F0911046F3900000A13071104110611071106596F3600000A6F3A00000A13081108283B00000A13090211097D2000000411096F5600000A130ADE1326DE000228320000060A061540F6FEFFFF142A110A2A00011000000000E9001C050103390000011330040079000000150000110228330000060A06153302142A06D10B027B240000040C2B19027B2200000402257B240000041758250D7D2400000409930B027B24000004027B2300000417592F1707284200000A2DCF071F2D2ECA071F5F2EC5071F3A2EC008027B240000043302142A027B2200000408027B240000040859736000000A2A000000133004004300000011000011022833000006D10A2B19027B2200000402257B240000041758250B7D2400000407930A027B24000004027B2300000417592F0F061F202ED2061F0D2ECD061F0A2EC82A00133004003800000011000011022833000006D10A2B19027B2200000402257B240000041758250B7D2400000407930A027B24000004027B2300000417592F04060333D32A133004009700000016000011021F3D283E000006027B24000004027B230000042F7F02257B2400000417587D2400000402283D000006027B24000004027B230000042F5D027B22000004027B24000004930A02257B2400000417587D24000004027B240000040B0206283E000006027B24000004027B230000042F25027B2200000407027B240000040759736000000A0C02257B2400000417587D24000004082A142A00133003001B0000000F000011026F1F00000A0A06152E0E02257B2400000417597D24000004062A00133005006E0000000F000011027B24000004027B23000004333702027B1C000004027B1D00000416027B1D0000048E696F5500000A7D1F00000402167D1E000004027B1F0000042D02152A022830000006027B24000004027B230000042F19027B2200000402257B24000004250A17587D2400000406932A152A0000033005008E00000000000000027B24000004027B23000004333702027B1C000004027B1D00000416027B1D0000048E696F5500000A7D1F00000402167D1E000004027B1F0000042D02152A022830000006027B24000004027B230000042F39027B23000004027B240000045905286100000A1003027B22000004027B24000004030405285B00000A02257B2400000405587D24000004052A162A2A020304056F6200000A2A000000133003005100000017000011160A0228320000060B2B400306045807D19D0617580A060458052E33071F0D331E0228330000061F0A33240228320000060B0306045807D19D0617580A2B10071F0A2E0B0228320000060B071533BC062A00000013300400360000001800001120A08601008D3A0000010A160B734C00000A0C2B0A080616076F6300000A26020616068E696F6200000A250B1630E6086F4400000A2A32027B1C0000046F5A00000A2A2E05027B26000004581A5B2A0013300600A900000017000011027B260000040A027B2600000416313C2B19027B25000004060304919C041758100205175910030617580A061A32E3170A02027B25000004161A0E040E056F48000006260E05175810052B02160A020304050E040E056F4800000606580A027B2600000405581A5D0B0504581003050759100202167D26000004041632292B23027B25000004027B260000040304919C02257B2600000417587D260000040417581002040532D9062A00000013300300220000001900001120C0D70000021F0A6458D20A2000DC00000220FF0300005F60D20B071E620660D12A4E021A8D440000017D2500000402286400000A2A000013300500C80000001A0000110504581003040B0E050C38AB00000003071958911F186203071858911F10626003071758911E6260030791600A0620FFFF10003626284000000A72B5030070178D030000010D0916068C49000001A209284100000A73020000067A0620FFFF000036100E040806284A0000069D0817580C2B3F062000D8000037310620FFDF00003529284000000A72B5030070178D030000011304110416068C49000001A21104284100000A73020000067A0E040806D19D0817580C071A580B071958053F4CFFFFFF080E05592A1E02284B0000062A13300500C80000001A0000110504581003040B0E050C38AB0000000307911F186203071758911F10626003071858911E62600307195891600A0620FFFF10003626284000000A72B5030070178D030000010D0916068C49000001A209284100000A73020000067A0620FFFF000036100E040806284A0000069D0817580C2B3F062000D8000037310620FFDF00003529284000000A72B5030070178D030000011304110416068C49000001A21104284100000A73020000067A0E040806D19D0817580C071A580B071958053F4CFFFFFF080E05592A1E02284B0000062AD202281B00000A02037D2700000402047D2800000402057D29000004020E047D2A000004020E057D2B000004020E067D2C0000042A1E027B270000042A1E027B2A0000042A1E027B290000042A1E027B280000042A000000133003002E0000001B000011027B2D0000042D0B7201040070736500000A7A027B2D00000403281C00000A6F6600000A12006F6700000A26062A00001B300300730000001C000011032D0B7294040070731800000A7A027B2D0000042D0802037D2D0000042A036F6800000A6F6900000A0B2B2D1201286A00000A0A027B2D000004066F6C0000066F6B00000A2D12027B2D000004066F6C000006066F6C00000A1201286D00000A2DCADE0E1201FE160300001B6F6E00000ADC2A000110000002002A003A64000E00000000133003007B0000001D000011027B2C0000042C2C027B2C0000040D1613042B190911049A0A060319286F00000A2D04160CDE521104175813041104098E6932E0027B2B0000042C2F027B2B00000413051613062B1A110511069A0B070319286F00000A2D04170CDE1C110617581306110611058E6932DE027B2A00000403046F610000062A082A4E02281B00000A021473650000067D350000042A1E027B340000042A1E027B330000042A8202027B3500000473650000067D3500000402257B3400000417587D340000042A033003004600000000000000027B340000042D02152A02257B3400000417597D34000004027B350000046F64000006027B350000046F6600000602027B350000046F640000067D35000004027B340000042A36027B35000004036F670000062A36027B35000004036F680000062A36027B35000004036F690000062A13300500670000000700001103250A2C4106729E040070282500000A2D1C0672AA040070282500000A2D17067219030070282500000A2D122B1802197D330000042A02187D330000042A02177D330000042A284000000A72B8040070178D030000010B071603A207284100000A73020000067A62027B330000042C02162A027B3500000403046F6A0000062A1E027B430000042A66027B440000042C0F027B410000046F7000000A16FE012A162A1E027B400000042A9E02281B00000A02037D4000000402737100000A7D4100000402167D4200000402167D430000042A3A027B41000004036F7200000A262AA603721205007017281C00000A281D00000A2D0802177D440000042A027B41000004036F7200000A262A0013300500AC0000001E000011027B440000042D33027B410000046F7000000A2D26284000000A7222050070178D030000010B0716038C3A000001A207284100000A73020000067A160A030C081F262E14081F2C2E07081F7C2E062B0A190A2B06180A2B02170A027B420000042C42027B42000004062E39284000000A726E050070188D030000010D0916038C3A000001A20917027B420000048C0C0000026F4400000AA209284100000A73020000067A02067D420000042A133002002C0000001F000011160A030B071F2A5945020000000D00000009000000071F3F330A170A2B06190A2B02180A02067D430000042A1B300300E400000020000011042D0B72CE050070731800000A7A027B410000046F7300000A13062B2711066F7400000A0A06752D0000012C1706742D0000010319286F00000A2D08171305DD9D00000011066F7500000A2DD0DE1511067504000001130711072C0711076F6E00000ADC027B410000046F7300000A13082B4C11086F7400000A0B07752D0000010C082C2204086F7B0000060D092C2F096F540000062C270903046F570000062C1D171305DE3A07740E0000021304110403046F6A0000062C05171305DE2211086F7500000A2DABDE1511087504000001130911092C0711096F6E00000ADC162A11052A011C000002001B00344F0015000000000200710059CA0015000000003A02281B00000A02037D5C0000042A1E027B5C0000042A1E027B5F0000042A2202037D5F0000042A1E027B600000042A1E027B5E0000042A133005003F00000008000011041F102E2B041F0F2E26284000000A72D6050070178D030000010A0616048C0F000002A206284100000A737600000A7A02037D5E00000402047D5D0000042A1E027B5D0000042A0013300500BA0100002100001103250A3991010000FE137EB80000043ABB0000001F0E737700000A25721903007016287800000A25728106007017287800000A25728F06007018287800000A2572A106007019287800000A2572A70600701A287800000A2572B30600701B287800000A2572C10600701C287800000A2572CB0600701D287800000A2572D70600701E287800000A2572E70600701F09287800000A2572F90600701F0A287800000A2572070700701F0B287800000A2572170700701F0C287800000A2572270700701F0D287800000AFE1380B8000004FE137EB8000004061201287900000A39B600000007450E000000020000000A000000120000001A000000220000002A000000320000003A000000420000004B000000540000005D000000660000006F0000002B7602177D5D0000042A02187D5D0000042A02197D5D0000042A021A7D5D0000042A021B7D5D0000042A021C7D5D0000042A021D7D5D0000042A021E7D5D0000042A021F097D5D0000042A021F0A7D5D0000042A021F0B7D5D0000042A021F0C7D5D0000042A021F0D7D5D0000042A021F0E7D5D0000042A284000000A7239070070178D030000010C081603A208284100000A73020000067A0000133005007D00000022000011170A03728507007017281C00000A281D00000A2D0902177D600000042B5D03729107007017281C00000A281D00000A2D0B02187D60000004160A2B3F0372A307007017281C00000A281D00000A2D0B02197D60000004160A2B21284000000A72B3070070178D030000010B071603A207284100000A73020000067A062AEA02281B00000A02037D6200000402737A00000A7D6300000402737B00000A7D6400000402737B00000A7D6500000402734C00000A7D660000042A1E027B620000042A0A142A001B3006006600000023000011030E0673750000060A05287C00000A2D160602066F7600000604050E0573080000066F7C0000060E04287C00000A2D0F0602030E0473090000066F7C000006066F7E000006DE1D0B076F7D00000A067B670000046F27000006284700000A73020000067A062A00000110000000003F000847001D4F0000011B3006005C00000023000011030E0573750000060A0602066F7600000602040E04730A0000066F7C00000605287C00000A2D0E0602030573090000066F7C000006066F7E000006DE1D0B076F7D00000A067B670000046F27000006284700000A73020000067A062A0110000000003500083D001D4F000001133003001100000024000011027B650000040312006F7E00000A26062A000000133003001B00000025000011027B6300000403281C00000A6F6600000A12006F7F00000A26062A8604027B67000004036F1B00000602047D67000004027B670000046F1A000006262AEA027B670000042C0B027B670000046F1D000006027B670000046F110000062C1202027B670000046F110000067D670000042A02\
-147D670000042A1B300300D500000026000011027B670000046F120000060A060C081F203027081F0959450500000039000000390000008F0000008F00000039000000081F202E343885000000081F252E4C081F3C2E330820FFFF0000337302287D000006027B670000042D012A027B670000046F120000060A2BA3027B670000046F1A0000060A2B9502287F000006027B670000046F1A0000060A2B810272FB07007028860000060B02027B670000046F1000000607287C000006DE0326DE00027B670000046F120000060A384DFFFFFF027B670000047205080070066F240000063837FFFFFF000000011000000000970014AB00030100000113300400EB00000027000011027B670000046F1A0000060A061F212E11027B67000004723B0800706F230000062A027B670000046F1A0000060A061F2D333F027B670000046F1A0000060A061F2D2E11027B6700000472AD080070066F24000006027B67000004027B6600000472FB080070720B0900706F21000006262A061F5B33070228820000062A027B67000004027B6600000472FB070070176F1F0000060B07250C2C3E087281060070282500000A2D1C087213090070282500000A2D16087223090070282500000A2D102B150228890000062A02288A0000062A02288F0000062A027B670000047233090070076F260000062A00133002001D00000001000011027B670000046F120000060A2B08021728810000060A061F2D2EF3062A000000133004005900000001000011027B670000046F1300000626027B670000046F1A0000060A032C16061F2D2E11027B6700000472C8090070066F24000006027B67000004027B6600000472260A007072440A00706F2100000626027B670000046F1E0000062A000000133004005E0000000A000011027B670000046F1A0000062602724A0A007028850000060A06724E0A007017281C00000A281D00000A2D070228830000062A06725E0A007017281C00000A281D00000A2D070228840000062A027B67000004726C0A0070066F260000062A2E72B80A0070738000000A7A0000133004004B00000001000011027B670000046F1300000626027B670000046F1E0000060A061F5B2E11027B6700000472D80A0070066F24000006027B67000004027B6600000472100B007072380B00706F21000006262A00133004005800000028000011027B670000046F1E0000060A061F253333020328860000060B027B670000046F120000060A076F150000062D0B72400B0070738100000A7A076F160000066F3A00000A2A027B67000004027B6600000403176F1F0000062A133004004F00000029000011027B670000046F1A00000626027B67000004027B6600000472CD00007003284700000A166F1F0000060A027B670000046F120000061F3B330C027B670000046F1A00000626020628870000060B072A00133003002700000024000011140A027B640000040312006F7E00000A26062D11027B67000004728A0B0070036F26000006062A001B300300490000002A000011737B00000A0A027B650000046F8200000A6F8300000A0C2B151202288400000A0B06076F16000006076F8500000A1202288600000A2DE2DE0E1202FE160800001B6F6E00000ADC062A00000001100000020017002239000E00000000133004000C0200002B000011027B670000046F1E0000060A061F25FE010B072C18027B670000046F1A00000626027B670000046F1E0000060A027B67000004027B6600000472FB070070176F1F0000060C027B670000046F1E0000060A140D061F222E05061F273322027B67000004027B66000004066F20000006130408110473090000060D3836010000141305141306027B67000004027B6600000472FB070070176F1F0000061307110728280000062C36027B670000046F1E0000060A027B67000004027B66000004066F20000006130808110873090000060D0911076F2900000638D800000011071306110672E60B007017281C00000A281D00000A2D3F027B670000046F1E0000060A061F222E05061F273316027B67000004027B66000004066F2000000613052B39027B6700000472F40B0070066F240000062B261106725C0C007017281C00000A281D00000A2C12027B67000004726A0C007011066F26000006141309027B670000046F1E0000060A061F222E05061F273316027B67000004027B66000004066F2000000613092B16061F3E2E11027B6700000472F10C0070066F240000060811051109027B670000046F1900000673080000060D027B670000046F1E0000060A061F2D33070228800000060A061F3E2E11027B6700000472590D0070066F24000006072C13027B64000004096F0B000006096F8700000A2A027B65000004096F0B000006096F8700000A2A13300800A50100002C000011027B670000046F1E0000060A020617288B0000060B027B670000046F1E000006281C00000A288800000A0A160C160D061F4F2E05061F2D3344061F4FFE010C027B670000046F1A00000626027B670000046F1E000006281C00000A288800000A0A061F4F2E05061F2D3312061F4FFE010D027B670000046F1A0000060A027B670000046F1E0000060A0206288D0000061304027B670000046F1E0000060A141305141306061F2D3349027B670000046F1A0000060A061F283318020617288B0000061305027B670000046F1E0000060A2B20061F2D330A021628810000060A2B11027B6700000472C90D0070066F24000006061F2D33070228800000060A061F2B3338027B670000046F1A0000060A061F282E11027B6700000472F90D0070066F24000006020617288B0000061306027B670000046F1E0000060A061F2D33070228800000060A061F3E2E11027B6700000472390E0070066F2400000607130916130A2B371109110A9A13071107281C00000A6F6600000A1308027B6300000411081108080911041106110573500000066F8900000A110A1758130A110A11098E6932C12A00000013300400220100002D000011737100000A0A031F2840D2000000027B670000046F1A0000061001027B670000046F1E0000061001389D000000027B670000046F1E0000061001031F25333B027E6800000428860000060B02027B670000046F1000000607287C000006020604288C00000602287D000006027B670000046F1200000610012B2C027B67000004027B660000047E68000004046F1F0000060C08281C00000A6F6600000A0C06086F7200000A26027B670000046F1E0000061001031F7C2E05031F2C330D027B670000046F1A0000061001031F29405BFFFFFF027B670000046F1A000006262B2C027B67000004027B6600000472FB070070046F1F0000060D09281C00000A6F6600000A0D06096F7200000A2606D02D000001288A00000A6F8B00000A740900001B2A000013300400BD0000002E000011027B670000046F120000060A027B670000046F1E0000060A3894000000061F25333A027E6800000428860000060C02027B670000046F1000000608287C000006020304288C00000602287D000006027B670000046F120000060A2B2C027B67000004027B660000047E68000004176F1F0000060B07281C00000A6F6600000A0B03076F7200000A26027B670000046F1E0000060A061F7C3318027B670000046F1A0000060A027B670000046F1E0000060A0620FFFF00004061FFFFFF2A00000013300300A30000002F00001173580000060A031F283346027B670000046F1A00000626021F2906288E000006027B670000046F1A0000061001031F3F2E0A031F2B2E05031F2A336506036F5F000006027B670000046F1A000006262B50031F253338027E6900000428860000060B02027B670000046F1000000607287C00000602027B670000046F12000006288D0000060A02287D0000062B13027E6900000428850000060C06086F60000006062A00133005000A02000030000011046F590000060A027B670000046F120000060B027B670000046F1E0000060B38D20100000720FFFF00003310027B6700000472AB0E00706F23000006071F253341027E6A00000428860000060C02027B670000046F1000000608287C0000060220FFFF000004288E00000602287D000006027B670000046F1E0000060B3874010000071F283323046F5B000006027B670000046F1A00000626027B670000046F1E0000060B384C010000071F293358027B670000046F1A0000060B071F2A2E0A071F2B2E05071F3F331304076F5F000006027B670000046F1A0000060B046F5C000006062F10027B6700000472E50E00706F23000006027B670000046F1E0000060B38EF000000071F2C2E0A071F7C2E05071F26332404076F5E000006027B670000046F1A00000626027B670000046F1E0000060B38BC000000071F233330027B670000046F1A0000060B725F0F0070027B67000004027B660000047E6A000004176F1F000006284700000A0D2B18027B67000004027B660000047E6A000004176F1F0000060D09281C00000A6F6600000A0D027B670000046F120000060B071F3F2E0A071F2B2E05071F2A3335046F5B00000604096F5D00000604076F5F000006046F5C00000626027B670000046F1A00000626027B670000046F1E0000060B2B1304096F5D000006027B670000046F1E0000060B07034027FEFFFF046F59000006063D1BFEFFFF2A0000133003006A00000031000011027B670000046F1E0000060A020617288B0000060B738C00000A0C02081F3E28900000060713051613062B35110511069A0D027B630000040912046F7F00000A2D11027B6700000472630F0070096F260000061104086F56000006110617581306110611058E6932C32A0000133003008500000032000011027B670000046F1E0000060A2B72061F25333E027E6B00000428860000060B02027B670000046F1000000607287C000006020320FFFF0000289000000602287D000006027B670000046F1E0000060A2B23061F2D33090228800000060A2B15020628910000060C03086F6C000006086F6C00000A027B670000046F1E0000060A0604338A2A000000133003008C00000033000011027B670000046F1E00000610010272FB07007028850000060A06281C00000A6F6600000A0A06736B0000060B027B670000046F1E0000061001031F2D330802288000000610010203072892000006027B670000046F1E0000061001031F2D330802288000000610010203072893000006027B670000046F1E0000061001031F2D33080228800000061001072A13300400BA00000034000011031F2533440272FB07007028860000060A02027B670000046F1000000606287C00000602027B670000046F1200000604289200000602287D000006027B670000046F1200000610012A031F28331104020316288B0000061F106F710000062A0272FB07007028850000060B0772B50F007017281C00000A281D00000A2D34027B670000046F1E0000061001031F282E11027B6700000472C70F0070036F2400000604020317288B0000061F0F6F710000062A04076F730000062A000013300400FB00000035000011031F2533440272FB07007028860000060A02027B670000046F1000000606287C00000602027B670000046F1200000604289300000602287D000006027B670000046F1200000610012A170B031F233339027B670000046F1A00000626027B67000004027B6600000472FB070070176F1F0000060C04086F740000060B027B670000046F1E0000061001072C6E031F272E05031F223328027B67000004027B66000004036F200000060D04096F6E000006027B670000046F1E00000610012A027B67000004027B6600000472FB070070166F1F00000613041104281C00000A6F6600000A13040411046F6E000006027B670000046F1E00000610012AA6721B1000708068000004722B10007080690000047237100070806A0000047251100070806B0000042A46020317281C00000A281D00000A16FE012A3A02281B00000A02037D730000042A1E027B720000042A2202037D720000042A1E027B710000042A620316320903027B710000043202142A027B70000004039A2A2A027B700000040304A22AA602257B7200000417597D72000004027B72000004163110027B70000004027B7200000417599A2A142A000000133004006400000036000011027B72000004027B71000004333D027B71000004027B73000004580A068D030000010B027B700000042C12027B7000000407027B71000004288E00000A02067D7100000402077D70000004027B7000000402257B72000004250C17587D72000004089A2ADE027B700000040314A2027B70000004031758027B7000000403027B7200000403591759285B00000A02257B7200000417597D720000042A7602037D7400000402047D7700000402057D7600000402147D750000042A96027B770000042C07027B770000042A027B750000042C0C027B750000046F6D0000062A142A2A027B7700000414FE012A1E02281B00000A2AFA02057D7900000402037D7D00000402047D7800000402167D7A00000402147D7B00000402177D7C000004027B81000004166F9800000602147D7E0000042A0000133004007F00000037000011160B027B810000046F970000060C2B2D027B81000004076F9A00000674160000020A067B74000004030E04281C00000A281D00000A2D02142A0717580B070832CF027B810000046F9D00000674160000020A062D1F73A20000060A027B81000004027B810000046F970000061759066F9B000006060304056F9F000006062A00133004004C00000038000011160A027B810000046F970000060B2B37027B81000004066F9A00000674160000020C087B740000040317281C00000A281D00000A2D0D027B81000004066F9E0000062A0617580A060732C52A133005005100000039000011160A037B810000046F970000060B2B3C037B81000004066F9A00000674160000020C02087B74000004086FA0000006087B760000041628A40000060D09087B750000047D750000040617580A060732C02A32027B810000046F970000062A0000133004004200000038000011160A027B810000046F970000060B2B2C027B81000004066F9A00000674160000020C087B740000040317281C00000A281D00000A2D02062A0617580A060732D0152A000013300200280000003A0000110316322203027B810000046F970000062F14027B81000004036F9A00000674160000020A062A142A52021F0A73960000067D8100000402281B00000A2A7E02177DB500000402738F00000A7DB600000402289000000A0228CA0000062A7E02177DB500000402738F00000A7DB600000402289000000A0228CA0000062A6E027B970000042D0C02027BA000000428AF000006027B970000042A2202037D970000042A000013300800CC0100003B000011027B970000043A24010000027BAF000004287C00000A398C000000027BB20000043909010000027BB20000047227000070289500000639F4000000D019000002288A00000A6F9100000A0A066F9200000A178D3A00000113041104161F2C9D11046F9300000A169A725D100070284700000A0B06076F9400000A0C0839AE00000008739500000A0D020372711000700914027BAD0000041428790000067D9700000438880000000314281E00000A2C1003027BAF000004732100000A10012B44027BA000000414281E00000A2C15027BA0000004027BAF000004732100000A10012B21289600000A727B100070284700000A732200000A027BAF000004732100000A10010203027BB2000004027BB0000004036F3200000A027BB1000004027BAD0000041428780000067D97000004027B970000043991000000027B970000046F7600000639810000000228C20000061305110517594502000000020000001F0000002B3A02027B970000046F76000006281C00000A6F6600000A7DA90000042B2E02027B970000046F76000006281C00000A6F3400000A7DA90000042B1102027B970000046F760000067DA900000402027B970000046F76000006722700007028950000067DA80000042A1E027BB20000042A2202037DB20000042A1E027BA90000042A1E027BB00000042A2202037DB00000042A1E027BAF0000042A2202037DAF0000042A1E027BB10000042A2202037DB10000042A1E027BAE0000042A3A02037DAE0000040228CA0000062A1E027BAD0000042A2202037DAD0000042A360203732200000A7DA00000042A1E027BAA0000042A000003300400600000000000000002037DAA0000040228CA000006027BA000000414289700000A2C44027BAA000004727F1000706F3700000A16311202027BAA000004732200000A7DA00000042A027287100070289600000A7299100070289800000A732200000A7DA00000042A1E027BB50000042A2202037DB50000042A1E027BB40000042A2202037DB40000042A1E027BA30000042A2202037DA30000042A1E027BAB0000042A5202037DAB0000040203739900000A7DA30000042A13300500DF0000003C0000110228C400000639D3000000284000000A0304284100000A0A027BAC000004027B980000042E3A06729F100070027B980000046F27000006289800000A0A02027B980000047DAC0000040228C400000672A910007006284700000A6F9A00000A2A72370300700B027B980000046F1000000614281E00000A2C11027B980000046F100000066F4D00000A0B0228C400000672BF1000701B8D030000010C081607A20817027B980000046F0B000006A20818027B980000046F130000068C3D000001A20819027B980000046F140000068C3D000001A2081A06A2086F9B00000A2A00133005001A0000003D0000110203178D2D0000010A06160F02284A00000AA20628C80000062A000003300500910000000000000002167D99000004021F0A73960000067D9C0000040202141F091428CB0000067D9D000004027B9D000004167D7C00000402734C00000A7DA100000402734C00000A7DA200000402167DA600000402147D9800000402167D9A00000402147D9B00000402147D9E00000402167D9F00000402147DA500000402167DA700000402167DA4000004027BB60000046F9C00000A2A00000013300400450000003E000011027B9C0000046F9D00000674170000020A062D1F73AA0000060A027B9C000004027B9C0000046F970000061759066F9B000006060304056FA300000602067D9D000004062A000000133004004E0000003F000011027B9C0000046F9700000617590A0616313B027B9C0000040617596F9A00000674170000020B027B9C000004061759027B9C000004066F9A0000066F9B000006027B9C00000406076F9B0000062A000013300400650000003E00001102037B7D000004037B78000004037B7900000428CB0000060A06037B7E0000047D7E00000406037B7C0000047D7C00000406037B7A0000047D7A00000406037B7B0000047D7B00000406037B7F0000047D7F00000406036FA600000602067D9D000004062A96027B9C0000046F9700000617311602027B9C0000046F9C00000674170000027D9D0000042A0013300200260000000F000011027B9C0000046F9700000617590A06163112027B9C000004066F9A00000674170000022A142ADE027B99000004193302182A027B990000041A3302192A027B99000004182E09027B990000041D33031F0F2A027B9D0000047B780000042A000013300200350000000A000011140A027B99000004193313027B9E0000047B74000004289D00000A0A2B15027B990000041A2E0C027B9D0000047B7D0000040A062A000000133003002300000040000011026F9E00000A0A062C17061F3A6F3500000A0B07152E0A060717586F9F00000A0A062A0013300400CE01000041000011027B99000004193323027B9E0000047B74000004722311007017281C00000A281D00000A2D06722F1100702A026FA000000A0A026FA000000A25130A2C3B110A7223110070282500000A2D21110A726B110070282500000A2D19110A7237030070282500000A2D113885000000722F1100702A72731100702A026FA100000A1833067E4800000A2A026FA100000A17335B027B9C0000046F9700000617590B2B47027B9C000004076F9A00000675170000020C082C2E087B780000041733250872231100706FA80000060D0916321508096FA90000066FA0000006130411042C0311042A0717590B071630B57E4800000A2A026FA100000A182E09026FA100000A17337272BD11007006284700000A1306027B9C0000046F97000006175913072B4F027B9C00000411076F9A0000067517000002130811082C3111087B78000004173327110811066FA800000613091109163217110811096FA90000066FA0000006130511052C0311052A11071759130711071630AC027BB60000040612056FA200000A2D45027BB60000046FA300000A16312272CB110070027BB60000046FA300000A130B120B28A400000A284700000A13052B0772CB1100701305027BB60000040611056FA500000A11052A0000133003003300000040000011026F9E00000A0A062C1E061F3A6F3500000A0B07152E0B0616076F3600000A0A2B067E4800000A0A06252D06267E4800000A2A9A027B99000004192E09027B990000041A3302172A027B9D0000047B7900000414FE0116FE012AAA027B99000004192E09027B990000041A330C027B9E0000046FA00000062A027B9D0000047B790000042AEA027B9900000419330C027B9C0000046F970000062A027B990000041A330E027B9C0000046F9700000617582A027B9C0000046F9700000617592A82027BA000000414289700000A2D0C027BA00000046F3200000A2A72370300702AA6027B99000004172E12027B99000004192E09027B990000041A330C027B9D0000047B7C0000042A162A82027B99000004192E09027B990000041A330C027B9E0000046FA10000062A162A5A027B9E0000042C0C027B9E0000047B760000042A162A00133002003800000042000011027B9C0000046F9700000617590A2B22027B9C000004066F9A00000674170000020B077B7A0000040C082C02082A0617590A061730DA162A133002003C00000043000011027B9C0000046F9700000617590A2B22027B9C000004066F9A00000674170000020B077B7B0000040C082C02082A0617590A061730DA7E4800000A2A1E027BB30000042A2202037DB30000042AFE027B99000004192E09027B990000041A3302162A027B9D0000047B78000004172E0F027B9D0000047B780000041F0A330C027B9D0000046FA70000062A162A000000133002002D0000000F000011027B99000004192E22027B990000041A2E19027B9D000004036FA80000060A0616320802066FA600000A2A142A2202036FA700000A2A000013300200340000003A000011027B99000004192E20027B990000041A2E17027B9D000004036FA90000060A062C07066FA00000062A72DD11007073A800000A7A2202036FA600000A2A2202036FA700000A2A260203046FA900000A2A133002001C0000000F000011027B9D000004036FA80000060A0616320902066FAA00000A172A162A2202036FAB00000A2A000000133002004B0000003A000011027B9D000004036FA90000060A062C3002037D9F00000402067D9E000004027B99000004192E11027B9D000004027B990000047D7F00000402197D990000042A72DD11007073A800000A7A66027B9D0000046FA700000616310902166FAA00000A172A162A000000033003004000000000000000027B99000004192E10027B990000041A2E07026FAC00000A2A027B9F000004027B9D0000046FA700000617592F1002027B9F00000417586FAA00000A172A162AEE027B99000004192E09027B990000041A331A02027B9D0000047B7F0000047D9900000402147D9E000004172A027B9D0000047B7800000417FE012A1E027BA80000042A6A027B980000042D060228EF000006027B980000046F1C0000062A0003300500D90000000000000002027BA000000428AF0000060228BE0000062C1F0272E111007014027BAA000004027BAD00000473080000067D980000042B32027BAE0000042C1F0272E111007014027BAE000004027BAD000004730A0000067D980000042B0B72F5110070736500000A7A027B980000040228ED0000066F0D000006027B9800000414027BA00000046F1B000006027B980000046F1000000614281E00000A2C1102027B980000046F100000067DA0000004027B980000046F0C0000062C1F027B970000042D170272711000707DB200000402027BA000000428AF0000062A00000013300400F702000044000011027B980000042D060228EF000006027B9D0000047B800000042C2B027B9D000004167D80000004020228CF0000067D9D00000402027B9D0000047B7F0000047D99000004172A160A3809020000027B990000040C08450C00000005000000840000004A0000003E0100003E0100004A010000A3000000D00000003501000055010000C20000001A000000387301000002177D99000004027B980000046F1A000006262B6A027B980000046F110000062C21027B980000046F1D00000602027B980000046F110000067D980000043830010000162A027B9B000004027B9D0000047B7D00000417281C00000A281D00000A2D0F0228CE00000602177D990000042B0D0228CE000006170A38F4000000027B9D0000047B7C0000042C060228CE0000060228F10000060A38D50000000228CE00000602177D9900000402027B9A00000428F20000060A38B6000000021F3C28F50000060A38A80000000228CE000006027B9C0000046F97000006027BA6000004304802177D99000004027BA50000042C1D02027BA500000428CD0000062602147DA500000402177D990000042B1C027B9D0000047B780000041F09330D021F0B7D9900000438E9FEFFFF170A2B430228FE0000060A2B3A02177D99000004383AFFFFFF0228CE000006382FFFFFFF02027B980000046F120000061628FC0000062C0D027B9D0000041F0D7D78000004170A062C1A027B9D0000047B780000041F0D330B027BB3000004183302160A062D34027B990000041F0B332A027B9C0000046F9700000617311C02177DA6000004021D7D99000004020228CF0000067D9D000004172A0639F1FDFFFF027BA40000043A8E000000026FA100000A172E12026FA100000A192E09026FA100000A1A337302177DA40000040228ED0000062C62026FA100000A173318026FAD00000A722700007017281C00000A281D00000A2C41027B9D000004027B990000047D7F000004027227000070171428CB0000060B0228CC00000602077D9D00000407177D8000000407167D7C00000402177D99000004172A172A00133003008500000001000011027B980000046F120000060A061F3C3314027B980000046F1A0000060A020628F20000062A0620FFFF00002E4E027B9D0000047B7E0000042C28027B9D0000047B7E0000046F520000066F5A00000617331002167D9A000004021E7D99000004162A02061728FC0000062C0D027B9D0000041F0D7D78000004172A021F0B7D99000004162A000000133006006101000045000011031F2533070228F70000062A031F214021010000027B980000046F1A0000061001031F2D33070228F80000062A031F5B33070228F90000062A031F5F2E4203283F00000A2D3A027B98000004027BA1000004727812007072670300706F210000060A02728E120070067267030070289800000A168D2D00000128C8000006162A027B98000004027BA100000472\
-C6120070166F1F0000060B0772D412007017281C00000A281D00000A2D5A0228FA00000602725C0C00706FA700000A2D2E0272E60B00706FA700000A2C21027B9D000004725C0C007072370300701F22027BB400000416FE016FA400000626027BB50000042C02162A027B9D0000041F0A7D78000004172A0272E4120070178D2D0000010C081607A20828C8000006027B9800000414727812007072670300706F2100000626162A031F3F3313027B980000046F1A000006260228FB0000062A031F2F33070228F60000062A020328F50000062A000000133004004900000046000011027B98000004027BA100000403166F1F0000060A027BB40000040B071759450200000002000000100000002B1A06281C00000A6F6600000A0A2B0C06281C00000A6F3400000A0A062A0000001B30010012000000470000110228AE00000A26170ADE0526160ADE00062A000001100000000000000B0B00055B000001133006008902000048000011140A027B990000041F0A2E40725E130070036F3500000A163224027BA1000004166F3E00000A027BA10000041F3C6F4300000A26021F097D99000004162A02725E13007028F30000060A2B0702177D990000040206171428CB0000060B07167D7C0000040207280A010006027B980000046F1E0000061001389D010000031F2F334107177D7C000004027B980000046F1A0000061001031F3E3B8C0100000272701300700328C9000006027B9800000414727812007072670300706F2100000626162A031F3C331F0272E0130070178D2D000001130711071606A2110728C8000006384301000002721E14007028F30000060C027B980000046F1E000006100108723214007017281C00000A281D00000A39040100000872C900007017281C00000A281D00000A39EE00000008723614007017281C00000A281D00000A39D80000000872CD00007017281C00000A281D00000A39C2000000140D161304031F3D2E0A031F222E05031F27335C031F3D3319027B980000046F1A00000626027B980000046F1E0000061001031F272E05031F22331303130402027BA10000040328FD0000060D2B21031F3E2E1C72511000701305027B98000004027BA10000041105166F1F0000060D08280C0100062C3D0708091104027BB400000416FE016FA4000006130611062D1C02723A140070178D2D000001130811081608A2110828C80000062B08071106280B010006027B980000046F1E00000610010320FFFF00002E08031F3E4053FEFFFF0320FFFF00003313027B98000004727E140070066F260000062B11031F3E330C027B980000046F1A00000626026FAF00000A173321027BA700000417330A021F0B7D99000004162A02257BA700000417587DA70000040207280D010006172A00000013300500050100004900001102187D99000004027B980000046F1A0000062602725E13007028F30000060A027B980000046F1E0000060B071F3E2E230272701300700728C9000006027B9800000414727812007072670300706F2100000626027B980000046F1A0000062602067D9B000004027BB400000416FE010C02027B9C000004027B9C0000046F9700000617596F9A00000674170000027D9D000004027B9C0000046F9700000617590D2B3B027B9C000004096F9A0000067417000002130411047B7D0000040608281C00000A281D00000A2D0F0211047B7D0000047D9B000004172A0917590D091630C10272CC140070178D2D000001130511051606A2110528C800000602177D99000004162A00000013300500370000000A0000117212150070027B98000004027BA1000004721815007072261500706F210000067226150070289800000A0A02141A0628CB00000626172A0013300400F50000004A000011027B980000046F1A0000060A061F2D2E250272AD0800700628C9000006027B980000041472FB08007072670300706F2100000626162A027B98000004027BA100000472FB080070720B0900706F210000060B0772440A00706F3700000A0C2B5E0818580D2B040917580D09076F3900000A2F0B07096F4600000A1F2D2EE80816311E07160817596F3600000A722C15007007096F9F00000A289800000A0B2B12722C15007007096F9F00000A284700000A0B0772440A00706F3700000A0C08162F9E076F3900000A16311E07076F3900000A17596F4600000A1F2D330C077230150070284700000A0B02141E0728CB00000626172A00000013300500F70000004B000011027B980000046F1A0000060A027B980000046F1E0000060A027B98000004027BA10000047234150070166F1F0000060B0772441500706FB000000A2C19027B9800000414721903007072670300706F2100000626162A07721903007017281C00000A281D00000A2C3002724C150070178D2D0000010D091607A20928C8000006027B9800000414721903007072670300706F2100000626162A027B980000046F1E0000060A061F5B2E2502728C1500700628C9000006027B9800000414721903007072670300706F2100000626162A027B98000004027BA1000004721903007072380B00706F210000060C02141A0828CB00000626172A0013300600280200004C000011027B980000046F1E0000060A02725110007028F30000060B02071F0A1428CB00000626027B980000046F1E0000060A061F3E3BE401000072370300700C72370300700D72370300701304061F5B3B0E010000027B98000004027BA10000047251100070166F1F0000061305110572E60B007017281C00000A281D00000A2D44027B980000046F1E0000060A061F222E05061F273374027B98000004027BA1000004066F200000060D027B9D00000411050906027BB400000416FE016FA4000006262B461105725C0C007017281C00000A281D00000A2C320272C8150070178D2D00000113061106161105A2110628C8000006027B980000041472D412007072670300706F2100000626027B980000046F1E0000060A061F222E05061F273335725C0C00701305027B98000004027BA1000004066F200000061304027B9D0000041105110406027BB400000416FE016FA400000626027B980000046F1E0000060A061F5B3328027B98000004027BA1000004720C160070722C1600706F210000060C027B9D000004087D79000004027B980000046F1E0000060A061F3E2E230272301600700628C9000006027B980000041472D412007072670300706F2100000626027B970000042C24027B970000046F760000060717281C00000A281D00000A2C0B728C160070736500000A7A02077DB200000402097DB00000040211047DAF00000402087DB100000402027B980000046F1000000628AF000006027B980000046F1A000006262A13300400AF0000004D000011027B98000004027BA100000472CE160070166F1F0000060A140B027B980000046F120000061F3F2E32027B98000004027BA100000472DA16007072670300706F210000060B07178D3A0000010D09161F2F9D096FB100000A0B2B1C027B98000004027BA100000472DA16007072670300706F210000060B061F3A6F3500000A0C0816310A060817586F9F00000A0A06726B11007017281C00000A281D00000A2C0C02061D0728CB00000626172A162A0013300400050100004E000011042C0D027B980000046F180000062B01170A042C0C027BA1000004166F3E00000A021B7D9900000438B5000000031F3C3363027B980000046F1A0000061001031F2F2E12031F212E0D031F3F2E0803283F00000A2C13021C7D9900000402037D9A0000043884000000027BA10000041F3C6F4300000A26027BA1000004036F4300000A26160A027B980000046F1A00000610012B4D031F26331F02027BA10000041F3C28FF000006160A027B980000046F1200000610012B29027B980000046F180000062D02160A027BA1000004036F4300000A26027B980000046F1A00000610010320FFFF00004040FFFFFF027BA10000046F4400000A0B0214190728CB00000626062A000000133003006C0000000100001103166F3E00000A027B980000046F1A0000060A2B2F061F26331602030428FF000006027B980000046F120000060A2B1403066F4300000A26027B980000046F1A0000060A0620FFFF00002E0906042E05061F3E33C00604330C027B980000046F1A00000626036F4400000A2A13300400B00200004F000011027B980000046F180000060A027BA1000004166F3E00000A027B980000046F120000060B027B9A00000439090200000228CE000006027B9A000004130411041F20594502000000E90100001100000011041F2F2E2911041F3F2E1438D8010000021F207D9A0000040228F80000062A021F207D9A0000040228FB0000062A02187D99000004172A071F3C407E010000027B980000046F1A0000060B071F213360027B980000046F1A0000060B071F2D331F062C0F021F207D9A0000040228F80000062A021F217D9A0000043873010000027BA10000041F3C6F4300000A26027BA10000041F216F4300000A26027BA1000004076F4300000A26160A382C010000071F3F332B027B980000046F1A00000626062C0F021F207D9A0000040228FB0000062A021F3F7D9A0000043813010000071F2F40B6000000027BA10000046F4400000A0C0228F60000062C58027B9B000004027B9D0000047B7D00000417281C00000A281D00000A2D3A062D0808287C00000A2C02172A021F2F7D9A000004027BA1000004166F3E00000A027BA1000004086F4500000A26021E7D99000004389F000000027BA1000004166F3E00000A027BA1000004086F4500000A26027BA10000047208170070027B9B0000047267030070289800000A6F4500000A26160A027B980000046F120000060B2B4A027BA10000041F3C6F4300000A26027BA1000004076F4300000A26160A2B1F027B980000046F180000062D05062C02160A027BA1000004076F4300000A26027B980000046F1A0000060B0720FFFF00004044FEFFFF0720FFFF0000330A021F0B7D99000004162A027BA10000046F4400000A0D09720E1700707E4800000A6FB200000A0D0972380B00707E4800000A6FB200000A0D0972221700707E4800000A6FB200000A0D02141A0928CB00000626027B9A0000042D08021F207D9A000004172A133005007301000050000011027B980000046F1A0000060A061F233321027B980000046F220000060B03076F4500000A26027B980000046F120000060A2A027BA2000004166F3E00000A2B19027BA2000004066F4300000A26027B980000046F1A0000060A0620FFFF00002E1206283F00000A2DD7061F5F2ED2061F2D2ECD027BA20000046FB300000A1631080628B400000A2DB7027BA20000046F4400000A0C027B9700000439A600000008287C00000A3A9B000000027B97000004086F7A0000060D092C71096F150000062C1E03096F160000066F4500000A2606042E0C027B980000046F1A0000060A2A08096F0E000006096F0F000006027B980000046F190000067308000006130409027B98000004096F0F000006732200000A6F1B0000060211047D98000004027B980000046F1A000006262A02722C170070178D2D000001130511051608A2110528C800000603725A1700706F4500000A2603086F4500000A2606042E1403066F4300000A26027B980000046F1A0000060A2A2E027B990000041F0BFE012AD6027B980000042C12027B980000046F1D00000602147D98000004027BA30000042C12027BA30000046FB500000A02147DA30000042A62027B990000042D02162A027B990000041F0B3302192A172A0000133002008B00000051000011027B9D0000047B78000004173371027BA1000004166F3E00000A2B4F026FA100000A0A06195945020000001300000013000000061F0D59450200000002000000020000002B19027BA1000004027B9D0000047B790000046F4500000A262B0C027BA10000046F4400000A2A026FB600000A2DA9027BA10000046F4400000A2A027B9D0000047B790000042A00133003007700000052000011281C00000A73B700000A0A0673B800000A0B07176FB900000A026FA100000A0C0817594502000000020000002E0000002B38026FB600000A262B080702176FBA00000A026FBB00000A2D0A026FA100000A1F0F33E6026FB600000A262B0C06026FBC00000A6FBD00000A076FBE00000A066F4400000A2A00133003002E00000053000011281C00000A73B700000A0A0673B800000A0B07176FB900000A0702176FBA00000A076FBE00000A066F4400000A2A0A142A0A142A2E725E170070736500000A7AA2027B99000004193309021A7D99000004172A027B990000041A3302162A7296170070736500000A7A000000133002003A00000025000011027B970000042C31027B97000004037B7D0000046F7B0000060A062C1C03067D7E000004066F520000066F5A00000619330703177D7C0000042A0000133002002200000054000011027B7E0000040A062C1706037B740000046F550000060B072C0703077D750000042A00001B30030033000000550000110228BF00000A26021F3A6F3500000A0A0616320F020617586F9F00000A28C000000A26170BDE0A26160BDE0526160BDE00072A00011C000000000000272700055B00000100000000272C00052B000001133006004F01000056000011037B78000004173332037B7D00000428F40000062D250228CE00000602141972C0170070037B7D0000047267030070289800000A28CB000006262A027B970000043908010000037B7D000004281C00000A6F6600000A0A160B027B9C0000046F9700000618590C037B7E000004398A000000080B2B7F027B9C000004076F9A00000674170000020D097B7C0000042D61097B7E000004130411042C600718331911046F5100000672C417007017281C00000A281D00000A2C4311046F51000006027B970000046F7600000617281C00000A281D00000A2C24110406027B970000046F570000062D1411046F530000062C0B0717590B07163D7AFFFFFF072D012A07082F4A027B9C000004086F9A000006741700000213050708175933140611057B7D00000417281C00000A281D00000A26021D7D9900000402037DA50000040228CE000006020717587DA60000042A00133002001001000057000011026FC200000A2D0A026FC300000A166A332C0F0128C400000A2D180F0128C500000A6F3A00000A7E4800000A282500000A2C0B72CE170070731300000A7A140A0F0228C500000A6FC600000A2513042C2611047251180070282500000A2D1011047261180070282500000A2D062B08180B2B06170B2B02160B73AB0000060C0872711000706FB100000608166FDF00000608076FC30000060F0128C400000A2D130F0128C500000A7E4800000A282500000A2C1A026FC700000A73C800000A732000000A0A08066FBA0000062B0D080F0128C500000A6FBF00000673C900000A0D09176FCA00000A09146FCB00000A09086FCC00000A062C06066F3D00000A096FCD00000A28CE00000A73CF00000A2A1E02281B00000A2A42534A4201000100000000000C00000076322E302E35303732370000000005006C000000E0280000237E00004C2900003820000023537472696E677300000000844900007418000023555300F861000010000000234755494400000008620000180D000023426C6F62000000000000000200000157DFA2290902000000FA25330016000001000000630000001C000000B80000000F010000E300000001000000CF0000003F000000110000000100000001000000570000000C0000004B0000005C0000000A0000000100000001000000040000000100000000000A0001000000000006005F01580106006901580106006E01580106007501580106008B0181010600A20196010A00B501AA010600F201D50106000402D5010600D60296010E00EA0258010600190496010600040581010600D006B50606006E085B080A002D0AAA010A00C50CAA010A00DA0CAA010600690E81010A000F0FAA010A00C812AA01120060144B14120069144B1406007D155E150600701658011200E316C81606000717F51606001E17F51606003B17F51606005A17F51606007317F51606008C17F5160600A717F5160600C217F5160600DB1758010600F117F51606000A18F5160600471827180600671827180600951858010600D118B5180600ED18B5180600FC185801060030191B1906005119580106006E1981010600A01981010600AB1981010600B41981010E00CA19BF190E00DC19BF190E00CA13BF190E00051ABF190E002D1ABF190E003D1ABF190E00711ABF190600ED1A580106000A1B580106002D1B580106007B1B580106008A1B58010600A11B58010600011C271806001C1C58010600581C27180600671C580106006D1C58010600A51C58010600B51C81010600C51C81010600F21C96010600021D580106000B1D58010600121D58013B00381D00002F01531D00000600911D58010600A21D5B080600DC1D58010600F11D58010600091E58010600EC09580106001F1E580106004B1EF5160600621EF5160600A51E81010600B21E81010600D01E81010A00ED1EAA010600031F58010A001F1FAA0106004F1F81010A005C1FAA010A006A1FAA010A00841FAA011200B31FC8160A00D31FAA010A00F61FAA010A001720AA010000000001000000000001000100012010001E003100050001000100010100003600310009000200080001001000420031000D0006000800000010004900310015001A002D0080001000540031001900250047000000100060003100180027004C000000100075003100180027004E00010010008D0031000D0027005000010100009900310009002E00580001001000A90031000D003300580001010000B600310009003600620001010000C000310009003B00620001001000CB0031000D004000620001010000D1003100090045006B0001010000DF003100090057006B0001001000F10031000D005C006B0001001000F80031000D006100750080011000000131000D006C009500010100001001310009006C009600000010001C0131000D007000960000001000240131000D0074009F00000010002E0131000D007800A300000100003301310009008200AB0001001000390131001D008F00AB0001001000440100000D00B7000E0100000000BC1B00000D00B700100113010000261C00000101B90010010100BF010A0006064302340056804B02370056805102370056805702370056805A024A0001005E020A00010066020A0001006D02500001007A020A00010085020A0001008B020A000100950237000100A30253000100AC0250000100B50234000100BC024A000100C70250000100DF0257000100EE025B000100FC025F0001000203500001001303340001001F03340031005804BF005180FC04340051805A02340001000B05FE0001000F0502010100190534000100200534000100DF025700010028050601010032050A0101003B05340001004005340003002706020103002C063400010066020A0001006806500001007B06500001008C06610101009B0665010100A80665010100DD06690106064302340056806407A10156804B02A10156806C07A10156807307A10101007907A10101008B07340001009A07AA0106064302340056801F08B80156802408B80156802808B80156802B08B80106064302340056803408BC0156803D08BC0156804608BC0156805108BC010100A302AA0101007808C00101008008B80101008C08BC0101009908500006064302340056806407DE0156804B02DE015680CD08DE015680D408DE015680DD08DE015680E008DE015680E608DE015680ED08DE015680F208DE015680F808DE0156800009DE0156800909DE0156801009DE0156801809DE0156802009DE0156802909DE0156803209DE0106064302340056806407230256803E092302568034082302568044092302010066020A0001004C09DE01010053096501010060090A0001006A0923025180F1090A00010066020A000100FC0956020100070A5F020100130A5F0201001E0A68020100230A530031004E0B0A003100720B0A0031008B0B0A003100AA0B0A0006064302340056801F08F6025680F50BF6025680FD0BF6020100050CFA0201000D0C34000100140C340001001C0C3400030093040A000300760C170303007E0C4A000100880C0A000300D10C22030300B50C0A000300E30C26030300E90C0A000300F10C5000030093040A000300760C2A030300F90C2E030300060D50000100100D32030606430234005680760D2E0356807E0D2E035680850D2E0356808C0D2E035680910D2E0356809B0D2E035680A00D2E035680AB0D2E035680B50D2E035680BB0D2E035680C70D2E035680D60D2E035680DA0D0A005180EE0D0A005180F70D0A005180FF0D0A005180050E0A0051800C0E0A005180160E0A0051801D0E0A000100240EBF030100230A530001002A0E2E030100320E4A0001003C0E0A000100450E320301004D0EC3030100540EC7030100580E340001005F0E5B0001001E0A68020100660268020100740ECB0301007A0E50000100860EC3030100900E340001009D0E34000100AC0250000100A90E0A000100BB0E0A000100C20E0A000100D10E530001005E020A000100DD0E5F000100EB0E0A000100F40E0A000100FC0E0A000100050F0A000100220FCF030100370FF6020100410F50000100500FD3031301441C26071300AE1D8C08D020000000008618CF010D000100D820000000008618CF0111000100E120000000008618CF0116000200F920000000008618CF011D0004000321000000008418CF0124000600212100000000860815022C000800292100000000C6402702240008005221000000008618CF0163000A008E21000000008618CF016B000E00AC21000000008618CF0171001000FD210000000086082D032C001400052200000000860836037B0014000D2200000000860841037F00140016220000000086084C032C0015001E2200000000860859032C001500262200000000860861038400150052220000000086087103890015005A220000000086087C038E00150062220000000086088903920015006A220000000086089203920015007B22000000008608A3037B0015008322000000008608B2032C0015008B22000000008608BE03960015009322000000008608CE037B0015009B22000000008608DF032C001500A422000000008600E9038E0015007423000000008600F2039B001500D025000000008608F703A3001700D82500000000860004040D001700F0250000000086000A048E0017002C260000000086002704A800170010270000000086003104B0001A00A8270000000086003D04B7001C00042900000000860047042C001F001B2A000000008600600411001F00242A0000000086006004C3002000642A0000000086006004C9002200942A00000000860060046B002400C02A00000000860066042C0026008D2B0000000096006E04CF002600CC2B0000000086007C04110027001D2C00000000E6018B040D0028002C2C00000000C4018B047F002800D02C000000009118B51B22072900EC2C000000008618CF010E012900042E000000008608F703A3002B000C2E000000009100440516012B00582E00000000830057050D002C00742F00000000930063051D012C006430000000008100E90392002F009C30000000008100760592002F00C4300000000081007F0527012F0014310000000081008C050D0030006C310000000081009C052C003000D831000000008100A9052C0130002232000000008100A905310131005832000000008100B805110032009C32000000008300C805370133002033000000008300D605370133005834000000008300E0052C003300E0340000000083000A040D0033003035000000008300EA053C0133007435000000008300F1052C003400183600000000C600000692003400403600000000C600050692003400BC3600000000C600050641013400563700000000C6000A06410137006437000000008600140641013A00C43700000000C6001D062C003D00063800000000C60004040D003D00133800000000C600360649013D00000000000000C307430651014000203800000000C600500651014500D83800000000930059065C014A000639000000008418CF010D004B001C3900000000C302430651014B00F039000000008618CF010D005000F83900000000C302430651015000CC3A000000008618CF010D005500D43A000000008618CF0172015500093B0000000086082D032C005B00113B000000008608E7067F015B00193B000000008608F8067B005B00213B0000000086080B077B005B002C3B000000008600200784015B00683B0000000086002E078A015C00F83B000000008600390795015D007F3C000000008618CF010D005F00933C000000008608A20792005F009B3C000000008608B307AE015F00A33C000000008600C7070D005F00C43C000000008600D10792005F00163D000000008600DA0711005F00243D000000008600E4073C016000323D000000008600F1073C016100403D000000008600FF0711006200B33D000000008600390795016300CC3D0000000086089F08C4016500D43D000000008608AE087B006500EE3D0000000086087103C9016500F63D000000008618CF01CE0165001E3E000000008600BB08CE0166002D3E000000008600DA0711006700583E000000008600E4073C016800103F000000008600F1073C016900483F000000008600390795016A005440000000008618CF0111006C0063400000000086082D032C006D006B4000000000860875092C006D007340000000008608810911006D007C400000000086088D0927026E008440000000008608A3092C026E008C40000000008600B20931026E00D740000000008608C40939027000E040000000008600CD0911007000A842000000008600D509270171003143000000008618CF016C0272006C430000000086082D032C00740074430000000086083A0A730274007843000000009600480A78027400FC43000000009600480A86027B0074440000000086004E0A940281009444000000008600590A9A028200BB44000000008100650AA0028300DD44000000008100700A0D0085001845000000008100480A0D0085000C460000000081007A0A0D0085000447000000008100860A8E0085003047000000008100980AA80285009847000000008100A90A0D0086000248000000008100BC0A0D0086001048000000008100D00A0D0086006848000000008100E30A2C018600CC48000000008100EC0A940287002849000000008100010B940288005C49000000008600140BAD028900C449000000008100310B0D008900DC4B0000000081003D0B0D008900904D000000008100550BB7028900C04E000000008100640BBE028B008C4F000000008100790BC5028D003C50000000008100920BCB028E0054520000000081009D0B0D009000CC520000000081009D0BD20290006053000000008100B10BDE029200F853000000008100BD0BE4029300C054000000008100CA0BE4029500C755000000009118B51B22079700F155000000009600E40BF00297000356000000008618CF01FE0299001256000000008608250C92009A001A560000000086082F0CFE029A002356000000008608390C92009B002B56000000008608420C03039B0044560000000086084B0C08039C004F56000000008600540C0E039E007C56000000008600580C0E039E00EC560000000086005D0CFE029E002457000000008600970C1B039F\
-0042570000000086089D0C2C00A2006857000000008608A70C7B00A2007357000000008618CF010D00A2007B57000000008600970C3603A200BC570000000086001B0D3E03A5004858000000008600280D1100A900A058000000008600380D4703AA00FD58000000008608470D9200AB000C590000000086005A0D4D03AB005C590000000086005A0D5203AC009059000000008618CF010D00AD00A559000000008618CF010D00AD00C559000000008618CF01DB03AD00E559000000008608620FE103AE00015A0000000086086A0FE603AE000C5A000000008100720FEC03AF00E45B0000000086087E0F2C00B000EC5B0000000086088A0F1100B000F55B000000008608960F2C00B100FD5B000000008608AA0F2C00B100055C000000008608BF0F1100B1000E5C000000008608D40F2C00B200165C000000008608E60F1100B2001F5C000000008608F80F2C00B300275C0000000086080B101100B300305C0000000086081E10F203B400385C0000000086082E10F703B400475C0000000086083E102C00B5004F5C0000000086084B101100B500585C00000000860058101100B600665C00000000860863102C00B700705C0000000086086C101100B700DC5C00000000860875107B00B800E45C00000000860886107F00B800ED5C0000000086089710FD03B900F55C000000008608A7100204B900FE5C000000008608B7100804BA00065D000000008608C4100D04BA000F5D000000008608D1102C00BB00175D000000008608E2101100BB002C5D000000008100F3101304BC00185E000000008100F310C300BE00405E000000008100F7100D00C000E05E000000008100580C1A04C000345F000000008100FC100D00C300905F000000008100580C2304C3000160000000008100540C0D00C400286000000000810009112A04C4005A6000000000C6080D112F04C400946000000000C6082D032C00C400D86000000000C6081A112C00C400086100000000C60828112C00C400E46200000000C60839112C00C400236300000000C60844117B00C4004A6300000000C6089D0C2C00C400756300000000C60851119200C400B06300000000C6085B112C00C400D16300000000C60867117B00C400FB6300000000C608A70C7B00C4001C6400000000C6087A118E00C400346400000000C60888113404C400786400000000C60895112C00C400C064000000008608A1113904C400C864000000008608B8113E04C400D16400000000C608470D9200C500146500000000C6005A0D2C01C5004D6500000000C6005A0D4404C600586500000000C6005A0D4A04C800986500000000C608420C4A04C900A16500000000C608420C2C01CA00AA6500000000C608420C4404CB00B46500000000C600CF112701CD00DC6500000000C600CF114F04CE00E86500000000C600CF11FE02D0003F6600000000C600DF117B00D1005C6600000000C600F4117B00D100A86600000000C60008127B00D100E46600000000860836037B00D100EC660000000086001612A300D100086700000000810022120D00D100F06700000000C60005067B00D100F46A0000000081007A0A7B00D100886B0000000081002C125504D100F86C000000008100E30A2C01D200506D0000000091003512CF00D300806D00000000810040125504D40018700000000081004E127B00D5002C710000000081005A127B00D500707100000000810066127B00D500747200000000810073127B00D500787300000000810089120D00D500AC7500000000810096127B00D50068760000000081009E125A04D5007C770000000081003104B000D700F477000000008100A8127B00D900B07A000000008100B3126004D9002F7C00000000C608C0127B00DB003B7C00000000C60004040D00DB00717C00000000C608D2126704DB008C7C00000000C600E0122C00DB00247D00000000C600EB122C00DB00A87D00000000C600F8122C00DB00E27D00000000C6083A0A7302DB00E57D00000000C60005132C01DB00E87D00000000C60015130D00DC00F47D00000000C60023137B00DC00207E00000000810036134703DC00687E0000000091003F136C04DD00987E0000000091005113CF00DF00F47E00000000810064134703E00050800000000096007314AC04E1006C81000000008618CF010D00E400000001007D14000001007D14000002008514000001007D1400000200871400000100961400000200A11400000100AB1400000200B01400000100B81400000200BD1400000300C31400000400C71400000100B81400000200CD1400000100B81400000200D514000003000B0500000400C71400000100DD1400000100E31400000200D51400000100EA1400000200ED1400000300F21400000100EA1400000200FA1400000100EA14000002000015000003000515000001001115000001001115000002001515000001001115000002001815000001001115000002001A15000001001E15000001001E15000001002415000001000B05000002003015000001004015000001004215000002004915000003004F1500000100561500000100B81402000100B81400000100ED14000001008A15000001004215000002008F15000003004F15000001009515000002004915000003009A15000001004215000002008F15000003004F1500000100A015000002004915000003009A1500000100A01500000200A61500000300B01500000400BA1500000500C01500000100A01500000200A61500000300B01500000400BA1500000500C01500000100CA1500000100A01500000200A61500000300B01500000400BA1500000500C01500000100A01500000200A61500000300B01500000400BA1500000500C01500000100B81400000200CF1500000300D31500000400D71500000500DA1500000600E51500000100B81400000100F01500000100B81400000200F51500000100F91500000100FD1500000100FD1500000100FF1500000100B81400000200F51500000100E31400000100021600000100F91500000100FD1500000100FD1500000100B81400000200F51500000100B81400000100DD14000001000416000002000015000001000015000001001E1500000100B814000002000F1600000100D51400000200B81400000300BD1400000400121600000500161600000600C714000007000F1600000100D51400000200B814000003001D1600000400161600000500C714000006000F1600000100B81400000100B81400000100D51400000200851400000100231600000100ED1400000100ED1400000100B81400000100151500000200281600000100311600000200281600000100151500000100371600000200D71500000100F01500000200ED14000001001515000001001515000002003B16000001001515000002003B1600000100421600000200441600000100461600000100DD14000001004D16000001004D1600000200DD14000001004D1600000100B81400000200DD1400000300FA1400000100B814000002000F1600000300DD1400000100B81400000200DD14000003004F1600000400591600000100B81400000100691600000100B814000001004D16000001000F1600000100DD1400000100D51400000100DD1400000100DD1400000100DD1400000100DD1400000100DD1400000100DD1400000100C31400000100DD1400000100DD1400000100DD1400000100DD1400000100DD14000001001115000002006B1600000100111500000200151500000100B814000002000F1600000300DD1400000100691600000100DD1400000100B81400000100B814000002008416000001004D16000001004D1600000100B81400000100B81400000200841600000100B81400000100B814000002009116000001004D1600000100151500000100051500000100B81400000100151500000100151500000200941600000100EA1400000200FA1400000100EA14000002009C1600000100A71600000100AE1600000100AE1600000200421600000100B81400000100AE1600000100B31600000200BC1600000300100104001100C100CF010D00C900CF010D00D100CF010D00D900CF011100E100CF011100E900CF011100F100CF011100F900CF0111000101CF0111000901CF0111001101CF0111001901CF017F002101CF0111002901CF0111003101CF01FE023901CF010D004101CF010D000900CF010D000900CF0111000900CF011D000900CF0124004100AB182C014901CF016C055901CF0111004100121919060900270224001900CF010D0061013C191F06690158192506590060192F062900050692007101CF0111005900CF013B065900CF01110051007509420659007B192C0069018619F002590092192C007901CF0147069101D51952069901EB1911009101F919FE02A101CF01110091010F1A5A069101191A7F00B1014A1A61069101611A670691017D1A6E06C101891A84005900991A2C00C101A91A2C006901FD0B74066901B91A7B066901C11A80066901B91A4D036901B91A86066901CB1A92006901D61A2C00510016128C06C101DB1A9206290004040D006100FF1AFE02D1010F1BB0066101181B1F0669013D1BB506D101441BB0066100541BBF0619005B1B2C006100541BCD066901641BD80669016E1BDD066901751B0A00E101831BEE06D1015B1B2C00D1015B1BFD066100CF010D005900901B2C00F101A41B1D0729008B040D00F901CF010D000902801C2A072900CF010D005100901C42066900991C7B006900050649015100AA1C37016900C01C34073102CF010D006900D21C4407690004040D001102D81C56073100360649013100500651015100DD1C42063902CF016A076901CF0186074102071DBC072900050641016100541BC7073100CF010D005102CF0111006901F50B74060C002C1DEF070C00481DFD0714005E1D12081C006C1D27080C00781D2C080C00841D32081C00881D7B0021008B040D006901581947087900250C92007900CF010D007900841D5C0879005E1D710871026C1D0E037102881D7B00C901CF0111002400CF01FE022400841D320824002C1DEF072C00CF010D003400CF010D006901C21DCF000900D01D2C0034002C1DEF072C002C1DEF078102CF0111008902CF0111003400481DFD073C005E1D120844006C1D270834004B0C32084400881D7B003400841D3208D101F50B17092C00841D32089102311E32097900431E3B090C00CF010D00A102CF0111001102D81CA1095400CF010D003900CF010D0091026B1ED609A902781E2C006901851EDC09A9028B1EE309B102CF01E909B902BC1EEF09590086192F0669016E1B030AC102CF0111009900DD1E11009900DD1E0A0A5400E71E0D00C902F81E280A39002D032C006901C11A4A04390039112C0039000D112F0454002C1DEF075400250C9200E9015B1B2C0054004B0C320839005A0D4A0439005A0D2C01D102CF01110039005A0D44043900CF11FE023900CF1127013900DF117B0039001A112C00C9023512280A39005111920069012C1F27016901371FA00A69013F1F44046100CB1A9200D101471FB006990004040D00390005067B00E102CF01CC0AE902CF010D04E902751FD30AF9028E1FDA0A3900C0127B0039009D0C2C009900D21C1100F90204040D00C902981F280AC902A61F280A0103CF010D00B100C81F7B00B100CB1AD70BB900C81F7B00B9009D0C2C006901FD0B2C00B1009D0CDB0B6901CF01E00B0903CF010D000903DF1F7F0009030220E60B09031220ED0B19031F202C00B9002C20F30BB100CF01F90B08000C003B00080010004000080014004500030018004D0008006800F40008006C00F9000800BC003B000800C00040000800C40045000800C800A5010800DC003B000800E00040000800E40045000800E800A5010800F0003B000800F40040000800F80045000800FC00A501080018013B0008001C01400008002001450008002401A50108002801E20108002C01E70108003001EC0108003401F10108003801F60108003C01FB01080040010002080044010502080048010A0208004C010F02080050011402080054011902080058011E02080060013B0008006401400008006801450008006C01A5010E0084014D020800B4013B000800B80140000800BC01450008000C023B0008001002400008001402450008001802A50108001C02E20108002002E70108002402EC0108002802F10108002C02F60108003002FB010800340200020800380205020E003C0258030E00400269030E00440276030E00480287030E004C029A030E005002A5030E0054029A030E005802B4032E003300380C2E008300F70C2E003B003E0C2E004300540C2E007B00EE0C2E0023000D0C2E002B00220C2E004B005E0C2E005300380C2E006300DB0C2E007300E10CA3026B04970923036B049709630383024000A41713004000641C1B00B704C0210B060D0B02001D0073050100800000001C0037069706C506D306E306F306020708070D0719073C074C076307700776077A0781078E0794079F07AF07B607C207D007D807DD07F8073A08500861086B0877089B08A208B808C008C508CA08D108D708DD08F50809091F094709500957095F0967097A09820988098E09AC09B309BA09C109CA09F309110A180A1D0A220A2D0A320A430A4B0A520A5A0A610A670A6B0A7B0A860A8D0A950AA60AAE0AB30ABB0AC70AE10AEC0AF50AFC0A010BFF0B020001000400020005001100090012000B0016000E00180011001B00120020001500220016002500170027001900280000003502300000009304300000009804D40000009F0430000000EA0230000000A804D8000000B404DD000000BB04E2000000C404E6000000C904E6000000D604D4000000E104300000003600EA000000E904D4000000F60430000000D602EF000000D602EF000000930430000000A9009C0100004407D40000005307D40000001208E60000009900B3010000C000D4010000C408D4000000B404D9010000930430000000640730000000DF003E020000E10943020000EC0948020000930430000000DA0BEB020000660CE60000006C0CE6000000710C12030000B50C30000000BB0CD4000000670DE6000000741374040000781330000000801330000000901330000000A11330000000AF1330000000BE1379040000CA1330000000D31330000000D813D400000010017E040000E51383040000EE1330000000D10C88040000930430000000FB13300000000514300000001214300000001914D4000000B50C300000002214E60000002814300000003014D4000000BB0CD40000007E0CE2000000DA0C8D040000E90C300000000F0F92040000670DE6000000710C97040000710C9C040000710CA10400009804D40000005A02D4000000C812A7040000DA0BEB0202000600030002000B00050002000C00070001000D00070002000E00090002000F000B00020010000D00020011000F00020012001100020013001300020014001500020015001700020016001900020017001B00020018001D00020019001F0002001C00210002002E002300020051002500020052002700020053002900020054002B00020059002D0002005A002F0002006200310002006300330002006400350002006C00370002006D00390001006E00390002006F003B00020070003D00020072003F0002007600410002007700430002009700450001009800450002009900470001009B00490002009A0049000200A0004B000200A1004D000200A7004F000200AD0051000100AE0051000200B00053000100B10053000200B20055000200B30057000100B40057000200B50059000100B60059000100B8005B000200B7005B000200B9005D000100BA005D000200BB005F000100BC005F000100BF0061000200BE0061000200C00063000100C10063000200C20065000100C30065000100C50067000200C40067000200C60069000100C70069000200D0006B000200D1006D000200D2006F000200D30071000200D40073000200D50075000200D60077000200D70079000200D8007B000200D9007D000200DA007F000200DB0081000200DC0083000200DD0085000100DF0087000200DE0087000200E00089000200E4008B000200E5008D000200E6008F000200ED009100020000019300020002019500020006019700E70709081E089408A808B008E308EC084409CF09502C0000B70004800000010008000400C13501000000CA048518000002000000000000000000000001004F01000000000200000000000000000000000100AA0100000000020000000000000000000000010058010000000002000000000000000000000001003F14000000001C001B0000000000003C4D6F64756C653E0053514C232E53676D6C5265616465722E646C6C0053676D6C5061727365457863657074696F6E0053676D6C004C69746572616C5479706500456E746974790048746D6C53747265616D00556373344465636F64657200556373344465636F646572426967456E6769616E00556373344465636F6465724C6974746C65456E6469616E00456C656D656E744465636C004465636C61726564436F6E74656E7400436F6E74656E744D6F64656C0047726F757054797065004F6363757272656E63650047726F757000417474726962757465547970650041747472696275746550726573656E6365004174744465660053676D6C44746400537472696E675574696C69746965730043617365466F6C64696E67004857537461636B00417474726962757465004E6F64650053746174650053676D6C5265616465720053474D4C526561646572006D73636F726C69620053797374656D00457863657074696F6E00456E756D004F626A6563740049446973706F7361626C650053797374656D2E494F00546578745265616465720053797374656D2E54657874004465636F6465720053797374656D2E586D6C00586D6C526561646572006D5F656E74697479436F6E74657874002E63746F720053797374656D2E52756E74696D652E53657269616C697A6174696F6E0053657269616C697A6174696F6E496E666F0053747265616D696E67436F6E74657874006765745F456E74697479436F6E74657874004765744F626A6563744461746100456E74697479436F6E746578740076616C75655F5F00434441544100534441544100504900454F46006D5F70726F7879006D5F6E616D65006D5F6973496E7465726E616C006D5F7075626C69634964006D5F757269006D5F6C69746572616C006D5F6C69746572616C54797065006D5F706172656E74006D5F697348746D6C006D5F6C696E65006D5F6C61737463686172006D5F69735768697465737061636500456E636F64696E67006D5F656E636F64696E6700557269006D5F7265736F6C766564557269006D5F73746D006D5F77654F776E54686553747265616D006D5F6C696E655374617274006D5F6162736F6C757465506F73006765745F4E616D65006765745F497348746D6C007365745F497348746D6C006765745F5075626C69634964006765745F557269006765745F5265736F6C766564557269006765745F506172656E74006765745F4C61737463686172006765745F4C696E65006765745F4C696E65506F736974696F6E006765745F4973496E7465726E616C006765745F4C69746572616C006765745F4C69746572616C54797065006765745F497357686974657370616365006765745F50726F7879005265616443686172004F70656E006765745F456E636F64696E6700436C6F736500536B69705768697465737061636500537472696E674275696C646572005363616E546F6B656E005363616E4C69746572616C005363616E546F456E6400457870616E6443686172456E74697479004374726C4D6170004572726F7200436F6E746578740049734C69746572616C54797065005365744C69746572616C5479706500446973706F7365004E616D6500497348746D6C005075626C69634964005265736F6C76656455726900506172656E74004C61737463686172004C696E65004C696E65506F736974696F6E004973496E7465726E616C004C69746572616C004973576869746573706163650050726F78790042554653495A450053747265616D0073746D0072617742756666657200726177506F730072617755736564006D5F6465636F646572006D5F627566666572007573656400706F7300436F7079546F4D656D6F727953747265616D004465636F6465426C6F636B004175746F446574656374456E636F64696E67005065656B4368617200536E6966665061747465726E00536E6966665768697465737061636500536E6966664C69746572616C00536E69666641747472696275746500536E6966665465726D696E61746F7200536E696666456E636F64696E6700536E6966664D65746100536E6966664E616D6500536B6970546F005061727365417474726962757465005065656B00526561640052656164426C6F636B00526561644C696E650052656164546F456E640074656D700074656D7042797465730047657443686172436F756E740047657446756C6C436861727300476574436861727300556E69636F6465546F5554463136006D5F73746172745461674F7074696F6E616C006D5F656E645461674F7074696F6E616C006D5F636F6E74656E744D6F64656C006D5F696E636C7573696F6E73006D5F6578636C7573696F6E730053797374656D2E436F6C6C656374696F6E732E47656E657269630044696374696F6E6172796032006D5F6174744C697374006765745F436F6E74656E744D6F64656C006765745F456E645461674F7074696F6E616C006765745F53746172745461674F7074696F6E616C0046696E6441747472696275746500416464417474446566730043616E436F6E7461696E00456E645461674F7074696F6E616C0053746172745461674F7074696F6E616C0044656661756C740052434441544100454D505459006D5F6465636C61726564436F6E74656E74006D5F63757272656E744465707468006D5F6D6F64656C006765745F43757272656E744465707468006765745F4465636C61726564436F6E74656E74005075736847726F757000506F7047726F75700041646453796D626F6C00416464436F6E6E6563746F72004164644F6363757272656E6365005365744465636C61726564436F6E74656E740043757272656E744465707468004E6F6E6500416E64004F720053657175656E6365005265717569726564004F7074696F6E616C005A65726F4F724D6F7265004F6E654F724D6F72650053797374656D2E436F6C6C656374696F6E730041727261794C697374004D656D62657273006D5F67726F757054797065006D5F6F6363757272656E6365004D69786564006765745F4F6363757272656E6365006765745F546578744F6E6C790041646447726F757000546578744F6E6C7900454E5449545900454E54495449455300494400494452454600494452454653004E414D45004E414D4553004E4D544F4B454E004E4D544F4B454E53004E554D424552004E554D42455253004E55544F4B454E004E55544F4B454E53004E4F544154494F4E00454E554D45524154494F4E00466978656400496D706C696564006D5F74797065006D5F656E756D56616C756573006D5F64656661756C74006D5F70726573656E6365006765745F44656661756C74007365745F44656661756C74006765745F41747472696275746550726573656E6365006765745F456E756D56616C75657300536574456E756D65726174656454797065006765745F5479706500536574547970650053657450726573656E636500456E756D56616C75657300547970650057686974655370616365006D5F656C656D656E7473006D5F70656E746974696573006D5F656E746974696573006D5F7362006D5F63757272656E7400586D6C4E616D655461626C65006765745F4E616D655461626C650050617273650046696E64456E746974790046696E64456C656D656E740050757368456E7469747900506F70456E746974790050617273654D61726B75700050617273654465636C436F6D6D656E74730050617273654465636C436F6D6D656E740050617273654D61726B656453656374696F6E005061727365496E636C75646553656374696F6E00506172736549676E6F726553656374696F6E005363616E4E616D65005061727365506172616D65746572456E7469747900476574506172616D65746572456E7469747900476574456E7469746965734C69746572616C4E616D654C6F6F6B7570005061727365456E74697479005061727365456C656D656E744465636C006E677465726D0050617273654E616D6547726F75700050617273654E616D654C6973740064637465726D005061727365436F6E74656E744D6F64656C00636D7465726D0050617273654D6F64656C0050617273654174744C6973740070657465726D0050617273654174744465660050617273654174745479706500506172736541747444656661756C74004E616D655461626C6500457175616C7349676E6F72654361736500546F557070657200546F4C6F776572006D5F6974656D73006D5F73697A65006D5F636F756E74006D5F67726F777468006765745F436F756E74007365745F436F756E74006765745F53697A65006765745F4974656D007365745F4974656D00506F7000507573680052656D6F7665417400436F756E740053697A65004974656D00447464547970650051756F746543686172006D5F6C69746572616C56616C7565005265736574006765745F56616C7565006765745F497344656661756C740056616C756500497344656661756C7400586D6C4E6F646554797065004E6F64655479706500586D6C537061636500537061636500586D6C4C616E67004973456D7074790043757272656E7453746174650053696D756C617465640061747472696275746573004164644174747269627574650052656D6F766541747472696275746500436F707941747472696275746573006765745F417474726962757465436F756E740047657441747472696275746500417474726962757465436F756E7400496E697469616C004D61726B757000456E645461670041747472004174747256616C75650054657874005061727469616C546167004175746F436C6F7365004344617461005061727469616C546578740050736575646F537461727454616700456F6600554E444546494E45445F4E414D455350414345006465636C7465726D007461677465726D00617465726D0061767465726D0063646174617465726D0064747465726D0070697465726D006D5F647464006D5F7374617465006D5F7061727469616C006D5F656E64546167006D5F737461636B006D5F6E6F6465006D5F61006D5F61706F73006D5F626173655572690054657874577269746572006D5F6C6F67006D5F666F756E64526F6F74006D5F6E65776E6F6465006D5F706F70746F6465707468006D5F726F6F74436F756E74006D5F726F6F74456C656D656E744E616D65006D5F68726566006D5F6572726F724C6F6746696C65006D5F6C6173744572726F72006D5F696E70757453747265616D006D5F7379736C6974006D5F7075626964006D5F737562736574006D5F646F6354797065005768697465737061636548616E646C696E67006D5F7768697465737061636548616E646C696E67006D5F666F6C64696E67006D5F7374726970446F635479706500756E6B6E6F776E4E616D65737061636573006765745F447464007365745F447464004C617A794C6F616444746400676574\
-5F446F6354797065007365745F446F6354797065006765745F526F6F74456C656D656E744E616D65006765745F5075626C69634964656E746966696572007365745F5075626C69634964656E746966696572006765745F53797374656D4C69746572616C007365745F53797374656D4C69746572616C006765745F496E7465726E616C537562736574007365745F496E7465726E616C537562736574006765745F496E70757453747265616D007365745F496E70757453747265616D006765745F57656250726F7879007365745F57656250726F78790053657442617365557269006765745F48726566007365745F48726566006765745F5374726970446F6354797065007365745F5374726970446F6354797065006765745F43617365466F6C64696E67007365745F43617365466F6C64696E67006765745F4572726F724C6F67007365745F4572726F724C6F67006765745F4572726F724C6F6746696C65007365745F4572726F724C6F6746696C65004C6F6700496E69740053776170546F704E6F64657300546F70006765745F4E6F646554797065006765745F4C6F63616C4E616D65006765745F4E616D657370616365555249006765745F507265666978006765745F48617356616C7565006765745F4465707468006765745F42617365555249006765745F4973456D707479456C656D656E74006765745F51756F746543686172006765745F586D6C5370616365006765745F586D6C4C616E67006765745F5768697465737061636548616E646C696E67007365745F5768697465737061636548616E646C696E67004D6F7665546F417474726962757465004D6F7665546F4669727374417474726962757465004D6F7665546F4E657874417474726962757465004D6F7665546F456C656D656E7400476574456E636F64696E67004F70656E496E707574005061727365546167005665726966794E616D650050617273655374617274546167005061727365456E645461670050617273654173704E6574005061727365436F6D6D656E74005061727365436F6E646974696F6E616C426C6F636B005061727365446F6354797065005061727365504900506172736554657874005061727365434461746100457870616E64456E74697479006765745F454F4600526561645374617465006765745F5265616453746174650052656164537472696E670052656164496E6E6572586D6C00526561644F75746572586D6C004C6F6F6B75704E616D657370616365005265736F6C7665456E74697479005265616441747472696275746556616C75650056616C69646174650056616C69646174654174747269627574650056616C69644174747269627574654E616D650056616C6964617465436F6E74656E740044746400446F635479706500526F6F74456C656D656E744E616D65005075626C69634964656E7469666965720053797374656D4C69746572616C00496E7465726E616C53756273657400496E70757453747265616D0057656250726F78790048726566005374726970446F6354797065004572726F724C6F67004572726F724C6F6746696C65004C6F63616C4E616D65004E616D657370616365555249005072656669780048617356616C75650044657074680042617365555249004973456D707479456C656D656E740053797374656D2E446174610053797374656D2E446174612E53716C54797065730053716C43686172730053716C537472696E670048746D6C546F586D6C006D657373616765006500696E6E6572457863657074696F6E0073747265616D496E666F0073747265616D43747800696E666F00636F6E74657874006E616D65007075626964007572690070726F7879006C69746572616C00626173655572690076616C756500706172656E74007362007465726D006E6D746F6B656E0071756F74650074797065007465726D696E61746F7273006D736700636800780061726700746F6B656E006973446973706F73696E670064656661756C74456E636F64696E6700730062756666657200696E646578006C656E677468007061747465726E0053797374656D2E52756E74696D652E496E7465726F705365727669636573004F75744174747269627574650077686174007374617274006461746100636F756E740062797465730062797465496E6465780062797465436F756E740063686172730063686172496E64657800636F64650073746F0065746F00636D00696E636C7573696F6E73006578636C7573696F6E73006C697374006474640073796D0063006463006700656E756D56616C756573006E740075726C0073756273657400696E7075740066756C6C006E6D746F6B656E73006E616D657300636D7400617474646566006100620067726F77746800690071756F7465636861720063617365496E73656E736974697665006E006172677300506172616D4172726179417474726962757465006E616D657370616365555249006E73006E657774657874007465726D696E61746F7200707265666978006E6F646500446F63756D656E7400446F63756D656E74557269004D6963726F736F66742E53716C5365727665722E5365727665720053716C46616365744174747269627574650053797374656D2E5265666C656374696F6E00417373656D626C795469746C6541747472696275746500417373656D626C794465736372697074696F6E41747472696275746500417373656D626C79436F6E66696775726174696F6E41747472696275746500417373656D626C79436F6D70616E7941747472696275746500417373656D626C7950726F6475637441747472696275746500417373656D626C79436F7079726967687441747472696275746500417373656D626C7954726164656D61726B41747472696275746500417373656D626C7943756C7475726541747472696275746500434C53436F6D706C69616E7441747472696275746500417373656D626C7956657273696F6E41747472696275746500417373656D626C7946696C6556657273696F6E4174747269627574650053797374656D2E52756E74696D652E436F6D70696C6572536572766963657300436F6D70696C6174696F6E52656C61786174696F6E734174747269627574650052756E74696D65436F6D7061746962696C6974794174747269627574650053514C232E53676D6C5265616465720053657269616C697A61626C6541747472696275746500476574537472696E670053797374656D2E53656375726974792E5065726D697373696F6E730053656375726974795065726D697373696F6E417474726962757465005365637572697479416374696F6E00417267756D656E744E756C6C457863657074696F6E0041646456616C75650053797374656D2E476C6F62616C697A6174696F6E0043756C74757265496E666F006765745F496E76617269616E7443756C7475726500537472696E6700436F6D70617265006F705F496E657175616C69747900537472696E67526561646572006765745F536368656D65006F705F457175616C697479006765745F4C6F63616C506174680046696C6553747265616D0046696C654D6F64650046696C654163636573730053797374656D2E4E6574005765625265717565737400437265617465004874747057656252657175657374007365745F557365724167656E74007365745F54696D656F7574004957656250726F7879007365745F50726F7879007365745F50726541757468656E7469636174650043726564656E7469616C4361636865004943726564656E7469616C73006765745F44656661756C7443726564656E7469616C73007365745F43726564656E7469616C7300576562526573706F6E736500476574526573706F6E7365006765745F526573706F6E7365557269006765745F4162736F6C757465557269006765745F436F6E74656E745479706500496E6465784F6600537562737472696E67006765745F4C656E677468005472696D00476574526573706F6E736553747265616D00417267756D656E74457863657074696F6E007365745F4C656E67746800436861720049734C6574746572006765745F43757272656E74554943756C747572650049466F726D617450726F766964657200466F726D61740049734C65747465724F72446967697400417070656E6400546F537472696E67006765745F436861727300436F6E63617400456D70747900436F6E7665727400546F4368617200496E743332006765745F4162736F6C7574655061746800474300537570707265737346696E616C697A65002E6363746F72003C50726976617465496D706C656D656E746174696F6E44657461696C733E7B41434246453538422D413946312D344243362D423435462D3241313542324431423641387D00436F6D70696C657247656E6572617465644174747269627574650056616C756554797065005F5F5374617469634172726179496E69745479706553697A653D3132380024246D6574686F643078363030303130652D310052756E74696D6548656C706572730041727261790052756E74696D654669656C6448616E646C6500496E697469616C697A654172726179006765745F55544638006765745F43616E5365656B0042797465004765744465636F646572005365656B4F726967696E005365656B004D656D6F727953747265616D00577269746500436F7079006765745F426967456E6469616E556E69636F646500556E69636F6465456E636F64696E67004D617468004D696E0055496E74333200496E76616C69644F7065726174696F6E457863657074696F6E0054727947657456616C75650056616C7565436F6C6C656374696F6E006765745F56616C75657300456E756D657261746F7200476574456E756D657261746F72006765745F43757272656E7400436F6E7461696E734B657900416464004D6F76654E65787400537472696E67436F6D70617269736F6E0049456E756D657261746F720024246D6574686F643078363030303037322D310049734E756C6C4F72456D707479006765745F4D657373616765004170706C69636174696F6E457863657074696F6E004E6F74496D706C656D656E746564457863657074696F6E004E6F74537570706F72746564457863657074696F6E0052756E74696D655479706548616E646C65004765745479706546726F6D48616E646C6500546F41727261790044656661756C744D656D62657241747472696275746500417373656D626C79006765745F417373656D626C79006765745F46756C6C4E616D650053706C6974004765744D616E69666573745265736F7572636553747265616D0053747265616D526561646572004469726563746F72790047657443757272656E744469726563746F72790053747265616D5772697465720057726974654C696E6500436C65617200586D6C436F6E7665727400456E636F64654E616D6500417267756D656E744F75744F6652616E6765457863657074696F6E00586D6C457863657074696F6E0053746172747357697468005472696D456E64005265706C616365004973446967697400537472696E6757726974657200586D6C5465787457726974657200466F726D617474696E67007365745F466F726D617474696E6700586D6C5772697465720057726974654E6F6465005665726966794E4D544F4B454E005665726966794E434E616D650053716C46756E6374696F6E417474726962757465006765745F49734E756C6C00586D6C446F63756D656E74007365745F50726573657276655768697465737061636500586D6C5265736F6C766572007365745F586D6C5265736F6C766572004C6F616400586D6C4E6F6465006765745F4F75746572586D6C006F705F496D706C6963697400001B65006E00740069007400790043006F006E007400650078007400000969006E0066006F000009680074006D006C00003355006E007200650073006F006C007600610062006C006500200065006E007400690074007900200027007B0030007D0027000109660069006C00650000354D006F007A0069006C006C0061002F0034002E0030002000280063006F006D00700061007400690062006C0065003B0029003B00001374006500780074002F00680074006D006C00000F630068006100720073006500740000033D0000033B0000057300620000097400650072006D00004549006E00760061006C006900640020006E0061006D0065002000730074006100720074002000630068006100720061006300740065007200200027007B0030007D002700013949006E00760061006C006900640020006E0061006D0065002000630068006100720061006300740065007200200027007B0030007D00270001177400650072006D0069006E00610074006F0072007300004D20007300740061007200740069006E00670020006F006E0020006C0069006E00650020007B0030007D00200077006100730020006E006500760065007200200063006C006F00730065006400004D5000720065006D006100740075007200650020007B0030007D002000700061007200730069006E006700200065006E00740069007400790020007200650066006500720065006E0063006500000745004F004600007D0A005200650066006500720065006E0063006500640020006F006E0020006C0069006E00650020007B0030007D002C00200070006F0073006900740069006F006E0020007B0031007D0020006F006600200069006E007400650072006E0061006C00200065006E007400690074007900200027007B0032007D002700017D0A005200650066006500720065006E0063006500640020006F006E0020006C0069006E00650020007B0030007D002C00200070006F0073006900740069006F006E0020007B0031007D0020006F006600200027007B0032007D002700200065006E00740069007400790020006100740020005B007B0033007D005D00010B43004400410054004100000B530044004100540041000005500049000001000B3C003F0078006D006C00000F760065007200730069006F006E00001165006E0063006F00640069006E00670000033E0000096D00650074006100001568007400740070002D0065007100750069007600010F63006F006E00740065006E007400001963006F006E00740065006E0074002D007400790070006500014B49006E00760061006C006900640020006300680061007200610063007400650072002000300078007B0030003A0078007D00200069006E00200065006E0063006F00640069006E006700008091540068006500200061007400740072006900620075007400650020006C00690073007400200066006F0072002000740068006500200065006C0065006D0065006E00740020006400650063006C00610072006100740069006F006E00200068006100730020006E006F00740020006200650065006E00200069006E0069007400690061006C0069007300650064002E0000096C00690073007400000B45004D00500054005900000D52004300440041005400410000594400650063006C006100720065006400200063006F006E00740065006E00740020007400790070006500200027007B0030007D00270020006900730020006E006F007400200073007500700070006F007200740065006400010F2300500043004400410054004100004B4D0069007300730069006E006700200074006F006B0065006E0020006200650066006F0072006500200063006F006E006E006500630074006F007200200027007B0030007D0027002E00015F43006F006E006E006500630074006F007200200027007B0030007D002700200069007300200069006E0063006F006E00730069007300740065006E0074002000770069007400680020007B0031007D002000670072006F00750070002E0001076400740064000080A9410074007400720069006200750074006500540079007000650020007B0030007D0020006900730020006E006F0074002000760061006C0069006400200066006F007200200061006E002000610074007400720069006200750074006500200064006500660069006E006900740069006F006E0020007700690074006800200061006E00200065006E0075006D006500720061007400650064002000760061006C00750065002E00000D45004E005400490054005900001145004E00540049005400490045005300000549004400000B49004400520045004600000D49004400520045004600530000094E0041004D004500000B4E0041004D0045005300000F4E004D0054004F004B0045004E0000114E004D0054004F004B0045004E005300000D4E0055004D00420045005200000F4E0055004D004200450052005300000F4E00550054004F004B0045004E0000114E00550054004F004B0045004E005300004B41007400740072006900620075007400650020007400790070006500200027007B0030007D00270020006900730020006E006F007400200073007500700070006F007200740065006400010B46004900580045004400001152004500510055004900520045004400000F49004D0050004C0049004500440000474100740074007200690062007500740065002000760061006C0075006500200027007B0030007D00270020006E006F007400200073007500700070006F007200740065006400010920000D000A000900003555006E00650078007000650063007400650064002000630068006100720061006300740065007200200027007B0030007D002700017146006F0075006E006400200027007B0030007D0027002C00200062007500740020006500780070006500630069006E00670020006400650063006C00610072006100740069006F006E0020007300740061007200740069006E00670020007700690074006800200027003C0021002700014D45007800700065006300740069006E006700200063006F006D006D0065006E007400200027003C0021002D002D0027002000620075007400200066006F0075006E00640020007B0030007D00010F43006F006D006D0065006E00740000072D002D003E00010F45004C0045004D0045004E005400000F4100540054004C0049005300540000809349006E00760061006C006900640020006400650063006C00610072006100740069006F006E00200027003C0021007B0030007D0027002E002000200045007800700065006300740069006E0067002000270045004E00540049005400590027002C002000270045004C0045004D0045004E005400270020006F007200200027004100540054004C0049005300540027002E00015D45007800700065006300740069006E006700200063006F006D006D0065006E0074002000640065006C0069006D006900740065007200200027002D002D0027002000620075007400200066006F0075006E00640020007B0030007D00011D4D00610072006B0075007000200043006F006D006D0065006E00740000052D002D0001035B00000F49004E0043004C00550044004500000D490047004E004F0052004500004B55006E0073007500700070006F00720074006500640020006D00610072006B00650064002000730065006300740069006F006E0020007400790070006500200027007B0030007D002700011F49006E0063006C007500640065002000530065006300740069006F006E00003745007800700065006300740069006E006700200027005B0027002000620075007400200066006F0075006E00640020007B0030007D00012743006F006E0064006900740069006F006E0061006C002000530065006300740069006F006E0000075D005D003E000049450078007400650072006E0061006C00200070006100720061006D006500740065007200200065006E00740069007400790020007200650073006F006C007500740069006F006E00005B5200650066006500720065006E0063006500200074006F00200075006E0064006500660069006E0065006400200070006100720061006D006500740065007200200065006E007400690074007900200027007B0030007D002700010D5000550042004C0049004300006745007800700065006300740069006E00670020007000750062006C006900630020006900640065006E0074006900660069006500720020006C00690074006500720061006C002000620075007400200066006F0075006E006400200027007B0030007D002700010D530059005300540045004D0000808549006E00760061006C00690064002000650078007400650072006E0061006C0020006900640065006E00740069006600690065007200200027007B0030007D0027002E00200020004500780070006500630069006E006700200027005000550042004C0049004300270020006F00720020002700530059005300540045004D0027002E00016745007800700065006300740069006E0067002000730079007300740065006D0020006900640065006E0074006900660069006500720020006C00690074006500720061006C002000620075007400200066006F0075006E006400200027007B0030007D002700016F45007800700065006300740069006E006700200065006E00640020006F006600200065006E00740069007400790020006400650063006C00610072006100740069006F006E00200027003E0027002000620075007400200066006F0075006E006400200027007B0030007D002700012F49006E00760061006C00690064002000730079006E00740061007800200061007400200027007B0030007D002700013F45007800700065006300740069006E006700200069006E0063006C007500730069006F006E00730020006E0061006D0065002000670072006F0075007000007145007800700065006300740069006E006700200065006E00640020006F006600200045004C0045004D0045004E00540020006400650063006C00610072006100740069006F006E00200027003E0027002000620075007400200066006F0075006E006400200027007B0030007D002700013943006F006E00740065006E00740020004D006F00640065006C00200077006100730020006E006F007400200063006C006F00730065006400007950006100720061006D006500740065007200200065006E0074006900740079002000630061006E006E006F007400200063006C006F007300650020006100200070006100720065006E0020006F007500740073006900640065002000690074002700730020006F0077006E002000730063006F00700065000103230000514100540054004C0049005300540020007200650066006500720065006E00630065007300200075006E0064006500660069006E0065006400200045004C0045004D0045004E00540020007B0030007D0000114E004F0054004100540049004F004E00005345007800700065006300740069006E00670020006E0061006D0065002000670072006F007500700020002700280027002C002000620075007400200066006F0075006E006400200027007B0030007D002700010F20000D000A0009007C002C002900000B20000D000A0009003E00001920000D000A0009002C0026007C00280029003F002B002A00000B200009000D000A003E0000132E00480074006D006C002E006400740064000009480054004D004C0000035C0000073A002F002F000011660069006C0065003A002F002F002F0000052F002F0000092000200020002000001523002300230020004500720072006F0072003A00006323002300230020004500720072006F007200200069006E0020007B0030007D0023007B0031007D002C0020006C0069006E00650020007B0032007D002C00200070006F0073006900740069006F006E0020007B0033007D003A0020007B0034007D00000B78006D006C006E007300003B68007400740070003A002F002F007700770077002E00770033002E006F00720067002F0032003000300030002F0078006D006C006E0073002F00000778006D006C00004968007400740070003A002F002F007700770077002E00770033002E006F00720067002F0058004D004C002F0031003900390038002F006E0061006D00650073007000610063006500000D78006D006C006E0073003A000011230075006E006B006E006F0077006E00000369000013230064006F00630075006D0065006E00740000808159006F00750020006D0075007300740020007300700065006300690066007900200069006E00700075007400200065006900740068006500720020007600690061002000480072006500660020006F007200200049006E00700075007400530074007200650061006D002000700072006F00700065007200740069006500730000155200650063006F0076006500720069006E0067000037490067006E006F00720069006E006700200069006E00760061006C006900640020006D00610072006B0075007000200027003C002100010D200009000D000A003E003C00000F44004F0043005400590050004500007949006E00760061006C006900640020006400650063006C00610072006100740069006F006E00200027003C0021007B0030007D002E002E002E0027002E002000200045007800700065006300740069006E006700200027003C00210044004F0043005400590050004500270020006F006E006C0079002E000111200009000D000A003D002F003E003C00006F45007800700065006300740065006400200065006D007000740079002000730074006100720074002000740061006700200027002F003E0027002000730065007100750065006E0063006500200069006E007300740065006100640020006F006600200027007B0030007D002700013D530074006100720074002000740061006700200027007B0030007D00270020006900730020006D0069007300730069006E006700200027003E0027000113200009000D000A003D00270022002F003E0001032C0000033A0000434400750070006C00690063006100740065002000610074007400720069006200750074006500200027007B0030007D0027002000690067006E006F00720065006400014D55006E0065007800700065006300740065006400200045004F0046002000700061007200730069006E0067002000730074006100720074002000740061006700200027007B0030007D00270001454E006F0020006D00610074006300680069006E0067002000730074006100720074002000740061006700200066006F007200200027003C002F007B0030007D003E00270001053C002500000D4100730070004E0065007400000525003E0000032D0001032000000F09000D000A005B005D003C003E000007690066002000003F45007800700065006300740069006E0067002000430044004100540041002000620075007400200066006F0075006E006400200027007B0030007D002700013B45007800700065006300740069006E006700200027005B0027002000620075007400200066006F0075006E006400200027007B0030007D002700014355006E0065007800700065006300740065006400200074006F006B0065006E00200069006E00200044004F0043005400590050004500200027007B0030007D002700011F49006E007400650072006E0061006C00200053007500620073006500740000035D00005B45007800700065006300740069006E006700200065006E00640020006F006600200044004F004300\
-540059005000450020007400610067002C002000620075007400200066006F0075006E006400200027007B0030007D0027000141440054004400200064006F006500730020006E006F00740020006D006100740063006800200064006F00630075006D0065006E00740020007400790070006500000B200009000D000A003F00002D500072006F00630065007300730069006E006700200049006E0073007400720075006300740069006F006E0000053C002F0000133C0021005B00430044004100540041005B0000092F002A002A002F00002D55006E0064006500660069006E0065006400200065006E007400690074007900200027007B0030007D0027000103260000374E006F00740020006F006E00200061006E00200065006E00740069007400790020007200650066006500720065006E00630065002E0000294E006F00740020006F006E00200061006E0020006100740074007200690062007500740065002E0000033C00000942004F004400590000808144006F00630075006D0065006E007400200041004E004400200044006F00630075006D0065006E0074005500720069002000630061006E006E006F007400200062006F007400680020006200650020004E0055004C004C0020006F007200200065006D00700074007900200073007400720069006E0067002000270027002100010F74006F006C006F00770065007200000F74006F0075007000700065007200000000008BE5BFACF1A9C64BB45F2A15B2D1B6A80008B77A5C561934E08902060E03200001042001010E062002010E1210062002010E120507200201122111250320000E0328000E0206080306110C04000000000401000000040200000002060302FFFF02060203061210030612290306122D03061215072004010E0E0E0E052002010E0E092004010E122D12150E032000020420010102042000122D04200012100320000303200008042000110C072002011210122D04200012290720030E12310E020620020E1231030720030E12310E0E03061D08052002010E03052002010E08040001020E03280002042800122D04280012100328000303280008042800110C0428001229040040000004FFFFFFFF0306123503061D050306121903061D0307200201123512290600011235123509000312191D05100808042001020E0420010E0E0520010E100E04200012190420010103072003081D030808072003081D0508080A2005081D0508081D030804000103090306122C03061D0E0806151239020E12440C2006010E0202122C1D0E1D0E042000122C05200112440E0A200101151239020E1244062002020E1248042800122C030611280403000000030612380420001128042800112803061130030611340306123D04200011340420001238052001011238042800113404280012380306113C040400000004050000000406000000040700000004080000000409000000040A000000040B000000040C000000040D000000040E000000040F00000004100000000306114004200011400420001D0E072002011D0E113C042000113C04280011400428001D0E042800113C0820000D000A0009000806151239020E12240806151239020E121003061231062002010E124104200012410D00071248122D0E0E0E0E0E12410D00061248122D0E12150E0E124105200112100E05200112240E07200201122D12100420010302092000151239020E12100620021D0E030206200201123D02052001122C030620020103122C0B200201151239020E124403052001124403062002010312440428001241050002020E0E0306115003061D1C04200101080420011C0805200201081C0320001C0428011C0803061244062003010E0E030306114503061149030612240306116003061254072003010E11450E08200412580E0E030205200101125C042001080E05200112580810230075006E006B006E006F0077006E000C200009000D000A003E003C0010200009000D000A003D002F003E003C0012200009000D000A003D00270022002F003E000A200009000D000A003E000E09000D000A005B005D003C003E000A200009000D000A003F00030612480306125C030612580306124D030611510706151239020E0E052001011241042000124805200101124805200101122D04200012150520010112150420001150052001011150042000124D05200101124D062002010E1D0E082003125C0E11450E062001125C125C042000125C0420001145042000114904200011510520010111510520020E0E0E0420010E08052002020E0E042001020305200202030206200201123103042000115507000201125C1258042800124804280012150428001150042800124D0428001145042800114904280011510428010E080428010E0E0528020E0E0E04280011550A000312591259115D115D12010001005408074D617853697A653200000080A0002400000480000094000000060200000024000052534131000400000100010033237E60D1AF2429EE4E6DABE42A2C8A8893EBD630506BA491C63FBFC5D6D0416C540D47A1244C1689482BC752CBAA4E0B95552751626957D1C0BD356D2C5E728A3EA0244C7AC9CC3D4CFB363802B0401245A79C4C7038E7E3901F3C727EC901AF72DAC23D4C6E2CAF8802EDDC1388C628430979DAC9AF0D307CD9527F1FDDC6062001011180A980A42E01808453797374656D2E53656375726974792E5065726D697373696F6E732E53656375726974795065726D697373696F6E4174747269627574652C206D73636F726C69622C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038391B0154021653657269616C697A6174696F6E466F726D617474657201052002010E1C0500001280B1090004080E0E021280B107000202122D122D0307010306200201122D0E04000012290A2003010E1180C11180C50700011280C9122D062001011280D50500001280DD062001011280DD0520001280E10620010E1280B104200108030520020E0808052002080E0805000112290E042000123518070E123512290E1280CD1280E1122D0E0E0808080E12140E04000102030900030E1280ED0E1D1C052001123103070703031D1C1D1C05200112310E040702030E04200103080500020E0E0E0A070808030803080808080400010308090707030808080803030400010E030507020E1D1C0407011D1C0B0705121012310E1D1C1D1C0307010E040001011C03000001030611700900020112810911810D0720020A0A1181150707040812190808072003011D050808090704081D05081281190C00050112810908128109080806070308081D0305200201020205070309090903070108060704080808030407020308072003011D0308080507030808080A070512190E0E122912190F070B08030E0E0E0E08080E122912190607040803080805070303080E050002080808040702080808200312311D0308080707031D0308123104070205050907050908081D1C1D1C07151239020E124408200202130010130104070112440B20001512812D0213001301081512812D020E12440B20001511813102130013010815118131020E1244042000130105200102130007200201130013010C0702124415118131020E1244080003080E0E1181350B07070E0E021D0E081D0E08042001081C09070411301D1C031D1C05070211340305200012813914070A1C1C0E1224123802128139121112813912110706151239020E0806151239020E080607030E081D1C050702021D1C07151239020E122407151239020E1210070702124812813D0407011210040701122406070303121003050703030E0E0507020312100507020E1210081512812D020E12100815118131020E1210130703151239020E1210121015118131020E12100D070A03020E12100E0E0E0E0E0E07000203031280B112070B031D0E0202122C1D0E1D0E0E0E1D0E0808000112814911814D082001128109128149021D0E080704123D12100E0E060703030E1210070703122C12100E070704080312100E120707031D0E151239020E12440E12241D0E0807070303121012440507020E124405070212100E0807051210020E0E0E090100044974656D00000A00030112810912810908060703081D1C080607031258080806070308081258080704080812581258040701125806151239020E0E0520001281550620011D0E1D0305200112350E0520010112350300000E0F07061281550E12351281591D0311500600030E0E0E0E062002010E1D1C0607030E0E1D1C0407011D0E040701125C05070208125C0400010E0E0407020E0810070C0E08125C080E0E0E08125C080E0807070308125C114906070308125C0E07070302125C11600607030E0E1D0E0507020E1150030701020F07090E125C0E0E030E12581D0E1D0E0A07060E030208125C1D0E060704030E0808070704030E0E1D0E0A0707030E0E0E0E0E1D0E0520010E1D030707040E0E081D03040702020E07070502030E0E030B0706030E0E121012101D0E0407011145062001011280ED0620010111817906200201121D020A070312817112817511450807021281711281750607021224124404070208020B07060E0808125C1224125C80C801000400540E044E616D6511436F6E766572745F48746D6C546F586D6C5455794D6963726F736F66742E53716C5365727665722E5365727665722E446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038390A446174614163636573730000000054020F497344657465726D696E697374696301540209497350726563697365010320000A0420001D03052001011D030620010112818905200101121D050001115D0E05200101115D0D07051280B9115012641281850E1401000F53514C232E53676D6C5265616465720000150100107777772E53514C73686172702E636F6D00000501000000001501001053716C205175616E74756D204C65617000000901000453514C2300007C010077436F7079726967687420C2A92032303032204D6963726F736F667420436F72706F726174696F6E2E20416C6C207269676874732072657365727665642E20284368726973204C6F76657474293B20323030372D32303038204D696E64546F7563682E20416C6C207269676874732072657365727665642E00000501000100000C010007312E382E302E3000000801000800000000001E01000100540216577261704E6F6E457863657074696F6E5468726F7773010000BCF000000000000000000000DEF00000002000000000000000000000000000000000000000000000D0F000000000000000000000000000000000000000005F436F72446C6C4D61696E006D73636F7265652E646C6C0000000000FF25002000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100100000001800008000000000000000000000000000000100010000003000008000000000000000000000000000000100000000004800000058000100200400000000000000000000200434000000560053005F00560045005200530049004F004E005F0049004E0046004F0000000000BD04EFFE00000100080001000000000008000100000000003F000000000000000400000002000000000000000000000000000000440000000100560061007200460069006C00650049006E0066006F00000000002400040000005400720061006E0073006C006100740069006F006E00000000000000B00480030000010053007400720069006E006700460069006C00650049006E0066006F0000005C03000001003000300030003000300034006200300000003C001100010043006F006D006D0065006E007400730000007700770077002E00530051004C00730068006100720070002E0063006F006D000000000044001100010043006F006D00700061006E0079004E0061006D00650000000000530071006C0020005100750061006E00740075006D0020004C0065006100700000000000480010000100460069006C0065004400650073006300720069007000740069006F006E0000000000530051004C0023002E00530067006D006C005200650061006400650072000000300008000100460069006C006500560065007200730069006F006E000000000031002E0038002E0030002E003000000048001400010049006E007400650072006E0061006C004E0061006D0065000000530051004C0023002E00530067006D006C005200650061006400650072002E0064006C006C0000001401770001004C006500670061006C0043006F007000790072006900670068007400000043006F0070007900720069006700680074002000A9002000320030003000320020004D006900630072006F0073006F0066007400200043006F00720070006F0072006100740069006F006E002E00200041006C006C0020007200690067006800740073002000720065007300650072007600650064002E00200028004300680072006900730020004C006F00760065007400740029003B00200032003000300037002D00320030003000380020004D0069006E00640054006F007500630068002E00200041006C006C0020007200690067006800740073002000720065007300650072007600650064002E00000000005000140001004F0072006900670069006E0061006C00460069006C0065006E0061006D0065000000530051004C0023002E00530067006D006C005200650061006400650072002E0064006C006C0000002C0005000100500072006F0064007500630074004E0061006D00650000000000530051004C00230000000000340008000100500072006F006400750063007400560065007200730069006F006E00000031002E0038002E0030002E003000000040000C00010041007300730065006D0062006C0079002000560065007200730069006F006E00000031002E0038002E0034002E00310033003700360031000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F000000C000000F03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
- WITH PERMISSION_SET = SAFE;
- ');
- PRINT 'SQL#.SgmlReader Assembly Created.';
- END;
- ELSE
- BEGIN
- PRINT 'Skipping install of SQL#.SgmlReader Assembly.';
- END;
- PRINT '';
-
-
- IF NOT EXISTS (
- SELECT 1
- FROM sys.module_assembly_usages mau
- INNER JOIN sys.assemblies asmbly
- ON asmbly.assembly_id = mau.assembly_id
- AND asmbly.name = N'SQL#'
- INNER JOIN sys.objects so
- ON so.[object_id] = mau.[object_id]
- WHERE so.name = N'SQLsharp_Setup'
- )
- BEGIN
- PRINT 'Creating Setup Procedure ...';
- PRINT '';
- EXEC(N'CREATE PROCEDURE [' + @SQLsharpSchema + N'].[SQLsharp_Setup] @SQLsharpSchema sysname = ''' + @SQLsharpSchema + N''', @SQLsharpAssembly sysname = NULL, @JustPrintSQL BIT = 0 WITH EXECUTE AS CALLER AS EXTERNAL NAME [SQL#].[SQLsharp].[Setup];');
- PRINT 'Setup Procedure Created';
- PRINT '';
- END;
- ELSE
- BEGIN
- PRINT 'Setup Procedure already exists; skipping ...';
- PRINT '';
- END;
-
-
- PRINT 'Running Setup Procedure ...';
- EXEC (N'EXEC [' + @SQLsharpSchema + N'].[SQLsharp_Setup]');
-
-
- PRINT '';
- PRINT 'Setup Procedure Completed';
- PRINT '';
-
------------------------------------
- IF (EXISTS(SELECT * FROM #SQLsharpOptions sso WHERE sso.[Option] LIKE N'SQL#%'))
- BEGIN
-
- -- account for pre-Version 3.0.x where INET, FileSystem, and DB groups were in main SQL# Assembly
- IF (EXISTS(
- SELECT *
- FROM #SQLsharpOptions
- WHERE [Option] = N'PriorVersion'
- AND LEFT([Value], 2) IN ('1.', '2.')
- )
- AND EXISTS(
- SELECT *
- FROM #SQLsharpOptions
- WHERE [Option] = N'SQL#'
- AND [Value] = 'EXTERNAL_ACCESS'
- )
- )
- BEGIN
- EXEC(N'
- INSERT INTO #SQLsharpOptions ([Option], [Value])
- SELECT module.SplitVal AS [Option], ''EXTERNAL_ACCESS'' AS [Value]
- FROM [' + @CurrentSQLsharpSchema + N'].String_Split(N''SQL#.Network,SQL#.FileSystem,SQL#.DB'', N'','', 1) module
- LEFT JOIN #SQLsharpOptions tmp
- ON tmp.[Option] = module.SplitVal
- WHERE tmp.[Option] IS NULL;
-
- ');
- END;
-
-
- DECLARE @Option NVARCHAR(50),
- @Value VARCHAR(50);
-
- DECLARE opt_cur CURSOR STATIC LOCAL FOR
- SELECT sso.[Option], sso.[Value]
- FROM #SQLsharpOptions sso
- INNER JOIN sys.assemblies sa
- ON sa.[name] = sso.[Option] --COLLATE database_default
- WHERE sso.[Option] LIKE N'SQL#%'
- AND sso.[Value] <> 'SAFE'
- ORDER BY sa.[name];
-
- OPEN opt_cur;
-
- FETCH NEXT
- FROM opt_cur
- INTO @Option, @Value;
-
- WHILE (@@FETCH_STATUS = 0)
- BEGIN
- RAISERROR(N'Resetting [%s] permissions to be: %s ...', 0, 0, @Option, @Value) WITH NOWAIT;
- EXEC (N'ALTER ASSEMBLY [' + @Option + N'] WITH PERMISSION_SET = ' + @Value);
-
- FETCH NEXT
- FROM opt_cur
- INTO @Option, @Value;
- END;
-
- CLOSE opt_cur;
- DEALLOCATE opt_cur;
- END;
------------------------------------
-
-
- PRINT '';
- PRINT 'SQL# Installed!!';
- PRINT '';
-
- COMMIT TRAN;
-
-
-END TRY
-BEGIN CATCH
-
- IF (@@TRANCOUNT > 0)
- BEGIN
- PRINT 'Rolling back the TRANSACTION...';
- ROLLBACK TRAN;
- PRINT 'Done.';
- END;
-
- IF (CURSOR_STATUS('local', 'opt_cur') >= 0)
- BEGIN
- PRINT 'Closing / Deallocating the CURSOR...';
- CLOSE opt_cur;
- DEALLOCATE opt_cur;
- PRINT 'Done.';
- END;
-
- DECLARE @ErrorMessage NVARCHAR(MAX);
- SET @ErrorMessage = N'Line ' + CONVERT(NVARCHAR(20), ERROR_LINE())
- + N', Msg ' + CONVERT(NVARCHAR(20), ERROR_NUMBER())
- + N': ' + ERROR_MESSAGE();
- RAISERROR(@ErrorMessage, 16, 1);
- PRINT '';
- PRINT '';
- RAISERROR(N'SQL# did NOT install successfully. Please see error messages above.', 16, 1);
- RETURN;
-
-END CATCH;
-
-
--- If this is a BETA copy, display the Expiration Date.
-IF (OBJECT_ID('SQL#.SQLsharp_ExpirationDate') IS NOT NULL)
-BEGIN
- PRINT '';
- EXEC (N'PRINT N''This BETA of SQL# version '' + [' + @SQLsharpSchema + N'].[SQLsharp_Version]() + N'' expires on: '' + CONVERT(NVARCHAR(30), [' + @SQLsharpSchema + N'].[SQLsharp_ExpirationDate](), 121);');
- PRINT '';
- PRINT '';
-END
-GO
-
--- Make sure that the transaction is cleaned up, just in case an error aborts the batch
-IF (@@TRANCOUNT > 0)
-BEGIN;
- PRINT 'For some reason the CATCH block was skipped but the TRANSACTION is still open; rolling back...';
- ROLLBACK TRAN;
- PRINT 'Done.';
-END;
-GO
-
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 00000000..4db847e1
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,111 @@
+# Contributing to the SQL Server Kit
+Please take a moment to review this document in order to make the contribution
+process easy and effective for everyone involved.
+
+Following these guidelines will help us get back to you more quickly, and will
+show that you care about making MySQLTuner better just like we do. In return, we'll
+do our best to respond to your issue or pull request as soon as possible with
+the same respect.
+
+_**Please Note:** These guidelines are adapted from [@necolas](https://github.com/necolas)'s
+[issue-guidelines](https://github.com/necolas/issue-guidelines) and serve as
+an excellent starting point for contributing to any open source project._
+
+
+## Feature requests
+
+
+Feature requests are welcome. But take a moment to find out whether your idea
+fits with the scope and aims of the project. It's up to *you* to make a strong
+case to convince the project's developers of the merits of this feature. Please
+provide as much detail and context as possible.
+
+Building something great means choosing features carefully especially because it
+is much, much easier to add features than it is to take them away. Additions
+ will be evaluated on a combination of scope (how well it fits into the
+project), maintenance burden and general usefulness.
+
+Creating something great often means saying no to seemingly good ideas. Don't
+despair if your feature request isn't accepted, take action! Fork the
+repository, build your idea and share it with others. We released this project under
+the [LICENSE] for this purpose precisely. Open source works best when smart
+and dedicated people riff off of each others' ideas to make even greater things.
+
+
+## Pull requests
+
+
+Good pull requests — patches, improvements, new features — are a fantastic help.
+They should remain focused in scope and avoid containing unrelated commits.
+
+**Please ask first** before embarking on any significant pull request (e.g.
+implementing features, refactoring code, porting to a different language),
+otherwise you risk spending a lot of time working on something that the
+project's developers might not want to merge into the project. You can solicit
+feedback and opinions in an open feature request thread or create a new one.
+
+Please use the [git flow for pull requests](#git-flow) and follow SQL Server KIT
+[code conventions](#code-conventions) before submitting your work.
+
+
+## Git Flow for pull requests
+
+
+1. [Fork] the project, clone your fork, and configure the remotes:
+
+ ```bash
+ # Clone your fork of the repo into the current directory
+ git clone git@github.com:/sqlserver-kit.git
+ # Navigate to the newly cloned directory
+ cd sqlserver-kit
+ # Assign the original repo to a remote called "upstream"
+ git remote add upstream https://github.com/ktaranov/sqlserver-kit
+ ```
+
+2. If you cloned a while ago, get the latest changes from upstream:
+
+ ```bash
+ git checkout master
+ git pull upstream master
+ ```
+
+3. Create a new topic branch (off the main project development branch) to
+ contain your feature, change, or fix:
+
+ ```bash
+ git checkout -b
+ ```
+
+4. Commit your changes in logical chunks. Please adhere to these [git commit message guidelines]
+ or your code is unlikely be merged into the main project. Use Git's [interactive rebase]
+ feature to tidy up your commits before making them public.
+
+5. Locally merge (or rebase) the upstream development branch into your topic branch:
+
+ ```bash
+ git pull [--rebase] upstream master
+ ```
+
+6. Push your topic branch up to your fork:
+
+ ```bash
+ git push origin
+ ```
+
+7. [Open a Pull Request] with a clear title and description.
+
+**IMPORTANT**: By submitting a patch, you agree to allow the project owner to license your work under the MIT [LICENSE]
+
+
+## SQL Server KIT Code Conventions
+
+
+Check [code convention]
+
+
+[Fork]:https://help.github.com/articles/fork-a-repo/
+[git commit message guidelines]:http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html
+[interactive rebase]:https://help.github.com/articles/about-git-rebase/
+[Open a Pull Request]:https://help.github.com/articles/about-pull-requests/
+[LICENSE]:https://github.com/ktaranov/sqlserver-kit/blob/master/LICENSE.md
+[code convention]:https://github.com/ktaranov/sqlserver-kit/blob/master/SQL%20Server%20Name%20Convention%20and%20T-SQL%20Programming%20Style.md
diff --git a/Errors/Backup/Be aware of 701 error if you use memory optimized table variable in a loop.maff b/Errors/Backup/Be aware of 701 error if you use memory optimized table variable in a loop.maff
new file mode 100644
index 00000000..2a3d673a
Binary files /dev/null and b/Errors/Backup/Be aware of 701 error if you use memory optimized table variable in a loop.maff differ
diff --git "a/Errors/Backup/CREATE DATABASE \342\200\223 I\342\200\231ve not seen that before..maff" "b/Errors/Backup/CREATE DATABASE \342\200\223 I\342\200\231ve not seen that before..maff"
new file mode 100644
index 00000000..57e6dc77
Binary files /dev/null and "b/Errors/Backup/CREATE DATABASE \342\200\223 I\342\200\231ve not seen that before..maff" differ
diff --git a/Errors/Backup/Case study Troubleshooting Doomed Transactions.maff b/Errors/Backup/Case study Troubleshooting Doomed Transactions.maff
new file mode 100644
index 00000000..9fdfd481
Binary files /dev/null and b/Errors/Backup/Case study Troubleshooting Doomed Transactions.maff differ
diff --git a/Errors/Backup/Compressed backup errors and TF 3042.maff b/Errors/Backup/Compressed backup errors and TF 3042.maff
new file mode 100644
index 00000000..b4048a77
Binary files /dev/null and b/Errors/Backup/Compressed backup errors and TF 3042.maff differ
diff --git a/Errors/Backup/Nuance of datetime data type in SQL Server.maff b/Errors/Backup/Nuance of datetime data type in SQL Server.maff
new file mode 100644
index 00000000..c845e20a
Binary files /dev/null and b/Errors/Backup/Nuance of datetime data type in SQL Server.maff differ
diff --git a/Errors/Backup/SQL SERVER - Disabling 15000 Partitions (15k).maff b/Errors/Backup/SQL SERVER - Disabling 15000 Partitions (15k).maff
new file mode 100644
index 00000000..acad7d3a
Binary files /dev/null and b/Errors/Backup/SQL SERVER - Disabling 15000 Partitions (15k).maff differ
diff --git a/Errors/Backup/SQL SERVER - FIX Error Msg 8672 - The MERGE Statement Attempted to UPDATE or DELETE the Same Row More Than Once.maff b/Errors/Backup/SQL SERVER - FIX Error Msg 8672 - The MERGE Statement Attempted to UPDATE or DELETE the Same Row More Than Once.maff
new file mode 100644
index 00000000..8d22d2e7
Binary files /dev/null and b/Errors/Backup/SQL SERVER - FIX Error Msg 8672 - The MERGE Statement Attempted to UPDATE or DELETE the Same Row More Than Once.maff differ
diff --git a/Errors/Backup/SQL SERVER - FIX Error 913, Severity 16 - Could Not Find Database ID 3. Database May Not be Activated Yet or May be in Transition.maff b/Errors/Backup/SQL SERVER - FIX Error 913, Severity 16 - Could Not Find Database ID 3. Database May Not be Activated Yet or May be in Transition.maff
new file mode 100644
index 00000000..cd77e956
Binary files /dev/null and b/Errors/Backup/SQL SERVER - FIX Error 913, Severity 16 - Could Not Find Database ID 3. Database May Not be Activated Yet or May be in Transition.maff differ
diff --git a/Errors/Backup/SQL SERVER - Logon Failure The User has not Been Granted the Requested Logon Type at This Computer.maff b/Errors/Backup/SQL SERVER - Logon Failure The User has not Been Granted the Requested Logon Type at This Computer.maff
new file mode 100644
index 00000000..942d63f0
Binary files /dev/null and b/Errors/Backup/SQL SERVER - Logon Failure The User has not Been Granted the Requested Logon Type at This Computer.maff differ
diff --git a/Errors/Backup/SQL Server 2016 Online ALTER COLUMN Operation.maff b/Errors/Backup/SQL Server 2016 Online ALTER COLUMN Operation.maff
new file mode 100644
index 00000000..cfb42900
Binary files /dev/null and b/Errors/Backup/SQL Server 2016 Online ALTER COLUMN Operation.maff differ
diff --git "a/Errors/Backup/Unable to restore a backup \342\200\223 Msg 3241.maff" "b/Errors/Backup/Unable to restore a backup \342\200\223 Msg 3241.maff"
new file mode 100644
index 00000000..293d82cf
Binary files /dev/null and "b/Errors/Backup/Unable to restore a backup \342\200\223 Msg 3241.maff" differ
diff --git a/Errors/Backup/Who owns your availability groups.maff b/Errors/Backup/Who owns your availability groups.maff
new file mode 100644
index 00000000..68ffb564
Binary files /dev/null and b/Errors/Backup/Who owns your availability groups.maff differ
diff --git a/Errors/README.md b/Errors/README.md
index 67096dd4..c29b0af1 100644
--- a/Errors/README.md
+++ b/Errors/README.md
@@ -3,18 +3,217 @@
## Useful links
- [System Error Messages](https://technet.microsoft.com/en-us/library/cc645603%28v=sql.105%29.aspx)
- - [Database Engine Error Severities](https://msdn.microsoft.com/en-us/library/ms164086.aspx)
- - [Integration Services Error and Message Reference](https://msdn.microsoft.com/en-us/library/ms345164.aspx)
- - [View and Read SQL Server Setup Log Files](https://msdn.microsoft.com/en-us/library/ms143702.aspx)
- - [Troubleshoot the SQL Server Utility](https://msdn.microsoft.com/en-us/library/ee210592.aspx)
+ - [Database Engine Error Severities](https://docs.microsoft.com/en-us/sql/relational-databases/errors-events/database-engine-error-severities)
+ - [Integration Services Error and Message Reference](https://docs.microsoft.com/en-us/sql/integration-services/integration-services-error-and-message-reference)
+ - [View and Read SQL Server Setup Log Files](https://docs.microsoft.com/en-us/sql/database-engine/install-windows/view-and-read-sql-server-setup-log-files)
+ - [Troubleshoot the SQL Server Utility](https://docs.microsoft.com/en-us/sql/database-engine/troubleshoot-the-sql-server-utility)
+ - [Common Issues: Licensing Errors](http://blogs.sqlsentry.com/georgeboakye/common-issues-licensing-errors/)
+ - [SQL Server 2016 Distributed Replay Errors](https://www.sqlskills.com/blogs/jonathan/sql-server-2016-distributed-replay-errors/)
+ - [The Instance ID MSSQLSERVER Is Already In Use](http://www.sqlservercentral.com/articles/MSSQLSERVER/161398/)
+ - [SQL Server: Detach/Attach Gotchas!](https://sqljana.wordpress.com/2018/04/08/sql-server-detach-attach-gotchas/)
-## SQL Server Common Errors
+## SQL Server All Errors List
-| Error Code | Description | Article |
-|------------|---------------------------------------------------------------------|----------------------------------------|
-| Msg 3153 | The backup set holds a backup of a database other than the existing | [Database Restore Fails with Msg 3154] |
-| Msg 3013 | RESTORE DATABASE is terminating abnormally | |
+```sql
+SELECT message_id, severity, text
+ FROM sys.messages
+ WHERE language_id = 1033; -- assuming US English
+```
-[Database Restore Fails with Msg 3154]://www.patrickkeisler.com/2016/05/database-restore-fails-with-msg-3154.html
+## Levels of Severity
+
+| Severity level | Description |
+|----------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| 0-9 | Informational messages that return status information or report errors that are not severe. The Database Engine does not raise system errors with severities of 0 through 9. |
+| 10 | Informational messages that return status information or report errors that are not severe. For compatibility reasons, the Database Engine converts severity 10 to severity 0 before returning the error information to the calling application. |
+| 11-16 | Indicate errors that can be corrected by the user. |
+| 11 | Indicates that the given object or entity does not exist. |
+| 12 | A special severity for queries that do not use locking because of special query hints. In some cases, read operations performed by these statements could result in inconsistent data, since locks are not taken to guarantee consistency. |
+| 13 | Indicates transaction deadlock errors. |
+| 14 | Indicates security-related errors, such as permission denied. |
+| 15 | Indicates syntax errors in the Transact-SQL command. |
+| 16 | Indicates general errors that can be corrected by the user. |
+| 17-19 | Indicate software errors that cannot be corrected by the user. Inform your system administrator of the problem. |
+| 17 | Indicates that the statement caused SQL Server to run out of resources (such as memory, locks, or disk space for the database) or to exceed some limit set by the system administrator. |
+| 18 | Indicates a problem in the Database Engine software, but the statement completes execution, and the connection to the instance of the Database Engine is maintained. The system administrator should be informed every time a message with a severity level of 18 occurs. |
+| 19 | Indicates that a nonconfigurable Database Engine limit has been exceeded and the current batch process has been terminated. Error messages with a severity level of 19 or higher stop the execution of the current batch. Severity level 19 errors are rare and must be corrected by the system administrator or your primary support provider. Contact your system administrator when a message with a severity level 19 is raised. Error messages with a severity level from 19 through 25 are written to the error log. |
+| 20-24 | Indicate system problems and are fatal errors, which means that the Database Engine task that is executing a statement or batch is no longer running. The task records information about what occurred and then terminates. In most cases, the application connection to the instance of the Database Engine may also terminate. If this happens, depending on the problem, the application might not be able to reconnect. Error messages in this range can affect all of the processes accessing data in the same database and may indicate that a database or object is damaged. Error messages with a severity level from 19 through 24 are written to the error log. |
+| 20 | Indicates that a statement has encountered a problem. Because the problem has affected only the current task, it is unlikely that the database itself has been damaged. |
+| 21 | Indicates that a problem has been encountered that affects all tasks in the current database, but it is unlikely that the database itself has been damaged. |
+| 22 | Indicates that the table or index specified in the message has been damaged by a software or hardware problem. Severity level 22 errors occur rarely. If one occurs, run DBCC CHECKDB to determine whether other objects in the database are also damaged. The problem might be in the buffer cache only and not on the disk itself. If so, restarting the instance of the Database Engine corrects the problem. To continue working, you must reconnect to the instance of the Database Engine; otherwise, use DBCC to repair the problem. In some cases, you may have to restore the database. If restarting the instance of the Database Engine does not correct the problem, then the problem is on the disk. Sometimes destroying the object specified in the error message can solve the problem. For example, if the message reports that the instance of the Database Engine has found a row with a length of 0 in a nonclustered index, delete the index and rebuild it. |
+| 23 | Indicates that the integrity of the entire database is in question because of a hardware or software problem. Severity level 23 errors occur rarely. If one occurs, run DBCC CHECKDB to determine the extent of the damage. The problem might be in the cache only and not on the disk itself. If so, restarting the instance of the Database Engine corrects the problem. To continue working, you must reconnect to the instance of the Database Engine; otherwise, use DBCC to repair the problem. In some cases, you may have to restore the database. |
+| 24 | Indicates a media failure. The system administrator may have to restore the database. You may also have to call your hardware vendor. |
+
+
+## SQL Server Errors
+
+| message_id | Description | Article |
+|-----------:|----------------------------------------------------------------------------------------------------------|--------------------------------------|
+| ? | You may see “out of user memory quota” message in errorlog when you use In-Memory OLTP feature … | [Out of user memory quota][7] |
+| ? | Logon Failure: The User has not Been Granted. The operating system returned the error ????? while … | [Compressed backup errors][8] |
+| - | The MSSQLSERVER service was unable to log on as SQLAuthority\SQLFarmService with the currently c … | [The User has not Been Granted][9] |
+| 0 | A server error occurred on current command. The results, if any, should be discarded. | [Who owns your availability groups?] |
+| 102 | Incorrect syntax near '%.*ls'. | [102_link1] |
+| 145 | ORDER BY items must appear in the select list if SELECT DISTINCT is specified. | [145_link1][27] |
+| 156 | Incorrect syntax near the keyword 'ORDER'. | [156_link1][23] |
+| 207 | Invalid column name '%.*ls'. | [207_link1] |
+| 213 | Column name or number of supplied values does not match table definition. | [213_link1][3] |
+| 229 | The %ls permission was denied on the object '%.*ls', database '%.*ls', schema '%.*ls'. | [229_link1][12] |
+| 264 | The column name '%.*ls' is specified more than once in the SET clause or column list of an INSERT … | [264_link1][25] |
+| 297 | The user does not have permission to perform this action. | [297_link1][12] |
+| 352 | The table-valued parameter "%.*ls" must be declared with the READONLY option. | [352_link1][22] |
+| 535 | The datediff function resulted in an overflow. The number of dateparts separating two date/time | [535_link1] |
+| 596 | Cannot continue execution because the session is in the kill state. | [596_link1] |
+| 650 | You can only specify the READPAST lock in the READ COMMITTED or REPEATABLE READ isolation levels. | [650_link1] |
+| 657 | Could not disable support for increased partitions in database … | [657_link1] |
+| 666 | The maximum system-generated unique value for a duplicate group was exceeded for index with … | [666_link1] |
+| 701 | There is insufficient system memory in resource pool '%ls' to run this query. … | [701_link1],[701_link2][11] |
+| 824 | SQL Server detected a logical consistency-based I/O error … | [824_link1],[824_link2],[KB2152734] |
+| 825 | The operating system returned error %ls to SQL Server. It failed creating event for a %S_MSG at … | [825_link1] |
+| 913 | Could Not Find Database %d. Database May Not be Activated Yet or May be in Transition … | [913_link1] |
+| 922 | Database '%.*ls' is being recovered. Waiting until recovery is finished. | [922_link1] |
+| 1701 | Creating or altering table %ls failed because the minimum row size would be 8061, including 10 b … | [1701_link1] |
+| 1807 | Could not obtain exclusive lock on database ‘model’. Retry the operation later. … | [1807_link1] |
+| 1904 | The statistics on table has 65 columns in the key list … | [1904_link1] |
+| 1908 | Column '%.*ls' is partitioning column of the index '%.*ls'. Partition columns for a unique index … | [1908_link1][18] |
+| 3101 | Exclusive access could not be obtained because the database is in use. … | [3101_link1] |
+| 3154 | The backup set holds a backup of a database other than the existing … | [3154_link1] |
+| 3241 | The media family on device '%ls' is incorrectly formed. SQL Server cannot process this media fam … | [3241_link1] |
+| 3314 | During undoing of a logged operation in database '%.*ls', an error occurred at log record ID %S … | [3314_link1] |
+| 3634 | The operating system returned the error '%ls' while attempting '%ls' on '%ls'. … | [3634_link1] |
+| 3743 | The database '%.*ls' is enabled for database mirroring. Database mirroring must be removed befor … | [3743_link1] |
+| 3930 | The current transaction cannot be committed and cannot support operations that write to the log … | [3930_link1] |
+| 4064 | Cannot open user default database. Login failed.Login failed. … | [4064_link1] |
+| 4189 | Cannot convert to text/ntext or collate to '%.*ls' because these legacy LOB types do not support UTF-8 … | [4189_link1][21] |
+| 4629 | Permissions on server scoped catalog views or system stored procedures or extended stored … | [4629_link1][12] |
+| 4922 | ALTER TABLE ALTER COLUMN Address failed because one or more objects access this column. … | [4922_link1] |
+| 4934 | Computed column '%.*ls' in table '%.*ls' cannot be persisted because the column does user or … | [4934_link1] |
+| 4947 | ALTER TABLE SWITCH statement failed. There is no identical index in source table '%.*ls' for the … | [4947_link1][18] |
+| 5004 | To use ALTER DATABASE, the database must be in a writable state in which a checkpoint can be executed. | [5004_link1] |
+| 5120 | Unable to open the physical file ... Operating system error 5: "5(Access is denied.)" … | [SQL SERVER - FIX Error 5120] |
+| 5123 | CREATE FILE encountered operating system error "%ls"(The system cannot find the path specified.) … | [5123_link1], [5123_link2] |
+| 5171 | %.*ls is not a primary database file. | [5171_link1][29] |
+| 5172 | The header for file '%ls' is not a valid database file header. The %ls property is incorrect. | [5172_link1][29] |
+| 6335 | XML datatype instance has too many levels of nested nodes. Maximum allowed depth is 128 levels. | [6335_link1] |
+| 6401 | Cannot roll back %.*ls. No transaction or savepoint of that name was found. | [6401_link1][4] |
+| 7344 | The OLE DB provider "%ls" for linked server "%ls" could not %ls table "%ls" because of column … | [7344_link1][3] |
+| 7357 | Cannot process the object "%ls". The OLE DB provider "%ls" for linked server "%ls" indicates that … | [7357_link1][2], [7357_link2][2] |
+| 7391 | The operation could not be performed because OLE DB provider "%ls" for linked server "%ls" ... … | [7391_link2][2] |
+| 7719 | CREATE/ALTER partition function failed as only maximum of 1000 partitions can be created. … | [657_link1] |
+| 8115 | Arithmetic overflow error converting %ls to data type %ls. | [8115_link1][24] |
+| 8180 | Statement(s) could not be prepared. | [8180_link1][28] |
+| 8127 | Column "%.*ls.%.*ls" is invalid in the ORDER BY clause because it is not contained in either an … | [8127_link1][27] |
+| 8624 | Internal Query Processor Error: The query processor could not produce a query plan. | [8624_link1] |
+| 8651 |Could not perform the operation because the requested memory grant was not available in resource … | [8651_link1] |
+| 8672 | The MERGE statement attempted to UPDATE or DELETE the same row more than once... … | [8672_link1] |
+| 8909 | Table error: Object ID %d, index ID %d, partition ID %I64d, alloc unit ID %I64d (type %.*ls), pa … | [8909_link1] |
+| 8921 | Check terminated. A failure was detected while collecting facts. Possibly tempdb out of space or … | [8921_link1] |
+| 8948 | Database error: Page %S_PGID is marked with the wrong type in PFS page %S_PGID. PFS status 0x%x … | [8948_link1][20] |
+| 9001 | The log for database '%.*ls' is not available. Check the operating system error log for related … | [9001_link1][16] |
+| 9002 | The transaction log for database '%ls' is full due to '%ls'. … | [9002_link1][17],[9002_link2][19] |
+| 13570 | The use of replication is not supported with system-versioned temporal table '%s' … | [13570_link1] |
+| 15002 | The procedure 'sys.sp_dbcmptlevel' cannot be executed within a transaction. … | [15002_link1] |
+| 15136 | The database principal is set as the execution context of one or more procedures, functions, … | [15136_link1] |
+| 15190 | There are still remote logins or linked logins for the server '%s'. | [15190_link1] |
+| 15199 | The current security context cannot be reverted. Please switch to the original database where … | [15199_link1][1] |
+| 15406 | Cannot execute as the server principal because the principal "%.*ls" does not exist, this type of … | [15406_link1][1] |
+| 17182 | TDSSNIClient initialization failed with error 0x%lx, status code 0x%lx. Reason: %S_MSG %.*ls | [17182_link1][15] |
+| 17190 | Initializing the FallBack certificate failed with error code: %d, state: %d, error number: %d. … | [17190_link1] |
+| 17300 | SQL Server was unable to run a new system task, either because there is insufficient memory or the … | [17300_link1] |
+| 18272 | During restore restart, an I/O error occurred on checkpoint file '%s' (operating system error %s … | [18272_link1] |
+| 18357 | Reason: An attempt to login using SQL authentication failed. Server is configured for Integrated … | [18357_link1][5] |
+| 18452 | Login failed. The login is from an untrusted domain and cannot be used with Windows authenticati … | [18452_link1] |
+| 18456 | Login failed for user '%.*ls'.%.*ls%.*ls | [18456_link1] |
+| 25713 | The value specified for %S_MSG, "%.*ls", %S_MSG, "%.*ls", is invalid. | [25713_link1],[25713_link2] |
+| 26023 | Server TCP provider failed to listen on [ %s <%s> %d]. Tcp port is already in use. | [26023_link1][13] |
+| 33111 | Cannot find server %S_MSG with thumbprint '%.*ls'. | [33111_link1] |
+| 33206 | SQL Server Audit failed to create the audit file '%s'. Make sure that the disk is not full and … | [33206_link1][10] |
+| 35250 | The connection to the primary replica is not active. The command cannot be processed. | [35250_link1] |
+| 39004 | A '%s' script error occurred during execution of 'sp_execute_external_script' with HRESULT 0x%x. | [39004_link1][14] |
+
+[1]:https://sqlstudies.com/2018/05/16/the-trials-and-tribulations-of-reverting-from-impersonation/
+[2]:https://sqlpowershell.wordpress.com/2016/11/09/sql-server-discuss-executesql-at-linkedserver/
+[3]:https://sqlstudies.com/2018/06/14/the-identity-column-the-insert-and-the-linked-server/
+[4]:http://www.sqlservercentral.com/blogs/sql-server-overview/2018/05/07/know-about-sql-server-error-6401/
+[5]:https://sqlstudies.com/2018/06/18/misleading-errors-server-is-configured-for-windows-authentication-only-but-its-not/
+[6]:https://sqlstudies.com/2018/05/10/each-session-should-be-able-to-have-its-own-temp-table-but-there-can-be-problems/
+[7]:https://blogs.msdn.microsoft.com/psssql/2017/06/07/you-may-see-out-of-user-memory-quota-message-in-errorlog-when-you-use-in-memory-oltp-feature/
+[8]:https://sqlstudies.com/2017/03/16/compressed-backup-errors-and-tf-3042/
+[9]:https://blog.sqlauthority.com/2017/04/14/sql-server-logon-failure-user-not-granted-requested-logon-type-computer/
+[10]:http://nebraskasql.blogspot.com/2018/03/error-33206-sql-server-audit-failed-to.html
+[11]:http://nebraskasql.blogspot.com/2014/03/error-701-insufficient-system-memory.html
+[12]:http://www.nielsberglund.com/2018/06/24/sp-execute-external-script-and-permissions/
+[13]:https://blogs.msdn.microsoft.com/psssql/2018/07/26/july-10-2018-windows-updates-cause-sql-startup-issues-due-to-tcp-port-is-already-in-use-errors/
+[14]:https://36chambers.wordpress.com/2017/04/27/error-0x80004005-in-sql-server-r-services/
+[15]:https://blogs.msdn.microsoft.com/sql_pfe_blog/2016/10/05/tcp-port-is-already-in-use/
+[16]:http://nedotter.com/archive/2018/07/dangerous-moves-setting-max-size-for-in-memory-oltp-containers/
+[17]:https://docs.microsoft.com/en-us/sql/relational-databases/logs/troubleshoot-a-full-transaction-log-sql-server-error-9002
+[18]:https://dbafromthecold.com/2018/02/21/indexing-and-partitioning/
+[19]:http://nebraskasql.blogspot.com/2018/08/the-mystery-of-exploding-t-log.html
+[20]:https://www.sqlskills.com/blogs/paul/pfs-corruption-after-upgrading-from-sql-server-2014/
+[21]:https://sqlquantumleap.com/2018/09/28/native-utf-8-support-in-sql-server-2019-savior-false-prophet-or-both/
+[22]:https://sqlstudies.com/2018/09/13/using-table-valued-parameters-with-sp_executesql/
+[23]:http://sqlstudies.com/2018/09/19/you-cant-delete-top-x-with-an-order-by/
+[24]:https://www.brentozar.com/archive/2018/10/sum-avg-and-arithmetic-overflow/
+[25]:https://www.sqltheater.com/blog/using-the-same-column-twice-in-an-update-statement/
+[26]:http://jasonbrimhall.info/2018/12/14/synonyms-in-sql-server-good-and-bad/
+[27]:https://www.brentozar.com/archive/2018/08/a-common-query-error/
+[28]:https://blog.sqlauthority.com/2019/01/14/sql-server-fix-msg-8180-statements-could-not-be-prepared-deferred-prepare-could-not-be-completed/
+[29]:https://blog.sqlauthority.com/2018/08/29/sql-server-unable-to-attach-database-files-the-pageaudit-property-is-incorrect-ransomware-attack/
+
+[Who owns your availability groups?]:http://www.cjsommer.com/2016-10-20-who-owns-your-availability-groups/
+[102_link1]:http://jasonbrimhall.info/2017/11/17/incorrect-syntax-what/
+[207_link1]:http://www.sqlservercentral.com/questions/IDENT_CURRENT/165581/
+[535_link1]:http://www.sqlservercentral.com/articles/T-SQL/153921/
+[596_link1]:http://sql-sasquatch.blogspot.ru/2017/09/sqlserver-just-how-minimal-can-that.html
+[650_link1]:https://sqlundercover.com/2019/02/07/alter-table-fails-on-replicated-tables-with-isolation-level-serializable-or-read-uncommitted-on-sql2012-and-earlier/
+[657_link1]:https://blog.sqlauthority.com/2016/05/20/sql-server-disabling-15000-15k-partitions/
+[666_link1]:https://blogs.msdn.microsoft.com/psssql/2018/02/16/uniqueifier-considerations-and-error-666/
+[701_link1]:https://blogs.msdn.microsoft.com/psssql/2017/02/22/be-aware-of-701-error-if-you-use-memory-optimized-table-variable-in-a-loop/
+[824_link1]:http://www.sqlservercentral.com/blogs/sql-server-citation-sql-blog-by-hemantgiri-s-goswami-sql-mvp/2016/08/23/resolve-microsoft-sql-server-error-code-824/
+[824_link2]:https://stevestedman.com/2018/08/checkdb-error-msg-824-level-24/
+[825_link1]:https://www.sqlskills.com/blogs/paul/a-little-known-sign-of-impending-doom-error-825/
+[913_link1]:https://blog.sqlauthority.com/2017/04/10/sql-server-fix-error-913-severity-16-not-find-database-id-3-database-may-not-activated-yet-may-transition-sql-service/
+[922_link1]:https://blog.sqlauthority.com/2018/08/27/sql-server-how-to-drop-or-delete-suspect-database/
+[KB2152734]:https://support.microsoft.com/help/2152734
+[1701_link1]:http://www.sqlservercentral.com/questions/163450/
+[1807_link1]:http://www.sqlservercentral.com/blogs/martin_catherall/2017/01/22/create-database-ive-not-seen-that-before/
+[1904_link1]:http://blog.sqlauthority.com/2016/10/27/sql-server-fix-error-msg-1904-statistics-table-65-columns-key-list/
+[KB290787]:https://support.microsoft.com/help/290787
+[2709_link1]:https://www.brentozar.com/archive/2018/04/an-odd-case-of-blocking/
+[3041_link1]:https://www.sqlservercentral.com/Forums/Topic1179720-1550-1.aspx
+[3101_link1]:https://sqlstudies.com/2017/11/27/closing-all-of-the-connections-to-a-database/
+[3154_link1]:http://www.patrickkeisler.com/2016/05/database-restore-fails-with-msg-3154.html
+[3241_link1]:https://blogs.msdn.microsoft.com/psssql/2017/04/12/unable-to-restore-a-backup-msg-3241/
+[3314_link1]:https://www.sqlskills.com/blogs/paul/20122014-bug-that-can-cause-database-or-server-to-go-offline/
+[3634_link1]:https://sqlundercover.com/2017/08/29/restores-using-invalid-backup-default-locations/
+[3743_link1]:https://blog.sqlauthority.com/2017/12/05/sql-server-msg-3743-database-enabled-database-mirroring-database-mirroring-must-removed-drop-database/
+[3930_link1]:http://michaeljswart.com/2017/01/case-study-troubleshooting-doomed-transactions/
+[4064_link1]:https://blog.sqlauthority.com/2008/11/04/sql-server-fix-error-4064-cannot-open-user-default-database-login-failed-login-failed-for-user/
+[4922_link1]:https://www.mssqltips.com/sqlservertip/4749/sql-server-2016-online-alter-column-operation/
+[4934_link1]:https://www.brentozar.com/archive/2018/04/an-odd-case-of-blocking/
+[SQL SERVER - FIX Error 5120]:http://blog.sqlauthority.com/2016/10/26/sql-server-fix-error-5120-database-read-mode-attaching-files/
+[5004_link1]:https://www.scarydba.com/2019/02/11/query-store-and-a-read_only-database/
+[5123_link1]:https://blogs.msdn.microsoft.com/sql_pfe_blog/2016/11/10/tempdb-misconfiguration-when-sql-server-fails-to-create-a-secondary-data-file/
+[5123_link2]:https://blog.sqlauthority.com/2017/09/21/sql-server-fix-msg-5123-level-16-create-file-encountered-operating-system-error-5/
+[6335_link1]:https://www.brentozar.com/archive/2017/06/biggest-query-plans-dont-show-dmvs/
+[8624_link1]:http://www.sqlservercentral.com/articles/Indexing/149879/
+[8651_link1]:https://blobeater.blog/2017/05/18/setting-sql-server-max-memory-dangerously-low/
+[8672_link1]:https://blog.sqlauthority.com/2017/03/13/sql-server-fix-error-msg-8672-merge-statement-attempted-update-delete-row/
+[8909_link1]:https://www.sqlskills.com/blogs/paul/disaster-recovery-101-object-id-0-index-id-1-partition-id-0/
+[8921_link1]:https://www.sqlskills.com/blogs/paul/disaster-recovery-101-fixing-a-broken-system-table-page/
+[13570_link1]:https://www.mssqltips.com/sqlservertip/5281/sql-server-replication-for-temporal-tables/
+[15002_link1]:https://blogs.msdn.microsoft.com/luti/2017/05/17/sql-server-offline-after-applying-service-pack/
+[15136_link1]:https://blogs.msdn.microsoft.com/psssql/2016/11/15/unable-to-drop-a-user-in-a-database/
+[15190_link1]:https://blog.sqlauthority.com/2018/12/15/sql-server-fix-msg-15190-there-are-still-remote-logins-or-linked-logins-for-the-server/
+[17190_link1]:https://www.sqlskills.com/blogs/jonathan/using-group-managed-service-accounts-for-sql-server/
+[17300_link1]:https://blog.sqlauthority.com/2018/08/16/sql-server-error-17300-the-error-is-printed-in-terse-mode-because-there-was-error-during-formatting/
+[18272_link1]:https://sqlundercover.com/2017/08/29/restores-using-invalid-backup-default-locations/
+[18452_link1]:http://jasonbrimhall.info/2016/11/08/login-from-an-untrusted-domain-back-to-basics/
+[18456_link1]:https://sqlstudies.com/2017/01/12/why-wont-my-sql-logins-work/
+[25713_link1]:https://sqlquantumleap.com/2018/01/22/server-audit-mystery-filtering-class_type-gets-error-msg-25713/
+[25713_link2]:https://sqlquantumleap.com/2018/01/30/server-audit-mystery-filtering-action_id-gets-error-msg-25713/
+[33111_link1]:https://sqlundercover.com/2018/04/04/encrypting-sql-server-database-backups/
+[35250_link1]:https://blog.sqlauthority.com/2017/05/18/sql-server-fix-msg-35250-level-16-state-7-connection-primary-replica-not-active-command-cannot-processed/
diff --git a/Extended_Events/APC_Reverted_plan_corrections.sql b/Extended_Events/APC_Reverted_plan_corrections.sql
new file mode 100644
index 00000000..d3b09c24
--- /dev/null
+++ b/Extended_Events/APC_Reverted_plan_corrections.sql
@@ -0,0 +1,23 @@
+/*
+Original link: https://blogs.msdn.microsoft.com/sqlserverstorageengine/2017/07/18/monitoring-automatic-tuning-actions-using-xevents/
+Author: Jovan Popovic
+*/
+
+IF SERVERPROPERTY('ProductMajorVersion') < 14
+RAISERROR ('Your version of SQL Server is not supported! This extended event works only for version >= 2017 RC1', 20, 1) WITH LOG;
+
+IF EXISTS (SELECT 1 FROM sys.server_event_sessions WHERE name = 'APC_Reverted_plan_corrections')
+ DROP EVENT SESSION [APC_Reverted_plan_corrections] ON SERVER;
+GO
+
+CREATE EVENT SESSION [APC_Reverted_plan_corrections] ON SERVER
+ADD EVENT qds.automatic_tuning_plan_regression_verification_check_completed(
+ WHERE ((([is_regression_detected]=(1))
+ AND ([is_regression_corrected]=(1)))
+ AND ([option_id]=(1))))
+ADD TARGET package0.event_file(SET filename=N'reverted_plan_corrections')
+WITH (STARTUP_STATE=ON);
+GO
+
+ALTER EVENT SESSION [APC_Reverted_plan_corrections] ON SERVER STATE = start;
+GO
diff --git a/Extended_Events/APC_plans_that_are_not_corrected.sql b/Extended_Events/APC_plans_that_are_not_corrected.sql
new file mode 100644
index 00000000..32a6d6ca
--- /dev/null
+++ b/Extended_Events/APC_plans_that_are_not_corrected.sql
@@ -0,0 +1,23 @@
+/*
+Original link: https://blogs.msdn.microsoft.com/sqlserverstorageengine/2017/07/18/monitoring-automatic-tuning-actions-using-xevents/
+Author: Jovan Popovic
+*/
+
+IF SERVERPROPERTY('ProductMajorVersion') < 14
+RAISERROR ('Your version of SQL Server is not supported! This extended event works only for version >= 2017 RC1', 20, 1) WITH LOG;
+
+IF EXISTS (SELECT 1 FROM sys.server_event_sessions WHERE name = 'APC_plans_that_are_not_corrected')
+ DROP EVENT SESSION [APC_plans_that_are_not_corrected] ON SERVER;
+GO
+
+CREATE EVENT SESSION [APC_plans_that_are_not_corrected] ON SERVER
+ADD EVENT qds.automatic_tuning_plan_regression_detection_check_completed(
+WHERE ((([is_regression_detected]=(1))
+ AND ([is_regression_corrected]=(0)))
+ AND ([option_id]=(1))))
+ADD TARGET package0.event_file(SET filename=N'plans_that_are_not_corrected')
+WITH (STARTUP_STATE=ON);
+GO
+
+ALTER EVENT SESSION [APC_plans_that_are_not_corrected] ON SERVER STATE = start;
+GO
\ No newline at end of file
diff --git a/Extended_Events/BackupRestoreTrace.sql b/Extended_Events/BackupRestoreTrace.sql
new file mode 100644
index 00000000..edb3b8ab
--- /dev/null
+++ b/Extended_Events/BackupRestoreTrace.sql
@@ -0,0 +1,34 @@
+/*
+Original link: https://blogs.msdn.microsoft.com/sql_server_team/sql-server-mysteries-the-case-of-the-not-100-restore/
+Author: Bob Ward
+*/
+IF EXISTS (
+ SELECT * FROM sys.server_event_sessions
+ WHERE [name] = N'BackupRestoreTrace')
+ DROP EVENT SESSION BackupRestoreTrace ON SERVER
+GO
+
+
+CREATE EVENT SESSION BackupRestoreTrace ON SERVER
+ADD EVENT sqlos.async_io_completed(
+ ACTION(package0.event_sequence,sqlos.task_address,sqlserver.session_id)),
+ADD EVENT sqlos.async_io_requested(
+ ACTION(package0.event_sequence,sqlos.task_address,sqlserver.session_id)),
+ADD EVENT sqlos.task_completed(
+ ACTION(package0.event_sequence,sqlserver.session_id)),
+ADD EVENT sqlos.task_started(
+ ACTION(package0.event_sequence,sqlserver.session_id)),
+ADD EVENT sqlserver.backup_restore_progress_trace(
+ ACTION(package0.event_sequence,sqlos.task_address,sqlserver.session_id)),
+ADD EVENT sqlserver.file_write_completed(SET collect_path=(1)
+ ACTION(package0.event_sequence,sqlos.task_address,sqlserver.session_id))
+ADD TARGET package0.event_file(SET filename=N'BackupRestoreTrace')
+WITH (
+ MAX_MEMORY=4096 KB,
+ EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,
+ MAX_DISPATCH_LATENCY=5 SECONDS,
+ MAX_EVENT_SIZE=0 KB,
+ MEMORY_PARTITION_MODE=NONE,
+ TRACK_CAUSALITY=OFF,
+ STARTUP_STATE=OFF
+);
diff --git a/Extended_Events/ConvertingSQLTracetoExtendedEvents.sql b/Extended_Events/ConvertingSQLTracetoExtendedEvents.sql
new file mode 100644
index 00000000..562e0469
--- /dev/null
+++ b/Extended_Events/ConvertingSQLTracetoExtendedEvents.sql
@@ -0,0 +1,325 @@
+/*
+Author: Jonathan Kehayias
+Original link: https://www.sqlskills.com/blogs/jonathan/converting-sql-trace-to-extended-events-in-sql-server-2012
+*/
+
+IF EXISTS (SELECT 1 FROM sys.server_event_sessions WHERE name = 'XE_Default_Trace')
+ DROP EVENT SESSION [XE_Default_Trace] ON SERVER;
+GO
+CREATE EVENT SESSION [XE_Default_Trace]
+ON SERVER
+/* Audit Login Failed is not implemented in Extended Events it may be a Server Audit Event */
+/* Audit Database Scope GDR Event is not implemented in Extended Events it may be a Server Audit Event */
+/* Audit Schema Object GDR Event is not implemented in Extended Events it may be a Server Audit Event */
+/* Audit Addlogin Event is not implemented in Extended Events it may be a Server Audit Event */
+/* Audit Login GDR Event is not implemented in Extended Events it may be a Server Audit Event */
+/* Audit Login Change Property Event is not implemented in Extended Events it may be a Server Audit Event */
+/* Audit Add Login to Server Role Event is not implemented in Extended Events it may be a Server Audit Event */
+/* Audit Add DB User Event is not implemented in Extended Events it may be a Server Audit Event */
+/* Audit Add Member to DB Role Event is not implemented in Extended Events it may be a Server Audit Event */
+/* Audit Add Role Event is not implemented in Extended Events it may be a Server Audit Event */
+/* Audit Backup/Restore Event is not implemented in Extended Events it may be a Server Audit Event */
+/* Audit DBCC Event is not implemented in Extended Events it may be a Server Audit Event */
+/* Audit Change Audit Event is not implemented in Extended Events it may be a Server Audit Event */
+/* Audit Change Database Owner is not implemented in Extended Events it may be a Server Audit Event */
+/* Audit Schema Object Take Ownership Event is not implemented in Extended Events it may be a Server Audit Event */
+/* Audit Server Alter Trace Event is not implemented in Extended Events it may be a Server Audit Event */
+ADD EVENT sqlserver.database_file_size_change(
+ ACTION
+ (
+ sqlserver.client_app_name — ApplicationName from SQLTrace
+ , sqlserver.client_hostname — HostName from SQLTrace
+ , sqlserver.client_pid — ClientProcessID from SQLTrace
+ , package0.event_sequence — EventSequence from SQLTrace
+ , sqlserver.is_system — IsSystem from SQLTrace
+ , sqlserver.nt_username — NTDomainName from SQLTrace
+ , sqlserver.server_instance_name — ServerName from SQLTrace
+ , sqlserver.server_principal_name — LoginName from SQLTrace
+ , sqlserver.server_principal_sid — LoginSid from SQLTrace
+ , sqlserver.session_id — SPID from SQLTrace
+ , sqlserver.session_server_principal_name — SessionLoginName from SQLTrace
+ )
+),
+/* Log File Auto Grow is implemented as the sqlserver.database_file_size_change event in Extended Events */
+/* Data File Auto Shrink is implemented as the sqlserver.database_file_size_change event in Extended Events */
+/* Log File Auto Shrink is implemented as the sqlserver.database_file_size_change event in Extended Events */
+ADD EVENT sqlserver.database_mirroring_state_change(
+ ACTION
+ (
+ package0.event_sequence — EventSequence from SQLTrace
+ , sqlserver.is_system — IsSystem from SQLTrace
+ , sqlserver.request_id — RequestID from SQLTrace
+ , sqlserver.server_instance_name — ServerName from SQLTrace
+ , sqlserver.server_principal_sid — LoginSid from SQLTrace
+ , sqlserver.session_id — SPID from SQLTrace
+ , sqlserver.session_server_principal_name — SessionLoginName from SQLTrace
+ , sqlserver.transaction_id — TransactionID from SQLTrace
+ )
+),
+ADD EVENT sqlserver.errorlog_written(
+ ACTION
+ (
+ sqlserver.client_app_name — ApplicationName from SQLTrace
+ , sqlserver.client_hostname — HostName from SQLTrace
+ , sqlserver.client_pid — ClientProcessID from SQLTrace
+ , sqlserver.database_id — DatabaseID from SQLTrace
+ , sqlserver.database_name — DatabaseName from SQLTrace
+ , package0.event_sequence — EventSequence from SQLTrace
+ , sqlserver.is_system — IsSystem from SQLTrace
+ , sqlserver.nt_username — NTUserName from SQLTrace
+ , sqlserver.nt_username — NTDomainName from SQLTrace
+ , sqlserver.request_id — RequestID from SQLTrace
+ , sqlserver.server_instance_name — ServerName from SQLTrace
+ , sqlserver.server_principal_name — LoginName from SQLTrace
+ , sqlserver.server_principal_sid — LoginSid from SQLTrace
+ , sqlserver.session_id — SPID from SQLTrace
+ , sqlserver.session_server_principal_name — SessionLoginName from SQLTrace
+ , sqlserver.transaction_id — TransactionID from SQLTrace
+ — Severity not implemented in XE for this event
+ — State not implemented in XE for this event
+ — Error not implemented in XE for this event
+ )
+),
+ADD EVENT sqlserver.full_text_crawl_started(
+ ACTION
+ (
+ package0.event_sequence — EventSequence from SQLTrace
+ , sqlserver.is_system — IsSystem from SQLTrace
+ , sqlserver.session_id — SPID from SQLTrace
+ , sqlserver.session_server_principal_name — SessionLoginName from SQLTrace
+ , sqlserver.transaction_id — TransactionID from SQLTrace
+ — ServerName not implemented in XE for this event
+ )
+),
+ADD EVENT sqlserver.full_text_crawl_stopped(
+ ACTION
+ (
+ package0.event_sequence — EventSequence from SQLTrace
+ , sqlserver.is_system — IsSystem from SQLTrace
+ , sqlserver.session_id — SPID from SQLTrace
+ , sqlserver.session_server_principal_name — SessionLoginName from SQLTrace
+ , sqlserver.transaction_id — TransactionID from SQLTrace
+ — ServerName not implemented in XE for this event
+ )
+),
+ADD EVENT sqlserver.hash_warning(
+ ACTION
+ (
+ sqlserver.client_app_name — ApplicationName from SQLTrace
+ , sqlserver.client_hostname — HostName from SQLTrace
+ , sqlserver.client_pid — ClientProcessID from SQLTrace
+ , sqlserver.database_id — DatabaseID from SQLTrace
+ , sqlserver.database_name — DatabaseName from SQLTrace
+ , package0.event_sequence — EventSequence from SQLTrace
+ , sqlserver.is_system — IsSystem from SQLTrace
+ , sqlserver.nt_username — NTUserName from SQLTrace
+ , sqlserver.nt_username — NTDomainName from SQLTrace
+ , sqlserver.request_id — RequestID from SQLTrace
+ , sqlserver.server_instance_name — ServerName from SQLTrace
+ , sqlserver.server_principal_name — LoginName from SQLTrace
+ , sqlserver.server_principal_sid — LoginSid from SQLTrace
+ , sqlserver.session_id — SPID from SQLTrace
+ , sqlserver.session_resource_group_id — GroupID from SQLTrace
+ , sqlserver.session_server_principal_name — SessionLoginName from SQLTrace
+ , sqlserver.transaction_id — TransactionID from SQLTrace
+ , sqlserver.transaction_sequence — XactSequence from SQLTrace
+ )
+),
+ADD EVENT sqlserver.missing_column_statistics(
+ ACTION
+ (
+ sqlserver.client_app_name — ApplicationName from SQLTrace
+ , sqlserver.client_hostname — HostName from SQLTrace
+ , sqlserver.client_pid — ClientProcessID from SQLTrace
+ , sqlserver.database_id — DatabaseID from SQLTrace
+ , sqlserver.database_name — DatabaseName from SQLTrace
+ , package0.event_sequence — EventSequence from SQLTrace
+ , sqlserver.is_system — IsSystem from SQLTrace
+ , sqlserver.nt_username — NTUserName from SQLTrace
+ , sqlserver.nt_username — NTDomainName from SQLTrace
+ , sqlserver.request_id — RequestID from SQLTrace
+ , sqlserver.server_instance_name — ServerName from SQLTrace
+ , sqlserver.server_principal_name — LoginName from SQLTrace
+ , sqlserver.server_principal_sid — LoginSid from SQLTrace
+ , sqlserver.session_id — SPID from SQLTrace
+ , sqlserver.session_resource_group_id — GroupID from SQLTrace
+ , sqlserver.session_server_principal_name — SessionLoginName from SQLTrace
+ , sqlserver.transaction_id — TransactionID from SQLTrace
+ , sqlserver.transaction_sequence — XactSequence from SQLTrace
+ )
+),
+ADD EVENT sqlserver.missing_join_predicate(
+ ACTION
+ (
+ sqlserver.client_app_name — ApplicationName from SQLTrace
+ , sqlserver.client_hostname — HostName from SQLTrace
+ , sqlserver.client_pid — ClientProcessID from SQLTrace
+ , sqlserver.database_id — DatabaseID from SQLTrace
+ , sqlserver.database_name — DatabaseName from SQLTrace
+ , package0.event_sequence — EventSequence from SQLTrace
+ , sqlserver.is_system — IsSystem from SQLTrace
+ , sqlserver.nt_username — NTUserName from SQLTrace
+ , sqlserver.nt_username — NTDomainName from SQLTrace
+ , sqlserver.request_id — RequestID from SQLTrace
+ , sqlserver.server_instance_name — ServerName from SQLTrace
+ , sqlserver.server_principal_name — LoginName from SQLTrace
+ , sqlserver.server_principal_sid — LoginSid from SQLTrace
+ , sqlserver.session_id — SPID from SQLTrace
+ , sqlserver.session_resource_group_id — GroupID from SQLTrace
+ , sqlserver.session_server_principal_name — SessionLoginName from SQLTrace
+ , sqlserver.transaction_id — TransactionID from SQLTrace
+ , sqlserver.transaction_sequence — XactSequence from SQLTrace
+ )
+),
+ADD EVENT sqlserver.object_altered(
+ ACTION
+ (
+ package0.attach_activity_id — IntegerData from SQLTrace
+ , sqlserver.client_app_name — ApplicationName from SQLTrace
+ , sqlserver.client_hostname — HostName from SQLTrace
+ , sqlserver.client_pid — ClientProcessID from SQLTrace
+ , package0.event_sequence — EventSequence from SQLTrace
+ , sqlserver.is_system — IsSystem from SQLTrace
+ , sqlserver.nt_username — NTUserName from SQLTrace
+ , sqlserver.nt_username — NTDomainName from SQLTrace
+ , sqlserver.request_id — RequestID from SQLTrace
+ , sqlserver.server_instance_name — ServerName from SQLTrace
+ , sqlserver.server_principal_name — LoginName from SQLTrace
+ , sqlserver.server_principal_sid — LoginSid from SQLTrace
+ , sqlserver.session_id — SPID from SQLTrace
+ , sqlserver.session_resource_group_id — GroupID from SQLTrace
+ , sqlserver.session_server_principal_name — SessionLoginName from SQLTrace
+ , sqlserver.transaction_id — TransactionID from SQLTrace
+ , sqlserver.transaction_sequence — XactSequence from SQLTrace
+ — BigintData1 not implemented in XE for this event
+ )
+),
+ADD EVENT sqlserver.object_created(
+ ACTION
+ (
+ package0.attach_activity_id — IntegerData from SQLTrace
+ , sqlserver.client_app_name — ApplicationName from SQLTrace
+ , sqlserver.client_hostname — HostName from SQLTrace
+ , sqlserver.client_pid — ClientProcessID from SQLTrace
+ , package0.event_sequence — EventSequence from SQLTrace
+ , sqlserver.is_system — IsSystem from SQLTrace
+ , sqlserver.nt_username — NTUserName from SQLTrace
+ , sqlserver.nt_username — NTDomainName from SQLTrace
+ , sqlserver.request_id — RequestID from SQLTrace
+ , sqlserver.server_instance_name — ServerName from SQLTrace
+ , sqlserver.server_principal_name — LoginName from SQLTrace
+ , sqlserver.server_principal_sid — LoginSid from SQLTrace
+ , sqlserver.session_id — SPID from SQLTrace
+ , sqlserver.session_resource_group_id — GroupID from SQLTrace
+ , sqlserver.session_server_principal_name — SessionLoginName from SQLTrace
+ , sqlserver.transaction_id — TransactionID from SQLTrace
+ , sqlserver.transaction_sequence — XactSequence from SQLTrace
+ — BigintData1 not implemented in XE for this event
+ )
+),
+ADD EVENT sqlserver.object_deleted(
+ ACTION
+ (
+ package0.attach_activity_id — IntegerData from SQLTrace
+ , sqlserver.client_app_name — ApplicationName from SQLTrace
+ , sqlserver.client_hostname — HostName from SQLTrace
+ , sqlserver.client_pid — ClientProcessID from SQLTrace
+ , package0.event_sequence — EventSequence from SQLTrace
+ , sqlserver.is_system — IsSystem from SQLTrace
+ , sqlserver.nt_username — NTUserName from SQLTrace
+ , sqlserver.nt_username — NTDomainName from SQLTrace
+ , sqlserver.request_id — RequestID from SQLTrace
+ , sqlserver.server_instance_name — ServerName from SQLTrace
+ , sqlserver.server_principal_name — LoginName from SQLTrace
+ , sqlserver.server_principal_sid — LoginSid from SQLTrace
+ , sqlserver.session_id — SPID from SQLTrace
+ , sqlserver.session_resource_group_id — GroupID from SQLTrace
+ , sqlserver.session_server_principal_name — SessionLoginName from SQLTrace
+ , sqlserver.transaction_id — TransactionID from SQLTrace
+ , sqlserver.transaction_sequence — XactSequence from SQLTrace
+ — BigintData1 not implemented in XE for this event
+ )
+),
+ADD EVENT sqlserver.plan_guide_unsuccessful(
+ ACTION
+ (
+ sqlserver.client_app_name — ApplicationName from SQLTrace
+ , sqlserver.client_hostname — HostName from SQLTrace
+ , sqlserver.client_pid — ClientProcessID from SQLTrace
+ , sqlserver.database_id — DatabaseID from SQLTrace
+ , sqlserver.database_name — DatabaseName from SQLTrace
+ , package0.event_sequence — EventSequence from SQLTrace
+ , sqlserver.is_system — IsSystem from SQLTrace
+ , sqlserver.nt_username — NTUserName from SQLTrace
+ , sqlserver.nt_username — NTDomainName from SQLTrace
+ , sqlserver.request_id — RequestID from SQLTrace
+ , sqlserver.server_instance_name — ServerName from SQLTrace
+ , sqlserver.server_principal_name — LoginName from SQLTrace
+ , sqlserver.server_principal_sid — LoginSid from SQLTrace
+ , sqlserver.session_id — SPID from SQLTrace
+ , sqlserver.session_server_principal_name — SessionLoginName from SQLTrace
+ , sqlserver.transaction_id — TransactionID from SQLTrace
+ , sqlserver.transaction_sequence — XactSequence from SQLTrace
+ — TextData not implemented in XE for this event
+ )
+),
+ADD EVENT sqlserver.server_memory_change(
+ ACTION
+ (
+ package0.event_sequence — EventSequence from SQLTrace
+ , sqlserver.is_system — IsSystem from SQLTrace
+ , sqlserver.request_id — RequestID from SQLTrace
+ , sqlserver.server_instance_name — ServerName from SQLTrace
+ , sqlserver.session_id — SPID from SQLTrace
+ , sqlserver.session_server_principal_name — SessionLoginName from SQLTrace
+ , sqlserver.transaction_id — TransactionID from SQLTrace
+ , sqlserver.transaction_sequence — XactSequence from SQLTrace
+ )
+),
+ADD EVENT sqlserver.server_start_stop(
+ ACTION
+ (
+ sqlserver.client_app_name — ApplicationName from SQLTrace
+ , sqlserver.client_hostname — HostName from SQLTrace
+ , sqlserver.client_pid — ClientProcessID from SQLTrace
+ , package0.event_sequence — EventSequence from SQLTrace
+ , sqlserver.is_system — IsSystem from SQLTrace
+ , sqlserver.nt_username — NTUserName from SQLTrace
+ , sqlserver.nt_username — NTDomainName from SQLTrace
+ , sqlserver.request_id — RequestID from SQLTrace
+ , sqlserver.server_instance_name — ServerName from SQLTrace
+ , sqlserver.server_principal_name — LoginName from SQLTrace
+ , sqlserver.server_principal_sid — LoginSid from SQLTrace
+ , sqlserver.session_id — SPID from SQLTrace
+ , sqlserver.session_server_principal_name — SessionLoginName from SQLTrace
+ )
+),
+ADD EVENT sqlserver.sort_warning(
+ ACTION
+ (
+ sqlserver.client_app_name — ApplicationName from SQLTrace
+ , sqlserver.client_hostname — HostName from SQLTrace
+ , sqlserver.client_pid — ClientProcessID from SQLTrace
+ , sqlserver.database_id — DatabaseID from SQLTrace
+ , sqlserver.database_name — DatabaseName from SQLTrace
+ , package0.event_sequence — EventSequence from SQLTrace
+ , sqlserver.is_system — IsSystem from SQLTrace
+ , sqlserver.nt_username — NTUserName from SQLTrace
+ , sqlserver.nt_username — NTDomainName from SQLTrace
+ , sqlserver.request_id — RequestID from SQLTrace
+ , sqlserver.server_instance_name — ServerName from SQLTrace
+ , sqlserver.server_principal_name — LoginName from SQLTrace
+ , sqlserver.server_principal_sid — LoginSid from SQLTrace
+ , sqlserver.session_id — SPID from SQLTrace
+ , sqlserver.session_resource_group_id — GroupID from SQLTrace
+ , sqlserver.session_server_principal_name — SessionLoginName from SQLTrace
+ , sqlserver.transaction_id — TransactionID from SQLTrace
+ , sqlserver.transaction_sequence — XactSequence from SQLTrace
+ )
+)
+ADD TARGET package0.event_file
+(
+ SET filename = 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Log\XE_Default_Trace.xel',
+ max_file_size = 20,
+ max_rollover_files = 5
+)
diff --git a/Extended_Events/DarkQueries.sql b/Extended_Events/DarkQueries.sql
new file mode 100644
index 00000000..4fafee37
--- /dev/null
+++ b/Extended_Events/DarkQueries.sql
@@ -0,0 +1,26 @@
+CREATE EVENT SESSION [DarkQueries] ON SERVER
+ ADD EVENT sqlserver.sql_statement_recompile(
+ ACTION(sqlserver.database_id,sqlserver.sql_text)
+ WHERE ([recompile_cause]=(11))) -- Option (RECOMPILE) Requested
+ ADD TARGET package0.event_file(SET filename=N'DarkQueries');
+
+ALTER EVENT SESSION [DarkQueries] ON SERVER STATE = START;
+
+
+SELECT DarkQueryData.eventDate,
+ DB_NAME(DarkQueryData.database_id) as DatabaseName,
+ DarkQueryData.object_type,
+ COALESCE(DarkQueryData.sql_text,
+ OBJECT_NAME(DarkQueryData.object_id, DarkQueryData.database_id)) command,
+ DarkQueryData.recompile_cause
+ FROM sys.fn_xe_file_target_read_file ( 'DarkQueries*xel', null, null, null) event_file_value
+ CROSS APPLY ( SELECT CAST(event_file_value.[event_data] as xml) ) event_file_value_xml ([xml])
+ CROSS APPLY (
+ SELECT event_file_value_xml.[xml].value('(event/@timestamp)[1]', 'datetime') as eventDate,
+ event_file_value_xml.[xml].value('(event/action[@name="sql_text"]/value)[1]', 'nvarchar(max)') as sql_text,
+ event_file_value_xml.[xml].value('(event/data[@name="object_type"]/text)[1]', 'nvarchar(100)') as object_type,
+ event_file_value_xml.[xml].value('(event/data[@name="object_id"]/value)[1]', 'bigint') as object_id,
+ event_file_value_xml.[xml].value('(event/data[@name="source_database_id"]/value)[1]', 'bigint') as database_id,
+ event_file_value_xml.[xml].value('(event/data[@name="recompile_cause"]/text)[1]', 'nvarchar(100)') as recompile_cause
+ ) as DarkQueryData
+ ORDER BY eventDate DESC;
diff --git a/Extended_Events/Deadlocks.sql b/Extended_Events/Deadlocks.sql
new file mode 100644
index 00000000..a047f584
--- /dev/null
+++ b/Extended_Events/Deadlocks.sql
@@ -0,0 +1,116 @@
+/*
+Original link: http://blog.waynesheffield.com/wayne/archive/2017/04/weaning-yourself-off-sql-profiler/
+Author: Wayne Sheffield
+*/
+IF EXISTS (SELECT 1 FROM sys.server_event_sessions WHERE name = 'Deadlocks')
+ DROP EVENT SESSION [Deadlocks] ON SERVER;
+GO
+
+EXECUTE xp_create_subdir 'C:\SQL\XE_Out';
+GO
+
+CREATE EVENT SESSION [Deadlocks]
+ON SERVER
+ADD EVENT sqlserver.lock_deadlock(
+ SET collect_database_name=(1),collect_resource_description=(1)
+ ACTION
+ (
+ sqlserver.client_app_name -- ApplicationName from SQLTrace
+ , sqlserver.client_pid -- ClientProcessID from SQLTrace
+ , sqlserver.nt_username -- NTUserName from SQLTrace
+ , sqlserver.server_principal_name -- LoginName from SQLTrace
+ , sqlserver.session_id -- SPID from SQLTrace
+ )
+),
+ADD EVENT sqlserver.lock_deadlock_chain(
+ SET collect_database_name=(1),collect_resource_description=(1)
+ ACTION
+ (
+ sqlserver.session_id -- SPID from SQLTrace
+ )
+),
+ADD EVENT sqlserver.xml_deadlock_report(
+ ACTION
+ (
+ sqlserver.server_principal_name -- LoginName from SQLTrace
+ , sqlserver.session_id -- SPID from SQLTrace
+ )
+)
+ADD TARGET package0.event_file
+(
+ SET filename = 'C:\SQL\XE_Out\Deadlocks.xel',
+ max_file_size = 250,
+ max_rollover_files = 5
+)
+WITH (STARTUP_STATE=OFF)
+;
+
+/*
+-- 1 The next step is to create a deadlock. Open up a new query window, and run the following. Leave this query window open.
+USE tempdb;
+GO
+IF OBJECT_ID('dbo.Test1') IS NOT NULL DROP TABLE dbo.Test1;
+IF OBJECT_ID('dbo.Test2') IS NOT NULL DROP TABLE dbo.Test2;
+CREATE TABLE dbo.Test1 (col1 INT);
+CREATE TABLE dbo.Test2 (col2 INT);
+INSERT INTO dbo.Test1 VALUES (1),(2),(3),(4),(5);
+INSERT INTO dbo.Test2 VALUES (1),(2),(3),(4),(5);
+GO
+BEGIN TRANSACTION
+UPDATE dbo.Test1 SET col1 = col1*10 WHERE col1=3;
+
+-- 2 Next, open up a second query window, and run the following code in that window:
+USE tempdb;
+BEGIN TRANSACTION;
+UPDATE dbo.Test2 SET col2 = col2*20 WHERE col2 = 4;
+UPDATE dbo.Test1 SET col1 = col1*20 WHERE col1 = 3;
+COMMIT TRANSACTION;
+
+-- 3 Finally, return to the first query window and run the following code, at which point one of the statements in one of the query windows will be deadlocked:
+UPDATE dbo.Test2 SET col2 = col2*10 WHERE col2 = 4;
+COMMIT TRANSACTION;
+
+-- Msg 1205, Level 13, State 45, Line 4
+-- Transaction (Process ID 57) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
+
+-- 4 Get extended event info
+WITH cte AS
+(
+SELECT t2.event_data.value('(event/@name)[1]','varchar(50)') AS event_name,
+ t2.event_data.value('(event/@timestamp)[1]', 'datetime2') AS StartTime,
+ t2.event_data.value('(event/data[@name="duration"]/value)[1]', 'bigint') AS duration,
+ t2.event_data.value('(event/data[@name="database_name"]/value)[1]', 'sysname') AS DBName,
+ t2.event_data.value('(event/action[@name="nt_username"]/value)[1]', 'varchar(500)') AS nt_username,
+ t2.event_data.value('(event/data[@name="mode"]/value)[1]', 'varchar(15)') + ' (' +
+ t2.event_data.value('(event/data[@name="mode"]/text)[1]', 'varchar(50)') + ')' AS mode,
+ t2.event_data.value('(event/data[@name="object_id"]/value)[1]', 'integer') AS object_id,
+ t2.event_data.value('(event/data[@name="resource_description"]/value)[1]', 'varchar(max)') AS resource_description,
+ t2.event_data.value('(event/data[@name="resource_owner_type"]/text)[1]', 'varchar(max)') AS resource_owner_type,
+ t2.event_data.value('(event/data[@name="resource_type"]/text)[1]', 'varchar(max)') + ' (' +
+ t2.event_data.value('(event/data[@name="resource_type"]/value)[1]', 'varchar(max)') + ')' AS resource_type,
+ t2.event_data.value('(event/action[@name="server_principal_name"]/value)[1]', 'varchar(max)') AS server_principal_name,
+ t2.event_data.value('(event/action[@name="session_id"]/value)[1]', 'varchar(max)') AS session_id,
+ t2.event_data.value('(event/action[@name="client_pid"]/value)[1]', 'integer') AS client_pid,
+ t2.event_data.value('(event/action[@name="client_app_name"]/value)[1]', 'varchar(max)') AS client_app_name,
+ t2.event_data
+FROM sys.fn_xe_file_target_read_file('C:\SQL\XE_Out\Deadlocks*.xel', NULL, NULL, NULL) t1
+CROSS APPLY (SELECT CONVERT(XML, t1.event_data)) t2(event_data)
+)
+SELECT cte.event_name,
+ cte.StartTime,
+ DATEADD(MICROSECOND, duration, CONVERT(DATETIME2, [cte].StartTime)) AS EndDate,
+ cte.duration,
+ cte.DBName,
+ cte.nt_username,
+ cte.server_principal_name,
+ cte.mode,
+ cte.object_id,
+ cte.resource_description,
+ cte.resource_owner_type,
+ cte.resource_type,
+ cte.session_id,
+ cte.client_pid,
+ cte.client_app_name,
+ cte.event_data
+FROM cte;
+*/
diff --git a/Extended_Events/ImplicitConversionOnly.sql b/Extended_Events/ImplicitConversionOnly.sql
new file mode 100644
index 00000000..863483e5
--- /dev/null
+++ b/Extended_Events/ImplicitConversionOnly.sql
@@ -0,0 +1,21 @@
+/*
+Original link: https://www.scarydba.com/2018/10/15/using-extended-events-to-capture-implicit-conversions/
+Author: Grant Fritchey
+*/
+-- If the Event Session exists DROP it
+IF EXISTS (SELECT 1
+FROM sys.server_event_sessions
+WHERE name = N'ImplicitConversionOnly')
+ DROP EVENT SESSION ImplicitConversionOnly ON SERVER;
+
+CREATE EVENT SESSION ImplicitConversionOnly
+ON SERVER
+ADD EVENT sqlserver.plan_affecting_convert
+(ACTION (sqlserver.sql_text)
+-- WHERE (sqlserver.equal_i_sql_unicode_string(sqlserver.database_name, N'AdventureWorks2017'))
+)
+ADD TARGET package0.event_file
+(SET filename = N'ImplicitConversionOnly');
+
+ALTER EVENT SESSION ImplicitConversionOnly ON SERVER STATE = START;
+GO
diff --git a/Extended_Events/InvestigateWaits.sql b/Extended_Events/InvestigateWaits.sql
new file mode 100644
index 00000000..9dbc8380
--- /dev/null
+++ b/Extended_Events/InvestigateWaits.sql
@@ -0,0 +1,42 @@
+/*
+Original link: http://www.sqlskills.com/blogs/paul/who-is-overriding-maxdop-1-on-the-instance/
+Author: Paul Randal
+*/
+IF EXISTS (
+ SELECT * FROM sys.server_event_sessions
+ WHERE [name] = N'InvestigateWaits')
+ DROP EVENT SESSION [InvestigateWaits] ON SERVER
+GO
+
+CREATE EVENT SESSION InvestigateWaits ON SERVER
+ADD EVENT sqlserver.degree_of_parallelism
+(
+ ACTION (
+ sqlserver.client_hostname,
+ sqlserver.nt_username,
+ sqlserver.sql_text)
+ WHERE [dop] > 0 -- parallel plans
+)
+ADD TARGET [package0].[ring_buffer]
+WITH
+(
+ MAX_MEMORY = 50 MB,
+ MAX_DISPATCH_LATENCY = 5 SECONDS)
+GO
+
+And the code to parse the XML, and sample output from my query is:
+
+SELECT
+ [data1].[value] ('(./@timestamp)[1]', 'datetime') AS [Time],
+ [data1].[value] ('(./data[@name="dop"]/value)[1]', 'INT') AS [DOP],
+ [data1].[value] ('(./action[@name="client_hostname"]/value)[1]', 'VARCHAR(MAX)') AS [Host],
+ [data1].[value] ('(./action[@name="nt_username"]/value)[1]', 'VARCHAR(MAX)') AS [User],
+ [data1].[value] ('(./action[@name="sql_text"]/value)[1]','VARCHAR(MAX)') AS [Statement]
+FROM (
+ SELECT CONVERT (XML, [target_data]) AS data
+ FROM sys.dm_xe_session_targets [xst]
+ INNER JOIN sys.dm_xe_sessions [xs]
+ ON [xst].[event_session_address] = [xs].[address]
+ WHERE [xs].[name] = N'InvestigateWaits') AS t
+CROSS APPLY data.nodes('//event') n (data1);
+GO
diff --git a/Extended_Events/LoginFailure.sql b/Extended_Events/LoginFailure.sql
new file mode 100644
index 00000000..23547f05
--- /dev/null
+++ b/Extended_Events/LoginFailure.sql
@@ -0,0 +1,9 @@
+/*
+https://blogs.msdn.microsoft.com/sql_pfe_blog/2017/05/04/login-failed-for-xxx-whos-keeps-trying-to-connect-to-my-server/
+*/
+
+CREATE EVENT SESSION [LoginFailureTrace] ON SERVER
+ADD EVENT sqlserver.errorlog_written( ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.client_pid))
+ADD TARGET package0.event_file(SET filename=N'LoginFailureTrace',max_file_size=(128))
+WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_MULTIPLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)
+GO
diff --git a/Extended_Events/MonitorPageSplits.sql b/Extended_Events/MonitorPageSplits.sql
new file mode 100644
index 00000000..df2ee769
--- /dev/null
+++ b/Extended_Events/MonitorPageSplits.sql
@@ -0,0 +1,56 @@
+/*
+Original link: http://sqlblog.com/blogs/jonathan_kehayias/archive/2010/10/17/tracking-page-splits-in-sql-server-denali-ctp1.aspx
+Author: Jonathan Kehayias
+*/
+
+IF (SELECT 1 FROM sys.server_event_sessions WHERE name = 'MonitorPageSplits') IS NOT NULL
+ DROP EVENT SESSION MonitorPageSplits ON SERVER
+GO
+
+CREATE EVENT SESSION MonitorPageSplits ON SERVER
+ADD EVENT sqlserver.page_split
+(
+ ACTION (sqlserver.database_id, sqlserver.sql_text)
+ WHERE sqlserver.database_id = 2
+)
+ADD TARGET package0.ring_buffer
+WITH (MAX_DISPATCH_LATENCY = 1 SECONDS)
+GO
+
+ALTER EVENT SESSION MonitorPageSplits ON SERVER STATE = start;
+GO
+
+/*
+SELECT
+ event_time = XEvent.value('(@timestamp)[1]','datetime')
+ , orig_file_id = XEvent.value('(data[@name=''file_id'']/value)[1]','int')
+ , orig_page_id = XEvent.value('(data[@name=''page_id'']/value)[1]','int')
+ , database_id = XEvent.value('(data[@name=''database_id'']/value)[1]','int')
+ , OBJECT_ID = p.OBJECT_ID
+ , index_id = p.index_id
+ , OBJECT_NAME = OBJECT_NAME(p.OBJECT_ID)
+ , index_name = i.name
+ , rowset_id = XEvent.value('(data[@name=''rowset_id'']/value)[1]','bigint')
+ , splitOperation = XEvent.value('(data[@name=''splitOperation'']/text)[1]','varchar(255)')
+ , new_page_file_id = XEvent.value('(data[@name=''new_page_file_id'']/value)[1]','int')
+ , new_page_page_id = XEvent.value('(data[@name=''new_page_page_id'']/value)[1]','int')
+ , sql_text = XEvent.value('(action[@name=''sql_text'']/value)[1]','varchar(max)')
+FROM
+(
+ SELECT CAST(target_data AS XML) AS target_data
+ FROM sys.dm_xe_session_targets xst
+ JOIN sys.dm_xe_sessions xs ON xs.address = xst.event_session_address
+ WHERE xs.name = 'MonitorPageSplits'
+) AS tab (target_data)
+CROSS APPLY target_data.nodes('/RingBufferTarget/event') AS EventNodes(XEvent)
+LEFT JOIN sys.allocation_units au
+ ON au.container_id = XEvent.value('(data[@name=''rowset_id'']/value)[1]','bigint')
+LEFT JOIN sys.partitions p
+ ON p.partition_id = au.container_id
+LEFT JOIN sys.indexes i
+ ON p.OBJECT_ID = i.OBJECT_ID
+ AND p.index_id = i.index_id
+
+-- View the Page allocations
+DBCC IND(tempdb, split_page, -1);
+*/
diff --git a/Extended_Events/ProcedureWaits.sql b/Extended_Events/ProcedureWaits.sql
new file mode 100644
index 00000000..78a6225b
--- /dev/null
+++ b/Extended_Events/ProcedureWaits.sql
@@ -0,0 +1,18 @@
+/*
+Original link: https://www.scarydba.com/2018/02/05/wait-statistics-query/
+Author: Grant Fritchey
+*/
+
+CREATE EVENT SESSION ProcedureWaits
+ON SERVER
+ ADD EVENT sqlos.wait_completed
+ (SET collect_wait_resource = (1)
+ WHERE (sqlserver.equal_i_sql_unicode_string(sqlserver.database_name, N'AdventureWorks2017'))),
+ ADD EVENT sqlserver.module_end
+ (WHERE ( sqlserver.database_name = N'AdventureWorks2017'
+ AND object_name = N'ProductTransactionHistoryByReference')),
+ ADD EVENT sqlserver.rpc_completed
+ (WHERE (sqlserver.database_name = N'AdventureWorks2017')),
+ ADD EVENT sqlserver.rpc_starting
+ (WHERE (sqlserver.database_name = N'AdventureWorks2017'))
+WITH (TRACK_CAUSALITY = ON);
diff --git a/Extended_Events/README.md b/Extended_Events/README.md
new file mode 100644
index 00000000..6c1af0e8
--- /dev/null
+++ b/Extended_Events/README.md
@@ -0,0 +1,22 @@
+# SQL Server Extended Events
+SQL Server Extended Events has a highly scalable and highly configurable architecture that allows users to collect as much or as little information as is necessary to troubleshoot or identify a performance problem.
+
+Useful links:
+ - [Extended Events Microsoft Docs](https://docs.microsoft.com/en-us/sql/relational-databases/extended-events/extended-events)
+ - [Find Your Dark Queries](http://michaeljswart.com/2017/04/finding-your-dark-queries/)
+ - [Finding Blocked Processes and Deadlocks using SQL Server Extended Events](https://www.brentozar.com/archive/2014/03/extended-events-doesnt-hard/)
+ - [What event information can I get by default from SQL Server?](http://dba.stackexchange.com/questions/48052/what-event-information-can-i-get-by-default-from-sql-server)
+ - [Understanding the sql_text Action in Extended Events](https://www.sqlskills.com/blogs/jonathan/understanding-the-sql_text-action-in-extended-events/)
+ - [Extended Events Series (1 of 31) – An Overview of Extended Events](https://www.sqlskills.com/blogs/jonathan/extended-events-overview/)
+ - [Deep dive into the Extended Events Histogram target](https://www.sqlshack.com/deep-dive-into-the-extended-events-histogram-target/)
+ - [Paul S. Randal articles about extended events](https://www.sqlskills.com/blogs/paul/category/extended-events/)
+ - [Jonathan Kehayias articles about extended events](https://www.sqlskills.com/blogs/jonathan/category/extended-events/)
+ - [Jonathan Kehayias extended 31 day series](https://www.sqlskills.com/blogs/jonathan/category/xevent-a-day-series/)
+ - [Erin Stellato articles about extended events](https://www.sqlskills.com/blogs/erin/category/extended-events/)
+ - [Stairway to SQL Server Extended Events](http://www.sqlservercentral.com/stairway/134867/) (by Erin Stellato)
+ - [Measuring “Observer Overhead” of SQL Trace vs. Extended Events](https://sqlperformance.com/2012/10/sql-trace/observer-overhead-trace-extended-events) (by Jonathan Kehayias)
+
+Courses:
+ - [SQL Server: Introduction to Extended Events](https://www.pluralsight.com/courses/sqlserver-basicxevents) (by Jonathan Kehayias)
+ - [SQL Server: Advanced Extended Events](https://www.pluralsight.com/courses/sqlserver-advanced-xevents) (by Jonathan Kehayias)
+ - [SQL Server: Replacing Profiler with Extended Events](https://www.pluralsight.com/courses/sqlserver-replacing-profiler-extended-events) (by Erin Stellato)
diff --git a/Extended_Events/Recompile_Histogram.sql b/Extended_Events/Recompile_Histogram.sql
new file mode 100644
index 00000000..20719a2b
--- /dev/null
+++ b/Extended_Events/Recompile_Histogram.sql
@@ -0,0 +1,24 @@
+CREATE EVENT SESSION Recompile_Histogram ON SERVER
+ ADD EVENT sqlserver.sql_statement_recompile
+ ADD TARGET package0.histogram (
+ SET filtering_event_name=N'sqlserver.sql_statement_recompile',
+ source=N'recompile_cause',
+ source_type=(0) );
+
+ALTER EVENT SESSION Recompile_Histogram ON SERVER STATE = START;
+
+SELECT sv.subclass_name as recompile_cause,
+ shredded.recompile_count
+ FROM sys.dm_xe_session_targets AS xet
+ JOIN sys.dm_xe_sessions AS xe
+ ON (xe.address = xet.event_session_address)
+ CROSS APPLY ( SELECT CAST(xet.target_data as xml) ) as target_data_xml ([xml])
+ CROSS APPLY target_data_xml.[xml].nodes('/HistogramTarget/Slot') AS nodes (slot_data)
+ CROSS APPLY (
+ SELECT nodes.slot_data.value('(value)[1]', 'int') AS recompile_cause,
+ nodes.slot_data.value('(@count)[1]', 'int') AS recompile_count
+ ) as shredded
+ JOIN sys.trace_subclass_values AS sv
+ ON shredded.recompile_cause = sv.subclass_value
+ WHERE xe.name = 'Recompile_Histogram'
+ AND sv.trace_event_id = 37 -- SP:Recompile;
diff --git a/Extended_Events/TrackPageSplits.sql b/Extended_Events/TrackPageSplits.sql
new file mode 100644
index 00000000..c35133ed
--- /dev/null
+++ b/Extended_Events/TrackPageSplits.sql
@@ -0,0 +1,70 @@
+/*
+Original link: https://www.sqlskills.com/blogs/jonathan/tracking-problematic-pages-splits-in-sql-server-2012-extended-events-no-really-this-time/
+Author: Wayne Sheffield
+*/
+-- If the Event Session exists DROP it
+IF EXISTS (SELECT 1
+ FROM sys.server_event_sessions
+ WHERE name = 'TrackPageSplits')
+ DROP EVENT SESSION [TrackPageSplits] ON SERVER;
+
+-- Create the Event Session to track LOP_DELETE_SPLIT transaction_log operations in the server
+CREATE EVENT SESSION [TrackPageSplits]
+ON SERVER
+ADD EVENT sqlserver.transaction_log(
+ WHERE operation = 11 -- LOP_DELETE_SPLIT
+)
+ADD TARGET package0.histogram(
+ SET filtering_event_name = 'sqlserver.transaction_log',
+ source_type = 0, -- Event Column
+ source = 'database_id');
+GO
+
+-- Start the Event Session
+ALTER EVENT SESSION [TrackPageSplits] ON SERVER STATE=START;
+GO
+
+
+-- Query the target data to identify the worst splitting database_id
+SELECT
+ n.value('(value)[1]', 'bigint') AS database_id,
+ DB_NAME(n.value('(value)[1]', 'bigint')) AS database_name,
+ n.value('(@count)[1]', 'bigint') AS split_count
+FROM
+(SELECT CAST(target_data as XML) target_data
+ FROM sys.dm_xe_sessions AS s
+ JOIN sys.dm_xe_session_targets t
+ ON s.address = t.event_session_address
+ WHERE s.name = 'SQLskills_TrackPageSplits'
+ AND t.target_name = 'histogram' ) as tab
+CROSS APPLY target_data.nodes('HistogramTarget/Slot') as q(n);
+
+
+-- Query Target Data to get the top splitting objects in the database:
+SELECT
+ o.name AS table_name,
+ i.name AS index_name,
+ tab.split_count,
+ i.fill_factor
+FROM ( SELECT
+ n.value('(value)[1]', 'bigint') AS alloc_unit_id,
+ n.value('(@count)[1]', 'bigint') AS split_count
+ FROM
+ (SELECT CAST(target_data as XML) target_data
+ FROM sys.dm_xe_sessions AS s
+ JOIN sys.dm_xe_session_targets t
+ ON s.address = t.event_session_address
+ WHERE s.name = 'TrackPageSplits'
+ AND t.target_name = 'histogram' ) as tab
+ CROSS APPLY target_data.nodes('HistogramTarget/Slot') as q(n)
+) AS tab
+JOIN sys.allocation_units AS au
+ ON tab.alloc_unit_id = au.allocation_unit_id
+JOIN sys.partitions AS p
+ ON au.container_id = p.partition_id
+JOIN sys.indexes AS i
+ ON p.object_id = i.object_id
+ AND p.index_id = i.index_id
+JOIN sys.objects AS o
+ ON p.object_id = o.object_id
+WHERE o.is_ms_shipped = 0;
\ No newline at end of file
diff --git a/Extended_Events/TrackTFChange.sql b/Extended_Events/TrackTFChange.sql
new file mode 100644
index 00000000..23709bfb
--- /dev/null
+++ b/Extended_Events/TrackTFChange.sql
@@ -0,0 +1,49 @@
+/*
+Original link: http://jasonbrimhall.info/2018/12/06/capture-the-flag-the-trace-flag/
+Author: Jason Brimhall
+*/
+-- If the Event Session exists DROP it
+IF EXISTS (SELECT 1 FROM sys.server_event_sessions WHERE name = N'TrackTFChange')
+ DROP EVENT SESSION TrackTFChange ON SERVER;
+
+CREATE EVENT SESSION TrackTFChange ON SERVER
+ADD EVENT sqlserver.trace_flag_changed(
+ ACTION (sqlserver.database_name,sqlserver.client_hostname,sqlserver.client_app_name,
+ sqlserver.sql_text,
+ sqlserver.session_id)
+ -- WHERE sqlserver.client_app_name <> 'Microsoft SQL Server Management Studio - Transact-SQL IntelliSense'
+ )
+ADD TARGET package0.ring_buffer
+WITH (MAX_DISPATCH_LATENCY=5SECONDS, TRACK_CAUSALITY=ON);
+GO
+
+ALTER EVENT SESSION TrackTFChange ON SERVER STATE = START;
+GO
+
+
+SELECT event_data.value('(event/@name)[1]', 'varchar(50)') AS event_name
+ , event_data.value('(event/@timestamp)[1]','varchar(max)') as timestamp
+ , event_data.value('(event/data[@name="flag"]/value)[1]', 'bigint') AS TraceFlag
+ , event_data.value('(event/data[@name="type"]/text)[1]', 'varchar(max)') AS FlagType
+ , CASE event_data.value('(event/data[@name="new_value"]/value)[1]','int')
+ WHEN 0 then 'Enabled'
+ WHEN 1 then 'Disabled'
+ END as NewValue
+ , event_data.value('(event/action[@name="sql_text"]/value)[1]', 'varchar(max)') AS sql_text
+ , event_data.value('(event/action[@name="database_name"]/value)[1]', 'varchar(max)') AS DBQueryExecutedFrom
+ , event_data.value('(event/action[@name="client_hostname"]/value)[1]', 'varchar(max)') AS ClientHost
+ , event_data.value('(event/action[@name="client_app_name"]/value)[1]', 'varchar(max)') AS appname
+ , event_data.value('(event/action[@name="session_id"]/value)[1]', 'varchar(max)') AS session_id
+FROM(SELECT evnt.query('.') AS event_data
+ FROM
+ ( SELECT CAST(target_data AS xml) AS TargetData
+ FROM sys.dm_xe_sessions AS s
+ INNER JOIN sys.dm_xe_session_targets AS t
+ ON s.address = t.event_session_address
+ WHERE s.name = 'TrackTFChange'
+ AND t.target_name = 'ring_buffer'
+ ) AS tab
+ CROSS APPLY TargetData.nodes ('RingBufferTarget/event') AS split(evnt)
+ ) AS evts(event_data)
+WHERE event_data.value('(event/@name)[1]', 'varchar(50)') = 'trace_flag_changed'
+ORDER BY timestamp ASC;
diff --git a/Extended_Events/system_health.sql b/Extended_Events/system_health.sql
new file mode 100644
index 00000000..9d846ccd
--- /dev/null
+++ b/Extended_Events/system_health.sql
@@ -0,0 +1,50 @@
+/*
+Author:
+Original link: https://blog.sqlauthority.com/2017/01/09/sql-server-get-historical-deadlock-information-system-health-extended-events/
+http://sqlworldwide.com/sql-server-system_health-session-retention
+*/
+CREATE EVENT SESSION [system_health] ON SERVER
+ADD EVENT sqlclr.clr_allocation_failure(
+ ACTION(package0.callstack,sqlserver.session_id)),
+ADD EVENT sqlclr.clr_virtual_alloc_failure(
+ ACTION(package0.callstack,sqlserver.session_id)),
+ADD EVENT sqlos.memory_broker_ring_buffer_recorded,
+ADD EVENT sqlos.memory_node_oom_ring_buffer_recorded(
+ ACTION(package0.callstack,sqlserver.session_id,sqlserver.sql_text,sqlserver.tsql_stack)),
+ADD EVENT sqlos.process_killed(
+ ACTION(package0.callstack,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.client_pid,sqlserver.query_hash,sqlserver.session_id,sqlserver.session_nt_username)),
+ADD EVENT sqlos.scheduler_monitor_deadlock_ring_buffer_recorded,
+ADD EVENT sqlos.scheduler_monitor_non_yielding_iocp_ring_buffer_recorded,
+ADD EVENT sqlos.scheduler_monitor_non_yielding_ring_buffer_recorded,
+ADD EVENT sqlos.scheduler_monitor_non_yielding_rm_ring_buffer_recorded,
+ADD EVENT sqlos.scheduler_monitor_stalled_dispatcher_ring_buffer_recorded,
+ADD EVENT sqlos.scheduler_monitor_system_health_ring_buffer_recorded,
+ADD EVENT sqlos.wait_info(
+ ACTION(package0.callstack,sqlserver.session_id,sqlserver.sql_text)
+ WHERE ([duration]>(15000) AND ([wait_type]>=N'LATCH_NL' AND ([wait_type]>=N'PAGELATCH_NL' AND [wait_type]<=N'PAGELATCH_DT' OR [wait_type]<=N'LATCH_DT' OR [wait_type]>=N'PAGEIOLATCH_NL' AND [wait_type]<=N'PAGEIOLATCH_DT' OR [wait_type]>=N'IO_COMPLETION' AND [wait_type]<=N'NETWORK_IO' OR [wait_type]=N'RESOURCE_SEMAPHORE' OR [wait_type]=N'SOS_WORKER' OR [wait_type]>=N'FCB_REPLICA_WRITE' AND [wait_type]<=N'WRITELOG' OR [wait_type]=N'CMEMTHREAD' OR [wait_type]=N'TRACEWRITE' OR [wait_type]=N'RESOURCE_SEMAPHORE_MUTEX') OR [duration]>(30000) AND [wait_type]<=N'LCK_M_RX_X'))), ADD EVENT sqlos.wait_info_external( ACTION(package0.callstack,sqlserver.session_id,sqlserver.sql_text) WHERE ([duration]>(5000) AND ([wait_type]>=N'PREEMPTIVE_OS_GENERICOPS' AND [wait_type]<=N'PREEMPTIVE_OS_ENCRYPTMESSAGE' OR [wait_type]>=N'PREEMPTIVE_OS_INITIALIZESECURITYCONTEXT' AND [wait_type]<=N'PREEMPTIVE_OS_QUERYSECURITYCONTEXTTOKEN' OR [wait_type]>=N'PREEMPTIVE_OS_AUTHZGETINFORMATIONFROMCONTEXT' AND [wait_type]<=N'PREEMPTIVE_OS_REVERTTOSELF' OR [wait_type]>=N'PREEMPTIVE_OS_CRYPTACQUIRECONTEXT' AND [wait_type]<=N'PREEMPTIVE_OS_DEVICEOPS' OR [wait_type]>=N'PREEMPTIVE_OS_NETGROUPGETUSERS' AND [wait_type]<=N'PREEMPTIVE_OS_NETUSERMODALSGET' OR [wait_type]>=N'PREEMPTIVE_OS_NETVALIDATEPASSWORDPOLICYFREE' AND [wait_type]<=N'PREEMPTIVE_OS_DOMAINSERVICESOPS' OR [wait_type]=N'PREEMPTIVE_OS_VERIFYSIGNATURE' OR [duration]>(45000) AND ([wait_type]>=N'PREEMPTIVE_OS_SETNAMEDSECURITYINFO' AND [wait_type]<=N'PREEMPTIVE_CLUSAPI_CLUSTERRESOURCECONTROL' OR [wait_type]>=N'PREEMPTIVE_OS_RSFXDEVICEOPS' AND [wait_type]<=N'PREEMPTIVE_OS_DSGETDCNAME' OR [wait_type]>=N'PREEMPTIVE_OS_DTCOPS' AND [wait_type]<=N'PREEMPTIVE_DTC_ABORT' OR [wait_type]>=N'PREEMPTIVE_OS_CLOSEHANDLE' AND [wait_type]<=N'PREEMPTIVE_OS_FINDFILE' OR [wait_type]>=N'PREEMPTIVE_OS_GETCOMPRESSEDFILESIZE' AND [wait_type]<=N'PREEMPTIVE_ODBCOPS' OR [wait_type]>=N'PREEMPTIVE_OS_DISCONNECTNAMEDPIPE' AND [wait_type]<=N'PREEMPTIVE_CLOSEBACKUPMEDIA' OR [wait_type]=N'PREEMPTIVE_OS_AUTHENTICATIONOPS' OR [wait_type]=N'PREEMPTIVE_OS_FREECREDENTIALSHANDLE' OR [wait_type]=N'PREEMPTIVE_OS_AUTHORIZATIONOPS' OR [wait_type]=N'PREEMPTIVE_COM_COCREATEINSTANCE' OR [wait_type]=N'PREEMPTIVE_OS_NETVALIDATEPASSWORDPOLICY' OR [wait_type]=N'PREEMPTIVE_VSS_CREATESNAPSHOT')))), ADD EVENT sqlserver.connectivity_ring_buffer_recorded(SET collect_call_stack=(1)), ADD EVENT sqlserver.error_reported( ACTION(package0.callstack,sqlserver.database_id,sqlserver.session_id,sqlserver.sql_text,sqlserver.tsql_stack) WHERE ([severity]>=(20) OR ([error_number]=(17803) OR [error_number]=(701) OR [error_number]=(802) OR [error_number]=(8645) OR [error_number]=(8651) OR [error_number]=(8657) OR [error_number]=(8902) OR [error_number]=(41354) OR [error_number]=(41355) OR [error_number]=(41367) OR [error_number]=(41384) OR [error_number]=(41336) OR [error_number]=(41309) OR [error_number]=(41312) OR [error_number]=(41313)))),
+ADD EVENT sqlserver.security_error_ring_buffer_recorded(SET collect_call_stack=(1)),
+ADD EVENT sqlserver.sp_server_diagnostics_component_result(SET collect_data=(1)
+ WHERE ([sqlserver].[is_system]=(1) AND [component]<>(4))),
+ADD EVENT sqlserver.sql_exit_invoked(
+ ACTION(package0.callstack,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.client_pid,sqlserver.query_hash,sqlserver.session_id,sqlserver.session_nt_username)),
+ADD EVENT sqlserver.xml_deadlock_report
+ADD TARGET package0.event_file(SET filename=N'system_health.xel',max_file_size=(5),max_rollover_files=(4)),
+ADD TARGET package0.ring_buffer(SET max_events_limit=(5000),max_memory=(4096))
+WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=120 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=ON)
+GO
+
+ALTER EVENT SESSION [system_health]
+ON SERVER STATE = STOP
+GO
+ALTER EVENT SESSION [system_health]
+ON SERVER DROP TARGET package0.event_file
+ALTER EVENT SESSION [system_health]
+ON SERVER ADD TARGET package0.event_file
+ (SET FILENAME=N'system_health.xel',--name of the session
+ max_file_size=(25), --size of each file in MB
+ max_rollover_files=(40)) --how many files you want to keep
+GO
+
+ALTER EVENT SESSION [system_health]
+ON SERVER STATE = START;
+GO
\ No newline at end of file
diff --git a/Help/README.md b/Help/README.md
new file mode 100644
index 00000000..2dae4b4c
--- /dev/null
+++ b/Help/README.md
@@ -0,0 +1,19 @@
+# SQL Help
+
+Need free help? Just follow this simple step:
+1. [Join GitHub](https://github.com/join)
+2. Add star to this repo
+3. Open new issue with a detailed explanation of your problem
+
+## How to ask right?
+
+1. [Create issue](https://github.com/ktaranov/sqlserver-kit/issues/new) in this repo or question on stackoverflow.com
+2. Include:
+ 1. Operation system with detailed version (Windows, Ubuntu, Macos etc.). Example: `Microsoft Windows [Version 10.0.16299.248]`
+ 2. Relation database type (SQL Server preferred, Orcale, MySQL, PostgreSQL, SQLite etc.) with detailed version. Example: `Microsoft SQL Server 2017 (RTM-CU1) (KB4038634) - 14.0.3006.16 (X64) ... on Windows 10 Pro 10.0`
+ 3. Demo script (if necessary) to reproduce your problem.
+3. Distribute your question using this channels:
+ 1. [Twitter #sqlhelp](https://twitter.com/search?q=%23sqlhelp&src=tyah) with `#sqlhelp` hash tag
+ 2. [Slack #sqlhelp](https://sqlcommunity.slack.com/messages/sqlhelp/) (more than 700 People)
+ 3. [SQLServerCentral Forum](https://www.sqlservercentral.com/Forums/)
+ 4. Telegram chat (Russian preferred): https://t.me/sqlcom
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 00000000..2ca2ad5f
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2015-2018 Konstantin Taranov
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/LICENSE.md b/LICENSE.md
deleted file mode 100644
index 8c5ce02c..00000000
--- a/LICENSE.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# The MIT License (MIT)
-
-Copyright (c) 2016 Konstantin Taranov
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/PowerShell/Add-UserToRole.ps1 b/PowerShell/Add-UserToRole.ps1
new file mode 100644
index 00000000..6786cfad
--- /dev/null
+++ b/PowerShell/Add-UserToRole.ps1
@@ -0,0 +1,93 @@
+#Requires -module sqlserver
+#Requires -module dbatools
+
+#Link: https://sqldbawithabeard.com/2017/03/06/quickly-creating-test-users-in-sql-server-with-powershell-using-the-sqlserver-module-and-dbatools
+
+### Define some variables
+$server = ''
+$Password = "Password"
+$Database = 'TheBeardsDatabase'
+$Admins = Get-Content 'C:\temp\Admins.txt'
+$Users = Get-Content 'C:\temp\Users.txt'
+$LoginType = 'SQLLogin'
+$userrole = 'Users'
+$adminrole = 'Admin'
+
+# Create a SQL Server SMO Object
+$srv = Connect-DbaSqlServer -SqlServer $server
+$db = $srv.Databases[$Database]
+
+function Add-UserToRole
+{
+param
+(
+[Parameter(Mandatory=$true,
+ValueFromPipeline=$true,
+ValueFromPipelineByPropertyName=$true,
+ValueFromRemainingArguments=$false)]
+[ValidateNotNullOrEmpty()]
+[string]$Password,
+[Parameter(Mandatory=$true,
+ValueFromPipeline=$true,
+ValueFromPipelineByPropertyName=$true,
+ValueFromRemainingArguments=$false)]
+[ValidateNotNullOrEmpty()]
+[string]$User,
+[Parameter(Mandatory=$true,
+ValueFromPipeline=$true,
+ValueFromPipelineByPropertyName=$true,
+ValueFromRemainingArguments=$false)]
+[ValidateNotNullOrEmpty()]
+[string]$Server,
+[Parameter(Mandatory=$true,
+ValueFromPipeline=$true,
+ValueFromPipelineByPropertyName=$true,
+ValueFromRemainingArguments=$false)]
+[ValidateNotNullOrEmpty()]
+[string]$Role,
+[Parameter(Mandatory=$true,
+ValueFromPipeline=$true,
+ValueFromPipelineByPropertyName=$true,
+ValueFromRemainingArguments=$false)]
+[ValidateSet("SQLLogin", "WindowsGroup", "WindowsUser")]
+[string]$LoginType
+)
+
+if(!($srv.Logins.Contains($User)))
+{
+if($LoginType -eq 'SQLLogin')
+{
+$Pass = ConvertTo-SecureString -String $Password -AsPlainText -Force
+$Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, $Pass
+Add-SqlLogin -ServerInstance $Server -LoginName $User -LoginType $LoginType -DefaultDatabase tempdb -Enable -GrantConnectSql -LoginPSCredential $Credential
+}
+elseif($LoginType -eq 'WindowsGroup' -or $LoginType -eq 'WindowsUser')
+{
+Add-SqlLogin -ServerInstance $Server -LoginName $User -LoginType $LoginType -DefaultDatabase tempdb -Enable -GrantConnectSql
+}
+}
+if (!($db.Users.Contains($User)))
+{
+
+# Add user to database
+
+$usr = New-Object ('Microsoft.SqlServer.Management.Smo.User') ($db, $User)
+$usr.Login = $User
+$usr.Create()
+
+}
+#Add User to the Role
+$db.roles[$role].AddMember($User)
+}
+
+foreach($User in $Users)
+{
+Add-UserToRole -Password $Password -User $user -Server $server -Role $Userrole -LoginType SQLLogin
+}
+
+foreach($User in $Admins)
+{
+Add-UserToRole -Password $Password -User $user -Server $server -Role $adminrole -LoginType SQLLogin
+}
+
+Get-DbaRoleMember -SqlInstance $server |ogv
\ No newline at end of file
diff --git a/PowerShell/Clone-SQLLogin.ps1 b/PowerShell/Clone-SQLLogin.ps1
new file mode 100644
index 00000000..26ea2ea0
--- /dev/null
+++ b/PowerShell/Clone-SQLLogin.ps1
@@ -0,0 +1,304 @@
+<#
+.Synopsis
+ Clone a SQL Server Login based on another exsiting login.
+
+.DESCRIPTION
+ Clone a SQL Server Login based on another exsiting login on one or multiple servers and the process can generate a script for auditing purpose.
+
+.EXAMPLE
+ The following command scripts out the permissions of login account [John] and generates the script at "c:\temp\clone.sql"
+ Notice, parameters [OldLogin] and [NewLogin] uses the same value of "John"
+ Clone-SQLLogin -Server Server1, Server2 -OldLogin John -NewLogin John -FilePath "c:\temp\clone.sql"
+
+.EXAMPLE
+ The following command exports a script that can be used to clone login account [John] for new login account [David], and the script is created at "c:\temp\clone.sql"
+ also the -Execute parameter means the new account "David" will be created
+ Clone-SQLLogin -Server Server1, Server2 -OldLogin John -NewLogin David -NewPassword 'P@$$W0rd' -FilePath "c:\temp\clone.sql" -Execute;
+
+.Parameter ServerInstance
+ ServerInstance is of string array datat ype, and can accept a string of sql instance names, spearated by comma. (mandatory)
+
+.Parameter OldLogin
+ The login account is the source where all the permissions will be scripted out and to be used for the NewLogin account (mandatory)
+
+.Parameter NewLogin
+ The login account is the target account that we want to clone (mandatory)
+
+.Parameter NewPassword
+ The password for the new login account if we want to create the login, default to empty string "" (optional)
+
+.Parameter FilePath
+ The full path name for the generated sql script (optional)
+
+.Parameter Execute
+ This is a swich parameter, if present, it means we need to create the NewLogin account.
+
+.OUTPUTS
+ none
+
+.NOTES
+ A few service broker related permissions are not covered in this version 1.
+ Original link: https://www.mssqltips.com/sqlservertip/4572/cloning-a-sql-server-login-with-all-permissions-using-powershell/
+ Author: Jeffrey Yao
+#>
+#requires -version 3.0
+add-type -assembly "Microsoft.SqlServer.Smo, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"; #if Version-11.xx means sql server 2012
+
+function Clone-SQLLogin
+{
+ [CmdletBinding(SupportsShouldProcess=$true)]
+
+ Param
+ (
+ # Param1 help description
+ [Parameter(Mandatory=$true,
+ ValueFromPipeline=$true,
+ Position=0)]
+ [string[]] $ServerInstance,
+
+ [Parameter(Mandatory=$true)]
+ [string] $OldLogin,
+
+ [Parameter(Mandatory=$true)]
+ [string] $NewLogin,
+
+ [string] $NewPassword="",
+
+ [string] $FilePath="",
+ [switch] $Execute
+ )
+
+ Begin
+ {
+ [string]$newUser=$newLogin.Substring($newLogin.IndexOf('\')+1); # if $newLogin is a Windows account, such as domain\username, since "\" is invalid in db user name, we need to remove it
+
+ [hashtable[]] $hta = @(); # a hashtable array
+ [hashtable] $h = @{};
+
+
+ if ( ($FilePath -ne "") -and (test-path -Path $FilePath))
+ { del -Path $filepath; }
+ }
+ Process
+ {
+
+ foreach ($sqlinstance in $ServerInstance)
+ {
+
+ $svr = new-object "Microsoft.SqlServer.Management.Smo.Server" $sqlinstance;
+ if ($svr.Edition -eq $null)
+ {
+ Write-warning "$sqlinstance cannot be connected";
+ continue;
+ }
+
+ [string]$str = "";
+
+ if (-not $WindowsLogin)
+ {
+ $str += "create login $($newLogin) with password='$($newPassword)'; `r`n"
+ }
+ else
+ {
+ $str += "create login $($newLogin) from windows;`r`n "
+ }
+
+ #find role membership for $login
+ if ($svr.logins[$OldLogin] -ne $null)
+ { $svr.logins[$oldLogin].ListMembers() | % {$str += "exec sp_addsrvrolemember @loginame = '$($newLogin)', @rolename = '$($_)'; `r`n"};}
+ else
+ { Write-warning "$oldLogin does not exist on server [$($svr.name)] so this sql instance is skipped"; continue; }
+
+ # find permission granted to $login
+
+
+ $svr.EnumObjectPermissions($oldLogin) | % { if ($_.PermissionState -eq 'GrantWithGrant')
+ {$str += "GRANT $($_.PermissionType) on $($_.ObjectClass)::[$($_.ObjectName)] to [$newLogin] WITH GRANT OPTION; `r`n"}
+ else
+ { $str += "$($_.PermissionState) $($_.PermissionType) on $($_.ObjectClass)::[$($_.ObjectName)] to [$newLogin]; `r`n"} }
+
+ $svr.EnumServerPermissions($oldLogin) | % { if ($_.PermissionState -eq 'GrantWithGrant')
+ { $str += "GRANT $($_.PermissionType) to [$newLogin] WITH GRANT OPTION; `r`n"}
+ else
+ { $str += "$($_.PermissionState) $($_.PermissionType) to [$newLogin]; `r`n" } }
+
+ $h = @{Server=$sqlinstance; DBName = 'master'; sqlcmd = $str};
+ $hta += $h;
+ #$str;
+
+
+ $ObjPerms = @(); # store login mapped users in each db on $svr
+ $Roles = @();
+ $DBPerms = @();
+ foreach ($itm in $svr.logins[$oldLogin].EnumDatabaseMappings())
+ {
+ if ($svr.Databases[$itm.DBName].Status -ne 'Normal')
+ { continue;}
+
+ if ($svr.Databases[$itm.DBName].Users[$newUser] -eq $null)
+ { $hta += @{Server=$sqlinstance; DBName = $itm.DBName; sqlcmd = "create user [$newUser] for login [$newLogin];`r`n" }; }
+
+ $r = $svr.Databases[$itm.DBName].Users[$itm.UserName].EnumRoles();
+ if ($r -ne $null)
+ {
+ $r | % { $hta += @{Server=$sqlinstance; DBName = $itm.DBName; sqlcmd = "exec sp_addrolemember @rolename='$_', @memberName='$($newUser)';`r`n" } }
+ }
+
+
+ $p = $svr.Databases[$itm.DBName].EnumDatabasePermissions($itm.UserName);
+ if ($p -ne $null)
+ { $ObjPerms += @{DBName=$itm.DBName; Permission=$p};}
+
+ $p = $svr.Databases[$itm.DBName].EnumObjectPermissions($itm.UserName)
+ if ($p -ne $null)
+ { $ObjPerms += @{DBName=$itm.DBName; Permission=$p}; }
+
+ $p = $svr.Databases[$itm.DBName].Certificates | % {$_.EnumObjectPermissions($itm.UserName)}
+ if ($p -ne $null)
+ { $ObjPerms += @{DBName=$itm.DBName; Permission=$p};}
+
+ #AsymmetricKeys
+ $p = $svr.Databases[$itm.DBName].AsymmetricKeys | % {$_.EnumObjectPermissions($itm.UserName)}
+ if ($p -ne $null)
+ { $ObjPerms += @{DBName=$itm.DBName; Permission=$p}; }
+
+ #SymmetricKeys
+ $p = $svr.Databases[$itm.DBName].SymmetricKeys | % {$_.EnumObjectPermissions($itm.UserName)}
+ if ($p -ne $null)
+ { $ObjPerms += @{DBName=$itm.DBName; Permission=$p};}
+
+ #XMLSchemaCollections
+ $p = $svr.Databases[$itm.DBName].XMLSchemaCollections | % {$_.EnumObjectPermissions($itm.UserName)}
+ if ($p -ne $null)
+ { $ObjPerms += @{DBName=$itm.DBName; Permission=$p};}
+
+ #service broker components
+ $p = $svr.Databases[$itm.DBName].ServiceBroker.MessageTypes | % {$_.EnumObjectPermissions($itm.UserName)}
+ if ($p -ne $null)
+ { $ObjPerms += @{DBName=$itm.DBName; Permission=$p};}
+
+ $p = $svr.Databases[$itm.DBName].ServiceBroker.Routes | % {$_.EnumObjectPermissions($itm.UserName)}
+ if ($p -ne $null)
+ { $ObjPerms += @{DBName=$itm.DBName; Permission=$p};}
+
+ $p = $svr.Databases[$itm.DBName].ServiceBroker.ServiceContracts | % {$_.EnumObjectPermissions($itm.UserName)}
+ if ($p -ne $null)
+ { $ObjPerms += @{DBName=$itm.DBName; Permission=$p};}
+
+ $p = $svr.Databases[$itm.DBName].ServiceBroker.Services | % {$_.EnumObjectPermissions($itm.UserName)}
+ if ($p -ne $null)
+ { $ObjPerms += @{DBName=$itm.DBName; Permission=$p};}
+
+ #Full text
+ $p = $svr.Databases[$itm.DBName].FullTextCatalogs | % {$_.EnumObjectPermissions($itm.UserName)}
+ if ($p -ne $null)
+ { $ObjPerms += @{DBName=$itm.DBName; Permission=$p};}
+
+ $p = $svr.Databases[$itm.DBName].FullTextStopLists | % {$_.EnumObjectPermissions($itm.UserName)}
+ if ($p -ne $null)
+ { $ObjPerms += @{DBName=$itm.DBName; Permission=$p};}
+ }
+
+
+ #generate t-sql to apply permission using SMO only
+ #[string]$str = ([System.String]::Empty)
+ foreach ($pr in $ObjPerms)
+ {
+
+ $h = @{Server=$sqlinstance; DBName=$($pr.DBName); sqlcmd=""};
+ $str = "" #"use $($pr.DBName) `r`n"
+ foreach ($p in $pr.Permission)
+ {
+ [string]$op_state = $p.PermissionState;
+
+ if ($p.ObjectClass -ne "ObjectOrColumn")
+ {
+ [string] $schema = "";
+
+ if ($p.ObjectSchema -ne $null)
+ { $schema = "$($p.ObjectSchema)."}
+
+ [string]$option = "";
+
+ if ($op_state -eq "GRANTwithGrant")
+ {
+ $op_state = 'GRANT';
+ $option = ' WITH GRANT OPTION';
+ }
+
+
+ Switch ($p.ObjectClass)
+ {
+ 'Database' { $str += "$op_state $($p.PermissionType) to [$newUser]$option;`r`n";}
+ 'SqlAssembly' { $str += "$op_state $($p.PermissionType) ON Assembly::$($schema)$($p.ObjectName) to [$newUser]$option;`r`n";}
+ 'Schema' { $str += "$op_state $($p.PermissionType) ON SCHEMA::$($schema)$($p.ObjectName) to [$newUser]$option;`r`n";}
+ 'UserDefinedType' { $str += "$op_state $($p.PermissionType) ON TYPE::$($schema)$($p.ObjectName) to [$newUser]$option;`r`n";}
+ 'AsymmetricKey' { $str += "$op_state $($p.PermissionType) ON ASYMMETRIC KEY::$($schema)$($p.ObjectName) to [$newUser]$option;`r`n";}
+ 'SymmetricKey' { $str += "$op_state $($p.PermissionType) ON SYMMETRIC KEY::$($schema)$($p.ObjectName) to [$newUser]$option;`r`n";}
+ 'Certificate' { $str += "$op_state $($p.PermissionType) ON Certificate::$($schema)$($p.ObjectName) to [$newUser]$option`r`n";}
+ 'XmlNamespace' { $str += "$op_state $($p.PermissionType) ON XML SCHEMA COLLECTION::$($schema)$($p.ObjectName) to [$newUser]$option`r`n";}
+ 'FullTextCatalog' { $str += "$op_state $($p.PermissionType) ON FullText Catalog::$($schema)[$($p.ObjectName)] to [$newUser]$option`r`n";}
+ 'FullTextStopList' { $str += "$op_state $($p.PermissionType) ON FullText Stoplist::$($schema)[$($p.ObjectName)] to [$newUser]$option`r`n";}
+ 'MessageType' { $str += "$op_state $($p.PermissionType) ON Message Type::$($schema)[$($p.ObjectName)] to [$newUser]$option`r`n";}
+ 'ServiceContract' { $str += "$op_state $($p.PermissionType) ON Contract::$($schema)[$($p.ObjectName)] to [$newUser]$option`r`n";}
+ 'ServiceRoute' { $str += "$op_state $($p.PermissionType) ON Route::$($schema)[$($p.ObjectName)] to [$newUser]$option`r`n";}
+ 'Service' { $str += "$op_state $($p.PermissionType) ON Service::$($schema)[$($p.ObjectName)] to [$newUser]$option`r`n";}
+ #you can add other stuff like Available Group etc in this switch block as well
+ }#switch
+
+ }
+ else
+ {
+ [string]$col = "" #if grant is on column level, we need to capture it
+ if ($p.ColumnName -ne $null)
+ { $col = "($($p.ColumnName))"};
+
+ $str += "$op_state $($p.PermissionType) ON Object::$($p.ObjectSchema).$($p.ObjectName) $col to [$newUser];`r`n";
+ }#else
+
+ }
+ #$str += "go`r`n";
+ $h.sqlcmd = $str;
+ $hta += $h;
+ }
+
+
+ }#loop $ServerInstance
+ } #process block
+ End
+ {
+ [string] $sqlcmd = "";
+
+ if ($FilePath.Length -gt 3) # $FilePath is provided
+ {
+ [string]$servername="";
+
+ foreach ($h in $hta)
+ {
+ if ($h.Server -ne $Servername)
+ {
+ $ServerName=$h.Server;
+ $sqlcmd += ":connect $servername `r`n"
+ }
+
+ $sqlcmd += "use $($h.DBName);`r`n" + $h.sqlcmd +"`r`ngo`r`n";
+
+ }
+ $sqlcmd | out-file -FilePath $FilePath -Append ;
+ }
+
+ if ($Execute)
+ {
+ foreach ($h in $hta)
+ {
+ $server = new-object "Microsoft.sqlserver.management.smo.server" $h.Server;
+ $database = $server.databases[$h.DBName];
+ $database.ExecuteNonQuery($h.sqlcmd)
+ }
+ } #$Execute
+
+ }#end block
+} #clone-sqllogin
+
+# test, change parameters to your own. The following creates a script about all permissions assigned to [Bobby]
+# Clone-SQLLogin -Server "$env:ComputerName", "$env:ComputerName\sql2014" -OldLogin Bobby -NewLogin Bobby -FilePath "c:\temp\Bobby_perm.sql";
diff --git a/PowerShell/Compare-Server-Settings.ps1 b/PowerShell/Compare-Server-Settings.ps1
new file mode 100644
index 00000000..782e8838
--- /dev/null
+++ b/PowerShell/Compare-Server-Settings.ps1
@@ -0,0 +1,25 @@
+#Requires -module dbatools
+
+<#
+.SYNOPSIS
+ Compare settings for production and development SQL Server instance
+
+.PARAMETER $productionName
+ Production server name
+
+.PARAMETER $productionName
+ Production server name
+
+.NOTE
+Original link: https://therestisjustcode.wordpress.com/2017/09/12/t-sql-tuesday-94-automating-configuration-comparison/
+Author: Andy Levy
+Modified: Konstantin Taranov 2017-09-20
+#>
+
+$productionName = 'localhost';
+$developmentName = 'localhost';
+
+$ProductionConfiguration = Get-DbaSpConfigure -ServerInstance $productionName;
+# -SqlCredential (Get-Credential -Message "Production Credentials" -UserName MySQLLogin);
+$DevelopmentConfiguration = Get-DbaSpConfigure -ServerInstance $developmentName;
+Compare-Object -ReferenceObject $DevelopmentConfiguration -DifferenceObject $ProductionConfiguration -property ConfigName, RunningValue | Sort-Object ConfigName;
diff --git a/PowerShell/Create-Deploy-SQL-Script.ps1 b/PowerShell/Create-Deploy-SQL-Script.ps1
new file mode 100644
index 00000000..ac23bf50
--- /dev/null
+++ b/PowerShell/Create-Deploy-SQL-Script.ps1
@@ -0,0 +1,207 @@
+#requires -version 4
+# https://www.red-gate.com/simple-talk/sql/database-delivery/how-to-build-and-deploy-a-database-from-object-level-source-in-a-vcs/
+<# this script uses powershell v4. It will need a bit of work if you are stuck on previous versions of PowerShell. #>
+$Server = 'SAM_540_TAR' #the name of the server
+$Instance = 'MSSQLSERVER' #The server instance
+$Database = 'NIIGAZ' #the database
+#this is the directory where you wish to place your scripts and from which they will be executed
+$DatabaseScriptPath = "$($env:HOMEDRIVE)$($env:HOMEPATH)\Documents\$($Database)"
+#in case you wish debug information
+$WarningPreference='Stop' #because if it can't connect to the database, you only get a warning
+$VerbosePreference = "SilentlyContinue"
+
+$DoWeLookForParentObjects = $true #don't change this!
+$SMO = 'Microsoft.SqlServer.Management.SMO'
+#read in the SQLPS module if it isn't in already
+import-module 'sqlps' -DisableNameChecking
+
+trap {
+ Write-Error ('Failed to access "{0}" : {1} in "{2}"' -f "$server/$instance", `
+ $_.Exception.Message, $_.InvocationInfo.ScriptName)
+ exit
+ }
+<# SMO likes to do build scripts in ObjectType order in a build script. The script starts with Database properties, followed by Schemas, XML Schema Collections and Types: none of which can have dependent objects.
+Table Types and Procedures come next. Then, in dependency order, Functions, Tables and Views. Then come Clustered indexes, non-clustered indexes, Primary XML Indexes, XML indexes, Default Constraints, Foreign keys Check constraints, triggers and lastly, extended properties.
+Here we define their order, but this order may need tweaking
+#>
+$ObjectTypeOrder = @{
+ 'users' = 1;
+ 'Roles' = 2;
+ 'Schemas' = 3;
+ 'Assemblies' = 4;
+ 'AsymmetricKeys' = 5;
+ 'Certificates' = 6;
+ 'XmlSchemaCollections' = 7;
+ 'FileGroups' = 8;
+ 'FullTextCatalogs' = 9;
+ 'FullTextStopLists' = 10;
+ 'LogFiles' = 11;
+ 'PartitionFunctions' = 12;
+ 'PartitionSchemes' = 13;
+ 'PlanGuides' = 14;
+ 'UserDefinedTypes' = 15;
+ 'UserDefinedDataTypes' = 16;
+ 'UserDefinedTableTypes' = 17;
+ 'UserDefinedAggregates' = 18;
+ 'ApplicationRoles' = 19;
+ 'Rules' = 20;
+ 'Defaults' = 21;
+ 'Tables' = 22;
+ 'StoredProcedures' = 23;
+ 'UserDefinedFunctions' = 24;
+ 'Views' = 25;
+ 'DatabaseAuditSpecifications' = 26;
+ 'SearchPropertyLists' = 27;
+ 'Sequences' = 28;
+ 'ServiceBroker' = 29;
+ 'SymmetricKeys' = 30;
+ 'Triggers' = 31;
+ 'Synonyms' = 32;
+ 'ExtendedStoredProcedures' = 33;
+ 'ExtendedProperties' = 34;
+}
+# first we access the server using the PSPath
+$Srv = get-item "SQLSERVER:\SQL\$Server\$Instance"
+#now we create all our lists of objects, using the SMO URNS to represent the object
+$urnCollection = new-object "$SMO.UrnCollection" #the objects that need sorting.
+$OrderedURNCollection = new-object "$SMO.UrnCollection" #list in the correct order
+$PostTableurnCollection = new-object "$SMO.UrnCollection" #tail of the list
+#we now determine the types we don't want to retrieve. This is complicated by a bug in SMO where the SMO doesnt check the version of the target server before asking for a type collection it doesn't know about.
+$TypesWeDontWant = '(?im)Roles|Federations'
+$pathsWritten=[array] @()
+if ([int]$srv.version.Major -gt 10) { $TypesWeDontWant = '(?im)Roles' }
+# first we access the database in order to get the object types. we get all except for the ones on our blacklist ' $TypesWeDontWant'
+Set-location "SQLSERVER:\SQL\$Server\$Instance\databases\$Database"
+Get-ChildItem | where-object{ "$($_.PSChildName))" -notmatch $TypesWeDontWant } |
+<#and now we sort them in object-dependency order so that the list of objects to script is in the order in which one would want to script them #>
+Select-Object `
+@{ E = { $ObjectTypeOrder."$_" }; N = "BuildOrder" },
+@{ E = { $_ }; N = "ObjectType" } | sort-object BuildOrder -PipelineVariable CurrentSQLObject |
+# then we get all the objects of each type in turn if there are any!
+foreach { if (test-Path "$($_.ObjectType.PSPath)") { Get-Childitem "$($_.ObjectType.PSPath)" } } |
+#get subtypes if necessary (stuff like service broker objects)
+foreach {
+ if ($_.GetType().BaseType -notlike '*smo*') { Get-Childitem "$($_.PSPath)" }
+ else { $_ }
+} |
+#and we check if the object is scriptable,
+where { ($_.PSobject.Members.name -match "script") -and ($_.Name -notmatch '(?im)AutoCreatedLocal') } |
+Foreach{
+ $urn = $_.urn
+ if ($CurrentSQLObject.BuildOrder -lt 21) { $OrderedURNCollection.add($urn) }
+ elseif ($CurrentSQLObject.BuildOrder -lt 26) { $urnCollection.add($urn) }
+ else { $PostTableurnCollection.add($urn) }
+}
+ <# discovering dependencies only works for a limited subset of objects; Views, Stored Procedures, Tables and User Defined Functions, #>
+
+#now we set up the scripter object just to do the dependency sorting
+$scr = New-Object "$SMO.Scripter"
+#now choose options for the scripter that we need to get dependency order
+$options = New-Object "$SMO.ScriptingOptions"
+$options.DriAll = $False
+$options.AllowSystemObjects = $false
+$options.WithDependencies = $False
+$scr.Options = $options
+$scr.Server = $srv
+
+#we create a dependency walker object
+$DependencyWalker = new-object ("$SMO.DependencyWalker")
+#
+#now we set up an event listnenr go get progress reports
+$ProgressReportEventHandler = [Microsoft.SqlServer.Management.Smo.ProgressReportEventHandler] { Write-Verbose "analysed '$($_.Current.GetAttribute('Name'))'" }
+$scr.add_DiscoveryProgress($ProgressReportEventHandler)
+#create the dependency tree
+$dependencyTree = $scr.DiscoverDependencies($urnCollection, $DoWeLookForParentObjects) #look for the parent objects for each object
+#and walk the dependencies to get the dependency tree.
+$depCollection = $scr.WalkDependencies($dependencyTree);
+#we just extract the root nodes and add them to the ordered list
+$Depcollection | where { $_.IsRootNode -ne 0 } | foreach{ $OrderedURNCollection.Add($_.urn) }
+#now we add the tail of the ordered list to the end
+$PostTableURNCollection | foreach{ $OrderedURNCollection.Add($_) }
+
+
+<#now set up the scripting options that you wish. This affects the code that we script out. you need to adjust this to taste. #>
+$ScrOptions = new-object ("$SMO.ScriptingOptions") #create the 'options' object
+$ScrOptions.ExtendedProperties = $true # yes we want these
+$ScrOptions.IncludeIfNotExists = $false # only build if not already there
+$ScrOptions.IncludeHeaders = $false # e.g. Object: Table xxx Script Date: xxx Date is picked up as a change */
+$ScrOptions.ToFileOnly = $true #do not echo as a string
+$ScrOptions.DRIAll = $true # and all the constraints with the tables
+$ScrOptions.AllowSystemObjects = $false # not these
+$ScrOptions.Indexes = $true # Yup, these would be nice to include with the table
+$ScrOptions.Triggers = $true # This should be included when scripting a table
+$ScrOptions.ScriptBatchTerminator = $true # this only goes to the file
+$ScrOptions.Encoding = [System.Text.Encoding]::UTF8 # otherwise git can't understand it
+
+# we now create the script directory if it doesn't already exist
+if (!(Test-Path -path $DatabaseScriptPath))
+{
+ Try { New-Item $DatabaseScriptPath -type directory | out-null }
+ Catch [system.exception]{
+ Write-Error "error while creating the '$DatabaseScriptPath' dirctory"
+ return
+ }
+}
+<# we now create the start of our SQLCMD script (think of it as a type of manifest file) to execute all these scripts in the right order #>
+$SQLCMDBuildScript=@"
+/**
+summary: >
+ This is a SQLCMD file that can be executed in SSMS if you are in SQLCMD mode, or you
+ can use the SQLCMD command-line utility
+Author: Phil Factor
+Revision: 1.5
+date: $(get-date)
+example: sqlcmd -S $server\$instance -d $($Database)Copy -i $($DatabaseScriptPath)\DatabaseBuildScript.SQL -o $($DatabaseScriptPath)\output.txt
+
+**/
+
+SET NOCOUNT ON
+GO
+PRINT 'Creating the database objects in order'
+
+
+"@
+#for each object in our ordered list of objects represented by URNs
+$OrderedURNCollection | Foreach{
+ # work out the full file path where we want to save each file
+ $fullPath = "$DatabaseScriptPath\$($_.Type)"
+ $filename = "$(if ($_.GetAttribute('Schema') -ne $null)
+ { $($_.GetAttribute('Schema') -replace '[\n\r\\\/\:\.]', '-') + '.' }
+ else { '' })$($_.GetAttribute('Name') -replace '[\n\r\\\/\:\.]', '-')_Build.sql"
+ # create the file path if it doesn't exist
+ if (!(Test-Path -path "$fullPath"))
+ {
+ Try { New-Item "$fullPath" -type directory | out-null }
+ Catch [system.exception]{
+ Write-Error "error while creating the "$fullPath" directory"
+ return
+ }
+ }
+ $ScrOptions.Filename = "$($fullpath)\$($filename)"; #tell the scripter object where to write the file
+ $srv.GetSmoObject($_).script($ScrOptions); #and script the object
+$SQLCMDBuildScript+=@"
+
+ PRINT 'creating the $($_.Type) $($_.GetAttribute('Name'))'
+ go
+ :r $($fullpath)\$($filename)
+ :On Error exit
+"@ #and write the lines into the contents of the Manifest file
+ $PathsWritten+="$($fullpath)\$($filename)"
+
+}
+$SQLCMDBuildScript+=@"
+
+PRINT 'Database creation is now complete'
+GO
+"@ #now finish off the file. By using the .NET class we write in UTF8
+
+[System.IO.File]::WriteAllLines("$DatabaseScriptPath\DatabaseBuildScript.SQL", $SQLCMDBuildScript)
+<# now we need to delete the files that don't represent current objects in the database so that all
+dropped objects are dropped in source control #>
+$PathsWritten+="$DatabaseScriptPath\DatabaseBuildScript.SQL" #to avoid getting this deleted
+<# now delete anything else #>
+$DeletedCount=0
+Get-ChildItem -path $DatabaseScriptPath -include '*.sql' -recurse |
+ where {$Pathswritten -notcontains $_.fullname} | Remove-Item |foreach{$DeletedCount+=1}
+if ($DeletedCount -gt 0) {Write-Verbose "deleted $DeletedCount file((if $DeletedCount -gt 1){'s'} else {''})"}
+"Did I do well?"
diff --git a/PowerShell/CsvSqlimport.ps1 b/PowerShell/CsvSqlimport.ps1
index 854b53eb..96ef4370 100644
--- a/PowerShell/CsvSqlimport.ps1
+++ b/PowerShell/CsvSqlimport.ps1
@@ -1,1272 +1,1272 @@
-Function Import-CsvToSql {
-<#
-.SYNOPSIS
-Efficiently imports very large (and small) CSV files into SQL Server using only the .NET Framework and PowerShell.
-
-.DESCRIPTION
-Import-CsvToSql takes advantage of .NET's super fast SqlBulkCopy class to import CSV files into SQL Server at up to 90,000
-rows a second.
-
-The entire import is contained within a transaction, so if a failure occurs or the script is aborted, no changes will persist.
-
-If the table specified does not exist, it will be automatically created using best guessed data types. In addition,
-the destination table can be truncated prior to import.
-
-The Query parameter be used to import only data returned from a SQL Query executed against the CSV file(s). This function
-supports a number of bulk copy options. Please see parameter list for details.
-
-THIS CODE IS PROVIDED "AS IS", WITH NO WARRANTIES.
-
-.PARAMETER CSV
-Required. The location of the CSV file(s) to be imported. Multiple files are allowed, so long as they are formatted
-similarly. If no CSV file is specified, a Dialog box will appear.
-
-.PARAMETER FirstRowColumns
-Optional. This parameter specifies whether the first row contains column names. If the first row does not contain column
-names and -Query is specified, use field names "column1, column2, column3" and so on.
-
-.PARAMETER Delimiter
-Optional. If you do not pass a Delimiter, then a comma will be used. Valid Delimiters include: tab "`t", pipe "|",
-semicolon ";", and space " ".
-
-.PARAMETER SqlServer
-Required. The destination SQL Server.
-
-.PARAMETER SqlCredential
-Connect to SQL Server using specified SQL Login credentials.
-
-.PARAMETER Database
-Required. The name of the database where the CSV will be imported into. This parameter is autopopulated using the
--SqlServer and -SqlCredential (optional) parameters.
-
-.PARAMETER Table
-SQL table or view where CSV will be imported into.
-
-If a table name is not specified, the table name will be automatically determined from filename, and a prompt will appear
-to confirm table name.
-
-If table does not currently exist, it will created. SQL datatypes are determined from the first row of the CSV that
-contains data (skips first row if -FirstRowColumns). Datatypes used are: bigint, numeric, datetime and varchar(MAX).
-
-If the automatically generated table datatypes do not work for you, please create the table prior to import.
-
-.PARAMETER Truncate
-Truncate table prior to import.
-
-.PARAMETER Safe
-Optional. By default, Import-CsvToSql uses StreamReader for imports. StreamReader is super fast, but may not properly parse some files.
-Safe uses OleDb to import the records, it's slower, but more predictable when it comes to parsing CSV files. A schema.ini is automatically
-generated for best results. If schema.ini currently exists in the directory, it will be moved to a temporary location, then moved back.
-
-OleDB also enables the script to use the -Query parameter, which enables you to import specific subsets of data within a CSV file. OleDB
-imports at up to 21,000 rows/sec.
-
-.PARAMETER Turbo
-Optional. Cannot be used in conjunction with -Query.
-
-Remember the Turbo button? This one actually works. Turbo is mega fast, but may not handle some datatypes as well as other methods.
-If your CSV file is rather vanilla and doesn't have a ton of NULLs, Turbo may work well for you. Note: Turbo mode uses a Table Lock.
-
-StreamReader/Turbo imports at up to 90,000 rows/sec (well, 93,000 locally for a 19 column file so, really, the number may be over
-100,000 rows/sec for tables with only a couple columns using optimized datatypes).
-
-.PARAMETER First
-Only import first X rows. Count starts at the top of the file, but skips the first row if FirstRowColumns was specifeid.
-
-Use -Query if you need advanced First (TOP) functionality.
-
-.PARAMETER Query
-Optional. Cannot be used in conjunction with -Turbo or -First. When Query is specified, the slower import method, OleDb,
-will be used.
-
-If you want to import just the results of a specific query from your CSV file, use this parameter.
-To make command line queries easy, this module will convert the word "csv" to the actual CSV formatted table name.
-If the FirstRowColumns switch is not used, the query should use column1, column2, column3, etc
-
-Example: select column1, column2, column3 from csv where column2 > 5
-Example: select distinct artist from csv
-Example: select top 100 artist, album from csv where category = 'Folk'
-
-See EXAMPLES for more example syntax.
-
-.PARAMETER TableLock
-SqlBulkCopy option. Per Microsoft "Obtain a bulk update lock for the duration of the bulk copy operation. When not
-specified, row locks are used." TableLock is automatically used when Turbo is specified.
-
-.PARAMETER CheckConstraints
-SqlBulkCopy option. Per Microsoft "Check constraints while data is being inserted. By default, constraints are not checked."
-
-.PARAMETER FireTriggers
-SqlBulkCopy option. Per Microsoft "When specified, cause the server to fire the insert triggers for the rows being inserted
-into the database."
-
-.PARAMETER KeepIdentity
-SqlBulkCopy option. Per Microsoft "Preserve source identity values. When not specified, identity values are assigned by
-the destination."
-
-.PARAMETER KeepNulls
-SqlBulkCopy option. Per Microsoft "Preserve null values in the destination table regardless of the settings for default
-values. When not specified, null values are replaced by default values where applicable."
-
-.PARAMETER shellswitch
-Internal parameter.
-
-.PARAMETER SqlCredentialPath
-Internal parameter.
-
-.NOTES
-Author: Chrissy LeMaire (@cl), netnerds.net
-
-.LINK
-https://blog.netnerds.net/2015/09/import-csvtosql-super-fast-csv-to-sql-server-import-powershell-module/
-
-.EXAMPLE
-Import-CsvToSql -Csv C:\temp\housing.csv -SqlServer sql001 -Database markets
-
-Imports the entire *comma delimited* housing.csv to the SQL "markets" database on a SQL Server named sql001.
-Since a table name was not specified, the table name is automatically determined from filename as "housing"
-and a prompt will appear to confirm table name.
-
-The first row is not skipped, as it does not contain column names.
-
-.EXAMPLE
-Import-CsvToSql -Csv .\housing.csv -SqlServer sql001 -Database markets -Table housing -First 100000 -Safe -Delimiter "`t" -FirstRowColumns
-
-Imports the first 100,000 rows of the tab delimited housing.csv file to the "housing" table in the "markets" database on a SQL Server
-named sql001. Since Safe was specified, the OleDB method will be used for the bulk import. It's assumed Safe was used because
-the first attempt without -Safe resulted in an import error. The first row is skipped, as it contains column names.
-
-.EXAMPLE
-Import-CsvToSql -csv C:\temp\huge.txt -sqlserver sqlcluster -Database locations -Table latitudes -Delimiter "|" -Turbo
-
-Imports all records from the pipe delimited huge.txt file using the fastest method possible into the latitudes table within the
-locations database. Obtains a table lock for the duration of the bulk copy operation. This specific command has been used
-to import over 10.5 million rows in 2 minutes.
-
-.EXAMPLE
-Import-CsvToSql -Csv C:\temp\housing.csv, .\housing2.csv -SqlServer sql001 -Database markets -Table `
-housing -Delimiter "`t" -query "select top 100000 column1, column3 from csv" -Truncate
-
-Truncates the "housing" table, then imports columns 1 and 3 of the first 100000 rows of the tab-delimited
-housing.csv in the C:\temp directory, and housing2.csv in the current directory. Since the query is executed against
-both files, a total of 200,000 rows will be imported.
-
-.EXAMPLE
-Import-CsvToSql -Csv C:\temp\housing.csv -SqlServer sql001 -Database markets -Table housing -query `
-"select address, zip from csv where state = 'Louisiana'" -FirstRowColumns -Truncate -FireTriggers
-
-Uses the first line to determine CSV column names. Truncates the "housing" table on the SQL Server,
-then imports the address and zip columns from all records in the housing.csv where the state equals Louisiana.
-
-Triggers are fired for all rows. Note that this does slightly slow down the import.
-
-.NOTES
- Author: Chrissy LeMaire
- Original Link: https://github.com/ctrlbold/dbatools/blob/master/Functions/CsvSqlimport.ps1
- Created Date: 2015-09-01
-
-#>
-[CmdletBinding(DefaultParameterSetName="Default")]
-Param(
- [string[]]$Csv,
- [Parameter(Mandatory=$true)]
- [string]$SqlServer,
- [object]$SqlCredential,
- [string]$Table,
- [switch]$Truncate,
- [string]$Delimiter = ",",
- [switch]$FirstRowColumns,
- [parameter(ParameterSetName="reader")]
- [switch]$Turbo,
- [parameter(ParameterSetName="ole")]
- [switch]$Safe,
- [int]$First = 0,
- [parameter(ParameterSetName="ole")]
- [string]$Query = "select * from csv",
- [int]$BatchSize = 50000,
- [int]$NotifyAfter,
- [switch]$TableLock,
- [switch]$CheckConstraints,
- [switch]$FireTriggers,
- [switch]$KeepIdentity,
- [switch]$KeepNulls,
- [switch]$shellswitch,
- [string]$SqlCredentialPath
- )
-
-DynamicParam {
-
- if ($sqlserver.length -gt 0) {
- # Auto populate database list from specified sqlserver
- $paramconn = New-Object System.Data.SqlClient.SqlConnection
-
- if ($SqlCredentialPath.length -gt 0) {
- $SqlCredential = Import-CliXml $SqlCredentialPath
- }
-
- if ($SqlCredential.count -eq 0 -or $SqlCredential -eq $null) {
- $paramconn.ConnectionString = "Data Source=$sqlserver;Integrated Security=True;"
- } else {
- $paramconn.ConnectionString = "Data Source=$sqlserver;User Id=$($SqlCredential.UserName); Password=$($SqlCredential.GetNetworkCredential().Password);"
- }
-
- try {
- $paramconn.Open()
- $sql = "select name from master.dbo.sysdatabases"
- $paramcmd = New-Object System.Data.SqlClient.SqlCommand($sql, $paramconn, $null)
- $paramdt = New-Object System.Data.DataTable
- $paramdt.Load($paramcmd.ExecuteReader())
- $databaselist = $paramdt.rows.name
- $null = $paramcmd.Dispose()
- $null = $paramconn.Close()
- $null = $paramconn.Dispose()
- } catch {
- # But if the routine fails, at least let them specify a database manually
- $databaselist = ""
- }
-
- # Reusable parameter setup
- $newparams = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary
- $attributes = New-Object System.Management.Automation.ParameterAttribute
- $attributes.Mandatory = $false
-
- # Database list parameter setup
- $dbattributes = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute]
- $dbattributes.Add($attributes)
- # If a list of databases were returned, populate the parameter set
- if ($databaselist.length -gt 0) {
- $dbvalidationset = New-Object System.Management.Automation.ValidateSetAttribute -ArgumentList $databaselist
- $dbattributes.Add($dbvalidationset)
- }
-
- $Database = New-Object -Type System.Management.Automation.RuntimeDefinedParameter("Database", [String], $dbattributes)
- $newparams.Add("Database", $Database)
- return $newparams
- }
-}
-
-Begin {
- Function Parse-OleQuery {
- <#
- .SYNOPSIS
- Tests to ensure query is valid. This will be used for the GUI.
-
- .EXAMPLE
- Parse-OleQuery -Csv sqlservera -Query $query -FirstRowColumns $FirstRowColumns -delimiter $delimiter
-
- .OUTPUT
-
-
- #>
- param(
- [string]$Provider,
- [Parameter(Mandatory=$true)]
- [string[]]$csv,
- [Parameter(Mandatory=$true)]
- [string]$Query,
- [Parameter(Mandatory=$true)]
- [bool]$FirstRowColumns,
- [Parameter(Mandatory=$true)]
- [string]$delimiter
-
- )
-
- if ($query.ToLower() -notmatch "\bcsv\b") {
- return "SQL statement must contain the word 'csv'."
- }
-
- try {
- $datasource = Split-Path $csv[0]
- $tablename = (Split-Path $csv[0] -leaf).Replace(".","#")
- switch ($FirstRowColumns) {
- $true { $FirstRowColumns = "Yes" }
- $false { $FirstRowColumns = "No" }
- }
- if ($provider -ne $null) {
- $connstring = "Provider=$provider;Data Source=$datasource;Extended Properties='text';"
- } else {
- $connstring = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=$datasource;Extended Properties='text';"
- }
-
- $conn = New-Object System.Data.OleDb.OleDbconnection $connstring
- $conn.Open()
- $sql = $Query -replace "\bcsv\b"," [$tablename]"
- $cmd = New-Object System.Data.OleDB.OleDBCommand
- $cmd.Connection = $conn
- $cmd.CommandText = $sql
- $null = $cmd.ExecuteReader()
- $cmd.Dispose()
- $conn.Dispose()
- return $true
- } catch { return $false }
- }
-
- Function Test-SqlConnection {
- <#
- .SYNOPSIS
- Uses System.Data.SqlClient to gather list of user databases.
-
- .EXAMPLE
- $SqlCredential = Get-Credential
- Get-SqlDatabases -SqlServer sqlservera -SqlCredential $SqlCredential
-
- .OUTPUT
- Array of user databases
-
- #>
- param(
- [Parameter(Mandatory=$true)]
- [string]$SqlServer,
- [object]$SqlCredential
- )
- $testconn = New-Object System.Data.SqlClient.SqlConnection
- if ($SqlCredential.count -eq 0) {
- $testconn.ConnectionString = "Data Source=$sqlserver;Integrated Security=True;Connection Timeout=3"
- } else {
- $testconn.ConnectionString = "Data Source=$sqlserver;User Id=$($SqlCredential.UserName); Password=$($SqlCredential.GetNetworkCredential().Password);Connection Timeout=3"
- }
- try {
- $testconn.Open()
- $testconn.Close()
- $testconn.Dispose()
- return $true
- } catch {
- $message = $_.Exception.Message.ToString()
- Write-Verbose $message
- if ($message -match "A network") { $message = "Can't connect to $sqlserver." }
- elseif ($message -match "Login failed for user") { $message = "Login failed for $username." }
- return $message
- }
- }
-
- Function Get-SqlDatabases {
- <#
- .SYNOPSIS
- Uses System.Data.SqlClient to gather list of user databases.
-
- .EXAMPLE
- $SqlCredential = Get-Credential
- Get-SqlDatabases -SqlServer sqlservera -SqlCredential $SqlCredential
-
- .OUTPUT
- Array of user databases
-
- #>
- param(
- [Parameter(Mandatory=$true)]
- [string]$SqlServer,
- [object]$SqlCredential
- )
- $paramconn = New-Object System.Data.SqlClient.SqlConnection
- if ($SqlCredential.count -eq 0) {
- $paramconn.ConnectionString = "Data Source=$sqlserver;Integrated Security=True;Connection Timeout=3"
- } else {
- $paramconn.ConnectionString = "Data Source=$sqlserver;User Id=$($SqlCredential.UserName); Password=$($SqlCredential.GetNetworkCredential().Password);Connection Timeout=3"
- }
- try {
- $paramconn.Open()
- $sql = "select name from master.dbo.sysdatabases where dbid > 4 order by name"
- $paramcmd = New-Object System.Data.SqlClient.SqlCommand($sql, $paramconn, $null)
- $datatable = New-Object System.Data.DataTable
- [void]$datatable.Load($paramcmd.ExecuteReader())
- $databaselist = $datatable.rows.name
- $null = $paramcmd.Dispose()
- $null = $paramconn.Close()
- $null = $paramconn.Dispose()
- return $databaselist
- } catch { throw "Cannot access $sqlserver" }
- }
-
- Function Get-SqlTables {
- <#
- .SYNOPSIS
- Uses System.Data.SqlClient to gather list of user databases.
-
- .EXAMPLE
- $SqlCredential = Get-Credential
- Get-SqlTables -SqlServer sqlservera -Database mydb -SqlCredential $SqlCredential
-
- .OUTPUT
- Array of tables
-
- #>
- param(
- [Parameter(Mandatory=$true)]
- [string]$SqlServer,
- [string]$Database,
- [object]$SqlCredential
- )
- $tableconn = New-Object System.Data.SqlClient.SqlConnection
- if ($SqlCredential.count -eq 0) {
- $tableconn.ConnectionString = "Data Source=$sqlserver;Integrated Security=True;Connection Timeout=3"
- } else {
- $username = ($SqlCredential.UserName).TrimStart("\")
- $tableconn.ConnectionString = "Data Source=$sqlserver;User Id=$username; Password=$($SqlCredential.GetNetworkCredential().Password);Connection Timeout=3"
- }
- try {
- $tableconn.Open()
- $sql = "select name from $database.sys.tables order by name"
- $tablecmd = New-Object System.Data.SqlClient.SqlCommand($sql, $tableconn, $null)
- $datatable = New-Object System.Data.DataTable
- [void]$datatable.Load($tablecmd.ExecuteReader())
- $tablelist = $datatable.rows.name
- $null = $tablecmd.Dispose()
- $null = $tableconn.Close()
- $null = $tableconn.Dispose()
- return $tablelist
- } catch { return }
- }
-
- Function Get-Columns {
- <#
- .SYNOPSIS
- TextFieldParser will be used instead of an OleDbConnection.
- This is because the OleDbConnection driver may not exist on x64.
-
- .EXAMPLE
- $columns = Get-Columns -Csv .\myfile.csv -Delimiter "," -FirstRowColumns $true
-
- .OUTPUT
- Array of column names
-
- #>
-
- param(
- [Parameter(Mandatory=$true)]
- [string[]]$Csv,
- [Parameter(Mandatory=$true)]
- [string]$Delimiter,
- [Parameter(Mandatory=$true)]
- [bool]$FirstRowColumns
- )
-
- $columnparser = New-Object Microsoft.VisualBasic.FileIO.TextFieldParser($csv[0])
- $columnparser.TextFieldType = "Delimited"
- $columnparser.SetDelimiters($Delimiter)
- $rawcolumns = $columnparser.ReadFields()
-
- if ($FirstRowColumns -eq $true) {
- $columns = ($rawcolumns | ForEach-Object { $_ -Replace '"' } | Select-Object -Property @{Name="name"; Expression = {"[$_]"}}).name
- } else {
- $columns = @()
- foreach ($number in 1..$rawcolumns.count ) { $columns += "[column$number]" }
- }
-
- $columnparser.Close()
- $columnparser.Dispose()
- return $columns
- }
-
- Function Get-ColumnText {
- <#
- .SYNOPSIS
- Returns an array of data, which can later be parsed for potential datatypes.
-
- .EXAMPLE
- $columns = Get-Columns -Csv .\myfile.csv -Delimiter ","
-
- .OUTPUT
- Array of column data
-
- #>
- param(
- [Parameter(Mandatory=$true)]
- [string[]]$Csv,
- [Parameter(Mandatory=$true)]
- [string]$Delimiter
- )
- $columnparser = New-Object Microsoft.VisualBasic.FileIO.TextFieldParser($csv[0])
- $columnparser.TextFieldType = "Delimited"
- $columnparser.SetDelimiters($Delimiter)
- $line = $columnparser.ReadLine()
- # Skip a line, in case first line are column names
- $line = $columnparser.ReadLine()
- $datatext = $columnparser.ReadFields()
- $columnparser.Close()
- $columnparser.Dispose()
- return $datatext
- }
-
- Function Write-Schemaini {
- <#
- .SYNOPSIS
- Unfortunately, passing delimiter within the OleDBConnection connection string is unreliable, so we'll use schema.ini instead
- The default delimiter in Windows changes depending on country, so we'll do this for every delimiter, even commas.
-
- Get OLE datatypes based on best guess of column data within the -Columns parameter.
-
- Sometimes SQL will accept a datetime that OLE won't, so Text will be used for datetime.
-
- .EXAMPLE
- $columns = Get-Columns -Csv C:\temp\myfile.csv -Delimiter ","
- $movedschemainis = Write-Schemaini -Csv C:\temp\myfile.csv -Columns $columns -ColumnText $columntext -Delimiter "," -FirstRowColumns $true
-
- .OUTPUT
- Creates new schema files, that look something like this:
- [housingdata.csv]
- Format=Delimited(,)
- ColNameHeader=True
- Col1="House ID" Long
- Col2="Description" Memo
- Col3="Price" Double
-
- Returns an array of existing schema files that have been moved, if any.
-
- #>
- param(
- [Parameter(Mandatory=$true)]
- [string[]]$Csv,
- [Parameter(Mandatory=$true)]
- [string[]]$Columns,
- [string[]]$ColumnText,
- [Parameter(Mandatory=$true)]
- [string]$Delimiter,
- [Parameter(Mandatory=$true)]
- [bool]$FirstRowColumns
- )
-
- $movedschemainis = @{}
- foreach ($file in $csv) {
- $directory = Split-Path $file
- $schemaexists = Test-Path "$directory\schema.ini"
- if ($schemaexists -eq $true) {
- $newschemaname = "$env:TEMP\$(Split-Path $file -leaf)-schema.ini"
- $movedschemainis.Add($newschemaname,"$directory\schema.ini")
- Move-Item "$directory\schema.ini" $newschemaname -Force
- }
-
- $filename = Split-Path $file -leaf; $directory = Split-Path $file
- Add-Content -Path "$directory\schema.ini" -Value "[$filename]"
- Add-Content -Path "$directory\schema.ini" -Value "Format=Delimited($Delimiter)"
- Add-Content -Path "$directory\schema.ini" -Value "ColNameHeader=$FirstRowColumns"
-
- $index = 0
- $olecolumns = ($columns | ForEach-Object { $_ -Replace "\[|\]", '"' })
-
- foreach ($datatype in $columntext) {
- $olecolumnname = $olecolumns[$index]
- $index++
-
- try { [System.Guid]::Parse($datatype) | Out-Null; $isguid = $true } catch { $isguid = $false }
-
- if ($isguid -eq $true) { $oledatatype = "Text" }
- elseif ([int64]::TryParse($datatype,[ref]0) -eq $true) { $oledatatype = "Long" }
- elseif ([double]::TryParse($datatype,[ref]0) -eq $true) { $oledatatype = "Double" }
- elseif ([datetime]::TryParse($datatype,[ref]0) -eq $true) { $oledatatype = "Text" }
- else { $oledatatype = "Memo" }
-
- Add-Content -Path "$directory\schema.ini" -Value "Col$($index)`=$olecolumnname $oledatatype"
- }
- }
- return $movedschemainis
- }
-
- Function New-SqlTable {
- <#
- .SYNOPSIS
- Creates new Table using existing SqlCommand.
-
- SQL datatypes based on best guess of column data within the -ColumnText parameter.
- Columns paramter determine column names.
-
- .EXAMPLE
- New-SqlTable -Csv $Csv -Delimiter $Delimiter -Columns $columns -ColumnText $columntext -SqlConn $sqlconn -Transaction $transaction
-
- .OUTPUT
- Creates new table
- #>
-
- param(
- [Parameter(Mandatory=$true)]
- [string[]]$Csv,
- [Parameter(Mandatory=$true)]
- [string]$Delimiter,
- [string[]]$Columns,
- [string[]]$ColumnText,
- [System.Data.SqlClient.SqlConnection]$sqlconn,
- [System.Data.SqlClient.SqlTransaction]$transaction
- )
- # Get SQL datatypes by best guess on first data row
- $sqldatatypes = @(); $index = 0
-
- foreach ($column in $columntext) {
- $sqlcolumnname = $Columns[$index]
- $index++
-
- # bigint, float, and datetime are more accurate, but it didn't work
- # as often as it should have, so we'll just go for a smaller datatype
- if ([int64]::TryParse($column,[ref]0) -eq $true) { $sqldatatype = "varchar(255)" }
- elseif ([double]::TryParse($column,[ref]0) -eq $true) { $sqldatatype = "varchar(255)" }
- elseif ([datetime]::TryParse($column,[ref]0) -eq $true) { $sqldatatype = "varchar(255)" }
- else { $sqldatatype = "varchar(MAX)" }
-
- $sqldatatypes += "$sqlcolumnname $sqldatatype"
- }
-
- $sql = "BEGIN CREATE TABLE [$table] ($($sqldatatypes -join ' NULL,')) END"
- $sqlcmd = New-Object System.Data.SqlClient.SqlCommand($sql, $sqlconn, $transaction)
- try { $null = $sqlcmd.ExecuteNonQuery()} catch {
- $errormessage = $_.Exception.Message.ToString()
- throw "Failed to execute $sql. `nDid you specify the proper delimiter? `n$errormessage"
- }
-
- Write-Output "[*] Successfully created table $table with the following column definitions:`n $($sqldatatypes -join "`n ")"
- # Write-Warning "All columns are created using a best guess, and use their maximum datatype."
- Write-Warning "This is inefficient but allows the script to import without issues."
- Write-Warning "Consider creating the table first using best practices if the data will be used in production."
-}
-
-
- if ($shellswitch -eq $false) { Write-Output "[*] Started at $(Get-Date)" }
-
- # Load the basics
- [void][Reflection.Assembly]::LoadWithPartialName("System.Data")
- [void][Reflection.Assembly]::LoadWithPartialName("Microsoft.VisualBasic")
- [void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
-
- # Getting the total rows copied is a challenge. Use SqlBulkCopyExtension.
- # http://stackoverflow.com/questions/1188384/sqlbulkcopy-row-count-when-complete
-
- $source = 'namespace System.Data.SqlClient
- {
- using Reflection;
-
- public static class SqlBulkCopyExtension
- {
- const String _rowsCopiedFieldName = "_rowsCopied";
- static FieldInfo _rowsCopiedField = null;
-
- public static int RowsCopiedCount(this SqlBulkCopy bulkCopy)
- {
- if (_rowsCopiedField == null) _rowsCopiedField = typeof(SqlBulkCopy).GetField(_rowsCopiedFieldName, BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Instance);
- return (int)_rowsCopiedField.GetValue(bulkCopy);
- }
- }
- }
- '
- Add-Type -ReferencedAssemblies 'System.Data.dll' -TypeDefinition $source -ErrorAction SilentlyContinue
-}
-
-Process {
- # Supafast turbo mode requires a table lock, or it's just regular fast
- if ($turbo -eq $true) { $tablelock = $true }
-
- # The query parameter requires OleDB which is invoked by the "safe" variable
- # Actually, a select could be performed on the datatable used in StreamReader, too.
- # Maybe that will be done later.
- if ($query -ne "select * from csv") { $safe = $true }
-
- if ($first -gt 0 -and $query -ne "select * from csv") {
- throw "Cannot use both -Query and -First. If a query is necessary, use TOP $first within your SQL statement."
- }
-
- # In order to support -First in both Streamreader, and OleDb imports, the query must be modified slightly.
- if ($first -gt 0) { $query = "select top $first * from csv" }
-
- # If shell switch occured, and encrypted SQL credentials were written to disk, create $SqlCredential
- if ($SqlCredentialPath.length -gt 0) {
- $SqlCredential = Import-CliXml $SqlCredentialPath
- }
-
- # Get Database string from RuntimeDefinedParameter if required
- if ($database -isnot [string]) { $database = $PSBoundParameters.Database }
- if ($database.length -eq 0) { throw "You must specify a database." }
-
- # Check to ensure a Windows account wasn't used as a SQL Credential
- if ($SqlCredential.count -gt 0 -and $SqlCredential.UserName -like "*\*") { throw "Only SQL Logins can be used as a SqlCredential." }
-
- # If no CSV was specified, prompt the user to select one.
- if ($csv.length -eq 0) {
- $fd = New-Object System.Windows.Forms.OpenFileDialog
- $fd.InitialDirectory = [environment]::GetFolderPath("MyDocuments")
- $fd.Filter = "CSV Files (*.csv;*.tsv;*.txt)|*.csv;*.tsv;*.txt"
- $fd.Title = "Select one or more CSV files"
- $fd.MultiSelect = $true
- $null = $fd.showdialog()
- $csv = $fd.filenames
- if ($csv.length -eq 0) { throw "No CSV file selected." }
- } else {
- foreach ($file in $csv) {
- $exists = Test-Path $file
- if ($exists -eq $false) { throw "$file does not exist" }
- }
- }
-
- # Resolve the full path of each CSV
- $resolvedcsv = @()
- foreach ($file in $csv) { $resolvedcsv += (Resolve-Path $file).Path }
- $csv = $resolvedcsv
-
- # UniqueIdentifier kills OLE DB / SqlBulkCopy imports. Check to see if destination table contains this datatype.
- if ($safe -eq $true) {
- $sqlcheckconn = New-Object System.Data.SqlClient.SqlConnection
- if ($SqlCredential.count -eq 0 -or $SqlCredential -eq $null) {
- $sqlcheckconn.ConnectionString = "Data Source=$sqlserver;Integrated Security=True;Connection Timeout=3; Initial Catalog=master"
- } else {
- $username = ($SqlCredential.UserName).TrimStart("\")
- $sqlcheckconn.ConnectionString = "Data Source=$sqlserver;User Id=$username; Password=$($SqlCredential.GetNetworkCredential().Password);Connection Timeout=3; Initial Catalog=master"
- }
-
- try { $sqlcheckconn.Open() } catch { throw $_.Exception }
-
- # Ensure database exists
- $sql = "select count(*) from master.dbo.sysdatabases where name = '$database'"
- $sqlcheckcmd = New-Object System.Data.SqlClient.SqlCommand($sql, $sqlcheckconn)
- $dbexists = $sqlcheckcmd.ExecuteScalar()
- if ($dbexists -eq $false) { throw "Database does not exist on $sqlserver" }
-
- # Change database after the fact, because if db doesn't exist, the login would fail.
- $sqlcheckconn.ChangeDatabase($database)
-
- $sql = "SELECT t.name as datatype FROM sys.columns c
- JOIN sys.types t ON t.system_type_id = c.system_type_id
- WHERE c.object_id = object_id('$table') and t.name != 'sysname'"
- $sqlcheckcmd = New-Object System.Data.SqlClient.SqlCommand($sql, $sqlcheckconn)
- $sqlcolumns = New-Object System.Data.DataTable
- $sqlcolumns.load($sqlcheckcmd.ExecuteReader("CloseConnection"))
- $sqlcheckconn.Dispose()
- if ($sqlcolumns.datatype -contains "UniqueIdentifier") {
- throw "UniqueIdentifier not supported by OleDB/SqlBulkCopy. Query and Safe cannot be supported."
- }
- }
-
- if ($safe -eq $true) {
- # Check for drivers. First, ACE (Access) if file is smaller than 2GB, then JET
- # ACE doesn't handle files larger than 2gb. What gives?
- foreach ($file in $csv) {
- $filesize = (Get-ChildItem $file).Length / 1GB
- if ($filesize -gt 1.99) { $jetonly = $true }
- }
-
- if ($jetonly -ne $true) { $provider = (New-Object System.Data.OleDb.OleDbEnumerator).GetElements() | Where-Object { $_.SOURCES_NAME -like "Microsoft.ACE.OLEDB.*" } }
-
- if ($provider -eq $null) {
- $provider = (New-Object System.Data.OleDb.OleDbEnumerator).GetElements() | Where-Object { $_.SOURCES_NAME -like "Microsoft.Jet.OLEDB.*" }
- }
-
- # If a suitable provider cannot be found (If x64 and Access hasn't been installed)
- # switch to x86, because it natively supports JET
- if ($provider -ne $null) {
- if ($provider -is [system.array]) { $provider = $provider[$provider.GetUpperBound(0)].SOURCES_NAME } else { $provider = $provider.SOURCES_NAME }
- }
-
- # If a provider doesn't exist, it is necessary to switch to x86 which natively supports JET.
- if ($provider -eq $null) {
- # While Install-Module takes care of installing modules to x86 and x64, Import-Module doesn't.
- # Because of this, the Module must be exported, written to file, and imported in the x86 shell.
- $definition = (Get-Command Import-CsvToSql).Definition
- $function = "Function Import-CsvToSql { $definition }"
- Set-Content "$env:TEMP\Import-CsvToSql.psm1" $function
-
- # Encode the SQL string, since some characters may mess up after being passed a second time.
- $bytes = [System.Text.Encoding]::UTF8.GetBytes($query)
- $query = [System.Convert]::ToBase64String($bytes)
-
- # Put switches back into proper format
- $switches = @()
- $options = "TableLock","CheckConstraints","FireTriggers","KeepIdentity","KeepNulls","Default","Truncate","FirstRowColumns","Safe"
- foreach ($option in $options) {
- $optionValue = Get-Variable $option -ValueOnly -ErrorAction SilentlyContinue
- if ($optionValue -eq $true) { $switches += "-$option" }
- }
-
- # Perform the actual switch, which removes any registered Import-CsvToSql modules
- # Then imports, and finally re-executes the command.
- $csv = $csv -join ","; $switches = $switches -join " "
- if ($SqlCredential.count -gt 0) {
- $SqlCredentialPath = "$env:TEMP\sqlcredential.xml"
- Export-CliXml -InputObject $SqlCredential $SqlCredentialPath
- }
- $command = "Import-CsvToSql -Csv $csv -SqlServer '$sqlserver'-Database '$database' -Table '$table' -Delimiter '$Delimiter' -First $First -Query '$query' -Batchsize $BatchSize -NotifyAfter $NotifyAfter $switches -shellswitch"
-
- if ($SqlCredentialPath.length -gt 0) { $command += " -SqlCredentialPath $SqlCredentialPath"}
- Write-Verbose "Switching to x86 shell, then switching back."
- &"$env:windir\syswow64\windowspowershell\v1.0\powershell.exe" "$command"
- return
- }
- }
-
- # Do the first few lines contain the specified delimiter?
- foreach ($file in $csv) {
- try { $firstfewlines = Get-Content $file -First 3 -ErrorAction Stop } catch { throw "$file is in use." }
- foreach ($line in $firstfewlines) {
- if (($line -match $delimiter) -eq $false) { throw "Delimiter $delimiter not found in first row of $file." }
- }
- }
-
- # If more than one csv specified, check to ensure number of columns match
- if ($csv -is [system.array]){
- $numberofcolumns = ((Get-Content $csv[0] -First 1 -ErrorAction Stop) -Split $delimiter).Count
-
- foreach ($file in $csv) {
- $firstline = Get-Content $file -First 1 -ErrorAction Stop
- $newnumcolumns = ($firstline -Split $Delimiter).Count
- if ($newnumcolumns -ne $numberofcolumns) { throw "Multiple csv file mismatch. Do both use the same delimiter and have the same number of columns?" }
- }
- }
-
- # Automatically generate Table name if not specified, then prompt user to confirm
- if ($table.length -eq 0) {
- $table = [IO.Path]::GetFileNameWithoutExtension($csv[0])
- $title = "Table name not specified."
- $message = "Would you like to use the automatically generated name: $table"
- $yes = New-Object System.Management.Automation.Host.ChoiceDescription "&Yes", "Uses table name $table for import."
- $no = New-Object System.Management.Automation.Host.ChoiceDescription "&No", "Allows you to specify an alternative table name."
- $options = [System.Management.Automation.Host.ChoiceDescription[]]($yes, $no)
- $result = $host.ui.PromptForChoice($title, $message, $options, 0)
- if ($result -eq 1) {
- do {$table = Read-Host "Please enter a table name"} while ($table.Length -eq 0)
- }
- }
-
- # If the shell has switched, decode the $query string.
- if ($shellswitch -eq $true) {
- $bytes = [System.Convert]::FromBase64String($Query)
- $query = [System.Text.Encoding]::UTF8.GetString($bytes)
- $csv = $csv -Split ","
- }
-
- # Create columns based on first data row of first csv.
- Write-Output "[*] Calculating column names and datatypes"
- $columns = Get-Columns -Csv $Csv -Delimiter $Delimiter -FirstRowColumns $FirstRowColumns
- if ($columns.count -gt 255 -and $safe -eq $true) {
- throw "CSV must contain fewer than 256 columns."
- }
-
- $columntext = Get-ColumnText -Csv $Csv -Delimiter $Delimiter
-
- # OLEDB method requires extra checks
- if ($safe -eq $true) {
- # Advanced SQL queries may not work (SqlBulkCopy likes a 1 to 1 mapping), so warn the user.
- if ($Query -match "GROUP BY" -or $Query -match "COUNT") { Write-Warning "Script doesn't really support the specified query. This probably won't work, but will be attempted anyway." }
-
- # Check for proper SQL syntax, which for the purposes of this module must include the word "table"
- if ($query.ToLower() -notmatch "\bcsv\b") {
- throw "SQL statement must contain the word 'csv'. Please see this module's documentation for more details."
- }
-
- # In order to ensure consistent results, a schema.ini file must be created.
- # If a schema.ini already exists, it will be moved to TEMP temporarily.
- Write-Verbose "Creating schema.ini"
- $movedschemainis = Write-Schemaini -Csv $Csv -Columns $columns -Delimiter "$Delimiter" -FirstRowColumns $FirstRowColumns -ColumnText $columntext
- }
-
- # Display SQL Server Login info
- if ($sqlcredential.count -gt 0) { $username = "SQL login $($SqlCredential.UserName)" }
- else { $username = "Windows login $(whoami)" }
- # Open Connection to SQL Server
- Write-Output "[*] Logging into $sqlserver as $username"
- $sqlconn = New-Object System.Data.SqlClient.SqlConnection
- if ($SqlCredential.count -eq 0) {
- $sqlconn.ConnectionString = "Data Source=$sqlserver;Integrated Security=True;Connection Timeout=3; Initial Catalog=master"
- } else {
- $sqlconn.ConnectionString = "Data Source=$sqlserver;User Id=$($SqlCredential.UserName); Password=$($SqlCredential.GetNetworkCredential().Password);Connection Timeout=3; Initial Catalog=master"
- }
-
- try { $sqlconn.Open() } catch { throw "Could not open SQL Server connection. Is $sqlserver online?" }
-
- # Everything will be contained within 1 transaction, even creating a new table if required
- # and truncating the table, if specified.
- $transaction = $sqlconn.BeginTransaction()
-
- # Ensure database exists
- $sql = "select count(*) from master.dbo.sysdatabases where name = '$database'"
- $sqlcmd = New-Object System.Data.SqlClient.SqlCommand($sql, $sqlconn, $transaction)
- $dbexists = $sqlcmd.ExecuteScalar()
- if ($dbexists -eq $false) { throw "Database does not exist on $sqlserver" }
- Write-Output "[*] Database exists"
-
- $sqlconn.ChangeDatabase($database)
-
- # Ensure table exists
- $sql = "select count(*) from $database.sys.tables where name = '$table'"
- $sqlcmd = New-Object System.Data.SqlClient.SqlCommand($sql, $sqlconn, $transaction)
- $tablexists = $sqlcmd.ExecuteScalar()
-
- # Create the table if required. Remember, this will occur within a transaction, so if the script fails, the
- # new table will no longer exist.
- if ($tablexists -eq $false) {
- Write-Output "[*] Table does not exist"
- Write-Output "[*] Creating table"
- New-SqlTable -Csv $Csv -Delimiter $Delimiter -Columns $columns -ColumnText $columntext -SqlConn $sqlconn -Transaction $transaction
- } else { Write-Output "[*] Table exists" }
-
- # Truncate if specified. Remember, this will occur within a transaction, so if the script fails, the
- # truncate will not be committed.
- if ($truncate -eq $true) {
- Write-Output "[*] Truncating table"
- $sql = "TRUNCATE TABLE [$table]"
- $sqlcmd = New-Object System.Data.SqlClient.SqlCommand($sql, $sqlconn, $transaction)
- try { $null = $sqlcmd.ExecuteNonQuery() } catch { Write-Warning "Could not truncate $table" }
- }
-
- # Get columns for column mapping
- if ($columnMappings -eq $null) {
- $olecolumns = ($columns | ForEach-Object { $_ -Replace "\[|\]" })
- $sql = "select name from sys.columns where object_id = object_id('$table') order by column_id"
- $sqlcmd = New-Object System.Data.SqlClient.SqlCommand($sql, $sqlconn, $transaction)
- $sqlcolumns = New-Object System.Data.DataTable
- $sqlcolumns.Load($sqlcmd.ExecuteReader())
- }
-
- # Time to import!
- $elapsed = [System.Diagnostics.Stopwatch]::StartNew()
-
- # Process each CSV file specified
- foreach ($file in $csv) {
-
- # Dynamically set NotifyAfter if it wasn't specified
- if ($notifyAfter -eq 0) {
- if ($resultcount -is [int]) { $notifyafter = $resultcount/10 }
- else { $notifyafter = 50000 }
- }
-
- # Setup bulk copy
- Write-Output "[*] Starting bulk copy for $(Split-Path $file -Leaf)"
-
- # Setup bulk copy options
- $bulkCopyOptions = @()
- $options = "TableLock","CheckConstraints","FireTriggers","KeepIdentity","KeepNulls","Default","Truncate"
- foreach ($option in $options) {
- $optionValue = Get-Variable $option -ValueOnly -ErrorAction SilentlyContinue
- if ($optionValue -eq $true) { $bulkCopyOptions += "$option" }
- }
- $bulkCopyOptions = $bulkCopyOptions -join " & "
-
- # Create SqlBulkCopy using default options, or options specified in command line.
- if ($bulkCopyOptions.count -gt 1) { $bulkcopy = New-Object Data.SqlClient.SqlBulkCopy($oleconnstring, $bulkCopyOptions, $transaction) }
- else { $bulkcopy = New-Object Data.SqlClient.SqlBulkCopy($sqlconn,"Default",$transaction) }
-
- $bulkcopy.DestinationTableName = "[$table]"
- $bulkcopy.bulkcopyTimeout = 0
- $bulkCopy.BatchSize = $BatchSize
- $bulkCopy.NotifyAfter = $NotifyAfter
-
- if ($safe -eq $true) {
- # Setup bulkcopy mappings
- for ($columnid = 0; $columnid -lt $sqlcolumns.rows.count; $columnid++) {
- $null = $bulkCopy.ColumnMappings.Add($olecolumns[$columnid], $sqlcolumns.rows[$columnid].ItemArray[0])
- }
-
- # Setup the connection string. Data Source is the directory that contains the csv.
- # The file name is also the table name, but with a "#" instead of a "."
- $datasource = Split-Path $file
- $tablename = (Split-Path $file -leaf).Replace(".","#")
- $oleconnstring = "Provider=$provider;Data Source=$datasource;Extended Properties='text';"
-
- # To make command line queries easier, let the user just specify "csv" instead of the
- # OleDbconnection formatted name (file.csv -> file#csv)
- $sql = $Query -replace "\bcsv\b"," [$tablename]"
-
- # Setup the OleDbconnection
- $oleconn = New-Object System.Data.OleDb.OleDbconnection
- $oleconn.ConnectionString = $oleconnstring
-
- # Setup the OleDBCommand
- $olecmd = New-Object System.Data.OleDB.OleDBCommand
- $olecmd.Connection = $oleconn
- $olecmd.CommandText = $sql
-
- try { $oleconn.Open() } catch { throw "Could not open OLEDB connection." }
-
- # Attempt to get the number of results so that a nice progress bar can be displayed.
- # This takes extra time, and files over 100MB take too long, so just skip them.
- if ($sql -match "GROUP BY") { "Query contains GROUP BY clause. Skipping result count." }
- else { Write-Output "[*] Determining total rows to be copied. This may take a few seconds." }
-
- if ($sql -match "\bselect top\b") {
- try {
- $split = $sql -split "\bselect top \b"
- $resultcount = [int]($split[1].Trim().Split()[0])
- Write-Output "[*] Attempting to fetch $resultcount rows"
- } catch { Write-Warning "Couldn't determine total rows to be copied." }
- } elseif ($sql -notmatch "GROUP BY") {
- $filesize = (Get-ChildItem $file).Length / 1MB
- if ($filesize -lt 100) {
- try {
- $split = $sql -split "\bfrom\b"
- $sqlcount = "select count(*) from $($split[1])"
- # Setup the OleDBCommand
- $olecmd = New-Object System.Data.OleDB.OleDBCommand
- $olecmd.Connection = $oleconn
- $olecmd.CommandText = $sqlcount
- $resultcount = [int]($olecmd.ExecuteScalar())
- Write-Output "[*] $resultcount rows will be copied"
- } catch { Write-Warning "Couldn't determine total rows to be copied" }
- } else {
- Write-Output "[*] File is too large for efficient result count; progress bar will not be shown."
- }
- }
- }
-
- # Write to server :D
- try {
- if ($safe -ne $true) {
- # Check to ensure batchsize isn't equal to 0
- if ($batchsize -eq 0) {
- write-warning "Invalid batchsize for this operation. Increasing to 50k"
- $batchsize = 50000
- }
-
- # Open the text file from disk
- $reader = New-Object System.IO.StreamReader($file)
- if ($FirstRowColumns -eq $true) { $null = $reader.readLine() }
-
- # Create the reusable datatable. Columns will be genereated using info from SQL.
- $datatable = New-Object System.Data.DataTable
-
- # Get table column info from SQL Server
- $sql = "SELECT c.name as colname, t.name as datatype, c.max_length, c.is_nullable FROM sys.columns c
- JOIN sys.types t ON t.system_type_id = c.system_type_id
- WHERE c.object_id = object_id('$table') and t.name != 'sysname'
- order by c.column_id"
- $sqlcmd = New-Object System.Data.SqlClient.SqlCommand($sql, $sqlconn,$transaction)
- $sqlcolumns = New-Object System.Data.DataTable
- $sqlcolumns.load($sqlcmd.ExecuteReader())
-
- foreach ($sqlcolumn in $sqlcolumns) {
- $datacolumn = $datatable.Columns.Add()
- $colname = $sqlcolumn.colname
- $datacolumn.AllowDBNull = $sqlcolumn.is_nullable
- $datacolumn.ColumnName = $colname
- $datacolumn.DefaultValue = [DBnull]::Value
- $datacolumn.Datatype = [string]
-
- # The following data types can sometimes cause issues when they are null
- # so we will treat them differently
- $convert = "bigint", "DateTimeOffset", "UniqueIdentifier", "smalldatetime", "datetime"
- if ($convert -notcontains $sqlcolumn.datatype -and $turbo -ne $true){
- $null = $bulkCopy.ColumnMappings.Add($datacolumn.ColumnName, $sqlcolumn.colname)
- }
- }
- # For the columns that cause trouble, we'll add an additional column to the datatable
- # which will perform a conversion.
- # Setting $column.datatype alone doesn't work as well as setting+converting.
- if ($turbo -ne $true) {
- $calcolumns = $sqlcolumns | Where-Object { $convert -contains $_.datatype }
- foreach ($calcolumn in $calcolumns) {
- $colname = $calcolumn.colname
- $null = $newcolumn = $datatable.Columns.Add()
- $null = $newcolumn.ColumnName = "computed$colname"
- switch ($calcolumn.datatype) {
- "bigint" { $netdatatype = "System.Int64"; $newcolumn.Datatype = [int64] }
- "DateTimeOffset" { $netdatatype = "System.DateTimeOffset"; $newcolumn.Datatype = [DateTimeOffset] }
- "UniqueIdentifier" { $netdatatype = "System.Guid"; $newcolumn.Datatype = [Guid] }
- { "smalldatetime","datetime" -contains $_ } { $netdatatype = "System.DateTime"; $newcolumn.Datatype = [DateTime] }
- }
- # Use a data column expression to facilitate actual conversion
- $null = $newcolumn.Expression = "Convert($colname, $netdatatype)"
- $null = $bulkCopy.ColumnMappings.Add($newcolumn.ColumnName, $calcolumn.colname)
- }
- }
-
- # Check to see if file has quote identified data (ie. "first","second","third")
- $quoted = $false
- $checkline = Get-Content $file -Last 1
- $checkcolumns = $checkline.Split($delimiter)
- foreach ($checkcolumn in $checkcolumns) {
- if ($checkcolumn.StartsWith('"') -and $checkcolumn.EndsWith('"')) { $quoted = $true }
- }
-
- if ($quoted -eq $true) {
- Write-Warning "The CSV file appears quote identified. This may take a little longer."
- # Thanks for this, Chris! http://www.schiffhauer.com/c-split-csv-values-with-a-regular-expression/
- $pattern = "((?<=`")[^`"]*(?=`"($delimiter|$)+)|(?<=$delimiter|^)[^$delimiter`"]*(?=$delimiter|$))"
- }
- if ($turbo -eq $true -and $first -eq 0) {
- while (($line = $reader.ReadLine()) -ne $null) {
- $i++
- if ($quoted -eq $true) {
- $null = $datatable.Rows.Add(($line.TrimStart('"').TrimEnd('"')) -Split "`"$delimiter`"")
- } else { $row = $datatable.Rows.Add($line.Split($delimiter)) }
-
- if (($i % $batchsize) -eq 0) {
- $bulkcopy.WriteToServer($datatable)
- Write-Output "[*] $i rows have been inserted in $([math]::Round($elapsed.Elapsed.TotalSeconds,2)) seconds"
- $datatable.Clear()
- }
- }
- } else {
- if ($turbo -eq $true -and $first -gt 0) { Write-Warning "Using -First makes turbo a smidge slower." }
- # Start import!
- while (($line = $reader.ReadLine()) -ne $null) {
- $i++
- try {
- if ($quoted -eq $true) {
- $row = $datatable.Rows.Add(($line.TrimStart('"').TrimEnd('"')) -Split $pattern)
- } else { $row = $datatable.Rows.Add($line.Split($delimiter)) }
- } catch {
- $row = $datatable.NewRow()
- try {
- $tempcolumn = $line.Split($delimiter)
- $colnum = 0
- foreach ($column in $tempcolumn) {
- if ($column.length -ne 0) {
- $row.item($colnum) = $column
- } else {
- $row.item($colnum) = [DBnull]::Value
- }
- $colnum++
- }
- $newrow = $datatable.Rows.Add($row)
- } catch {
- Write-Warning "The following line ($i) is causing issues:"
- Write-Output $line.Replace($delimiter,"`n")
-
- if ($quoted -eq $true) {
- Write-Warning "The import has failed, likely because the quoted data was a little too inconsistent. Try using the -Safe parameter."
- }
-
- Write-Verbose "Column datatypes:"
- foreach ($c in $datatable.columns) {
- Write-Verbose "$($c.columnname) = $($c.datatype)"
- }
- Write-Error $_.Exception.Message
- break
- }
- }
-
- if (($i % $batchsize) -eq 0 -or $i -eq $first) {
- $bulkcopy.WriteToServer($datatable)
- Write-Output "[*] $i rows have been inserted in $([math]::Round($elapsed.Elapsed.TotalSeconds,2)) seconds"
- $datatable.Clear()
- if ($i -eq $first) { break }
- }
- }
- }
- # Add in all the remaining rows since the last clear
- if($datatable.Rows.Count -gt 0) {
- $bulkcopy.WriteToServer($datatable)
- $datatable.Clear()
- }
- } else {
- # Add rowcount output
- $bulkCopy.Add_SqlRowscopied({
- $script:totalrows = $args[1].RowsCopied
- if ($resultcount -is [int]) {
- $percent = [int](($script:totalrows/$resultcount)*100)
- $timetaken = [math]::Round($elapsed.Elapsed.TotalSeconds,2)
- Write-Progress -id 1 -activity "Inserting $resultcount rows" -percentcomplete $percent `
- -status ([System.String]::Format("Progress: {0} rows ({1}%) in {2} seconds", $script:totalrows, $percent, $timetaken))
- } else {
- Write-Host "$($script:totalrows) rows copied in $([math]::Round($elapsed.Elapsed.TotalSeconds,2)) seconds" }
- })
-
- $bulkCopy.WriteToServer($olecmd.ExecuteReader("SequentialAccess"))
- if ($resultcount -is [int]) { Write-Progress -id 1 -activity "Inserting $resultcount rows" -status "Complete" -Completed }
-
- }
- $completed = $true
- } catch {
- # If possible, give more information about common errors.
- if ($resultcount -is [int]) { Write-Progress -id 1 -activity "Inserting $resultcount rows" -status "Failed" -Completed }
- $errormessage = $_.Exception.Message.ToString()
- $completed = $false
- if ($errormessage -like "*for one or more required parameters*") {
-
- Write-Error "Looks like your SQL syntax may be invalid. `nCheck the documentation for more information or start with a simple -Query 'select top 10 * from csv'"
- Write-Error "Valid CSV columns are $columns"
-
- } elseif ($errormessage -match "invalid column length") {
-
- # Get more information about malformed CSV input
- $pattern = @("\d+")
- $match = [regex]::matches($errormessage, @("\d+"))
- $index = [int]($match.groups[1].Value)-1
- $sql = "select name, max_length from sys.columns where object_id = object_id('$table') and column_id = $index"
- $sqlcmd = New-Object System.Data.SqlClient.SqlCommand($sql, $sqlconn,$transaction)
- $datatable = New-Object System.Data.DataTable
- $datatable.load($sqlcmd.ExecuteReader())
- $column = $datatable.name
- $length = $datatable.max_length
-
- if ($safe -eq $true) {
- Write-Warning "Column $index ($column) contains data with a length greater than $length"
- Write-Warning "SqlBulkCopy makes it pretty much impossible to know which row caused the issue, but it's somewhere after row $($script:totalrows)."
- }
- } elseif ($errormessage -match "does not allow DBNull" -or $errormessage -match "The given value of type") {
-
- if ($tablexists -eq $false) {
- Write-Error "Looks like the datatype prediction didn't work out. Please create the table manually with proper datatypes then rerun the import script."
- } else {
- $sql = "select name from sys.columns where object_id = object_id('$table') order by column_id"
- $sqlcmd = New-Object System.Data.SqlClient.SqlCommand($sql, $sqlconn, $transaction)
- $datatable = New-Object System.Data.DataTable
- $datatable.Load($sqlcmd.ExecuteReader())
- $olecolumns = ($columns | ForEach-Object { $_ -Replace "\[|\]" }) -join ', '
- Write-Warning "Datatype mismatch."
- Write-Output "[*] This is sometimes caused by null handling in SqlBulkCopy, quoted data, or the first row being column names and not data (-FirstRowColumns)"
- Write-Output "[*] This could also be because the data types don't match or the order of the columns within the CSV/SQL statement "
- Write-Output "[*] do not line up with the order of the table within the SQL Server.`n"
- Write-Output "[*] CSV order: $olecolumns`n"
- Write-Output "[*] SQL order: $($datatable.rows.name -join ', ')`n"
- Write-Output "[*] If this is the case, you can reorder columns by using the -Query parameter or execute the import against a view.`n"
- if ($safe -eq $false) {
- Write-Output "[*] You can also try running this import using the -Safe parameter, which handles quoted text well.`n"
- }
- Write-Error "`n$errormessage"
- }
-
-
- } elseif ($errormessage -match "Input string was not in a correct format" -or $errormessage -match "The given ColumnName") {
- Write-Warning "CSV contents may be malformed."
- Write-Error $errormessage
- } else { Write-Error $errormessage }
- }
- }
-
- if ($completed -eq $true) {
- # "Note: This count does not take into consideration the number of rows actually inserted when Ignore Duplicates is set to ON."
- $null = $transaction.Commit()
-
- if ($safe -eq $false) {
- Write-Output "[*] $i total rows copied"
- } else {
- $total = [System.Data.SqlClient.SqlBulkCopyExtension]::RowsCopiedCount($bulkcopy)
- Write-Output "[*] $total total rows copied"
- }
- } else {
- Write-Output "[*] Transaction rolled back."
- Write-Output "[*] (Was the proper parameter specified? Is the first row the column name?)."
- }
-
- # Script is finished. Show elapsed time.
- $totaltime = [math]::Round($elapsed.Elapsed.TotalSeconds,2)
- Write-Output "[*] Total Elapsed Time for bulk insert: $totaltime seconds"
-}
-
-End {
- # Close everything just in case & ignore errors
- try { $null = $sqlconn.close(); $null = $sqlconn.Dispose(); $null = $oleconn.close;
- $null = $olecmd.Dispose(); $null = $oleconn.Dispose(); $null = $bulkCopy.close();
- $null = $bulkcopy.dispose(); $null = $reader.close; $null = $reader.dispose() } catch {}
-
- # Delete all the temp files
- if ($SqlCredentialPath.length -gt 0) {
- if ((Test-Path $SqlCredentialPath) -eq $true) {
- $null = cmd /c "del $SqlCredentialPath"
- }
- }
-
- if ($shellswitch -eq $false -and $safe -eq $true) {
- # Delete new schema files
- Write-Verbose "Removing automatically generated schema.ini"
- foreach ($file in $csv) {
- $directory = Split-Path $file
- $null = cmd /c "del $directory\schema.ini" | Out-Null
- }
-
- # If a shell switch occured, delete the temporary module file.
- if ((Test-Path "$env:TEMP\Import-CsvToSql.psm1") -eq $true) { cmd /c "del $env:TEMP\Import-CsvToSql.psm1" | Out-Null }
-
- # Move original schema.ini's back if they existed
- if ($movedschemainis.count -gt 0) {
- foreach ($item in $movedschemainis) {
- Write-Verbose "Moving $($item.keys) back to $($item.values)"
- $null = cmd /c "move $($item.keys) $($item.values)"
- }
- }
- Write-Output "[*] Finished at $(Get-Date)"
- }
-}
-}
+Function Import-CsvToSql {
+<#
+.SYNOPSIS
+Efficiently imports very large (and small) CSV files into SQL Server using only the .NET Framework and PowerShell.
+
+.DESCRIPTION
+Import-CsvToSql takes advantage of .NET's super fast SqlBulkCopy class to import CSV files into SQL Server at up to 90,000
+rows a second.
+
+The entire import is contained within a transaction, so if a failure occurs or the script is aborted, no changes will persist.
+
+If the table specified does not exist, it will be automatically created using best guessed data types. In addition,
+the destination table can be truncated prior to import.
+
+The Query parameter be used to import only data returned from a SQL Query executed against the CSV file(s). This function
+supports a number of bulk copy options. Please see parameter list for details.
+
+THIS CODE IS PROVIDED "AS IS", WITH NO WARRANTIES.
+
+.PARAMETER CSV
+Required. The location of the CSV file(s) to be imported. Multiple files are allowed, so long as they are formatted
+similarly. If no CSV file is specified, a Dialog box will appear.
+
+.PARAMETER FirstRowColumns
+Optional. This parameter specifies whether the first row contains column names. If the first row does not contain column
+names and -Query is specified, use field names "column1, column2, column3" and so on.
+
+.PARAMETER Delimiter
+Optional. If you do not pass a Delimiter, then a comma will be used. Valid Delimiters include: tab "`t", pipe "|",
+semicolon ";", and space " ".
+
+.PARAMETER SqlServer
+Required. The destination SQL Server.
+
+.PARAMETER SqlCredential
+Connect to SQL Server using specified SQL Login credentials.
+
+.PARAMETER Database
+Required. The name of the database where the CSV will be imported into. This parameter is autopopulated using the
+-SqlServer and -SqlCredential (optional) parameters.
+
+.PARAMETER Table
+SQL table or view where CSV will be imported into.
+
+If a table name is not specified, the table name will be automatically determined from filename, and a prompt will appear
+to confirm table name.
+
+If table does not currently exist, it will created. SQL datatypes are determined from the first row of the CSV that
+contains data (skips first row if -FirstRowColumns). Datatypes used are: bigint, numeric, datetime and varchar(MAX).
+
+If the automatically generated table datatypes do not work for you, please create the table prior to import.
+
+.PARAMETER Truncate
+Truncate table prior to import.
+
+.PARAMETER Safe
+Optional. By default, Import-CsvToSql uses StreamReader for imports. StreamReader is super fast, but may not properly parse some files.
+Safe uses OleDb to import the records, it's slower, but more predictable when it comes to parsing CSV files. A schema.ini is automatically
+generated for best results. If schema.ini currently exists in the directory, it will be moved to a temporary location, then moved back.
+
+OleDB also enables the script to use the -Query parameter, which enables you to import specific subsets of data within a CSV file. OleDB
+imports at up to 21,000 rows/sec.
+
+.PARAMETER Turbo
+Optional. Cannot be used in conjunction with -Query.
+
+Remember the Turbo button? This one actually works. Turbo is mega fast, but may not handle some datatypes as well as other methods.
+If your CSV file is rather vanilla and doesn't have a ton of NULLs, Turbo may work well for you. Note: Turbo mode uses a Table Lock.
+
+StreamReader/Turbo imports at up to 90,000 rows/sec (well, 93,000 locally for a 19 column file so, really, the number may be over
+100,000 rows/sec for tables with only a couple columns using optimized datatypes).
+
+.PARAMETER First
+Only import first X rows. Count starts at the top of the file, but skips the first row if FirstRowColumns was specifeid.
+
+Use -Query if you need advanced First (TOP) functionality.
+
+.PARAMETER Query
+Optional. Cannot be used in conjunction with -Turbo or -First. When Query is specified, the slower import method, OleDb,
+will be used.
+
+If you want to import just the results of a specific query from your CSV file, use this parameter.
+To make command line queries easy, this module will convert the word "csv" to the actual CSV formatted table name.
+If the FirstRowColumns switch is not used, the query should use column1, column2, column3, etc
+
+Example: select column1, column2, column3 from csv where column2 > 5
+Example: select distinct artist from csv
+Example: select top 100 artist, album from csv where category = 'Folk'
+
+See EXAMPLES for more example syntax.
+
+.PARAMETER TableLock
+SqlBulkCopy option. Per Microsoft "Obtain a bulk update lock for the duration of the bulk copy operation. When not
+specified, row locks are used." TableLock is automatically used when Turbo is specified.
+
+.PARAMETER CheckConstraints
+SqlBulkCopy option. Per Microsoft "Check constraints while data is being inserted. By default, constraints are not checked."
+
+.PARAMETER FireTriggers
+SqlBulkCopy option. Per Microsoft "When specified, cause the server to fire the insert triggers for the rows being inserted
+into the database."
+
+.PARAMETER KeepIdentity
+SqlBulkCopy option. Per Microsoft "Preserve source identity values. When not specified, identity values are assigned by
+the destination."
+
+.PARAMETER KeepNulls
+SqlBulkCopy option. Per Microsoft "Preserve null values in the destination table regardless of the settings for default
+values. When not specified, null values are replaced by default values where applicable."
+
+.PARAMETER shellswitch
+Internal parameter.
+
+.PARAMETER SqlCredentialPath
+Internal parameter.
+
+.NOTES
+Author: Chrissy LeMaire (@cl), netnerds.net
+
+.LINK
+https://blog.netnerds.net/2015/09/import-csvtosql-super-fast-csv-to-sql-server-import-powershell-module/
+
+.EXAMPLE
+Import-CsvToSql -Csv C:\temp\housing.csv -SqlServer sql001 -Database markets
+
+Imports the entire *comma delimited* housing.csv to the SQL "markets" database on a SQL Server named sql001.
+Since a table name was not specified, the table name is automatically determined from filename as "housing"
+and a prompt will appear to confirm table name.
+
+The first row is not skipped, as it does not contain column names.
+
+.EXAMPLE
+Import-CsvToSql -Csv .\housing.csv -SqlServer sql001 -Database markets -Table housing -First 100000 -Safe -Delimiter "`t" -FirstRowColumns
+
+Imports the first 100,000 rows of the tab delimited housing.csv file to the "housing" table in the "markets" database on a SQL Server
+named sql001. Since Safe was specified, the OleDB method will be used for the bulk import. It's assumed Safe was used because
+the first attempt without -Safe resulted in an import error. The first row is skipped, as it contains column names.
+
+.EXAMPLE
+Import-CsvToSql -csv C:\temp\huge.txt -sqlserver sqlcluster -Database locations -Table latitudes -Delimiter "|" -Turbo
+
+Imports all records from the pipe delimited huge.txt file using the fastest method possible into the latitudes table within the
+locations database. Obtains a table lock for the duration of the bulk copy operation. This specific command has been used
+to import over 10.5 million rows in 2 minutes.
+
+.EXAMPLE
+Import-CsvToSql -Csv C:\temp\housing.csv, .\housing2.csv -SqlServer sql001 -Database markets -Table `
+housing -Delimiter "`t" -query "select top 100000 column1, column3 from csv" -Truncate
+
+Truncates the "housing" table, then imports columns 1 and 3 of the first 100000 rows of the tab-delimited
+housing.csv in the C:\temp directory, and housing2.csv in the current directory. Since the query is executed against
+both files, a total of 200,000 rows will be imported.
+
+.EXAMPLE
+Import-CsvToSql -Csv C:\temp\housing.csv -SqlServer sql001 -Database markets -Table housing -query `
+"select address, zip from csv where state = 'Louisiana'" -FirstRowColumns -Truncate -FireTriggers
+
+Uses the first line to determine CSV column names. Truncates the "housing" table on the SQL Server,
+then imports the address and zip columns from all records in the housing.csv where the state equals Louisiana.
+
+Triggers are fired for all rows. Note that this does slightly slow down the import.
+
+.NOTES
+ Author: Chrissy LeMaire
+ Original Link: https://github.com/ctrlbold/dbatools/blob/master/Functions/CsvSqlimport.ps1
+ Created Date: 2015-09-01
+
+#>
+[CmdletBinding(DefaultParameterSetName="Default")]
+Param(
+ [string[]]$Csv,
+ [Parameter(Mandatory=$true)]
+ [string]$SqlServer,
+ [object]$SqlCredential,
+ [string]$Table,
+ [switch]$Truncate,
+ [string]$Delimiter = ",",
+ [switch]$FirstRowColumns,
+ [parameter(ParameterSetName="reader")]
+ [switch]$Turbo,
+ [parameter(ParameterSetName="ole")]
+ [switch]$Safe,
+ [int]$First = 0,
+ [parameter(ParameterSetName="ole")]
+ [string]$Query = "select * from csv",
+ [int]$BatchSize = 50000,
+ [int]$NotifyAfter,
+ [switch]$TableLock,
+ [switch]$CheckConstraints,
+ [switch]$FireTriggers,
+ [switch]$KeepIdentity,
+ [switch]$KeepNulls,
+ [switch]$shellswitch,
+ [string]$SqlCredentialPath
+ )
+
+DynamicParam {
+
+ if ($sqlserver.length -gt 0) {
+ # Auto populate database list from specified sqlserver
+ $paramconn = New-Object System.Data.SqlClient.SqlConnection
+
+ if ($SqlCredentialPath.length -gt 0) {
+ $SqlCredential = Import-CliXml $SqlCredentialPath
+ }
+
+ if ($SqlCredential.count -eq 0 -or $SqlCredential -eq $null) {
+ $paramconn.ConnectionString = "Data Source=$sqlserver;Integrated Security=True;"
+ } else {
+ $paramconn.ConnectionString = "Data Source=$sqlserver;User Id=$($SqlCredential.UserName); Password=$($SqlCredential.GetNetworkCredential().Password);"
+ }
+
+ try {
+ $paramconn.Open()
+ $sql = "select name from master.dbo.sysdatabases"
+ $paramcmd = New-Object System.Data.SqlClient.SqlCommand($sql, $paramconn, $null)
+ $paramdt = New-Object System.Data.DataTable
+ $paramdt.Load($paramcmd.ExecuteReader())
+ $databaselist = $paramdt.rows.name
+ $null = $paramcmd.Dispose()
+ $null = $paramconn.Close()
+ $null = $paramconn.Dispose()
+ } catch {
+ # But if the routine fails, at least let them specify a database manually
+ $databaselist = ""
+ }
+
+ # Reusable parameter setup
+ $newparams = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary
+ $attributes = New-Object System.Management.Automation.ParameterAttribute
+ $attributes.Mandatory = $false
+
+ # Database list parameter setup
+ $dbattributes = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute]
+ $dbattributes.Add($attributes)
+ # If a list of databases were returned, populate the parameter set
+ if ($databaselist.length -gt 0) {
+ $dbvalidationset = New-Object System.Management.Automation.ValidateSetAttribute -ArgumentList $databaselist
+ $dbattributes.Add($dbvalidationset)
+ }
+
+ $Database = New-Object -Type System.Management.Automation.RuntimeDefinedParameter("Database", [String], $dbattributes)
+ $newparams.Add("Database", $Database)
+ return $newparams
+ }
+}
+
+Begin {
+ Function Parse-OleQuery {
+ <#
+ .SYNOPSIS
+ Tests to ensure query is valid. This will be used for the GUI.
+
+ .EXAMPLE
+ Parse-OleQuery -Csv sqlservera -Query $query -FirstRowColumns $FirstRowColumns -delimiter $delimiter
+
+ .OUTPUT
+
+
+ #>
+ param(
+ [string]$Provider,
+ [Parameter(Mandatory=$true)]
+ [string[]]$csv,
+ [Parameter(Mandatory=$true)]
+ [string]$Query,
+ [Parameter(Mandatory=$true)]
+ [bool]$FirstRowColumns,
+ [Parameter(Mandatory=$true)]
+ [string]$delimiter
+
+ )
+
+ if ($query.ToLower() -notmatch "\bcsv\b") {
+ return "SQL statement must contain the word 'csv'."
+ }
+
+ try {
+ $datasource = Split-Path $csv[0]
+ $tablename = (Split-Path $csv[0] -leaf).Replace(".","#")
+ switch ($FirstRowColumns) {
+ $true { $FirstRowColumns = "Yes" }
+ $false { $FirstRowColumns = "No" }
+ }
+ if ($provider -ne $null) {
+ $connstring = "Provider=$provider;Data Source=$datasource;Extended Properties='text';"
+ } else {
+ $connstring = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=$datasource;Extended Properties='text';"
+ }
+
+ $conn = New-Object System.Data.OleDb.OleDbconnection $connstring
+ $conn.Open()
+ $sql = $Query -replace "\bcsv\b"," [$tablename]"
+ $cmd = New-Object System.Data.OleDB.OleDBCommand
+ $cmd.Connection = $conn
+ $cmd.CommandText = $sql
+ $null = $cmd.ExecuteReader()
+ $cmd.Dispose()
+ $conn.Dispose()
+ return $true
+ } catch { return $false }
+ }
+
+ Function Test-SqlConnection {
+ <#
+ .SYNOPSIS
+ Uses System.Data.SqlClient to gather list of user databases.
+
+ .EXAMPLE
+ $SqlCredential = Get-Credential
+ Get-SqlDatabases -SqlServer sqlservera -SqlCredential $SqlCredential
+
+ .OUTPUT
+ Array of user databases
+
+ #>
+ param(
+ [Parameter(Mandatory=$true)]
+ [string]$SqlServer,
+ [object]$SqlCredential
+ )
+ $testconn = New-Object System.Data.SqlClient.SqlConnection
+ if ($SqlCredential.count -eq 0) {
+ $testconn.ConnectionString = "Data Source=$sqlserver;Integrated Security=True;Connection Timeout=3"
+ } else {
+ $testconn.ConnectionString = "Data Source=$sqlserver;User Id=$($SqlCredential.UserName); Password=$($SqlCredential.GetNetworkCredential().Password);Connection Timeout=3"
+ }
+ try {
+ $testconn.Open()
+ $testconn.Close()
+ $testconn.Dispose()
+ return $true
+ } catch {
+ $message = $_.Exception.Message.ToString()
+ Write-Verbose $message
+ if ($message -match "A network") { $message = "Can't connect to $sqlserver." }
+ elseif ($message -match "Login failed for user") { $message = "Login failed for $username." }
+ return $message
+ }
+ }
+
+ Function Get-SqlDatabases {
+ <#
+ .SYNOPSIS
+ Uses System.Data.SqlClient to gather list of user databases.
+
+ .EXAMPLE
+ $SqlCredential = Get-Credential
+ Get-SqlDatabases -SqlServer sqlservera -SqlCredential $SqlCredential
+
+ .OUTPUT
+ Array of user databases
+
+ #>
+ param(
+ [Parameter(Mandatory=$true)]
+ [string]$SqlServer,
+ [object]$SqlCredential
+ )
+ $paramconn = New-Object System.Data.SqlClient.SqlConnection
+ if ($SqlCredential.count -eq 0) {
+ $paramconn.ConnectionString = "Data Source=$sqlserver;Integrated Security=True;Connection Timeout=3"
+ } else {
+ $paramconn.ConnectionString = "Data Source=$sqlserver;User Id=$($SqlCredential.UserName); Password=$($SqlCredential.GetNetworkCredential().Password);Connection Timeout=3"
+ }
+ try {
+ $paramconn.Open()
+ $sql = "select name from master.dbo.sysdatabases where dbid > 4 order by name"
+ $paramcmd = New-Object System.Data.SqlClient.SqlCommand($sql, $paramconn, $null)
+ $datatable = New-Object System.Data.DataTable
+ [void]$datatable.Load($paramcmd.ExecuteReader())
+ $databaselist = $datatable.rows.name
+ $null = $paramcmd.Dispose()
+ $null = $paramconn.Close()
+ $null = $paramconn.Dispose()
+ return $databaselist
+ } catch { throw "Cannot access $sqlserver" }
+ }
+
+ Function Get-SqlTables {
+ <#
+ .SYNOPSIS
+ Uses System.Data.SqlClient to gather list of user databases.
+
+ .EXAMPLE
+ $SqlCredential = Get-Credential
+ Get-SqlTables -SqlServer sqlservera -Database mydb -SqlCredential $SqlCredential
+
+ .OUTPUT
+ Array of tables
+
+ #>
+ param(
+ [Parameter(Mandatory=$true)]
+ [string]$SqlServer,
+ [string]$Database,
+ [object]$SqlCredential
+ )
+ $tableconn = New-Object System.Data.SqlClient.SqlConnection
+ if ($SqlCredential.count -eq 0) {
+ $tableconn.ConnectionString = "Data Source=$sqlserver;Integrated Security=True;Connection Timeout=3"
+ } else {
+ $username = ($SqlCredential.UserName).TrimStart("\")
+ $tableconn.ConnectionString = "Data Source=$sqlserver;User Id=$username; Password=$($SqlCredential.GetNetworkCredential().Password);Connection Timeout=3"
+ }
+ try {
+ $tableconn.Open()
+ $sql = "select name from $database.sys.tables order by name"
+ $tablecmd = New-Object System.Data.SqlClient.SqlCommand($sql, $tableconn, $null)
+ $datatable = New-Object System.Data.DataTable
+ [void]$datatable.Load($tablecmd.ExecuteReader())
+ $tablelist = $datatable.rows.name
+ $null = $tablecmd.Dispose()
+ $null = $tableconn.Close()
+ $null = $tableconn.Dispose()
+ return $tablelist
+ } catch { return }
+ }
+
+ Function Get-Columns {
+ <#
+ .SYNOPSIS
+ TextFieldParser will be used instead of an OleDbConnection.
+ This is because the OleDbConnection driver may not exist on x64.
+
+ .EXAMPLE
+ $columns = Get-Columns -Csv .\myfile.csv -Delimiter "," -FirstRowColumns $true
+
+ .OUTPUT
+ Array of column names
+
+ #>
+
+ param(
+ [Parameter(Mandatory=$true)]
+ [string[]]$Csv,
+ [Parameter(Mandatory=$true)]
+ [string]$Delimiter,
+ [Parameter(Mandatory=$true)]
+ [bool]$FirstRowColumns
+ )
+
+ $columnparser = New-Object Microsoft.VisualBasic.FileIO.TextFieldParser($csv[0])
+ $columnparser.TextFieldType = "Delimited"
+ $columnparser.SetDelimiters($Delimiter)
+ $rawcolumns = $columnparser.ReadFields()
+
+ if ($FirstRowColumns -eq $true) {
+ $columns = ($rawcolumns | ForEach-Object { $_ -Replace '"' } | Select-Object -Property @{Name="name"; Expression = {"[$_]"}}).name
+ } else {
+ $columns = @()
+ foreach ($number in 1..$rawcolumns.count ) { $columns += "[column$number]" }
+ }
+
+ $columnparser.Close()
+ $columnparser.Dispose()
+ return $columns
+ }
+
+ Function Get-ColumnText {
+ <#
+ .SYNOPSIS
+ Returns an array of data, which can later be parsed for potential datatypes.
+
+ .EXAMPLE
+ $columns = Get-Columns -Csv .\myfile.csv -Delimiter ","
+
+ .OUTPUT
+ Array of column data
+
+ #>
+ param(
+ [Parameter(Mandatory=$true)]
+ [string[]]$Csv,
+ [Parameter(Mandatory=$true)]
+ [string]$Delimiter
+ )
+ $columnparser = New-Object Microsoft.VisualBasic.FileIO.TextFieldParser($csv[0])
+ $columnparser.TextFieldType = "Delimited"
+ $columnparser.SetDelimiters($Delimiter)
+ $line = $columnparser.ReadLine()
+ # Skip a line, in case first line are column names
+ $line = $columnparser.ReadLine()
+ $datatext = $columnparser.ReadFields()
+ $columnparser.Close()
+ $columnparser.Dispose()
+ return $datatext
+ }
+
+ Function Write-Schemaini {
+ <#
+ .SYNOPSIS
+ Unfortunately, passing delimiter within the OleDBConnection connection string is unreliable, so we'll use schema.ini instead
+ The default delimiter in Windows changes depending on country, so we'll do this for every delimiter, even commas.
+
+ Get OLE datatypes based on best guess of column data within the -Columns parameter.
+
+ Sometimes SQL will accept a datetime that OLE won't, so Text will be used for datetime.
+
+ .EXAMPLE
+ $columns = Get-Columns -Csv C:\temp\myfile.csv -Delimiter ","
+ $movedschemainis = Write-Schemaini -Csv C:\temp\myfile.csv -Columns $columns -ColumnText $columntext -Delimiter "," -FirstRowColumns $true
+
+ .OUTPUT
+ Creates new schema files, that look something like this:
+ [housingdata.csv]
+ Format=Delimited(,)
+ ColNameHeader=True
+ Col1="House ID" Long
+ Col2="Description" Memo
+ Col3="Price" Double
+
+ Returns an array of existing schema files that have been moved, if any.
+
+ #>
+ param(
+ [Parameter(Mandatory=$true)]
+ [string[]]$Csv,
+ [Parameter(Mandatory=$true)]
+ [string[]]$Columns,
+ [string[]]$ColumnText,
+ [Parameter(Mandatory=$true)]
+ [string]$Delimiter,
+ [Parameter(Mandatory=$true)]
+ [bool]$FirstRowColumns
+ )
+
+ $movedschemainis = @{}
+ foreach ($file in $csv) {
+ $directory = Split-Path $file
+ $schemaexists = Test-Path "$directory\schema.ini"
+ if ($schemaexists -eq $true) {
+ $newschemaname = "$env:TEMP\$(Split-Path $file -leaf)-schema.ini"
+ $movedschemainis.Add($newschemaname,"$directory\schema.ini")
+ Move-Item "$directory\schema.ini" $newschemaname -Force
+ }
+
+ $filename = Split-Path $file -leaf; $directory = Split-Path $file
+ Add-Content -Path "$directory\schema.ini" -Value "[$filename]"
+ Add-Content -Path "$directory\schema.ini" -Value "Format=Delimited($Delimiter)"
+ Add-Content -Path "$directory\schema.ini" -Value "ColNameHeader=$FirstRowColumns"
+
+ $index = 0
+ $olecolumns = ($columns | ForEach-Object { $_ -Replace "\[|\]", '"' })
+
+ foreach ($datatype in $columntext) {
+ $olecolumnname = $olecolumns[$index]
+ $index++
+
+ try { [System.Guid]::Parse($datatype) | Out-Null; $isguid = $true } catch { $isguid = $false }
+
+ if ($isguid -eq $true) { $oledatatype = "Text" }
+ elseif ([int64]::TryParse($datatype,[ref]0) -eq $true) { $oledatatype = "Long" }
+ elseif ([double]::TryParse($datatype,[ref]0) -eq $true) { $oledatatype = "Double" }
+ elseif ([datetime]::TryParse($datatype,[ref]0) -eq $true) { $oledatatype = "Text" }
+ else { $oledatatype = "Memo" }
+
+ Add-Content -Path "$directory\schema.ini" -Value "Col$($index)`=$olecolumnname $oledatatype"
+ }
+ }
+ return $movedschemainis
+ }
+
+ Function New-SqlTable {
+ <#
+ .SYNOPSIS
+ Creates new Table using existing SqlCommand.
+
+ SQL datatypes based on best guess of column data within the -ColumnText parameter.
+ Columns paramter determine column names.
+
+ .EXAMPLE
+ New-SqlTable -Csv $Csv -Delimiter $Delimiter -Columns $columns -ColumnText $columntext -SqlConn $sqlconn -Transaction $transaction
+
+ .OUTPUT
+ Creates new table
+ #>
+
+ param(
+ [Parameter(Mandatory=$true)]
+ [string[]]$Csv,
+ [Parameter(Mandatory=$true)]
+ [string]$Delimiter,
+ [string[]]$Columns,
+ [string[]]$ColumnText,
+ [System.Data.SqlClient.SqlConnection]$sqlconn,
+ [System.Data.SqlClient.SqlTransaction]$transaction
+ )
+ # Get SQL datatypes by best guess on first data row
+ $sqldatatypes = @(); $index = 0
+
+ foreach ($column in $columntext) {
+ $sqlcolumnname = $Columns[$index]
+ $index++
+
+ # bigint, float, and datetime are more accurate, but it didn't work
+ # as often as it should have, so we'll just go for a smaller datatype
+ if ([int64]::TryParse($column,[ref]0) -eq $true) { $sqldatatype = "varchar(255)" }
+ elseif ([double]::TryParse($column,[ref]0) -eq $true) { $sqldatatype = "varchar(255)" }
+ elseif ([datetime]::TryParse($column,[ref]0) -eq $true) { $sqldatatype = "varchar(255)" }
+ else { $sqldatatype = "varchar(MAX)" }
+
+ $sqldatatypes += "$sqlcolumnname $sqldatatype"
+ }
+
+ $sql = "BEGIN CREATE TABLE [$table] ($($sqldatatypes -join ' NULL,')) END"
+ $sqlcmd = New-Object System.Data.SqlClient.SqlCommand($sql, $sqlconn, $transaction)
+ try { $null = $sqlcmd.ExecuteNonQuery()} catch {
+ $errormessage = $_.Exception.Message.ToString()
+ throw "Failed to execute $sql. `nDid you specify the proper delimiter? `n$errormessage"
+ }
+
+ Write-Output "[*] Successfully created table $table with the following column definitions:`n $($sqldatatypes -join "`n ")"
+ # Write-Warning "All columns are created using a best guess, and use their maximum datatype."
+ Write-Warning "This is inefficient but allows the script to import without issues."
+ Write-Warning "Consider creating the table first using best practices if the data will be used in production."
+}
+
+
+ if ($shellswitch -eq $false) { Write-Output "[*] Started at $(Get-Date)" }
+
+ # Load the basics
+ [void][Reflection.Assembly]::LoadWithPartialName("System.Data")
+ [void][Reflection.Assembly]::LoadWithPartialName("Microsoft.VisualBasic")
+ [void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
+
+ # Getting the total rows copied is a challenge. Use SqlBulkCopyExtension.
+ # http://stackoverflow.com/questions/1188384/sqlbulkcopy-row-count-when-complete
+
+ $source = 'namespace System.Data.SqlClient
+ {
+ using Reflection;
+
+ public static class SqlBulkCopyExtension
+ {
+ const String _rowsCopiedFieldName = "_rowsCopied";
+ static FieldInfo _rowsCopiedField = null;
+
+ public static int RowsCopiedCount(this SqlBulkCopy bulkCopy)
+ {
+ if (_rowsCopiedField == null) _rowsCopiedField = typeof(SqlBulkCopy).GetField(_rowsCopiedFieldName, BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Instance);
+ return (int)_rowsCopiedField.GetValue(bulkCopy);
+ }
+ }
+ }
+ '
+ Add-Type -ReferencedAssemblies 'System.Data.dll' -TypeDefinition $source -ErrorAction SilentlyContinue
+}
+
+Process {
+ # Supafast turbo mode requires a table lock, or it's just regular fast
+ if ($turbo -eq $true) { $tablelock = $true }
+
+ # The query parameter requires OleDB which is invoked by the "safe" variable
+ # Actually, a select could be performed on the datatable used in StreamReader, too.
+ # Maybe that will be done later.
+ if ($query -ne "select * from csv") { $safe = $true }
+
+ if ($first -gt 0 -and $query -ne "select * from csv") {
+ throw "Cannot use both -Query and -First. If a query is necessary, use TOP $first within your SQL statement."
+ }
+
+ # In order to support -First in both Streamreader, and OleDb imports, the query must be modified slightly.
+ if ($first -gt 0) { $query = "select top $first * from csv" }
+
+ # If shell switch occured, and encrypted SQL credentials were written to disk, create $SqlCredential
+ if ($SqlCredentialPath.length -gt 0) {
+ $SqlCredential = Import-CliXml $SqlCredentialPath
+ }
+
+ # Get Database string from RuntimeDefinedParameter if required
+ if ($database -isnot [string]) { $database = $PSBoundParameters.Database }
+ if ($database.length -eq 0) { throw "You must specify a database." }
+
+ # Check to ensure a Windows account wasn't used as a SQL Credential
+ if ($SqlCredential.count -gt 0 -and $SqlCredential.UserName -like "*\*") { throw "Only SQL Logins can be used as a SqlCredential." }
+
+ # If no CSV was specified, prompt the user to select one.
+ if ($csv.length -eq 0) {
+ $fd = New-Object System.Windows.Forms.OpenFileDialog
+ $fd.InitialDirectory = [environment]::GetFolderPath("MyDocuments")
+ $fd.Filter = "CSV Files (*.csv;*.tsv;*.txt)|*.csv;*.tsv;*.txt"
+ $fd.Title = "Select one or more CSV files"
+ $fd.MultiSelect = $true
+ $null = $fd.showdialog()
+ $csv = $fd.filenames
+ if ($csv.length -eq 0) { throw "No CSV file selected." }
+ } else {
+ foreach ($file in $csv) {
+ $exists = Test-Path $file
+ if ($exists -eq $false) { throw "$file does not exist" }
+ }
+ }
+
+ # Resolve the full path of each CSV
+ $resolvedcsv = @()
+ foreach ($file in $csv) { $resolvedcsv += (Resolve-Path $file).Path }
+ $csv = $resolvedcsv
+
+ # UniqueIdentifier kills OLE DB / SqlBulkCopy imports. Check to see if destination table contains this datatype.
+ if ($safe -eq $true) {
+ $sqlcheckconn = New-Object System.Data.SqlClient.SqlConnection
+ if ($SqlCredential.count -eq 0 -or $SqlCredential -eq $null) {
+ $sqlcheckconn.ConnectionString = "Data Source=$sqlserver;Integrated Security=True;Connection Timeout=3; Initial Catalog=master"
+ } else {
+ $username = ($SqlCredential.UserName).TrimStart("\")
+ $sqlcheckconn.ConnectionString = "Data Source=$sqlserver;User Id=$username; Password=$($SqlCredential.GetNetworkCredential().Password);Connection Timeout=3; Initial Catalog=master"
+ }
+
+ try { $sqlcheckconn.Open() } catch { throw $_.Exception }
+
+ # Ensure database exists
+ $sql = "select count(*) from master.dbo.sysdatabases where name = '$database'"
+ $sqlcheckcmd = New-Object System.Data.SqlClient.SqlCommand($sql, $sqlcheckconn)
+ $dbexists = $sqlcheckcmd.ExecuteScalar()
+ if ($dbexists -eq $false) { throw "Database does not exist on $sqlserver" }
+
+ # Change database after the fact, because if db doesn't exist, the login would fail.
+ $sqlcheckconn.ChangeDatabase($database)
+
+ $sql = "SELECT t.name as datatype FROM sys.columns c
+ JOIN sys.types t ON t.system_type_id = c.system_type_id
+ WHERE c.object_id = object_id('$table') and t.name != 'sysname'"
+ $sqlcheckcmd = New-Object System.Data.SqlClient.SqlCommand($sql, $sqlcheckconn)
+ $sqlcolumns = New-Object System.Data.DataTable
+ $sqlcolumns.load($sqlcheckcmd.ExecuteReader("CloseConnection"))
+ $sqlcheckconn.Dispose()
+ if ($sqlcolumns.datatype -contains "UniqueIdentifier") {
+ throw "UniqueIdentifier not supported by OleDB/SqlBulkCopy. Query and Safe cannot be supported."
+ }
+ }
+
+ if ($safe -eq $true) {
+ # Check for drivers. First, ACE (Access) if file is smaller than 2GB, then JET
+ # ACE doesn't handle files larger than 2gb. What gives?
+ foreach ($file in $csv) {
+ $filesize = (Get-ChildItem $file).Length / 1GB
+ if ($filesize -gt 1.99) { $jetonly = $true }
+ }
+
+ if ($jetonly -ne $true) { $provider = (New-Object System.Data.OleDb.OleDbEnumerator).GetElements() | Where-Object { $_.SOURCES_NAME -like "Microsoft.ACE.OLEDB.*" } }
+
+ if ($provider -eq $null) {
+ $provider = (New-Object System.Data.OleDb.OleDbEnumerator).GetElements() | Where-Object { $_.SOURCES_NAME -like "Microsoft.Jet.OLEDB.*" }
+ }
+
+ # If a suitable provider cannot be found (If x64 and Access hasn't been installed)
+ # switch to x86, because it natively supports JET
+ if ($provider -ne $null) {
+ if ($provider -is [system.array]) { $provider = $provider[$provider.GetUpperBound(0)].SOURCES_NAME } else { $provider = $provider.SOURCES_NAME }
+ }
+
+ # If a provider doesn't exist, it is necessary to switch to x86 which natively supports JET.
+ if ($provider -eq $null) {
+ # While Install-Module takes care of installing modules to x86 and x64, Import-Module doesn't.
+ # Because of this, the Module must be exported, written to file, and imported in the x86 shell.
+ $definition = (Get-Command Import-CsvToSql).Definition
+ $function = "Function Import-CsvToSql { $definition }"
+ Set-Content "$env:TEMP\Import-CsvToSql.psm1" $function
+
+ # Encode the SQL string, since some characters may mess up after being passed a second time.
+ $bytes = [System.Text.Encoding]::UTF8.GetBytes($query)
+ $query = [System.Convert]::ToBase64String($bytes)
+
+ # Put switches back into proper format
+ $switches = @()
+ $options = "TableLock","CheckConstraints","FireTriggers","KeepIdentity","KeepNulls","Default","Truncate","FirstRowColumns","Safe"
+ foreach ($option in $options) {
+ $optionValue = Get-Variable $option -ValueOnly -ErrorAction SilentlyContinue
+ if ($optionValue -eq $true) { $switches += "-$option" }
+ }
+
+ # Perform the actual switch, which removes any registered Import-CsvToSql modules
+ # Then imports, and finally re-executes the command.
+ $csv = $csv -join ","; $switches = $switches -join " "
+ if ($SqlCredential.count -gt 0) {
+ $SqlCredentialPath = "$env:TEMP\sqlcredential.xml"
+ Export-CliXml -InputObject $SqlCredential $SqlCredentialPath
+ }
+ $command = "Import-CsvToSql -Csv $csv -SqlServer '$sqlserver'-Database '$database' -Table '$table' -Delimiter '$Delimiter' -First $First -Query '$query' -Batchsize $BatchSize -NotifyAfter $NotifyAfter $switches -shellswitch"
+
+ if ($SqlCredentialPath.length -gt 0) { $command += " -SqlCredentialPath $SqlCredentialPath"}
+ Write-Verbose "Switching to x86 shell, then switching back."
+ &"$env:windir\syswow64\windowspowershell\v1.0\powershell.exe" "$command"
+ return
+ }
+ }
+
+ # Do the first few lines contain the specified delimiter?
+ foreach ($file in $csv) {
+ try { $firstfewlines = Get-Content $file -First 3 -ErrorAction Stop } catch { throw "$file is in use." }
+ foreach ($line in $firstfewlines) {
+ if (($line -match $delimiter) -eq $false) { throw "Delimiter $delimiter not found in first row of $file." }
+ }
+ }
+
+ # If more than one csv specified, check to ensure number of columns match
+ if ($csv -is [system.array]){
+ $numberofcolumns = ((Get-Content $csv[0] -First 1 -ErrorAction Stop) -Split $delimiter).Count
+
+ foreach ($file in $csv) {
+ $firstline = Get-Content $file -First 1 -ErrorAction Stop
+ $newnumcolumns = ($firstline -Split $Delimiter).Count
+ if ($newnumcolumns -ne $numberofcolumns) { throw "Multiple csv file mismatch. Do both use the same delimiter and have the same number of columns?" }
+ }
+ }
+
+ # Automatically generate Table name if not specified, then prompt user to confirm
+ if ($table.length -eq 0) {
+ $table = [IO.Path]::GetFileNameWithoutExtension($csv[0])
+ $title = "Table name not specified."
+ $message = "Would you like to use the automatically generated name: $table"
+ $yes = New-Object System.Management.Automation.Host.ChoiceDescription "&Yes", "Uses table name $table for import."
+ $no = New-Object System.Management.Automation.Host.ChoiceDescription "&No", "Allows you to specify an alternative table name."
+ $options = [System.Management.Automation.Host.ChoiceDescription[]]($yes, $no)
+ $result = $host.ui.PromptForChoice($title, $message, $options, 0)
+ if ($result -eq 1) {
+ do {$table = Read-Host "Please enter a table name"} while ($table.Length -eq 0)
+ }
+ }
+
+ # If the shell has switched, decode the $query string.
+ if ($shellswitch -eq $true) {
+ $bytes = [System.Convert]::FromBase64String($Query)
+ $query = [System.Text.Encoding]::UTF8.GetString($bytes)
+ $csv = $csv -Split ","
+ }
+
+ # Create columns based on first data row of first csv.
+ Write-Output "[*] Calculating column names and datatypes"
+ $columns = Get-Columns -Csv $Csv -Delimiter $Delimiter -FirstRowColumns $FirstRowColumns
+ if ($columns.count -gt 255 -and $safe -eq $true) {
+ throw "CSV must contain fewer than 256 columns."
+ }
+
+ $columntext = Get-ColumnText -Csv $Csv -Delimiter $Delimiter
+
+ # OLEDB method requires extra checks
+ if ($safe -eq $true) {
+ # Advanced SQL queries may not work (SqlBulkCopy likes a 1 to 1 mapping), so warn the user.
+ if ($Query -match "GROUP BY" -or $Query -match "COUNT") { Write-Warning "Script doesn't really support the specified query. This probably won't work, but will be attempted anyway." }
+
+ # Check for proper SQL syntax, which for the purposes of this module must include the word "table"
+ if ($query.ToLower() -notmatch "\bcsv\b") {
+ throw "SQL statement must contain the word 'csv'. Please see this module's documentation for more details."
+ }
+
+ # In order to ensure consistent results, a schema.ini file must be created.
+ # If a schema.ini already exists, it will be moved to TEMP temporarily.
+ Write-Verbose "Creating schema.ini"
+ $movedschemainis = Write-Schemaini -Csv $Csv -Columns $columns -Delimiter "$Delimiter" -FirstRowColumns $FirstRowColumns -ColumnText $columntext
+ }
+
+ # Display SQL Server Login info
+ if ($sqlcredential.count -gt 0) { $username = "SQL login $($SqlCredential.UserName)" }
+ else { $username = "Windows login $(whoami)" }
+ # Open Connection to SQL Server
+ Write-Output "[*] Logging into $sqlserver as $username"
+ $sqlconn = New-Object System.Data.SqlClient.SqlConnection
+ if ($SqlCredential.count -eq 0) {
+ $sqlconn.ConnectionString = "Data Source=$sqlserver;Integrated Security=True;Connection Timeout=3; Initial Catalog=master"
+ } else {
+ $sqlconn.ConnectionString = "Data Source=$sqlserver;User Id=$($SqlCredential.UserName); Password=$($SqlCredential.GetNetworkCredential().Password);Connection Timeout=3; Initial Catalog=master"
+ }
+
+ try { $sqlconn.Open() } catch { throw "Could not open SQL Server connection. Is $sqlserver online?" }
+
+ # Everything will be contained within 1 transaction, even creating a new table if required
+ # and truncating the table, if specified.
+ $transaction = $sqlconn.BeginTransaction()
+
+ # Ensure database exists
+ $sql = "select count(*) from master.dbo.sysdatabases where name = '$database'"
+ $sqlcmd = New-Object System.Data.SqlClient.SqlCommand($sql, $sqlconn, $transaction)
+ $dbexists = $sqlcmd.ExecuteScalar()
+ if ($dbexists -eq $false) { throw "Database does not exist on $sqlserver" }
+ Write-Output "[*] Database exists"
+
+ $sqlconn.ChangeDatabase($database)
+
+ # Ensure table exists
+ $sql = "select count(*) from $database.sys.tables where name = '$table'"
+ $sqlcmd = New-Object System.Data.SqlClient.SqlCommand($sql, $sqlconn, $transaction)
+ $tablexists = $sqlcmd.ExecuteScalar()
+
+ # Create the table if required. Remember, this will occur within a transaction, so if the script fails, the
+ # new table will no longer exist.
+ if ($tablexists -eq $false) {
+ Write-Output "[*] Table does not exist"
+ Write-Output "[*] Creating table"
+ New-SqlTable -Csv $Csv -Delimiter $Delimiter -Columns $columns -ColumnText $columntext -SqlConn $sqlconn -Transaction $transaction
+ } else { Write-Output "[*] Table exists" }
+
+ # Truncate if specified. Remember, this will occur within a transaction, so if the script fails, the
+ # truncate will not be committed.
+ if ($truncate -eq $true) {
+ Write-Output "[*] Truncating table"
+ $sql = "TRUNCATE TABLE [$table]"
+ $sqlcmd = New-Object System.Data.SqlClient.SqlCommand($sql, $sqlconn, $transaction)
+ try { $null = $sqlcmd.ExecuteNonQuery() } catch { Write-Warning "Could not truncate $table" }
+ }
+
+ # Get columns for column mapping
+ if ($columnMappings -eq $null) {
+ $olecolumns = ($columns | ForEach-Object { $_ -Replace "\[|\]" })
+ $sql = "select name from sys.columns where object_id = object_id('$table') order by column_id"
+ $sqlcmd = New-Object System.Data.SqlClient.SqlCommand($sql, $sqlconn, $transaction)
+ $sqlcolumns = New-Object System.Data.DataTable
+ $sqlcolumns.Load($sqlcmd.ExecuteReader())
+ }
+
+ # Time to import!
+ $elapsed = [System.Diagnostics.Stopwatch]::StartNew()
+
+ # Process each CSV file specified
+ foreach ($file in $csv) {
+
+ # Dynamically set NotifyAfter if it wasn't specified
+ if ($notifyAfter -eq 0) {
+ if ($resultcount -is [int]) { $notifyafter = $resultcount/10 }
+ else { $notifyafter = 50000 }
+ }
+
+ # Setup bulk copy
+ Write-Output "[*] Starting bulk copy for $(Split-Path $file -Leaf)"
+
+ # Setup bulk copy options
+ $bulkCopyOptions = @()
+ $options = "TableLock","CheckConstraints","FireTriggers","KeepIdentity","KeepNulls","Default","Truncate"
+ foreach ($option in $options) {
+ $optionValue = Get-Variable $option -ValueOnly -ErrorAction SilentlyContinue
+ if ($optionValue -eq $true) { $bulkCopyOptions += "$option" }
+ }
+ $bulkCopyOptions = $bulkCopyOptions -join " & "
+
+ # Create SqlBulkCopy using default options, or options specified in command line.
+ if ($bulkCopyOptions.count -gt 1) { $bulkcopy = New-Object Data.SqlClient.SqlBulkCopy($oleconnstring, $bulkCopyOptions, $transaction) }
+ else { $bulkcopy = New-Object Data.SqlClient.SqlBulkCopy($sqlconn,"Default",$transaction) }
+
+ $bulkcopy.DestinationTableName = "[$table]"
+ $bulkcopy.bulkcopyTimeout = 0
+ $bulkCopy.BatchSize = $BatchSize
+ $bulkCopy.NotifyAfter = $NotifyAfter
+
+ if ($safe -eq $true) {
+ # Setup bulkcopy mappings
+ for ($columnid = 0; $columnid -lt $sqlcolumns.rows.count; $columnid++) {
+ $null = $bulkCopy.ColumnMappings.Add($olecolumns[$columnid], $sqlcolumns.rows[$columnid].ItemArray[0])
+ }
+
+ # Setup the connection string. Data Source is the directory that contains the csv.
+ # The file name is also the table name, but with a "#" instead of a "."
+ $datasource = Split-Path $file
+ $tablename = (Split-Path $file -leaf).Replace(".","#")
+ $oleconnstring = "Provider=$provider;Data Source=$datasource;Extended Properties='text';"
+
+ # To make command line queries easier, let the user just specify "csv" instead of the
+ # OleDbconnection formatted name (file.csv -> file#csv)
+ $sql = $Query -replace "\bcsv\b"," [$tablename]"
+
+ # Setup the OleDbconnection
+ $oleconn = New-Object System.Data.OleDb.OleDbconnection
+ $oleconn.ConnectionString = $oleconnstring
+
+ # Setup the OleDBCommand
+ $olecmd = New-Object System.Data.OleDB.OleDBCommand
+ $olecmd.Connection = $oleconn
+ $olecmd.CommandText = $sql
+
+ try { $oleconn.Open() } catch { throw "Could not open OLEDB connection." }
+
+ # Attempt to get the number of results so that a nice progress bar can be displayed.
+ # This takes extra time, and files over 100MB take too long, so just skip them.
+ if ($sql -match "GROUP BY") { "Query contains GROUP BY clause. Skipping result count." }
+ else { Write-Output "[*] Determining total rows to be copied. This may take a few seconds." }
+
+ if ($sql -match "\bselect top\b") {
+ try {
+ $split = $sql -split "\bselect top \b"
+ $resultcount = [int]($split[1].Trim().Split()[0])
+ Write-Output "[*] Attempting to fetch $resultcount rows"
+ } catch { Write-Warning "Couldn't determine total rows to be copied." }
+ } elseif ($sql -notmatch "GROUP BY") {
+ $filesize = (Get-ChildItem $file).Length / 1MB
+ if ($filesize -lt 100) {
+ try {
+ $split = $sql -split "\bfrom\b"
+ $sqlcount = "select count(*) from $($split[1])"
+ # Setup the OleDBCommand
+ $olecmd = New-Object System.Data.OleDB.OleDBCommand
+ $olecmd.Connection = $oleconn
+ $olecmd.CommandText = $sqlcount
+ $resultcount = [int]($olecmd.ExecuteScalar())
+ Write-Output "[*] $resultcount rows will be copied"
+ } catch { Write-Warning "Couldn't determine total rows to be copied" }
+ } else {
+ Write-Output "[*] File is too large for efficient result count; progress bar will not be shown."
+ }
+ }
+ }
+
+ # Write to server :D
+ try {
+ if ($safe -ne $true) {
+ # Check to ensure batchsize isn't equal to 0
+ if ($batchsize -eq 0) {
+ write-warning "Invalid batchsize for this operation. Increasing to 50k"
+ $batchsize = 50000
+ }
+
+ # Open the text file from disk
+ $reader = New-Object System.IO.StreamReader($file)
+ if ($FirstRowColumns -eq $true) { $null = $reader.readLine() }
+
+ # Create the reusable datatable. Columns will be genereated using info from SQL.
+ $datatable = New-Object System.Data.DataTable
+
+ # Get table column info from SQL Server
+ $sql = "SELECT c.name as colname, t.name as datatype, c.max_length, c.is_nullable FROM sys.columns c
+ JOIN sys.types t ON t.system_type_id = c.system_type_id
+ WHERE c.object_id = object_id('$table') and t.name != 'sysname'
+ order by c.column_id"
+ $sqlcmd = New-Object System.Data.SqlClient.SqlCommand($sql, $sqlconn,$transaction)
+ $sqlcolumns = New-Object System.Data.DataTable
+ $sqlcolumns.load($sqlcmd.ExecuteReader())
+
+ foreach ($sqlcolumn in $sqlcolumns) {
+ $datacolumn = $datatable.Columns.Add()
+ $colname = $sqlcolumn.colname
+ $datacolumn.AllowDBNull = $sqlcolumn.is_nullable
+ $datacolumn.ColumnName = $colname
+ $datacolumn.DefaultValue = [DBnull]::Value
+ $datacolumn.Datatype = [string]
+
+ # The following data types can sometimes cause issues when they are null
+ # so we will treat them differently
+ $convert = "bigint", "DateTimeOffset", "UniqueIdentifier", "smalldatetime", "datetime"
+ if ($convert -notcontains $sqlcolumn.datatype -and $turbo -ne $true){
+ $null = $bulkCopy.ColumnMappings.Add($datacolumn.ColumnName, $sqlcolumn.colname)
+ }
+ }
+ # For the columns that cause trouble, we'll add an additional column to the datatable
+ # which will perform a conversion.
+ # Setting $column.datatype alone doesn't work as well as setting+converting.
+ if ($turbo -ne $true) {
+ $calcolumns = $sqlcolumns | Where-Object { $convert -contains $_.datatype }
+ foreach ($calcolumn in $calcolumns) {
+ $colname = $calcolumn.colname
+ $null = $newcolumn = $datatable.Columns.Add()
+ $null = $newcolumn.ColumnName = "computed$colname"
+ switch ($calcolumn.datatype) {
+ "bigint" { $netdatatype = "System.Int64"; $newcolumn.Datatype = [int64] }
+ "DateTimeOffset" { $netdatatype = "System.DateTimeOffset"; $newcolumn.Datatype = [DateTimeOffset] }
+ "UniqueIdentifier" { $netdatatype = "System.Guid"; $newcolumn.Datatype = [Guid] }
+ { "smalldatetime","datetime" -contains $_ } { $netdatatype = "System.DateTime"; $newcolumn.Datatype = [DateTime] }
+ }
+ # Use a data column expression to facilitate actual conversion
+ $null = $newcolumn.Expression = "Convert($colname, $netdatatype)"
+ $null = $bulkCopy.ColumnMappings.Add($newcolumn.ColumnName, $calcolumn.colname)
+ }
+ }
+
+ # Check to see if file has quote identified data (ie. "first","second","third")
+ $quoted = $false
+ $checkline = Get-Content $file -Last 1
+ $checkcolumns = $checkline.Split($delimiter)
+ foreach ($checkcolumn in $checkcolumns) {
+ if ($checkcolumn.StartsWith('"') -and $checkcolumn.EndsWith('"')) { $quoted = $true }
+ }
+
+ if ($quoted -eq $true) {
+ Write-Warning "The CSV file appears quote identified. This may take a little longer."
+ # Thanks for this, Chris! http://www.schiffhauer.com/c-split-csv-values-with-a-regular-expression/
+ $pattern = "((?<=`")[^`"]*(?=`"($delimiter|$)+)|(?<=$delimiter|^)[^$delimiter`"]*(?=$delimiter|$))"
+ }
+ if ($turbo -eq $true -and $first -eq 0) {
+ while (($line = $reader.ReadLine()) -ne $null) {
+ $i++
+ if ($quoted -eq $true) {
+ $null = $datatable.Rows.Add(($line.TrimStart('"').TrimEnd('"')) -Split "`"$delimiter`"")
+ } else { $row = $datatable.Rows.Add($line.Split($delimiter)) }
+
+ if (($i % $batchsize) -eq 0) {
+ $bulkcopy.WriteToServer($datatable)
+ Write-Output "[*] $i rows have been inserted in $([math]::Round($elapsed.Elapsed.TotalSeconds,2)) seconds"
+ $datatable.Clear()
+ }
+ }
+ } else {
+ if ($turbo -eq $true -and $first -gt 0) { Write-Warning "Using -First makes turbo a smidge slower." }
+ # Start import!
+ while (($line = $reader.ReadLine()) -ne $null) {
+ $i++
+ try {
+ if ($quoted -eq $true) {
+ $row = $datatable.Rows.Add(($line.TrimStart('"').TrimEnd('"')) -Split $pattern)
+ } else { $row = $datatable.Rows.Add($line.Split($delimiter)) }
+ } catch {
+ $row = $datatable.NewRow()
+ try {
+ $tempcolumn = $line.Split($delimiter)
+ $colnum = 0
+ foreach ($column in $tempcolumn) {
+ if ($column.length -ne 0) {
+ $row.item($colnum) = $column
+ } else {
+ $row.item($colnum) = [DBnull]::Value
+ }
+ $colnum++
+ }
+ $newrow = $datatable.Rows.Add($row)
+ } catch {
+ Write-Warning "The following line ($i) is causing issues:"
+ Write-Output $line.Replace($delimiter,"`n")
+
+ if ($quoted -eq $true) {
+ Write-Warning "The import has failed, likely because the quoted data was a little too inconsistent. Try using the -Safe parameter."
+ }
+
+ Write-Verbose "Column datatypes:"
+ foreach ($c in $datatable.columns) {
+ Write-Verbose "$($c.columnname) = $($c.datatype)"
+ }
+ Write-Error $_.Exception.Message
+ break
+ }
+ }
+
+ if (($i % $batchsize) -eq 0 -or $i -eq $first) {
+ $bulkcopy.WriteToServer($datatable)
+ Write-Output "[*] $i rows have been inserted in $([math]::Round($elapsed.Elapsed.TotalSeconds,2)) seconds"
+ $datatable.Clear()
+ if ($i -eq $first) { break }
+ }
+ }
+ }
+ # Add in all the remaining rows since the last clear
+ if($datatable.Rows.Count -gt 0) {
+ $bulkcopy.WriteToServer($datatable)
+ $datatable.Clear()
+ }
+ } else {
+ # Add rowcount output
+ $bulkCopy.Add_SqlRowscopied({
+ $script:totalrows = $args[1].RowsCopied
+ if ($resultcount -is [int]) {
+ $percent = [int](($script:totalrows/$resultcount)*100)
+ $timetaken = [math]::Round($elapsed.Elapsed.TotalSeconds,2)
+ Write-Progress -id 1 -activity "Inserting $resultcount rows" -percentcomplete $percent `
+ -status ([System.String]::Format("Progress: {0} rows ({1}%) in {2} seconds", $script:totalrows, $percent, $timetaken))
+ } else {
+ Write-Host "$($script:totalrows) rows copied in $([math]::Round($elapsed.Elapsed.TotalSeconds,2)) seconds" }
+ })
+
+ $bulkCopy.WriteToServer($olecmd.ExecuteReader("SequentialAccess"))
+ if ($resultcount -is [int]) { Write-Progress -id 1 -activity "Inserting $resultcount rows" -status "Complete" -Completed }
+
+ }
+ $completed = $true
+ } catch {
+ # If possible, give more information about common errors.
+ if ($resultcount -is [int]) { Write-Progress -id 1 -activity "Inserting $resultcount rows" -status "Failed" -Completed }
+ $errormessage = $_.Exception.Message.ToString()
+ $completed = $false
+ if ($errormessage -like "*for one or more required parameters*") {
+
+ Write-Error "Looks like your SQL syntax may be invalid. `nCheck the documentation for more information or start with a simple -Query 'select top 10 * from csv'"
+ Write-Error "Valid CSV columns are $columns"
+
+ } elseif ($errormessage -match "invalid column length") {
+
+ # Get more information about malformed CSV input
+ $pattern = @("\d+")
+ $match = [regex]::matches($errormessage, @("\d+"))
+ $index = [int]($match.groups[1].Value)-1
+ $sql = "select name, max_length from sys.columns where object_id = object_id('$table') and column_id = $index"
+ $sqlcmd = New-Object System.Data.SqlClient.SqlCommand($sql, $sqlconn,$transaction)
+ $datatable = New-Object System.Data.DataTable
+ $datatable.load($sqlcmd.ExecuteReader())
+ $column = $datatable.name
+ $length = $datatable.max_length
+
+ if ($safe -eq $true) {
+ Write-Warning "Column $index ($column) contains data with a length greater than $length"
+ Write-Warning "SqlBulkCopy makes it pretty much impossible to know which row caused the issue, but it's somewhere after row $($script:totalrows)."
+ }
+ } elseif ($errormessage -match "does not allow DBNull" -or $errormessage -match "The given value of type") {
+
+ if ($tablexists -eq $false) {
+ Write-Error "Looks like the datatype prediction didn't work out. Please create the table manually with proper datatypes then rerun the import script."
+ } else {
+ $sql = "select name from sys.columns where object_id = object_id('$table') order by column_id"
+ $sqlcmd = New-Object System.Data.SqlClient.SqlCommand($sql, $sqlconn, $transaction)
+ $datatable = New-Object System.Data.DataTable
+ $datatable.Load($sqlcmd.ExecuteReader())
+ $olecolumns = ($columns | ForEach-Object { $_ -Replace "\[|\]" }) -join ', '
+ Write-Warning "Datatype mismatch."
+ Write-Output "[*] This is sometimes caused by null handling in SqlBulkCopy, quoted data, or the first row being column names and not data (-FirstRowColumns)"
+ Write-Output "[*] This could also be because the data types don't match or the order of the columns within the CSV/SQL statement "
+ Write-Output "[*] do not line up with the order of the table within the SQL Server.`n"
+ Write-Output "[*] CSV order: $olecolumns`n"
+ Write-Output "[*] SQL order: $($datatable.rows.name -join ', ')`n"
+ Write-Output "[*] If this is the case, you can reorder columns by using the -Query parameter or execute the import against a view.`n"
+ if ($safe -eq $false) {
+ Write-Output "[*] You can also try running this import using the -Safe parameter, which handles quoted text well.`n"
+ }
+ Write-Error "`n$errormessage"
+ }
+
+
+ } elseif ($errormessage -match "Input string was not in a correct format" -or $errormessage -match "The given ColumnName") {
+ Write-Warning "CSV contents may be malformed."
+ Write-Error $errormessage
+ } else { Write-Error $errormessage }
+ }
+ }
+
+ if ($completed -eq $true) {
+ # "Note: This count does not take into consideration the number of rows actually inserted when Ignore Duplicates is set to ON."
+ $null = $transaction.Commit()
+
+ if ($safe -eq $false) {
+ Write-Output "[*] $i total rows copied"
+ } else {
+ $total = [System.Data.SqlClient.SqlBulkCopyExtension]::RowsCopiedCount($bulkcopy)
+ Write-Output "[*] $total total rows copied"
+ }
+ } else {
+ Write-Output "[*] Transaction rolled back."
+ Write-Output "[*] (Was the proper parameter specified? Is the first row the column name?)."
+ }
+
+ # Script is finished. Show elapsed time.
+ $totaltime = [math]::Round($elapsed.Elapsed.TotalSeconds,2)
+ Write-Output "[*] Total Elapsed Time for bulk insert: $totaltime seconds"
+}
+
+End {
+ # Close everything just in case & ignore errors
+ try { $null = $sqlconn.close(); $null = $sqlconn.Dispose(); $null = $oleconn.close;
+ $null = $olecmd.Dispose(); $null = $oleconn.Dispose(); $null = $bulkCopy.close();
+ $null = $bulkcopy.dispose(); $null = $reader.close; $null = $reader.dispose() } catch {}
+
+ # Delete all the temp files
+ if ($SqlCredentialPath.length -gt 0) {
+ if ((Test-Path $SqlCredentialPath) -eq $true) {
+ $null = cmd /c "del $SqlCredentialPath"
+ }
+ }
+
+ if ($shellswitch -eq $false -and $safe -eq $true) {
+ # Delete new schema files
+ Write-Verbose "Removing automatically generated schema.ini"
+ foreach ($file in $csv) {
+ $directory = Split-Path $file
+ $null = cmd /c "del $directory\schema.ini" | Out-Null
+ }
+
+ # If a shell switch occured, delete the temporary module file.
+ if ((Test-Path "$env:TEMP\Import-CsvToSql.psm1") -eq $true) { cmd /c "del $env:TEMP\Import-CsvToSql.psm1" | Out-Null }
+
+ # Move original schema.ini's back if they existed
+ if ($movedschemainis.count -gt 0) {
+ foreach ($item in $movedschemainis) {
+ Write-Verbose "Moving $($item.keys) back to $($item.values)"
+ $null = cmd /c "move $($item.keys) $($item.values)"
+ }
+ }
+ Write-Output "[*] Finished at $(Get-Date)"
+ }
+}
+}
diff --git a/PowerShell/Export-AllPlans.ps1 b/PowerShell/Export-AllPlans.ps1
new file mode 100644
index 00000000..73745dd7
--- /dev/null
+++ b/PowerShell/Export-AllPlans.ps1
@@ -0,0 +1,64 @@
+<#
+.SYNOPSIS
+ Export all SQL Server query plans in files.
+.DESCRIPTION
+ Export all plans from cache to a .SQLPLAN file
+.PARAMETR
+ Machine - specify path to computer
+.PARAMETR
+ SqlInstance - specify SQL Server instance name
+.PARAMETR
+ DBname - specify database name
+.PARAMETR
+ Output - specify path for exported files
+.EXAMPLE
+Export-AllPlans -Machine "hostname"
+.NOTES
+ Requires: Powershell version 3 or higher, sqlps module
+ Tested on: SQL Server 2014/2016
+ Author: Grant Fritchey
+ Author Modified: Alexandr Titenko
+ Created date:
+ Last modified: 2017-02-22
+#>
+
+function Export-AllPlans {
+
+ param (
+ #Specify path to computer
+ [Parameter(Mandatory=$false)]
+ [String]$Machine = $env:COMPUTERNAME,
+ #Specify SQL Server instance name
+ [Parameter(Mandatory=$false)]
+ [String]$SqlInstance = '',
+ #Specify database name
+ [Parameter(Mandatory=$false)]
+ [String]$DBname = '',
+ #Specify output files path
+ [Parameter(Mandatory=$false)]
+ [String]$Output = 'C:\plans'
+ )
+$Query = 'SELECT deqp.query_plan
+FROM sys.dm_exec_query_stats AS deqs
+CROSS APPLY sys.dm_exec_query_plan(deqs.plan_handle) AS deqp
+WHERE deqp.query_plan IS NOT NULL;'
+
+$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
+$SqlConnection.ConnectionString = "Server=$Machine\$SqlInstance;Database=$DBname;trusted_connection=true"
+
+$PlanQuery = new-object System.Data.SqlClient.SqlCommand
+$PlanQuery.CommandText = $Query
+$PlanQuery.Connection = $SqlConnection
+$PlanAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
+$PlanAdapter.SelectCommand = $PlanQuery
+$PlanSet = new-object System.Data.DataSet
+$PlanAdapter.Fill($PlanSet)
+
+foreach($row in $PlanSet.Tables[0])
+{
+ $i+=1
+ $row[0] | Out-File -FilePath "$Output\$i.sqlplan"
+}
+}
+
+Export-AllPlans
\ No newline at end of file
diff --git a/PowerShell/Export-SQLTableToCSV.ps1 b/PowerShell/Export-SQLTableToCSV.ps1
new file mode 100644
index 00000000..eb24e65a
--- /dev/null
+++ b/PowerShell/Export-SQLTableToCSV.ps1
@@ -0,0 +1,488 @@
+#requires -version 4
+#requires -modules PSLogging
+<#
+.SYNOPSIS
+ Export in parallel sql server tables into csv files using bcp utility
+.DESCRIPTION
+ Export in parallel sql server tables into csv files using bcp utility
+ bcp docs: https://docs.microsoft.com/en-us/sql/tools/bcp-utility
+.PARAMETER CSVPath
+ Specifies path to out csv file(s) and log file
+.PARAMETER ServerName
+ Specifies a SQL Server name
+.PARAMETER DatabaseName
+ Specifies a database name
+.PARAMETER CodePage
+ Specifies code page
+.PARAMETER SchemaName
+ Specifies shema name. Use this parameter with parameter TableName
+.PARAMETER TableName
+ Specifies table name.
+.PARAMETER ExcludeColumns
+ Specifies which columns will be excluded.
+.PARAMETER OrderByColumns
+ Sets order by specific columns.
+.PARAMETER MinRowCount
+ Specifies a minimum row count for table(s) which will be unloaded
+.PARAMETER MaxRowCount
+ Specifies a maximum row count for table(s) which will be unloaded
+.PARAMETER FormatFile
+ Specify format file
+.PARAMETER FieldTerminator
+ Specify field terminator
+.PARAMETER RowTerminator
+ Specify row terminator
+.PARAMETER FileExtension
+ Determines the file extension
+.PARAMETER Collation
+ Specifies collation. Using collation parameter not allowed without format file parameter ('xml' or 'fmt')
+.PARAMETER OutputColumnHeaders
+ Specifies presence of headers - true - export with headers; false - export without headers
+.PARAMETER SavePhysicalOrder
+ Specifies column order. False - Alphabet column order type; true - physical column order type
+.PARAMETER OrderByColumns_term
+ Sets order by specific columns
+.OUTPUTS Log File
+ The script log file stored in C:\Windows\Temp\.log
+.NOTES
+ Version:
+ Author: Konstantin Taranov k@taranov.pro
+ Author Modified: Alexander Titenko aleks.titenko@gmail.com
+ Creation Date: 2017-09-26
+ Last modified: 2017-09-29
+ Purpose/Change: Add PSLogging module
+.EXAMPLE
+ Export-SQLTableToCSV -CSVPath D:\12\ -ServerName NL-04 -DatabaseName NIIGAZ -MinRowCount 1 -MaxRowCount 3;
+#>
+
+#---------------------------------------------------------[Initialisations]--------------------------------------------------------
+
+#Set Error Action to Silently Continue
+$ErrorActionPreference = 'SilentlyContinue'
+
+#Import Modules & Snap-ins
+Import-Module PSLogging
+
+#----------------------------------------------------------[Declarations]----------------------------------------------------------
+
+#Script Version
+$sScriptVersion = '1.1'
+
+#Log File Info
+$sLogPath = 'D:\1\'
+$sLogName = 'Export-SQLTableToCSV.log'
+$sLogFile = Join-Path -Path $sLogPath -ChildPath $sLogName
+
+#-----------------------------------------------------------[Functions]------------------------------------------------------------
+
+Function Export-SQLTableToCSV
+{
+ Param(
+ # Specifies path to out csv file(s) and log file
+ [Parameter(Mandatory=$true)]
+ [string]$CSVPath,
+ # Specifies a SQL Server name
+ [Parameter(Mandatory=$true)]
+ [string]$ServerName,
+ # Specifies a database name
+ [Parameter(Mandatory=$true)]
+ [string]$DatabaseName,
+ [Parameter(Mandatory=$false)]
+ [string]$CodePage = '-C65001',
+ [Parameter(Mandatory=$false)]
+ [string]$ExcludeColumns,
+ [Parameter(Mandatory=$false)]
+ [string]$SchemaName,
+ [Parameter(Mandatory=$false)]
+ [string]$TableName,
+ [Parameter(Mandatory=$false)]
+ [string]$OrderByColumns,
+ [Parameter(Mandatory=$false)]
+ [string]$MinRowCount,
+ [Parameter(Mandatory=$false)]
+ [string]$MaxRowCount,
+ [Parameter(Mandatory=$false)]
+ [string]$FormatFile,
+ [Parameter(Mandatory=$false)]
+ [string]$FieldTerminator,
+ [Parameter(Mandatory=$false)]
+ [string]$RowTerminator,
+ [Parameter(Mandatory=$false)]
+ [string]$FileExtension,
+ [Parameter(Mandatory=$false)]
+ [string]$Collation,
+ [Parameter(Mandatory=$false)]
+ [switch]$OutputColumnHeaders,
+ [Parameter(Mandatory=$false)]
+ [switch]$SavePhysicalOrder,
+ [Parameter(Mandatory=$false)]
+ [string]$OrderByColumns_term = ','
+
+ )
+ Begin
+ {
+ Write-LogInfo -LogPath $sLogFile -Message "Srart export SQL Tables from $DatabaseName in $CSVPath with bcp utility"
+ $sw = [Diagnostics.Stopwatch]::StartNew()
+ Write-Host "[*] Start script at $(Get-Date -Format 'HH:mm:ss')" -foreground:yellow;
+ }
+ Process
+ {
+ Try
+ {
+ if (-not(Test-Path $CSVPath))
+ {
+ $message = "Path $CSVPath doesn't exist!"
+ Write-Host $message -ForegroundColor Red
+ Write-LogInfo -LogPath $sLogFile -Message $message
+ break
+ }
+
+ $alllowableFormatFileTypes = @('','xml','fmt')
+
+ if ($alllowableFormatFileTypes -notcontains $FormatFile)
+ {
+ $message = "Allowed values for parameter FormatFile is xml, fmt or blank value"
+ Write-Host $message -ForegroundColor Red
+ Write-LogInfo -LogPath $sLogFile -Message $message
+ break
+ }
+
+ if (-not($FormatFile) -and $Collation)
+ {
+ $message = "Using collation parameter not allowed without format file parameter ('xml' or 'fmt')"
+ Write-Host $message -ForegroundColor Red
+ Write-LogInfo -LogPath $sLogFile -Message
+ break
+ }
+
+ if ($ExcludeColumns[0] -notcontains '[' -and $ExcludeColumns -notcontains '')
+ {
+ $message = "Parameter orderByColumns must be in square brackets and separated by comma"
+ Write-Host $message -ForegroundColor Red
+ Write-LogInfo -LogPath $sLogFile -Message
+ break
+ }
+
+ if ($ExcludeColumns[0] -contains '[' -and $FormatFile -notcontains '')
+ {
+ $message = "Parameter ExcludeColumns must be blank, since parameter FormatFile is present"
+ Write-Host $message -ForegroundColor Red
+ Write-LogInfo -LogPath $sLogFile -Message
+ break
+ }
+
+ if ($ExcludeColumns -and ($SchemaName -or $TableName))
+ {
+ $message = "Parameter ExcludeColumns must be blank, since parameters SchemaName or TableName are present"
+ Write-Host $message -ForegroundColor Red
+ Write-LogInfo -LogPath $sLogFile -Message
+ break
+ }
+
+ if ($OrderByColumns -and ($SchemaName -or $TableName))
+ {
+ $message = "Parameter OrderByColumns must be blank, since parameters SchemaName or TableName are present"
+ Write-Host $message -ForegroundColor Red
+ Write-LogInfo -LogPath $sLogFile -Message
+ break
+ }
+
+ if (-not($OutputColumnHeaders))
+ {
+ $message = "Headers won't output. If you want headers run with switch parameter: -OutputColumnHeaders"
+ Write-Host $message -ForegroundColor Yellow
+ Write-LogInfo -LogPath $sLogFile -Message $message
+ }
+
+ if (-not($SavePhysicalOrder))
+ {
+ $message = "Alphabet column order type use. If you want column physical order run with switch parameter: -SavePhysicalOrder"
+ Write-Host $message -ForegroundColor Yellow
+ Write-LogInfo -LogPath $sLogFile -Message $message
+ }
+ else
+ {
+ $message = "Physical column order is used"
+ Write-Host $message -ForegroundColor Yellow
+ Write-LogInfo -LogPath $sLogFile -Message "Use physical column order"
+ }
+
+ if ($Collation)
+ {
+ $invokeCollation = Invoke-Sqlcmd -ServerInstance $ServerName -Database $DatabaseName -Verbose -Query "
+ select COUNT(*) from sys.fn_helpcollations() WHERE name = '$Collation';";
+
+ if ($invokeCollation.Column1 -eq 0)
+ {
+ $message = "Defined collation not found in server collations list"
+ Write-Host $message -ForegroundColor Yellow
+ Write-LogInfo -LogPath $sLogFile -Message $message
+ $Collation = ''
+ }
+ }
+
+ if ($FieldTerminator)
+ {
+ $FieldTerminatorToHeaders = $FieldTerminator
+ $FieldTerminator = '-t"' + $FieldTerminator + '"';
+ }
+
+ if ($RowTerminator)
+ {
+ $RowTerminator = '-r"' + $RowTerminator + '"'
+ }
+
+ if ($CodePage)
+ {
+ $CodePage = '-c ' + $CodePage + ''
+ }
+
+ if ($FormatFile -and $FormatFile -eq 'xml')
+ {
+ $FormatFileForBcp = 'xml" -x'
+ }
+ else
+ {
+ $FormatFileForBcp = 'fmt"'
+ }
+
+ if ($ShemaName)
+ {
+ $tableDependencySchemaName = "and t.schema_id = (SELECT SCHEMA_ID('$ShemaName'))"
+ }
+ else
+ {
+ $tableDependencySchemaName = ''
+ }
+
+ if ($TableName)
+ {
+ $tableDependencyTableName = "and t.name = '$TableName'"
+ }
+ else
+ {
+ $tableDependencyTableName = ''
+ }
+
+ $tableDependecy = Invoke-Sqlcmd -ServerInstance $ServerName -Database $DatabaseName -Verbose -Query "
+ SELECT QUOTENAME(SCHEMA_NAME(t.schema_id)) AS SchemaName
+ , QUOTENAME(t.name) AS TableName
+ , SUM(ps.row_count) AS TableRowCount
+ FROM sys.tables t
+ INNER JOIN sys.dm_db_partition_stats ps
+ ON ps.object_id = t.object_id
+ WHERE index_id < 2
+ GROUP BY t.name
+ , t.schema_id
+ HAVING SUM(ps.row_count) >= $MinRowCount AND SUM(ps.row_count) <= $MaxRowCount $tableDependencySchemaName $tableDependencyTableName
+ ORDER BY SUM(ps.row_count) ASC
+ OPTION (RECOMPILE);
+ ";
+
+ $tableDependecy
+
+ Foreach ($t in $tableDependecy)
+ {
+ $tableFullName = $t[0] + '.' + $t[1]
+ $ShemaName = $t[0].Split('[').Split(']')
+ $TableName = $t[1].Split('[').Split(']')
+ $ShemaName = ([string]$ShemaName).Trim()
+ $TableName = ([string]$TableName).Trim()
+ $tableFullNameAndFileExt = $TableFullName + '.' + $FileExtension
+ $filePath = $CSVPath + $TableFullName + '.' + $FileExtension
+ $filePathWithHeaders = $CSVPath + $TableFullName + '_headers.' + $FileExtension
+ $FormatFilePath = $CSVPath + $TableFullName + '.' + $FormatFile
+ $FormatFileDelPath = $CSVPath + $TableFullName + 'del.' + $FormatFile
+
+ Write-Debug "tableFullName:$tableFullName`
+ ShemaName:$ShemaName`
+ trimmedShemaName:$trimmedShemaName`
+ TableName:$TableName`
+ trimmedTableName:$trimmedTableName`
+ tableFullNameAndFileExt:$tableFullNameAndFileExt`
+ filePath:$filePath`
+ filePathWithHeaders:$filePathWithHeaders`
+ FormatFilePath:$FormatFilePath`
+ FormatFileDelPath:$FormatFileDelPath"
+
+ if ($OrderByColumns)
+ {
+ $CountOrderByColumns = $OrderByColumns.split($OrderByColumns_term).Count
+ $invokeCountOrderByColumns = Invoke-Sqlcmd -ServerInstance $ServerName -Database $DatabaseName -Verbose -Query "
+ SELECT COUNT(*)
+ FROM sys.columns sac
+ WHERE sac.object_id = (SELECT OBJECT_ID('$tableFullName')) AND Name IN ('$OrderByColumns');
+ ";
+ Write-Debug "OrderByColumns: $OrderByColumns`
+ CountOrderByColumns: $CountOrderByColumns"
+
+ if ($invokeCountOrderByColumns.Column1 -notin $CountOrderByColumns)
+ {
+ write-Host "Some columns in OrderByColumns not exists in table" -ForegroundColor Red
+ break
+ }
+ Write-Debug "invokeCountOrderByColumns.Column1: $invokeCountOrderByColumns.Column1"
+ }
+
+ if ($SavePhysicalOrder)
+ {
+ $columnsOrder = 'ORDER BY sac.column_id'
+ }
+ else
+ {
+ $columnsOrder = 'ORDER BY Name'
+ }
+ Write-Debug "SavePhysicalOrder: $SavePhysicalOrder`
+ columnsOrder: $columnsOrder"
+
+ $invokeOrderByColumns = Invoke-Sqlcmd -ServerInstance $ServerName -Database $DatabaseName -Verbose -Query "
+ SELECT Name
+ FROM sys.columns sac
+ WHERE sac.object_id = (SELECT OBJECT_ID('$tableFullName')) AND Name NOT IN ('$ExcludeColumns') $columnsOrder;
+ ";
+ Write-Debug "ExcludeColumns: $ExcludeColumns"
+
+ $Columns = ''
+ $ColumnsToHeaders = ''
+
+ foreach ($i in $invokeOrderByColumns.Name)
+ {
+ $Columns += '[' + $i + '],'
+ $ColumnsToHeaders += $i + $FieldTerminatorToHeaders
+ }
+ $Columns = $Columns -replace ".$"
+ $ColumnsToHeaders = "'" + ($ColumnsToHeaders -replace ".$") + "'"
+
+ Write-Debug "Columns: $Columns`
+ ColumnsToHeaders: $ColumnsToHeaders"
+
+ $bcpStatement = 'bcp "SELECT '+ $Columns +' FROM ['+ $ServerName +'].['+ $DatabaseName +'].['+ $ShemaName +'].['+ $TableName +']' + `
+ $OrdrByColumns + '" queryout "' + $CSVPath + '['+ $ShemaName +'].['+ $TableName +'].' + `
+ $FileExtension + '" -T -S ' + $ServerName + ' ' + $CodePage + ' ' + $FieldTerminator + ' ' + $RowTerminator + '';
+
+ Write-Debug "bcpStatement: $bcpStatement"
+
+ Invoke-Expression $bcpStatement
+
+ if ($OutputColumnHeaders)
+ {
+ $bcpStatement = 'bcp "SELECT ' + $ColumnsToHeaders + '" queryout "' + $CSVPath + '['+ $ShemaName +'].['+ $TableName +']_headers.' + `
+ $FileExtension + '" -T -S ' + $ServerName + ' ' + $CodePage + ' ' + $FieldTerminator + ' ' + $RowTerminator + '';
+
+ Write-Debug "bcpStatement: $bcpStatement"
+
+ Invoke-Expression $bcpStatement
+ }
+
+ cmd /C "copy /b $filePathWithHeaders + $filePath $filePathWithHeaders"
+ cmd /C "del $filePath"
+ cmd /C "ren $filePathWithHeaders `"$tableFullNameAndFileExt`""
+
+ if ($FormatFile -eq ('xml' -or 'fmt') -and $SavePhysicalOrder)
+ {
+ $bcpStatement = 'bcp ['+ $DatabaseName +'].'+ $tableFullName +' format nul -c -f "' + $CSVPath + `
+ '['+ $ShemaName +'].['+ $TableName +'].' + $FormatFileForBcp + ' ' + $FieldTerminator + ' -T ';
+
+ Write-Debug "bcpStatement: $bcpStatement"
+
+ Invoke-Expression $bcpStatement
+
+ }
+
+ if ($FormatFile)
+ {
+ $tmpSchemaAndTableName = '['+ $ShemaName +'].[tmp' + $TableName + ']'
+
+ if ($SavePhysicalOrder)
+ {
+ $bcpStatement = 'bcp ['+ $DatabaseName +'].'+ $tableFullName +' format nul -c -f "' + $CSVPath + `
+ '['+ $ShemaName +'].['+ $TableName +']del.' + $FormatFileForBcp + ' ' + $FieldTerminator + ' -T ';
+
+ Write-Debug "bcpStatement: $bcpStatement"
+
+ Invoke-Expression $bcpStatement
+ }
+ else
+ {
+ $invokeStatement = 'IF OBJECT_ID(''['+ $DatabaseName +'].'+ $tmpSchemaAndTableName +''') IS NOT NULL DROP TABLE ' +$tmpSchemaAndTableName +';
+ SELECT ' + $Columns + ' INTO ' +$tmpSchemaAndTableName +' FROM ['+ $DatabaseName +'].'+ $tableFullName +' WHERE 1=2;'
+
+ Write-Debug "invokeStatement: $invokeStatement"
+
+ Invoke-Sqlcmd -ServerInstance $ServerName -Database $DatabaseName -Verbose -Query $invokeStatement
+ }
+
+ }
+
+ if ($FormatFile)
+ {
+ $invokeCollation = Invoke-Sqlcmd -ServerInstance $ServerName -Database $DatabaseName -Verbose -Query "
+ SELECT CONVERT(VARCHAR(128), DATABASEPROPERTYEX('$DatabaseName', 'collation'));
+ ;";
+
+ $CurrentCollation = $invokeCollation.Column1
+ Write-Debug "CurrentCollation: $CurrentCollation"
+
+ if ($FormatFile -eq 'xml')
+ {
+ $lob = 'SINGLE_NCLOB'
+ }
+ if ($FormatFile -eq 'fmt')
+ {
+ $lob = 'SINGLE_CLOB'
+ }
+
+ if ($Collation -eq '' -and $FormatFile -eq 'fmt')
+ {
+ $Collation = '""""'
+ }
+
+ if ($Collation -eq '' -and $FormatFile -eq 'xml')
+ {
+ $Collation = ''
+ }
+
+ $bcpStatement = 'bcp "SELECT REPLACE(BulkColumn, '''+ $CurrentCollation +''', '''+ $Collation +''') AS BulkColumn
+ FROM OPENROWSET(BULK '''+ $FormatFileDelPath +''', '+ $lob +') as x" queryout "'+ $FormatFilePath +'" -c -T'
+
+ Write-Debug "bcpStatement - $bcpStatement"
+
+ Invoke-Expression $bcpStatement
+
+ cmd /C "del $FormatFileDelPath"
+ }
+ }
+ }
+ Catch
+ {
+ Write-LogError -LogPath $sLogFile -Message $_.Exception -ExitGracefully
+ Break
+ }
+ }
+ End
+ {
+ If (-not $Error)
+ {
+ Write-Host 'Completed Successfully.' -ForegroundColor Green
+ Write-Host "[*] Stop script at $(Get-Date -Format 'HH:mm:ss')" -foreground:yellow;
+ $sw.Stop();
+ $sw.Elapsed | Format-Table -Property Minutes, Seconds, Milliseconds -AutoSize;
+ Write-LogInfo -LogPath $sLogFile -Message 'Completed Successfully.'
+ Write-LogInfo -LogPath $sLogFile -Message ' '
+ }
+ else
+ {
+ Write-Error -ErrorRecord
+ Write-LogInfo -LogPath $sLogFile -Message $Error
+ }
+ }
+}
+
+#-----------------------------------------------------------[Execution]------------------------------------------------------------
+
+Start-Log -LogPath $sLogPath -LogName $sLogName -ScriptVersion $sScriptVersion
+
+Export-SQLTableToCSV -CSVPath D:\1\ -ServerName NL-04 -DatabaseName NIIGAZ -MinRowCount 1 -MaxRowCount 2 -CodePage '-C65001' -FileExtension txt -FieldTerminator '|' -RowTerminator '\n' -OutputColumnHeaders -SavePhysicalOrder -Debug -FormatFile xml
+
+
+Stop-Log -LogPath $sLogFile
diff --git a/PowerShell/Fast_table_to_csv.ps1 b/PowerShell/Fast_table_to_csv.ps1
index 01eb8dba..9c63b6d9 100644
--- a/PowerShell/Fast_table_to_csv.ps1
+++ b/PowerShell/Fast_table_to_csv.ps1
@@ -1,56 +1,56 @@
-<#
-.SYNOPSIS
- .
-.DESCRIPTION
- This script export SQL Server table to csv file
-.PARAMETER sqlCmd.CommandText
- SQL query for export data
-.EXAMPLE
- C:\PS>
-
-.NOTES
- Author: Bill Graziano
- Original Link: http://www.sqlteam.com/article/fast-csv-import-in-powershell-to-sql-server
- Created Date: 2014-03-18
-#>
-$streamWriter = New-Object System.IO.StreamWriter ".\SimpleCsvOut3.txt"
-$sqlConn = New-Object System.Data.SqlClient.SqlConnection $ConnectionString
-$sqlCmd = New-Object System.Data.SqlClient.SqlCommand
-$sqlCmd.Connection = $sqlConn
-$sqlCmd.CommandText = "SELECT * FROM Test.dbo.CsvImport"
-$sqlConn.Open();
-$reader = $sqlCmd.ExecuteReader();
-
-# Initialze the arry the hold the values
-$array = @()
-for ( $i = 0 ; $i -lt $reader.FieldCount; $i++ )
- { $array += @($i) }
-
-# Write Header
-$streamWriter.Write($reader.GetName(0))
-for ( $i = 1; $i -lt $reader.FieldCount; $i ++)
-{ $streamWriter.Write($("," + $reader.GetName($i))) }
-
-$streamWriter.WriteLine("") # Close the header line
-
-while ($reader.Read())
-{
- # get the values;
- $fieldCount = $reader.GetValues($array);
-
- # add quotes if the values have a comma
- for ($i = 0; $i -lt $array.Length; $i++)
- {
- if ($array[$i].ToString().Contains(","))
- {
- $array[$i] = '"' + $array[$i].ToString() + '"';
- }
- }
-
- $newRow = [string]::Join(",", $array);
-
- $streamWriter.WriteLine($newRow)
-}
-$reader.Close();
-$sqlConn.Close();
-$streamWriter.Close();
+<#
+.SYNOPSIS
+ .
+.DESCRIPTION
+ This script export SQL Server table to csv file
+.PARAMETER sqlCmd.CommandText
+ SQL query for export data
+.EXAMPLE
+ C:\PS>
+
+.NOTES
+ Author: Bill Graziano
+ Original Link: http://www.sqlteam.com/article/fast-csv-import-in-powershell-to-sql-server
+ Created Date: 2014-03-18
+#>
+$streamWriter = New-Object System.IO.StreamWriter ".\SimpleCsvOut3.txt"
+$sqlConn = New-Object System.Data.SqlClient.SqlConnection $ConnectionString
+$sqlCmd = New-Object System.Data.SqlClient.SqlCommand
+$sqlCmd.Connection = $sqlConn
+$sqlCmd.CommandText = "SELECT * FROM Test.dbo.CsvImport"
+$sqlConn.Open();
+$reader = $sqlCmd.ExecuteReader();
+
+# Initialze the arry the hold the values
+$array = @()
+for ( $i = 0 ; $i -lt $reader.FieldCount; $i++ )
+ { $array += @($i) }
+
+# Write Header
+$streamWriter.Write($reader.GetName(0))
+for ( $i = 1; $i -lt $reader.FieldCount; $i ++)
+{ $streamWriter.Write($("," + $reader.GetName($i))) }
+
+$streamWriter.WriteLine("") # Close the header line
+
+while ($reader.Read())
+{
+ # get the values;
+ $fieldCount = $reader.GetValues($array);
+
+ # add quotes if the values have a comma
+ for ($i = 0; $i -lt $array.Length; $i++)
+ {
+ if ($array[$i].ToString().Contains(","))
+ {
+ $array[$i] = '"' + $array[$i].ToString() + '"';
+ }
+ }
+
+ $newRow = [string]::Join(",", $array);
+
+ $streamWriter.WriteLine($newRow)
+}
+$reader.Close();
+$sqlConn.Close();
+$streamWriter.Close();
diff --git a/PowerShell/Format-SQLCode.ps1 b/PowerShell/Format-SQLCode.ps1
new file mode 100644
index 00000000..4d966951
--- /dev/null
+++ b/PowerShell/Format-SQLCode.ps1
@@ -0,0 +1,105 @@
+<#
+.Synopsis
+ Formatting your T-SQL code
+.DESCRIPTION
+ Formatting T-SQL code through RedGate Format Api (https://www.red-gate.com/products/sql-development/sql-prompt/)
+
+ Works on PowerShell Core (aka PowerShell 6+)
+.EXAMPLE
+ $Script = '--(Query 16)_(AlwaysOn AG Cluster)
+ SELECT cluster_name, quorum_type_desc, quorum_state_desc
+ FROM sys.dm_hadr_cluster WITH (NOLOCK) OPTION (RECOMPILE);
+ ------'
+
+ Format-SQLCode -Script $Script -Style Default
+.EXAMPLE
+ Formatting one file
+
+ Format-SQLCode `
+ -FullName 'C:\SQL Server 2014 Diagnostic Information Queries\(Query 11)_(SQL Server Agent Alerts).sql' `
+ -Style Default
+.EXAMPLE
+ Formatting all file on a directory
+
+ Get-ChildItem 'C:\SQL Server 2014 Diagnostic Information Queries' -File | Format-SQLCode -Style Default
+
+.EXAMPLE
+ Formatting all file on a directory and save the result to file.
+
+ $ListFiles = Get-ChildItem 'C:\Temp\SQL Server 2014 Diagnostic Information Queries\' -File
+ Foreach($File in $ListFiles) {
+ $File | Format-SQLCode -Style Indented | Set-Content -PassThru -Path $File.FullName
+ }
+
+.LINK
+ Author: Mateusz Nadobnik
+ Link: http://mnadobnik.pl/format-sqlcode
+
+ Date: 01.02.2019
+ Version: 1.0.0.0
+ Keywords: Formatting, T-SQL, RedGate, SQL Prompt
+ Notes:
+ Changelog:
+#>
+function Format-SQLCode {
+ [OutputType([String])]
+ [cmdletbinding()]
+ param(
+ #Style for format script t-sql
+ [ValidateSet('Collapsed', 'Commas before', 'Default', 'Indented', 'Right aligned')]
+ [string]$Style,
+ #Path to file
+ [Parameter(Mandatory, ParameterSetName = 'File', ValueFromPipelineByPropertyName = $true)]
+ [Alias('FilePath', 'FullNamePath')]
+ [string]$FullName,
+ #Script
+ [Parameter(Mandatory, ParameterSetName = 'Script')]
+ [string]$Script
+ )
+ begin {
+ $ErrorActionPreference = 'Continue';
+ $FnName = '[Format-RedGateScriptSQL]';
+ if ((Invoke-WebRequest -UseBasicParsing 'https://promptformatapi.red-gate.com/').StatusCode -ne 200) {
+ Write-Warning "$FnName Check your connection with the Internet";
+ return;
+ }
+ }
+ process {
+ $Uri = "https://promptformatapi.red-gate.com/api/format/$Style";
+ try {
+ if ($FullName) {
+ # preparing body for request
+ Write-Verbose "$FnName Get content from file: $FullName";
+ $FileContent = Get-Content $FullName -Encoding UTF8 -Raw;
+ $Body = "`"$FileContent`"";
+ Write-Verbose "$Body";
+ }
+ elseif ($Script) {
+ Write-Verbose "$Body";
+ $Body = "`"$Script`"";
+ }
+
+ Write-Verbose "$FnName $paramInvokeWebRequest";
+
+ Write-Verbose "$FnName Invoke-WebRequest";
+ $Response = Invoke-WebRequest `
+ -Uri $Uri `
+ -Method "POST" `
+ -Headers @{"path" = "/api/format/Collapsed"; "origin" = "https://www.red-gate.com"; "accept-encoding" = "gzip, deflate, br"; "accept-language" = "pl-PL,pl;q=0.9,en-US;q=0.8,en;q=0.7"; "user-agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"; "accept" = "*/*"; "referer" = "https://www.red-gate.com/products/sql-development/sql-prompt/?utm_source=format-sql&utm_medium=redirect&utm_campaign=sqlprompt"; "authority" = "promptformatapi.red-gate.com"; "scheme" = "https"; "dnt" = "1"; "method" = "POST"} `
+ -ContentType "application/json" `
+ -Body $Body `
+
+ if ($Response.StatusCode -eq 200) {
+ [string]$FormattedScript = ($Response.Content).replace('\r\n', '`r`n');
+ return Invoke-Expression -Command $FormattedScript;
+ }
+ }
+ catch [Microsoft.PowerShell.Commands.HttpResponseException] {
+ Write-Warning "$(($_.ErrorDetails.Message | ConvertFrom-Json).Details) - $FullName";
+ }
+ catch {
+ Write-Warning "$($_.ErrorDetails.Message) - $FullName";
+ }
+ }
+ end { };
+}
diff --git a/PowerShell/Get-CmsHosts.ps1 b/PowerShell/Get-CmsHosts.ps1
new file mode 100644
index 00000000..7c89d7e9
--- /dev/null
+++ b/PowerShell/Get-CmsHosts.ps1
@@ -0,0 +1,76 @@
+<#
+.SYNOPSIS This function queries a CMS instance and returns a list of instances Written by Mark Wilkinson @m82labs on Twitter, website m82labs.com
+
+.PARAMETER cmdHost
+
+.PARAMETER searchPattern !!NOT INJECTION SAFE!! this parameter simply gets inserted into a wildcard query on the list of available instances on the CMS. This parameter accepts a pipe delimeter list of patterns, allowing you to match instance names on multiple conditions.
+
+.PARAMETER version The SQL Server version (build number) that should be running on the returned instances. !! This will query each instance to get the build version, use in conjuction with searchPattern !!
+
+.EXAMPLE This will return all instances that start with 'Pattern' and are on SQL 2016 RTM
+Get-CMSHosts -searchPattern 'Pattern' -version '13.0.1605.1'
+
+.EXAMPLE
+This can be used in a 'ForEach': ForEach ( $instance in Get-CMSHosts -searchPattern 'Pattern' -version '13.0.1605.1' ) { #Do some stuff }
+.NOTES
+Original link: http://tracyboggiano.com/archive/2017/04/query-multipleservers
+#>
+function Get-CmsHosts() {
+ param(
+ [CmdletBinding()]
+ [string]$cmsHost = '',
+ [string]$searchPattern = '',
+ [string]$instanceList,
+ [string]$version
+ )
+
+ If ( $instanceList -and (Test-Path -Path $instanceList) ) {
+ $results = Get-Content -Path $instanceList
+ } Else {
+ $pattern = ''
+
+ For ( $pat_i = 0; $pat_i -lt ($searchPattern.Split('|')).Count; $pat_i++ ) {
+ If ( $pat_i -gt 0 ) { $pattern += " OR " }
+ $pattern += "server_name LIKE '$($searchPattern.Split('|')[$pat_i])%'"
+ }
+
+ [string]$query_get_servers = "SELECT DISTINCT server_name FROM msdb.dbo.sysmanagement_shared_registered_servers WHERE {{searchPattern}}"
+ $results = (Invoke-SqlCmd -query $query_get_servers.Replace('{{searchPattern}}',$pattern) -ServerInstance $cmsHost).server_name
+ }
+
+ If ( $version ) {
+ ForEach ( $instance In $results ) {
+ Try {
+ If ( (Invoke-Sqlcmd -Query "SELECT SERVERPROPERTY('productversion') AS v" -ServerInstance $instance -ConnectionTimeout 1 -QueryTimeout 1 -ErrorAction Stop).v -ne $version) {
+ $results = $results | Where-Object { $_ -notmatch $instance }
+ }
+ } Catch {
+ $connect_error += 1
+ Write-Host "failed: $($_.Exception.Message)" -ForegroundColor White -BackgroundColor Red
+ $results = $results | Where-Object { $_ -notmatch $instance }
+ continue
+ }
+ }
+ }
+
+ If ( $connect_error ) {
+ Write-Host " -[$($connect_error) instance(s) skipped due to connection error]- " -ForegroundColor Red -NoNewline
+ }
+
+ return $results
+}
+
+
+Get-CmsHosts -InstanceList 'c:\temp\servers.txt' | % { New-PSSession -ComputerName $_ | out-null}
+$sessions = Get-PSSession
+
+$scriptblock = {
+$query = @"
+SELECT @@VERSION
+"@
+Invoke-Sqlcmd -Query $query
+}
+
+Invoke-Command -Session $($sessions | ? { $_.State -eq 'Opened' }) -ScriptBlock $scriptblock | Select * -ExcludeProperty RunspaceId | Out-GridView
+$sessions | Remove-PSSession
+
diff --git a/PowerShell/Get-MachineInformationExcel.ps1 b/PowerShell/Get-MachineInformationExcel.ps1
index 9663b43d..98c8e0ab 100644
--- a/PowerShell/Get-MachineInformationExcel.ps1
+++ b/PowerShell/Get-MachineInformationExcel.ps1
@@ -1,885 +1,885 @@
-<#============================================================================
- File: Get-MachineInformationExcel.ps
-
- Summary: Get machine information like memory, CPU and disk configuration
- and output it to Excel
-
-------------------------------------------------------------------------------
- Written by Sander Stad, SQLStad.nl
-
- (c) 2015, SQLStad.nl. All rights reserved.
-
- For more scripts and sample code, check out http://www.SQLStad.nl
-
- You may alter this code for your own *non-commercial* purposes (e.g. in a
- for-sale commercial tool). Use in your own environment is encouraged.
- You may republish altered code as long as you include this copyright and
- give due credit, but you must obtain prior permission before blogging
- this code.
-
- THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF
- ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED
- TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
- PARTICULAR PURPOSE.
-============================================================================#>
-
-# Import the Excel library
-Import-Module ExcelPSLib -Force
-Import-Module PSSQLLib -Force
-
-CLS
-
-function Generate-Documentation()
-{
- param(
- [Parameter(Mandatory=$true, Position=1)]
- [ValidateNotNullOrEmpty()]
- [string]$server,
- [Parameter(Mandatory=$true, Position=2)]
- [string]$instance = '',
- [Parameter(Mandatory=$true, Position=3)]
- [ValidateNotNullOrEmpty()]
- [string]$destination
- )
-
- # Make up the target in case we have a default instance
- if(($instance -eq '') -or (($instance).ToUpper() -eq 'MSSQLSERVER'))
- {
- $target = $server
- }
- else
- {
- $target = "$server\$instance"
- }
-
- Write-Host "Setting up components for $target" -ForegroundColor Green
-
- # Create timestamp
- $timestamp = Get-Date -f yyyyddMMHHmmss
-
- # Set the destination
- $outputFile = $destination + '\MachineInformation_' + ($server).ToUpper() + '_' + ($instance).ToUpper() + '_' + $timestamp + '.xlsx'
-
- # Set the position of the first row
- $rowPosition = 1
-
- # Set the number of the tab
- $tabPosition = 1
-
- # Create a new Excel package
- [OfficeOpenXml.ExcelPackage]$excel = New-OOXMLPackage -author "Sander Stad" -title "Machine Information $target"
-
- # Create a new workbook
- [OfficeOpenXml.ExcelWorkbook]$book = $excel | Get-OOXMLWorkbook
-
- # Set the different styles
- $styleGreen = New-OOXMLStyleSheet -WorkBook $book -Name "GirlStyle" -Bold -ForeGroundColor Black -FillType Solid -BackGroundColor Green -borderStyle Thin -BorderColor Black -NFormat "#,##0.00"
- $styleRed = New-OOXMLStyleSheet -WorkBook $book -Name "BoyStyle" -Bold -ForeGroundColor Black -FillType Solid -BackGroundColor Red -borderStyle Thin -BorderColor Black -NFormat "#,##0.00"
- $styleHeader = New-OOXMLStyleSheet -WorkBook $book -Name "HeaderStyle" -Bold -ForeGroundColor White -BackGroundColor Black -Size 12 -HAlign Center -VAlign Center -FillType Solid
- $styleHeader2 = New-OOXMLStyleSheet -WorkBook $book -Name "HeaderStyle2" -Bold -ForeGroundColor White -BackGroundColor Black -Size 11 -HAlign Left -VAlign Center -FillType Solid
- $styleNormal = New-OOXMLStyleSheet -WorkBook $book -Name "NormalStyle" -borderStyle Thin -BorderColor Black
- $styleNumber = New-OOXMLStyleSheet -WorkBook $book -Name "Float" -NFormat "#,##0.00"
- $styleConditionalFormatting = New-OOXMLStyleSheet -WorkBook $book -Name "ConditionalF" -Bold -ForeGroundColor Black -FillType Solid -BackGroundColor Orange -borderStyle Double -BorderColor Blue -NFormat "#,##0.0000" -Italic
-
- Write-Host "Start retrieving data for $target" -ForegroundColor Green
-
- #######################################################################################################
- # SYSTEM INFORMATION
- #######################################################################################################
-
- # Add a worksheet
- $excel | Add-OOXMLWorksheet -WorkSheetName "System Information"
- # Set the worksheet as the first sheet
- $sheet = $book | Select-OOXMLWorkSheet -WorkSheetNumber $tabPosition
-
- Write-Host " - Retrieving data for System Information" -ForegroundColor Green
-
- # Get the data from the function
- $data = $null
- $data = Get-HostSystemInformation -hst $server
-
- if($data.Name.Length -ge 1)
- {
-
- # Fill the sheet with data from the system function
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value "Server Name" -StyleSheet $styleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $data.Name -StyleSheet $styleNormal | Out-Null
-
- $sheet.Column(1).Width = 30
- $sheet.Column(2).Width = 40
- $rowPosition++
-
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value "Domain" -StyleSheet $styleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $data.Domain -StyleSheet $styleNormal | Out-Null
-
- $rowPosition++
-
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value "Manufacturer" -StyleSheet $styleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $data.Manufacturer -StyleSheet $styleNormal | Out-Null
-
- $rowPosition++
-
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value "Model" -StyleSheet $styleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $data.Model -StyleSheet $styleNormal | Out-Null
-
- $rowPosition++
-
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value "Number of logical processors" -StyleSheet $styleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $data.NumberOfLogicalProcessors -StyleSheet $styleNormal | Out-Null
-
- $rowPosition++
-
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value "Number of processors" -StyleSheet $styleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $data.NumberOfProcessors -StyleSheet $styleNormal | Out-Null
-
- $rowPosition++
-
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value "Last load info" -StyleSheet $styleHeader2 | Out-Null
- if([string]::IsNullOrEmpty($data.LastLoadInfo))
- {
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value '' -StyleSheet $styleNormal | Out-Null
- }
- else
- {
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $data.LastLoadInfo -StyleSheet $styleNormal | Out-Null
- }
-
- $rowPosition++
-
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value "Total physical memory MB" -StyleSheet $styleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $data.TotalPhysicalMemoryMB -StyleSheet $styleNormal | Out-Null
- }
- else
- {
- Write-Host "No records fount for System Information" -ForegroundColor Red
- }
-
- #######################################################################################################
- #######################################################################################################
-
-
- #######################################################################################################
- # OPERATING SYSTEM INFORMATION
- #######################################################################################################
-
- # Reset row positions
- $rowPosition = 1
-
- # Set the tabposition
- $tabPosition++
-
- # Add a worksheet
- $excel | Add-OOXMLWorksheet -WorkSheetName "Operating System"
- # Set the worksheet as the first sheet
- $sheet = $book | Select-OOXMLWorkSheet -WorkSheetNumber $tabPosition
-
- Write-Host " - Retrieving data for Operating System" -ForegroundColor Green
-
- # Get the data from the function
- $data = $null
- $data = Get-HostOperatingSystem -hst $server
-
- if($data.OSArchitecture.Length -ge 1)
- {
-
- # Fill the sheet with data from the hardware function
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value "OS Architecture" -StyleSheet $styleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $data.OSArchitecture -StyleSheet $styleNormal | Out-Null
-
- $sheet.Column(1).Width = 30
- $sheet.Column(2).Width = 40
- $rowPosition++
-
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value "OS Language" -StyleSheet $styleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $data.OSLanguage -StyleSheet $styleNormal | Out-Null
-
- $rowPosition++
-
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value "OS ProductSuite" -StyleSheet $styleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $data.OSProductSuite -StyleSheet $styleNormal | Out-Null
-
- $rowPosition++
-
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value "OS Type" -StyleSheet $styleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $data.OSType -StyleSheet $styleNormal | Out-Null
-
- $rowPosition++
-
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value "BuildType" -StyleSheet $styleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $data.BuildType -StyleSheet $styleNormal | Out-Null
-
- $rowPosition++
-
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value "Version" -StyleSheet $styleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $data.Version -StyleSheet $styleNormal | Out-Null
-
- $rowPosition++
-
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value "Windows Directory" -StyleSheet $styleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $data.WindowsDirectory -StyleSheet $styleNormal | Out-Null
-
- $rowPosition++
-
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value "Free Physical Memory MB" -StyleSheet $styleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $data.FreePhysicalMemoryMB -StyleSheet $styleNormal | Out-Null
-
- $rowPosition++
-
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value "Free Space In Paging Files MB" -StyleSheet $styleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $data.FreeSpaceInPagingFilesMB -StyleSheet $styleNormal | Out-Null
-
- $rowPosition++
-
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value "Free Virtua lMemory MB" -StyleSheet $styleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $data.FreeVirtualMemoryMB -StyleSheet $styleNormal | Out-Null
-
- $rowPosition++
-
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value "Service Pack Major Version" -StyleSheet $styleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $data.ServicePackMajorVersion -StyleSheet $styleNormal | Out-Null
-
- $rowPosition++
-
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value "Service Pack Minor Version" -StyleSheet $styleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $data.ServicePackMinorVersion -StyleSheet $styleNormal | Out-Null
- }
- else
- {
- Write-Host "No records fount for Operating System" -ForegroundColor Red
- }
-
- #######################################################################################################
- #######################################################################################################
-
-
- #######################################################################################################
- # SQL SERVER SERVICES
- #######################################################################################################
-
- # Reset row positions
- $rowPosition = 1
-
- # Set the tabposition
- $tabPosition++
-
- # Add a worksheet
- $excel | Add-OOXMLWorksheet -WorkSheetName "SQL Services" #-AutofilterRange "A2:G2"
- # Set the worksheet as the first sheet
- $sheet = $book | Select-OOXMLWorkSheet -WorkSheetNumber $tabPosition
-
- Write-Host " - Retrieving data for SQL Server Services" -ForegroundColor Green
-
- # Get the data from the function
- $services = Get-HostSQLServerServices -hst $server
-
- if($services.Count -ge 1)
- {
-
- # Create the header
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 1 -value "System Name" -StyleSheet $StyleHeader2 | Out-Null
- $sheet.Column(1).Width = 22
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 2 -value "Display Name" -StyleSheet $StyleHeader2 | Out-Null
- $sheet.Column(2).Width = 32
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 3 -value "Service Name" -StyleSheet $StyleHeader2 | Out-Null
- $sheet.Column(3).Width = 22
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 4 -value "State" -StyleSheet $StyleHeader2 | Out-Null
- $sheet.Column(4).Width = 22
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 5 -value "Status" -StyleSheet $StyleHeader2 | Out-Null
- $sheet.Column(5).Width = 22
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 6 -value "Start Mode" -StyleSheet $StyleHeader2 | Out-Null
- $sheet.Column(6).Width = 22
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 7 -value "Start Name" -StyleSheet $StyleHeader2 | Out-Null
- $sheet.Column(7).Width = 32
-
- $rowPosition++
-
- foreach($service in $services)
- {
-
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value $service.SystemName -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $service.DisplayName -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 3 -value $service.Name -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 4 -value $service.State -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 5 -value $service.Status -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 6 -value $service.StartMode -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 7 -value $service.StartName -StyleSheet $styleNormal | Out-Null
-
- $rowPosition++
- }
- }
- else
- {
- Write-Host "No records fount for SQL Services" -ForegroundColor Red
- }
-
- #######################################################################################################
- #######################################################################################################
-
- #######################################################################################################
- # DISK INFORMATION
- #######################################################################################################
-
- # Reset row positions
- $rowPosition = 1
-
- # Set the tabposition
- $tabPosition++
-
- # Add a worksheet
- $excel | Add-OOXMLWorksheet -WorkSheetName "Disk Information" #-AutofilterRange "A2:G2"
- # Set the worksheet as the first sheet
- $sheet = $book | Select-OOXMLWorkSheet -WorkSheetNumber $tabPosition
-
- Write-Host " - Retrieving data for Disk Information" -ForegroundColor Green
-
- $disks = Get-HostHarddisk -hst $server
-
- if($disks.Count -ge 1)
- {
-
- # Create the header
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 1 -value "Disk" -StyleSheet $StyleHeader2 | Out-Null
- $sheet.Column(1).Width = 22
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 2 -value "Volume Name" -StyleSheet $StyleHeader2 | Out-Null
- $sheet.Column(2).Width = 32
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 3 -value "Free Space MB" -StyleSheet $StyleHeader2 | Out-Null
- $sheet.Column(3).Width = 22
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 4 -value "Size MB" -StyleSheet $StyleHeader2 | Out-Null
- $sheet.Column(4).Width = 22
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 5 -value "Percentage Used" -StyleSheet $StyleHeader2 | Out-Null
- $sheet.Column(5).Width = 22
-
- $rowPosition++
-
- foreach($disk in $disks)
- {
-
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value $disk.Disk -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $disk.VolumeName -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 3 -value $disk.FreeSpaceMB -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 4 -value $disk.SizeMB -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 5 -value $disk.PercentageUsed -StyleSheet $styleNormal | Out-Null
-
- $rowPosition++
- }
- }
- else
- {
- Write-Host "No records fount for Disk Information" -ForegroundColor Red
- }
-
- #######################################################################################################
- #######################################################################################################
-
- #######################################################################################################
- # SQL CONFIGURATION
- #######################################################################################################
-
- # Reset row positions
- $rowPosition = 1
-
- # Set the tabposition
- $tabPosition++
-
- # Add a worksheet
- $excel | Add-OOXMLWorksheet -WorkSheetName "Instance Configuration" #-AutofilterRange "A2:G2"
- # Set the worksheet as the first sheet
- $sheet = $book | Select-OOXMLWorkSheet -WorkSheetNumber $tabPosition
-
- Write-Host " - Retrieving data for SQL Configuration" -ForegroundColor Green
-
- $configurations = Get-SQLConfiguration -inst $target | Sort DisplayName
-
- if($configurations.Count -ge 1)
- {
-
- # Create the header
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 1 -value "Display Name" -StyleSheet $StyleHeader2 | Out-Null
- $sheet.Column(1).Width = 40
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 2 -value "Number" -StyleSheet $StyleHeader2 | Out-Null
- $sheet.Column(2).Width = 32
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 3 -value "Minimum" -StyleSheet $StyleHeader2 | Out-Null
- $sheet.Column(3).Width = 22
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 4 -value "Maximum" -StyleSheet $StyleHeader2 | Out-Null
- $sheet.Column(4).Width = 22
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 5 -value "Is Dynamic" -StyleSheet $StyleHeader2 | Out-Null
- $sheet.Column(5).Width = 22
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 6 -value "Is Advanced" -StyleSheet $StyleHeader2 | Out-Null
- $sheet.Column(6).Width = 22
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 7 -value "Description" -StyleSheet $StyleHeader2 | Out-Null
- $sheet.Column(7).Width = 50
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 8 -value "Run Value" -StyleSheet $StyleHeader2 | Out-Null
- $sheet.Column(8).Width = 22
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 9 -value "Config Value" -StyleSheet $StyleHeader2 | Out-Null
- $sheet.Column(9).Width = 22
-
- $rowPosition++
-
- foreach($config in $configurations)
- {
-
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value $config.DisplayName -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $config.Number -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 3 -value $config.Minimum -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 4 -value $config.Maximum -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 5 -value $config.IsDynamic -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 6 -value $config.IsAdvanced -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 7 -value $config.Description -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 8 -value $config.RunValue -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 9 -value $config.ConfigValue -StyleSheet $styleNormal | Out-Null
-
- $rowPosition++
- }
- }
- else
- {
- Write-Host "No records fount for Instance Configuration" -ForegroundColor Red
- }
-
- #######################################################################################################
- #######################################################################################################
-
- #######################################################################################################
- # DATABASES
- #######################################################################################################
-
- # Reset row positions
- $rowPosition = 1
-
- # Set the tabposition
- $tabPosition++
-
- # Add a worksheet
- $excel | Add-OOXMLWorksheet -WorkSheetName "Databases" #-AutofilterRange "A2:G2"
- # Set the worksheet as the first sheet
- $sheet = $book | Select-OOXMLWorkSheet -WorkSheetNumber $tabPosition
-
- Write-Host " - Retrieving data for Databases" -ForegroundColor Green
-
- $databases = Get-SQLDatabases -inst $target | Sort Name
-
- if($databases.Count -ge 1)
- {
-
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 1 -value "Name" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 2 -value "ID" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 3 -value "AutoClose" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 4 -value "AutoCreateStatisticsEnabled" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 5 -value "AutoShrink" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 6 -value "AutoUpdateStatisticsAsync" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 7 -value "AutoUpdateStatisticsEnabled" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 8 -value "AvailabilityGroupName" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 9 -value "CloseCursorsOnCommitEnabled" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 10 -value "Collation" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 11 -value "CompatibilityLevel" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 12 -value "CreateDate" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 13 -value "DataSpaceUsage" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 14 -value "EncryptionEnabled" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 15 -value "IndexSpaceUsage" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 16 -value "IsDbSecurityAdmin" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 17 -value "IsFullTextEnabled" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 18 -value "IsManagementDataWarehouse" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 19 -value "IsMirroringEnabled" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 20 -value "LastBackupDate" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 21 -value "LastDifferentialBackupDate" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 22 -value "LastLogBackupDate" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 23 -value "Owner" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 24 -value "PageVerify" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 25 -value "PrimaryFilePath" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 26 -value "ReadOnly" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 27 -value "RecoveryModel" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 28 -value "RecursiveTriggersEnabled" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 29 -value "Size" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 30 -value "SnapshotIsolationState" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 31 -value "SpaceAvailable" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 32 -value "Status" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 33 -value "TargetRecoveryTime" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 34 -value "Trustworthy" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 35 -value "UserAccess" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 36 -value "UserName" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 37 -value "Version" -StyleSheet $StyleHeader2 | Out-Null
-
- $rowPosition++
-
- foreach($db in $databases)
- {
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value $db.Name -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $db.ID -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 3 -value $db.AutoClose -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 4 -value $db.AutoCreateStatisticsEnabled -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 5 -value $db.AutoShrink -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 6 -value $db.AutoUpdateStatisticsAsync -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 7 -value $db.AutoUpdateStatisticsEnabled -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 8 -value $db.AvailabilityGroupName -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 9 -value $db.CloseCursorsOnCommitEnabled -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 10 -value $db.Collation -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 11 -value $db.CompatibilityLevel -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 12 -value $db.CreateDate -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 13 -value $db.DataSpaceUsage -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 14 -value $db.EncryptionEnabled -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 15 -value $db.IndexSpaceUsage -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 16 -value $db.IsDbSecurityAdmin -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 17 -value $db.IsFullTextEnabled -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 18 -value $db.IsManagementDataWarehouse -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 19 -value $db.IsMirroringEnabled -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 20 -value $db.LastBackupDate -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 21 -value $db.LastDifferentialBackupDate -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 22 -value $db.LastLogBackupDate -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 23 -value $db.Owner -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 24 -value $db.PageVerify -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 25 -value $db.PrimaryFilePath -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 26 -value $db.ReadOnly -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 27 -value $db.RecoveryModel -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 28 -value $db.RecursiveTriggersEnabled -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 29 -value $db.Size -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 30 -value $db.SnapshotIsolationState -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 31 -value $db.SpaceAvailable -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 32 -value $db.Status -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 33 -value $db.TargetRecoveryTime -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 34 -value $db.Trustworthy -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 35 -value $db.UserAccess -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 36 -value $db.UserName -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 7 -value $db.Version -StyleSheet $styleNormal | Out-Null
-
- $rowPosition++
- }
- }
- else
- {
- Write-Host "No records fount for Databases" -ForegroundColor Red
- }
-
- #######################################################################################################
- #######################################################################################################
-
- #######################################################################################################
- # DATABASE FILES
- #######################################################################################################
-
- # Reset row positions
- $rowPosition = 1
-
- # Set the tabposition
- $tabPosition++
-
- # Add a worksheet
- $excel | Add-OOXMLWorksheet -WorkSheetName "Database Files" #-AutofilterRange "A2:G2"
- # Set the worksheet as the first sheet
- $sheet = $book | Select-OOXMLWorkSheet -WorkSheetNumber $tabPosition
-
- Write-Host " - Retrieving data for Database Files" -ForegroundColor Green
-
- $databaseFiles = Get-SQLDatabaseFiles -inst $target | Sort DatabaseName, FileType
-
- if($databaseFiles.Count -ge 1)
- {
-
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 1 -value "Database Name" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 2 -value "Name" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 3 -value "File Type" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 4 -value "Directory" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 5 -value "File Name" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 6 -value "Growth" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 7 -value "Growth Type" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 8 -value "Size" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 9 -value "Used Space" -StyleSheet $StyleHeader2 | Out-Null
-
- $rowPosition++
-
- foreach($dbFile in $databaseFiles)
- {
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value $dbFile.DatabaseName -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $dbFile.Name -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 3 -value $dbFile.FileType -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 4 -value $dbFile.Directory -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 5 -value $dbFile.FileName -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 6 -value $dbFile.Growth -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 7 -value $dbFile.GrowthType -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 8 -value $dbFile.Size -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 9 -value $dbFile.UsedSpace -StyleSheet $styleNormal | Out-Null
-
- $rowPosition++
- }
- }
- else
- {
- Write-Host "No records fount for Database Files" -ForegroundColor Red
- }
-
- #######################################################################################################
- #######################################################################################################
-
- #######################################################################################################
- # DATABASE USERS
- #######################################################################################################
-
- # Reset row positions
- $rowPosition = 1
-
- # Set the tabposition
- $tabPosition++
-
- # Add a worksheet
- $excel | Add-OOXMLWorksheet -WorkSheetName "Database Users" #-AutofilterRange "A2:G2"
- # Set the worksheet as the first sheet
- $sheet = $book | Select-OOXMLWorkSheet -WorkSheetNumber $tabPosition
-
- Write-Host " - Retrieving data for Database Users" -ForegroundColor Green
-
- $users = Get-SQLDatabaseUsers -inst $target | Sort Parent,Name
-
- if($users.Count -ge 1)
- {
-
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 1 -value "Parent" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 2 -value "Name" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 3 -value "AsymmetricKey" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 4 -value "AuthenticationType" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 5 -value "Certificate" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 6 -value "CreateDate" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 7 -value "DateLastModified" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 8 -value "DefaultSchema" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 9 -value "HasDBAccess" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 10 -value "ID" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 11 -value "IsSystemObject" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 12 -value "Login" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 13 -value "LoginType" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 14 -value "UserType" -StyleSheet $StyleHeader2 | Out-Null
-
- $rowPosition++
-
- foreach($user in $users)
- {
-
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value $user.Parent -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $user.Name -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 3 -value $user.AsymmetricKey -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 4 -value $user.AuthenticationType -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 5 -value $user.Certificate -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 6 -value $user.CreateDate -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 7 -value $user.DateLastModified -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 8 -value $user.DefaultSchema -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 9 -value $user.HasDBAccess -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 10 -value $user.ID -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 11 -value $user.IsSystemObject -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 12 -value $user.Login -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 13 -value $user.LoginType -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 14 -value $user.UserType -StyleSheet $styleNormal | Out-Null
-
- $rowPosition++
-
- }
- }
- else
- {
- Write-Host "No records fount for Database Users" -ForegroundColor Red
- }
-
- #######################################################################################################
- #######################################################################################################
-
- #######################################################################################################
- # DATABASE PRIVILEGES
- #######################################################################################################
-
- # Reset row positions
- $rowPosition = 1
-
- # Set the tabposition
- $tabPosition++
-
- # Add a worksheet
- $excel | Add-OOXMLWorksheet -WorkSheetName "Database Privileges" #-AutofilterRange "A2:G2"
- # Set the worksheet as the first sheet
- $sheet = $book | Select-OOXMLWorkSheet -WorkSheetNumber $tabPosition
-
- Write-Host " - Retrieving data for Database Privileges" -ForegroundColor Green
-
- $data = Get-SQLDatabasePrivileges -inst $target | Sort DatabaseName, LoginName
-
- if($data.Count -ge 1)
- {
-
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 1 -value "Database Name" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 2 -value "User Name" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 3 -value "User Type" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 4 -value "Database Roles" -StyleSheet $StyleHeader2 | Out-Null
-
- $rowPosition++
-
- foreach($dbPriv in $data)
- {
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value $dbPriv.DatabaseName -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $dbPriv.UserName -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 3 -value $dbPriv.UserType -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 4 -value $dbPriv.DatabaseRoles -StyleSheet $styleNormal | Out-Null
-
- $rowPosition++
- }
- }
- else
- {
- Write-Host "No records fount for Database Privileges" -ForegroundColor Red
- }
-
- #######################################################################################################
- #######################################################################################################
-
- #######################################################################################################
- # SERVER PRIVILEGES
- #######################################################################################################
-
- # Reset row positions
- $rowPosition = 1
-
- # Set the tabposition
- $tabPosition++
-
- # Add a worksheet
- $excel | Add-OOXMLWorksheet -WorkSheetName "Login Privileges" #-AutofilterRange "A2:G2"
- # Set the worksheet as the first sheet
- $sheet = $book | Select-OOXMLWorkSheet -WorkSheetNumber $tabPosition
-
- Write-Host " - Retrieving data for SQL Server Privileges" -ForegroundColor Green
-
- $privileges = Get-SQLServerPrivileges -inst $target | Sort Name
-
- if($privileges.Count -ge 1)
- {
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 1 -value "Name" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 2 -value "Login Type" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 3 -value "Create Date" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 4 -value "Date Last Modified" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 5 -value "Is Disabled" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 6 -value "Serve rRoles" -StyleSheet $StyleHeader2 | Out-Null
-
- $rowPosition++
-
- foreach($priv in $privileges)
- {
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value $priv.Name -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $priv.LoginType -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 3 -value $priv.CreateDate -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 4 -value $priv.DateLastModified -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 5 -value $priv.IsDisabled -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 6 -value $priv.ServerRoles -StyleSheet $styleNormal | Out-Null
-
- $rowPosition++
- }
- }
- else
- {
- Write-Host "No records fount for SQL Server Privileges" -ForegroundColor Red
- }
-
- #######################################################################################################
- #######################################################################################################
-
- #######################################################################################################
- # AGENT JOBS
- #######################################################################################################
-
- # Reset row positions
- $rowPosition = 1
-
- # Set the tabposition
- $tabPosition++
-
- # Add a worksheet
- $excel | Add-OOXMLWorksheet -WorkSheetName "Agent Jobs" #-AutofilterRange "A2:G2"
- # Set the worksheet as the first sheet
- $sheet = $book | Select-OOXMLWorkSheet -WorkSheetNumber $tabPosition
-
- Write-Host " - Retrieving data for Agent Jobs" -ForegroundColor Green
-
- $jobs = Get-SQLAgentJobs -inst $target | Sort Name
-
- if($jobs.Count -ge 1)
- {
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 1 -value "Name" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 2 -value "Description" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 3 -value "Parent" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 4 -value "Category" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 5 -value "CategoryType" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 6 -value "DateCreated" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 7 -value "DateLastModified" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 8 -value "DeleteLevel" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 9 -value "EmailLevel" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 10 -value "EventLogLevel" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 11 -value "HasSchedule" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 12 -value "HasServer" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 13 -value "HasStep" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 14 -value "IsEnabled" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 15 -value "JobID" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 16 -value "JobType" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 17 -value "LastRunDate" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 18 -value "LastRunOutcome" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 19 -value "NetSendLevel" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 20 -value "NextRunDate" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 21 -value "NextRunScheduleID" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 22 -value "OperatorToEmail" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 23 -value "OperatorToNetSend" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 24 -value "OperatorToPage" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 25 -value "OriginatingServer" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 26 -value "OwnerLoginName" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 27 -value "PageLevel" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 28 -value "StartStepID" -StyleSheet $StyleHeader2 | Out-Null
- $sheet | Set-OOXMLRangeValue -row $RowPosition -col 29 -value "VersionNumber" -StyleSheet $StyleHeader2 | Out-Null
-
- $rowPosition++
-
- foreach($job in $jobs)
- {
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value $job.Name -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $job.Description -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 3 -value $job.Parent -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 4 -value $job.Category -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 5 -value $job.CategoryType -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 6 -value $job.DateCreated -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 7 -value $job.DateLastModified -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 8 -value $job.DeleteLevel -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 9 -value $job.EmailLevel -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 10 -value $job.EventLogLevel -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 11 -value $job.HasSchedule -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 12 -value $job.HasServer -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 13 -value $job.HasStep -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 14 -value $job.IsEnabled -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 15 -value $job.JobID -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 16 -value $job.JobType -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 17 -value $job.LastRunDate -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 18 -value $job.LastRunOutcome -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 19 -value $job.NetSendLevel -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 20 -value $job.NextRunDate -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 21 -value $job.NextRunScheduleID -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 22 -value $job.OperatorToEmail -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 23 -value $job.OperatorToNetSend -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 24 -value $job.OperatorToPage -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 25 -value $job.OriginatingServer -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 26 -value $job.OwnerLoginName -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 27 -value $job.PageLevel -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 28 -value $job.StartStepID -StyleSheet $styleNormal | Out-Null
- $sheet | Set-OOXMLRangeValue -row $rowPosition -col 29 -value $job.VersionNumber -StyleSheet $styleNormal | Out-Null
-
- $rowPosition++
- }
- }
- else
- {
- Write-Host "No records fount for Agent Jobs" -ForegroundColor Red
- }
-
- #######################################################################################################
- #######################################################################################################
-
- $excel | Save-OOXMLPackage -FileFullPath $outputFile -Dispose
-}
-
-$items = Import-Csv "c:\sqlserverinstances.csv" -Delimiter ";"
-
-foreach($item in $items)
-{
- if(Test-Connection $item.ComputerName)
- {
- Generate-Documentation -server $item.ComputerName -instance $item.SQLServerInstanceName -destination 'H:\Mijn documenten\_Overdracht\Databasebeheer\SQL Server Inventarisatie'
- }
-}
+<#============================================================================
+ File: Get-MachineInformationExcel.ps
+
+ Summary: Get machine information like memory, CPU and disk configuration
+ and output it to Excel
+
+------------------------------------------------------------------------------
+ Written by Sander Stad, SQLStad.nl
+
+ (c) 2015, SQLStad.nl. All rights reserved.
+
+ For more scripts and sample code, check out http://www.SQLStad.nl
+
+ You may alter this code for your own *non-commercial* purposes (e.g. in a
+ for-sale commercial tool). Use in your own environment is encouraged.
+ You may republish altered code as long as you include this copyright and
+ give due credit, but you must obtain prior permission before blogging
+ this code.
+
+ THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF
+ ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED
+ TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
+ PARTICULAR PURPOSE.
+============================================================================#>
+
+# Import the Excel library
+Import-Module ExcelPSLib -Force
+Import-Module PSSQLLib -Force
+
+CLS
+
+function Generate-Documentation()
+{
+ param(
+ [Parameter(Mandatory=$true, Position=1)]
+ [ValidateNotNullOrEmpty()]
+ [string]$server,
+ [Parameter(Mandatory=$true, Position=2)]
+ [string]$instance = '',
+ [Parameter(Mandatory=$true, Position=3)]
+ [ValidateNotNullOrEmpty()]
+ [string]$destination
+ )
+
+ # Make up the target in case we have a default instance
+ if(($instance -eq '') -or (($instance).ToUpper() -eq 'MSSQLSERVER'))
+ {
+ $target = $server
+ }
+ else
+ {
+ $target = "$server\$instance"
+ }
+
+ Write-Host "Setting up components for $target" -ForegroundColor Green
+
+ # Create timestamp
+ $timestamp = Get-Date -f yyyyddMMHHmmss
+
+ # Set the destination
+ $outputFile = $destination + '\MachineInformation_' + ($server).ToUpper() + '_' + ($instance).ToUpper() + '_' + $timestamp + '.xlsx'
+
+ # Set the position of the first row
+ $rowPosition = 1
+
+ # Set the number of the tab
+ $tabPosition = 1
+
+ # Create a new Excel package
+ [OfficeOpenXml.ExcelPackage]$excel = New-OOXMLPackage -author "Sander Stad" -title "Machine Information $target"
+
+ # Create a new workbook
+ [OfficeOpenXml.ExcelWorkbook]$book = $excel | Get-OOXMLWorkbook
+
+ # Set the different styles
+ $styleGreen = New-OOXMLStyleSheet -WorkBook $book -Name "GirlStyle" -Bold -ForeGroundColor Black -FillType Solid -BackGroundColor Green -borderStyle Thin -BorderColor Black -NFormat "#,##0.00"
+ $styleRed = New-OOXMLStyleSheet -WorkBook $book -Name "BoyStyle" -Bold -ForeGroundColor Black -FillType Solid -BackGroundColor Red -borderStyle Thin -BorderColor Black -NFormat "#,##0.00"
+ $styleHeader = New-OOXMLStyleSheet -WorkBook $book -Name "HeaderStyle" -Bold -ForeGroundColor White -BackGroundColor Black -Size 12 -HAlign Center -VAlign Center -FillType Solid
+ $styleHeader2 = New-OOXMLStyleSheet -WorkBook $book -Name "HeaderStyle2" -Bold -ForeGroundColor White -BackGroundColor Black -Size 11 -HAlign Left -VAlign Center -FillType Solid
+ $styleNormal = New-OOXMLStyleSheet -WorkBook $book -Name "NormalStyle" -borderStyle Thin -BorderColor Black
+ $styleNumber = New-OOXMLStyleSheet -WorkBook $book -Name "Float" -NFormat "#,##0.00"
+ $styleConditionalFormatting = New-OOXMLStyleSheet -WorkBook $book -Name "ConditionalF" -Bold -ForeGroundColor Black -FillType Solid -BackGroundColor Orange -borderStyle Double -BorderColor Blue -NFormat "#,##0.0000" -Italic
+
+ Write-Host "Start retrieving data for $target" -ForegroundColor Green
+
+ #######################################################################################################
+ # SYSTEM INFORMATION
+ #######################################################################################################
+
+ # Add a worksheet
+ $excel | Add-OOXMLWorksheet -WorkSheetName "System Information"
+ # Set the worksheet as the first sheet
+ $sheet = $book | Select-OOXMLWorkSheet -WorkSheetNumber $tabPosition
+
+ Write-Host " - Retrieving data for System Information" -ForegroundColor Green
+
+ # Get the data from the function
+ $data = $null
+ $data = Get-HostSystemInformation -hst $server
+
+ if($data.Name.Length -ge 1)
+ {
+
+ # Fill the sheet with data from the system function
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value "Server Name" -StyleSheet $styleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $data.Name -StyleSheet $styleNormal | Out-Null
+
+ $sheet.Column(1).Width = 30
+ $sheet.Column(2).Width = 40
+ $rowPosition++
+
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value "Domain" -StyleSheet $styleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $data.Domain -StyleSheet $styleNormal | Out-Null
+
+ $rowPosition++
+
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value "Manufacturer" -StyleSheet $styleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $data.Manufacturer -StyleSheet $styleNormal | Out-Null
+
+ $rowPosition++
+
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value "Model" -StyleSheet $styleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $data.Model -StyleSheet $styleNormal | Out-Null
+
+ $rowPosition++
+
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value "Number of logical processors" -StyleSheet $styleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $data.NumberOfLogicalProcessors -StyleSheet $styleNormal | Out-Null
+
+ $rowPosition++
+
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value "Number of processors" -StyleSheet $styleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $data.NumberOfProcessors -StyleSheet $styleNormal | Out-Null
+
+ $rowPosition++
+
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value "Last load info" -StyleSheet $styleHeader2 | Out-Null
+ if([string]::IsNullOrEmpty($data.LastLoadInfo))
+ {
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value '' -StyleSheet $styleNormal | Out-Null
+ }
+ else
+ {
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $data.LastLoadInfo -StyleSheet $styleNormal | Out-Null
+ }
+
+ $rowPosition++
+
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value "Total physical memory MB" -StyleSheet $styleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $data.TotalPhysicalMemoryMB -StyleSheet $styleNormal | Out-Null
+ }
+ else
+ {
+ Write-Host "No records fount for System Information" -ForegroundColor Red
+ }
+
+ #######################################################################################################
+ #######################################################################################################
+
+
+ #######################################################################################################
+ # OPERATING SYSTEM INFORMATION
+ #######################################################################################################
+
+ # Reset row positions
+ $rowPosition = 1
+
+ # Set the tabposition
+ $tabPosition++
+
+ # Add a worksheet
+ $excel | Add-OOXMLWorksheet -WorkSheetName "Operating System"
+ # Set the worksheet as the first sheet
+ $sheet = $book | Select-OOXMLWorkSheet -WorkSheetNumber $tabPosition
+
+ Write-Host " - Retrieving data for Operating System" -ForegroundColor Green
+
+ # Get the data from the function
+ $data = $null
+ $data = Get-HostOperatingSystem -hst $server
+
+ if($data.OSArchitecture.Length -ge 1)
+ {
+
+ # Fill the sheet with data from the hardware function
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value "OS Architecture" -StyleSheet $styleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $data.OSArchitecture -StyleSheet $styleNormal | Out-Null
+
+ $sheet.Column(1).Width = 30
+ $sheet.Column(2).Width = 40
+ $rowPosition++
+
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value "OS Language" -StyleSheet $styleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $data.OSLanguage -StyleSheet $styleNormal | Out-Null
+
+ $rowPosition++
+
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value "OS ProductSuite" -StyleSheet $styleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $data.OSProductSuite -StyleSheet $styleNormal | Out-Null
+
+ $rowPosition++
+
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value "OS Type" -StyleSheet $styleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $data.OSType -StyleSheet $styleNormal | Out-Null
+
+ $rowPosition++
+
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value "BuildType" -StyleSheet $styleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $data.BuildType -StyleSheet $styleNormal | Out-Null
+
+ $rowPosition++
+
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value "Version" -StyleSheet $styleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $data.Version -StyleSheet $styleNormal | Out-Null
+
+ $rowPosition++
+
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value "Windows Directory" -StyleSheet $styleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $data.WindowsDirectory -StyleSheet $styleNormal | Out-Null
+
+ $rowPosition++
+
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value "Free Physical Memory MB" -StyleSheet $styleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $data.FreePhysicalMemoryMB -StyleSheet $styleNormal | Out-Null
+
+ $rowPosition++
+
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value "Free Space In Paging Files MB" -StyleSheet $styleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $data.FreeSpaceInPagingFilesMB -StyleSheet $styleNormal | Out-Null
+
+ $rowPosition++
+
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value "Free Virtua lMemory MB" -StyleSheet $styleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $data.FreeVirtualMemoryMB -StyleSheet $styleNormal | Out-Null
+
+ $rowPosition++
+
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value "Service Pack Major Version" -StyleSheet $styleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $data.ServicePackMajorVersion -StyleSheet $styleNormal | Out-Null
+
+ $rowPosition++
+
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value "Service Pack Minor Version" -StyleSheet $styleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $data.ServicePackMinorVersion -StyleSheet $styleNormal | Out-Null
+ }
+ else
+ {
+ Write-Host "No records fount for Operating System" -ForegroundColor Red
+ }
+
+ #######################################################################################################
+ #######################################################################################################
+
+
+ #######################################################################################################
+ # SQL SERVER SERVICES
+ #######################################################################################################
+
+ # Reset row positions
+ $rowPosition = 1
+
+ # Set the tabposition
+ $tabPosition++
+
+ # Add a worksheet
+ $excel | Add-OOXMLWorksheet -WorkSheetName "SQL Services" #-AutofilterRange "A2:G2"
+ # Set the worksheet as the first sheet
+ $sheet = $book | Select-OOXMLWorkSheet -WorkSheetNumber $tabPosition
+
+ Write-Host " - Retrieving data for SQL Server Services" -ForegroundColor Green
+
+ # Get the data from the function
+ $services = Get-HostSQLServerServices -hst $server
+
+ if($services.Count -ge 1)
+ {
+
+ # Create the header
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 1 -value "System Name" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet.Column(1).Width = 22
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 2 -value "Display Name" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet.Column(2).Width = 32
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 3 -value "Service Name" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet.Column(3).Width = 22
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 4 -value "State" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet.Column(4).Width = 22
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 5 -value "Status" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet.Column(5).Width = 22
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 6 -value "Start Mode" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet.Column(6).Width = 22
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 7 -value "Start Name" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet.Column(7).Width = 32
+
+ $rowPosition++
+
+ foreach($service in $services)
+ {
+
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value $service.SystemName -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $service.DisplayName -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 3 -value $service.Name -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 4 -value $service.State -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 5 -value $service.Status -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 6 -value $service.StartMode -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 7 -value $service.StartName -StyleSheet $styleNormal | Out-Null
+
+ $rowPosition++
+ }
+ }
+ else
+ {
+ Write-Host "No records fount for SQL Services" -ForegroundColor Red
+ }
+
+ #######################################################################################################
+ #######################################################################################################
+
+ #######################################################################################################
+ # DISK INFORMATION
+ #######################################################################################################
+
+ # Reset row positions
+ $rowPosition = 1
+
+ # Set the tabposition
+ $tabPosition++
+
+ # Add a worksheet
+ $excel | Add-OOXMLWorksheet -WorkSheetName "Disk Information" #-AutofilterRange "A2:G2"
+ # Set the worksheet as the first sheet
+ $sheet = $book | Select-OOXMLWorkSheet -WorkSheetNumber $tabPosition
+
+ Write-Host " - Retrieving data for Disk Information" -ForegroundColor Green
+
+ $disks = Get-HostHarddisk -hst $server
+
+ if($disks.Count -ge 1)
+ {
+
+ # Create the header
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 1 -value "Disk" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet.Column(1).Width = 22
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 2 -value "Volume Name" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet.Column(2).Width = 32
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 3 -value "Free Space MB" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet.Column(3).Width = 22
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 4 -value "Size MB" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet.Column(4).Width = 22
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 5 -value "Percentage Used" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet.Column(5).Width = 22
+
+ $rowPosition++
+
+ foreach($disk in $disks)
+ {
+
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value $disk.Disk -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $disk.VolumeName -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 3 -value $disk.FreeSpaceMB -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 4 -value $disk.SizeMB -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 5 -value $disk.PercentageUsed -StyleSheet $styleNormal | Out-Null
+
+ $rowPosition++
+ }
+ }
+ else
+ {
+ Write-Host "No records fount for Disk Information" -ForegroundColor Red
+ }
+
+ #######################################################################################################
+ #######################################################################################################
+
+ #######################################################################################################
+ # SQL CONFIGURATION
+ #######################################################################################################
+
+ # Reset row positions
+ $rowPosition = 1
+
+ # Set the tabposition
+ $tabPosition++
+
+ # Add a worksheet
+ $excel | Add-OOXMLWorksheet -WorkSheetName "Instance Configuration" #-AutofilterRange "A2:G2"
+ # Set the worksheet as the first sheet
+ $sheet = $book | Select-OOXMLWorkSheet -WorkSheetNumber $tabPosition
+
+ Write-Host " - Retrieving data for SQL Configuration" -ForegroundColor Green
+
+ $configurations = Get-SQLConfiguration -inst $target | Sort DisplayName
+
+ if($configurations.Count -ge 1)
+ {
+
+ # Create the header
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 1 -value "Display Name" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet.Column(1).Width = 40
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 2 -value "Number" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet.Column(2).Width = 32
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 3 -value "Minimum" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet.Column(3).Width = 22
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 4 -value "Maximum" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet.Column(4).Width = 22
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 5 -value "Is Dynamic" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet.Column(5).Width = 22
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 6 -value "Is Advanced" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet.Column(6).Width = 22
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 7 -value "Description" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet.Column(7).Width = 50
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 8 -value "Run Value" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet.Column(8).Width = 22
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 9 -value "Config Value" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet.Column(9).Width = 22
+
+ $rowPosition++
+
+ foreach($config in $configurations)
+ {
+
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value $config.DisplayName -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $config.Number -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 3 -value $config.Minimum -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 4 -value $config.Maximum -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 5 -value $config.IsDynamic -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 6 -value $config.IsAdvanced -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 7 -value $config.Description -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 8 -value $config.RunValue -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 9 -value $config.ConfigValue -StyleSheet $styleNormal | Out-Null
+
+ $rowPosition++
+ }
+ }
+ else
+ {
+ Write-Host "No records fount for Instance Configuration" -ForegroundColor Red
+ }
+
+ #######################################################################################################
+ #######################################################################################################
+
+ #######################################################################################################
+ # DATABASES
+ #######################################################################################################
+
+ # Reset row positions
+ $rowPosition = 1
+
+ # Set the tabposition
+ $tabPosition++
+
+ # Add a worksheet
+ $excel | Add-OOXMLWorksheet -WorkSheetName "Databases" #-AutofilterRange "A2:G2"
+ # Set the worksheet as the first sheet
+ $sheet = $book | Select-OOXMLWorkSheet -WorkSheetNumber $tabPosition
+
+ Write-Host " - Retrieving data for Databases" -ForegroundColor Green
+
+ $databases = Get-SQLDatabases -inst $target | Sort Name
+
+ if($databases.Count -ge 1)
+ {
+
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 1 -value "Name" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 2 -value "ID" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 3 -value "AutoClose" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 4 -value "AutoCreateStatisticsEnabled" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 5 -value "AutoShrink" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 6 -value "AutoUpdateStatisticsAsync" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 7 -value "AutoUpdateStatisticsEnabled" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 8 -value "AvailabilityGroupName" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 9 -value "CloseCursorsOnCommitEnabled" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 10 -value "Collation" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 11 -value "CompatibilityLevel" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 12 -value "CreateDate" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 13 -value "DataSpaceUsage" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 14 -value "EncryptionEnabled" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 15 -value "IndexSpaceUsage" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 16 -value "IsDbSecurityAdmin" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 17 -value "IsFullTextEnabled" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 18 -value "IsManagementDataWarehouse" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 19 -value "IsMirroringEnabled" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 20 -value "LastBackupDate" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 21 -value "LastDifferentialBackupDate" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 22 -value "LastLogBackupDate" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 23 -value "Owner" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 24 -value "PageVerify" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 25 -value "PrimaryFilePath" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 26 -value "ReadOnly" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 27 -value "RecoveryModel" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 28 -value "RecursiveTriggersEnabled" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 29 -value "Size" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 30 -value "SnapshotIsolationState" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 31 -value "SpaceAvailable" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 32 -value "Status" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 33 -value "TargetRecoveryTime" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 34 -value "Trustworthy" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 35 -value "UserAccess" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 36 -value "UserName" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 37 -value "Version" -StyleSheet $StyleHeader2 | Out-Null
+
+ $rowPosition++
+
+ foreach($db in $databases)
+ {
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value $db.Name -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $db.ID -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 3 -value $db.AutoClose -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 4 -value $db.AutoCreateStatisticsEnabled -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 5 -value $db.AutoShrink -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 6 -value $db.AutoUpdateStatisticsAsync -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 7 -value $db.AutoUpdateStatisticsEnabled -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 8 -value $db.AvailabilityGroupName -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 9 -value $db.CloseCursorsOnCommitEnabled -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 10 -value $db.Collation -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 11 -value $db.CompatibilityLevel -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 12 -value $db.CreateDate -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 13 -value $db.DataSpaceUsage -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 14 -value $db.EncryptionEnabled -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 15 -value $db.IndexSpaceUsage -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 16 -value $db.IsDbSecurityAdmin -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 17 -value $db.IsFullTextEnabled -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 18 -value $db.IsManagementDataWarehouse -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 19 -value $db.IsMirroringEnabled -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 20 -value $db.LastBackupDate -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 21 -value $db.LastDifferentialBackupDate -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 22 -value $db.LastLogBackupDate -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 23 -value $db.Owner -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 24 -value $db.PageVerify -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 25 -value $db.PrimaryFilePath -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 26 -value $db.ReadOnly -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 27 -value $db.RecoveryModel -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 28 -value $db.RecursiveTriggersEnabled -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 29 -value $db.Size -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 30 -value $db.SnapshotIsolationState -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 31 -value $db.SpaceAvailable -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 32 -value $db.Status -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 33 -value $db.TargetRecoveryTime -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 34 -value $db.Trustworthy -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 35 -value $db.UserAccess -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 36 -value $db.UserName -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 7 -value $db.Version -StyleSheet $styleNormal | Out-Null
+
+ $rowPosition++
+ }
+ }
+ else
+ {
+ Write-Host "No records fount for Databases" -ForegroundColor Red
+ }
+
+ #######################################################################################################
+ #######################################################################################################
+
+ #######################################################################################################
+ # DATABASE FILES
+ #######################################################################################################
+
+ # Reset row positions
+ $rowPosition = 1
+
+ # Set the tabposition
+ $tabPosition++
+
+ # Add a worksheet
+ $excel | Add-OOXMLWorksheet -WorkSheetName "Database Files" #-AutofilterRange "A2:G2"
+ # Set the worksheet as the first sheet
+ $sheet = $book | Select-OOXMLWorkSheet -WorkSheetNumber $tabPosition
+
+ Write-Host " - Retrieving data for Database Files" -ForegroundColor Green
+
+ $databaseFiles = Get-SQLDatabaseFiles -inst $target | Sort DatabaseName, FileType
+
+ if($databaseFiles.Count -ge 1)
+ {
+
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 1 -value "Database Name" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 2 -value "Name" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 3 -value "File Type" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 4 -value "Directory" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 5 -value "File Name" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 6 -value "Growth" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 7 -value "Growth Type" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 8 -value "Size" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 9 -value "Used Space" -StyleSheet $StyleHeader2 | Out-Null
+
+ $rowPosition++
+
+ foreach($dbFile in $databaseFiles)
+ {
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value $dbFile.DatabaseName -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $dbFile.Name -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 3 -value $dbFile.FileType -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 4 -value $dbFile.Directory -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 5 -value $dbFile.FileName -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 6 -value $dbFile.Growth -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 7 -value $dbFile.GrowthType -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 8 -value $dbFile.Size -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 9 -value $dbFile.UsedSpace -StyleSheet $styleNormal | Out-Null
+
+ $rowPosition++
+ }
+ }
+ else
+ {
+ Write-Host "No records fount for Database Files" -ForegroundColor Red
+ }
+
+ #######################################################################################################
+ #######################################################################################################
+
+ #######################################################################################################
+ # DATABASE USERS
+ #######################################################################################################
+
+ # Reset row positions
+ $rowPosition = 1
+
+ # Set the tabposition
+ $tabPosition++
+
+ # Add a worksheet
+ $excel | Add-OOXMLWorksheet -WorkSheetName "Database Users" #-AutofilterRange "A2:G2"
+ # Set the worksheet as the first sheet
+ $sheet = $book | Select-OOXMLWorkSheet -WorkSheetNumber $tabPosition
+
+ Write-Host " - Retrieving data for Database Users" -ForegroundColor Green
+
+ $users = Get-SQLDatabaseUsers -inst $target | Sort Parent,Name
+
+ if($users.Count -ge 1)
+ {
+
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 1 -value "Parent" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 2 -value "Name" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 3 -value "AsymmetricKey" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 4 -value "AuthenticationType" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 5 -value "Certificate" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 6 -value "CreateDate" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 7 -value "DateLastModified" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 8 -value "DefaultSchema" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 9 -value "HasDBAccess" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 10 -value "ID" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 11 -value "IsSystemObject" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 12 -value "Login" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 13 -value "LoginType" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 14 -value "UserType" -StyleSheet $StyleHeader2 | Out-Null
+
+ $rowPosition++
+
+ foreach($user in $users)
+ {
+
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value $user.Parent -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $user.Name -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 3 -value $user.AsymmetricKey -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 4 -value $user.AuthenticationType -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 5 -value $user.Certificate -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 6 -value $user.CreateDate -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 7 -value $user.DateLastModified -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 8 -value $user.DefaultSchema -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 9 -value $user.HasDBAccess -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 10 -value $user.ID -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 11 -value $user.IsSystemObject -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 12 -value $user.Login -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 13 -value $user.LoginType -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 14 -value $user.UserType -StyleSheet $styleNormal | Out-Null
+
+ $rowPosition++
+
+ }
+ }
+ else
+ {
+ Write-Host "No records fount for Database Users" -ForegroundColor Red
+ }
+
+ #######################################################################################################
+ #######################################################################################################
+
+ #######################################################################################################
+ # DATABASE PRIVILEGES
+ #######################################################################################################
+
+ # Reset row positions
+ $rowPosition = 1
+
+ # Set the tabposition
+ $tabPosition++
+
+ # Add a worksheet
+ $excel | Add-OOXMLWorksheet -WorkSheetName "Database Privileges" #-AutofilterRange "A2:G2"
+ # Set the worksheet as the first sheet
+ $sheet = $book | Select-OOXMLWorkSheet -WorkSheetNumber $tabPosition
+
+ Write-Host " - Retrieving data for Database Privileges" -ForegroundColor Green
+
+ $data = Get-SQLDatabasePrivileges -inst $target | Sort DatabaseName, LoginName
+
+ if($data.Count -ge 1)
+ {
+
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 1 -value "Database Name" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 2 -value "User Name" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 3 -value "User Type" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 4 -value "Database Roles" -StyleSheet $StyleHeader2 | Out-Null
+
+ $rowPosition++
+
+ foreach($dbPriv in $data)
+ {
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value $dbPriv.DatabaseName -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $dbPriv.UserName -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 3 -value $dbPriv.UserType -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 4 -value $dbPriv.DatabaseRoles -StyleSheet $styleNormal | Out-Null
+
+ $rowPosition++
+ }
+ }
+ else
+ {
+ Write-Host "No records fount for Database Privileges" -ForegroundColor Red
+ }
+
+ #######################################################################################################
+ #######################################################################################################
+
+ #######################################################################################################
+ # SERVER PRIVILEGES
+ #######################################################################################################
+
+ # Reset row positions
+ $rowPosition = 1
+
+ # Set the tabposition
+ $tabPosition++
+
+ # Add a worksheet
+ $excel | Add-OOXMLWorksheet -WorkSheetName "Login Privileges" #-AutofilterRange "A2:G2"
+ # Set the worksheet as the first sheet
+ $sheet = $book | Select-OOXMLWorkSheet -WorkSheetNumber $tabPosition
+
+ Write-Host " - Retrieving data for SQL Server Privileges" -ForegroundColor Green
+
+ $privileges = Get-SQLServerPrivileges -inst $target | Sort Name
+
+ if($privileges.Count -ge 1)
+ {
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 1 -value "Name" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 2 -value "Login Type" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 3 -value "Create Date" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 4 -value "Date Last Modified" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 5 -value "Is Disabled" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 6 -value "Serve rRoles" -StyleSheet $StyleHeader2 | Out-Null
+
+ $rowPosition++
+
+ foreach($priv in $privileges)
+ {
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value $priv.Name -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $priv.LoginType -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 3 -value $priv.CreateDate -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 4 -value $priv.DateLastModified -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 5 -value $priv.IsDisabled -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 6 -value $priv.ServerRoles -StyleSheet $styleNormal | Out-Null
+
+ $rowPosition++
+ }
+ }
+ else
+ {
+ Write-Host "No records fount for SQL Server Privileges" -ForegroundColor Red
+ }
+
+ #######################################################################################################
+ #######################################################################################################
+
+ #######################################################################################################
+ # AGENT JOBS
+ #######################################################################################################
+
+ # Reset row positions
+ $rowPosition = 1
+
+ # Set the tabposition
+ $tabPosition++
+
+ # Add a worksheet
+ $excel | Add-OOXMLWorksheet -WorkSheetName "Agent Jobs" #-AutofilterRange "A2:G2"
+ # Set the worksheet as the first sheet
+ $sheet = $book | Select-OOXMLWorkSheet -WorkSheetNumber $tabPosition
+
+ Write-Host " - Retrieving data for Agent Jobs" -ForegroundColor Green
+
+ $jobs = Get-SQLAgentJobs -inst $target | Sort Name
+
+ if($jobs.Count -ge 1)
+ {
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 1 -value "Name" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 2 -value "Description" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 3 -value "Parent" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 4 -value "Category" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 5 -value "CategoryType" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 6 -value "DateCreated" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 7 -value "DateLastModified" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 8 -value "DeleteLevel" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 9 -value "EmailLevel" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 10 -value "EventLogLevel" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 11 -value "HasSchedule" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 12 -value "HasServer" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 13 -value "HasStep" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 14 -value "IsEnabled" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 15 -value "JobID" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 16 -value "JobType" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 17 -value "LastRunDate" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 18 -value "LastRunOutcome" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 19 -value "NetSendLevel" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 20 -value "NextRunDate" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 21 -value "NextRunScheduleID" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 22 -value "OperatorToEmail" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 23 -value "OperatorToNetSend" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 24 -value "OperatorToPage" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 25 -value "OriginatingServer" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 26 -value "OwnerLoginName" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 27 -value "PageLevel" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 28 -value "StartStepID" -StyleSheet $StyleHeader2 | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $RowPosition -col 29 -value "VersionNumber" -StyleSheet $StyleHeader2 | Out-Null
+
+ $rowPosition++
+
+ foreach($job in $jobs)
+ {
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 1 -value $job.Name -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 2 -value $job.Description -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 3 -value $job.Parent -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 4 -value $job.Category -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 5 -value $job.CategoryType -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 6 -value $job.DateCreated -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 7 -value $job.DateLastModified -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 8 -value $job.DeleteLevel -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 9 -value $job.EmailLevel -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 10 -value $job.EventLogLevel -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 11 -value $job.HasSchedule -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 12 -value $job.HasServer -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 13 -value $job.HasStep -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 14 -value $job.IsEnabled -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 15 -value $job.JobID -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 16 -value $job.JobType -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 17 -value $job.LastRunDate -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 18 -value $job.LastRunOutcome -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 19 -value $job.NetSendLevel -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 20 -value $job.NextRunDate -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 21 -value $job.NextRunScheduleID -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 22 -value $job.OperatorToEmail -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 23 -value $job.OperatorToNetSend -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 24 -value $job.OperatorToPage -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 25 -value $job.OriginatingServer -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 26 -value $job.OwnerLoginName -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 27 -value $job.PageLevel -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 28 -value $job.StartStepID -StyleSheet $styleNormal | Out-Null
+ $sheet | Set-OOXMLRangeValue -row $rowPosition -col 29 -value $job.VersionNumber -StyleSheet $styleNormal | Out-Null
+
+ $rowPosition++
+ }
+ }
+ else
+ {
+ Write-Host "No records fount for Agent Jobs" -ForegroundColor Red
+ }
+
+ #######################################################################################################
+ #######################################################################################################
+
+ $excel | Save-OOXMLPackage -FileFullPath $outputFile -Dispose
+}
+
+$items = Import-Csv "c:\sqlserverinstances.csv" -Delimiter ";"
+
+foreach($item in $items)
+{
+ if(Test-Connection $item.ComputerName)
+ {
+ Generate-Documentation -server $item.ComputerName -instance $item.SQLServerInstanceName -destination 'H:\Mijn documenten\_Overdracht\Databasebeheer\SQL Server Inventarisatie'
+ }
+}
diff --git a/PowerShell/Get-SQLErrorLog.ps1 b/PowerShell/Get-SQLErrorLog.ps1
new file mode 100644
index 00000000..acac19d2
--- /dev/null
+++ b/PowerShell/Get-SQLErrorLog.ps1
@@ -0,0 +1,243 @@
+[cmdletbinding()]
+param(
+ [Parameter(Mandatory = $true)]
+ [string]$servername,
+ [Parameter(Mandatory = $false)]
+ [string]$instanceName = "DEFAULT",
+ [Parameter(Mandatory = $false)]
+ [string]$From = "1/1/1970 00:00:00",
+ [Parameter(Mandatory = $false)]
+ [string]$To,
+ [Parameter(Mandatory = $false)]
+ [System.Management.Automation.CredentialAttribute()]
+ $Credential,
+ [Parameter(Mandatory = $false)]
+ [int]$maxThreads
+)
+
+begin
+{
+ $FileReaderScriptBlock = {
+ Param (
+ [string] $filepath,
+ [hashtable] $splat
+ )
+
+ $RemoteCommandScriptBlock = {
+ param (
+ [string] $filepath
+ )
+ Get-Content $filepath -ReadCount 0
+ }
+
+ #$Content = @()
+ $Content = Invoke-Command @splat -scriptblock $RemoteCommandScriptBlock -ArgumentList $filePath
+
+ $RunResult = [pscustomobject] @{
+ FileName = $filepath
+ ContentCount = $Content.Count
+ Content = $Content
+ ScriptToRun = $RemoteCommandScriptBlock
+ }
+ Return $RunResult
+ }
+
+ $FileParserScriptBlock = {
+ Param (
+ [array] $fileContents,
+ [array] $lineNumbers
+ )
+
+ $ErrorLogEntries = New-Object -typename System.Collections.ArrayList
+
+ For ($l = 0; $l -lt $lineNumbers.Count; $l++) {
+ $LineNumber = $lineNumbers[$l].LineNumber
+
+ $line = $fileContents[$LineNumber-1] -replace '\s+', ' '
+ $parsed = $line.split(' ')
+ $logErrorNumber = $parsed[4] -replace ',',''
+ $logSeverity = $parsed[6] -replace ',',''
+ $LogState = $parsed[8] -replace '\.',''
+
+ $line = $fileContents[$LineNumber] -replace '\s+', ' '
+ $parsed = $line.split(' ')
+
+ $eventTime = Get-Date -Date ($parsed[0] + ' ' + $parsed[1])
+ if ($parsed[2] -ne "Server") {
+ $spid = ($parsed[2] -replace 'spid','') -replace 's',''
+ } else {
+ $Spid = $null
+ }
+ $message = $line.Substring($parsed[0].Length + $parsed[1].Length + $parsed[2].length + 3)
+
+ $ErrorLogEvent = [pscustomobject] @{
+ EventTime = $eventTime
+ Spid = $spid
+ Message = $message
+ ErrorNumber = $logErrorNumber
+ Severity = $logSeverity
+ State = $LogState
+ }
+
+ $ErrorLogEntries.Add($ErrorLogEvent)
+ }
+
+ $RunResult = New-Object PSObject -Property @{
+ ErrorLogObjects = $ErrorLogEntries
+ }
+ Return $RunResult
+ }
+}
+
+
+
+process
+{
+ $eventSource = "MSSQLSERVER"
+ if ($instancename -ne "DEFAULT") {
+ $eventSource = "MSSQL$" + $instanceName
+ }
+ if (!$to) {
+ $to = Get-Date
+ Write-Verbose "Settting to to $to"
+ }
+
+ $InvokeCommandParamters = @{
+ 'ComputerName'=$servername;
+ }
+ if ($Credential) {
+ $InvokeCommandParamters.Add('Credential',$Credential)
+ }
+
+ Write-Verbose "Server Name: $servername"
+ Write-Verbose "Looking for SQL Server instance information for service $eventsource"
+ $ErrorLogPathFromEventLog = ((Invoke-Command @InvokeCommandParamters -ScriptBlock {param ($eventSource) Get-Eventlog -LogName Application | where-object {$_.EventID -eq 17111 -and $_.Source -eq $eventSource}} -ArgumentList $eventSource | Select -First 1).Message -replace "Logging SQL Server messages in file '","") -replace "'.",""
+ $errorLogPath = $ErrorLogPathFromEventLog.Substring(0,$ErrorLogPathFromEventLog.LastIndexOf("\"))
+ $errorLogFileName = $ErrorLogPathFromEventLog.Substring($ErrorLogPathFromEventLog.LastIndexOf("\")+1)
+ Write-Verbose "SQL Server Error Log Path: $errorlogpath"
+ $ErrorLogs = Invoke-Command @InvokeCommandParamters -ScriptBlock {param ($ErrorLogPath, $ErrorLogFileName) Get-ChildItem -Path $ErrorLogPath | Where-Object {$_.Name -like "$ErrorLogFileName*"}} -ArgumentList $errorlogpath, $errorLogFileName
+ $LastErrorLog = $ErrorLogs | Where-Object {$_.LastWriteTime -le $from} | Sort-Object -Property LastWriteTime -Descending | Select -First 1
+ if ($to -ge ($ErrorLogs | Sort-Object -Property LastWritTime | Select -First 1).LastWriteTime) {
+ $FirstErrorLog = $ErrorLogs | Sort-Object -Property LastWritTime | Select -First 1
+ } else {
+ $FirstErrorLog = $ErrorLogs | Where-Object {$_.LastWriteTime -ge $to} | Sort-Object -Property LastWriteTime | Select -First 1
+ }
+
+ $ErrorLogs = $ErrorLogs | Where-Object {$_.LastWriteTime -ge $LastErrorLog.LastWriteTime -and $_.LastWriteTime -le $FirstErrorLog.LastWriteTime} | Sort-Object -Property LastWriteTime
+
+ $fileNumber = 0
+ $jobs = New-Object -typename System.Collections.ArrayList
+ $PowerShellObjects = New-Object -typename System.Collections.ArrayList
+ $Results = @()
+
+ ForEach ($ErrorLog in $ErrorLogs)
+ {
+ $Runspace = [runspacefactory]::CreateRunspace()
+ $PowerShell = [powershell]::Create().AddScript($FileReaderScriptBlock).AddArgument($ErrorLog.FullName).AddArgument($InvokeCommandParamters)
+ $PowerShell.Runspace = $Runspace
+ [void]$PowerShellObjects.Add($PowerShell)
+ }
+
+ ForEach ($PowerShellObject in $PowerShellObjects)
+ {
+ $PowerShellObject.Runspace.Open()
+ [void]$Jobs.Add(($PowerShellObject.BeginInvoke()))
+ }
+
+ Write-Verbose "All files added, waiting for threads to complete"
+ $StopWatch = [System.Diagnostics.Stopwatch]::StartNew()
+
+ Do
+ {
+ Start-Sleep -Seconds 1
+ } While ($jobs.IsCompleted -contains $false)
+
+ Write-Verbose "All threads completed!"
+ $StopWatch.Stop()
+ $FileReaderDuration = $StopWatch.Elapsed.TotalMilliseconds
+ Write-Verbose "$FileReaderDuration milliseconds to read all the files"
+
+ $Counter = 0
+ $AllContent = $null
+ ForEach ($PowerShellObject in $PowerShellObjects)
+ {
+ $Data = $PowerShellObject.EndInvoke($Jobs[$Counter])
+ $AllContent += $Data.Content
+ $Results += $Data
+ $Counter++
+ $PowerShellObject.Runspace.Dispose()
+ $PowerShellObject.Dispose()
+ }
+
+ Write-Verbose "Matching error lines..."
+ $matchedLines = $AllContent | Select-String -Pattern '((\w+): (\d+)[,\.]\s?){3}'
+ $matchedLinesTotal = $matchedLines.Length
+ $remainder = $matchedLinesTotal % 8
+ $setSize = ($matchedLinesTotal - $remainder) / 8
+
+ $jobs = New-Object -typename System.Collections.ArrayList
+ $PowerShellObjects = New-Object -typename System.Collections.ArrayList
+ $Results = @()
+
+ Write-Verbose "There are $matchedLinesTotal to parse"
+ for ($x = 0; $x -lt 8; $x++) {
+ $min = $setSize * $x
+ $max = $min + ($setSize - 1)
+ $subSet = $matchedLines[$min..$max]
+ Write-Verbose "Chunking $min to $max..."
+ $Runspace = [runspacefactory]::CreateRunspace()
+ $m = $matchedLines[$min..$max]
+ $PowerShell = [powershell]::Create().AddScript($FileParserScriptBlock).AddArgument($AllContent).AddArgument($subSet)
+ $PowerShell.Runspace = $Runspace
+ [void]$PowerShellObjects.Add($PowerShell)
+ }
+ if ($remainder -gt 0) {
+ $min = $max + 1
+ $max = $matchedLinesTotal
+ $subSet = $matchedLines[$min..$max]
+ Write-Verbose "Chunking remainder $min to $max..."
+ $Runspace = [runspacefactory]::CreateRunspace()
+ $PowerShell = [powershell]::Create().AddScript($FileParserScriptBlock).AddArgument($AllContent).AddArgument($subSet)
+ $PowerShell.Runspace = $Runspace
+ [void]$PowerShellObjects.Add($PowerShell)
+
+ }
+
+ ForEach ($PowerShellObject in $PowerShellObjects)
+ {
+ $PowerShellObject.Runspace.Open()
+ [void]$Jobs.Add(($PowerShellObject.BeginInvoke()))
+ }
+
+ $StopWatch = [System.Diagnostics.Stopwatch]::StartNew()
+ Write-Verbose "All files chunks chunked, waiting for threads to complete"
+
+ Do
+ {
+ Write-Verbose "Waiting..."
+ Start-Sleep -Seconds 2
+ } While ($jobs.IsCompleted -contains $false)
+
+ Write-Verbose "All threads completed!"
+ $StopWatch.Stop()
+ $FileParserDuration = $StopWatch.Elapsed.TotalMilliseconds
+ Write-Verbose "$FileParserDuration milliseconds to parse all the chunks"
+
+ $Errors = @()
+ $Counter = 0
+ ForEach ($PowerShellObject in $PowerShellObjects)
+ {
+ $Data = $PowerShellObject.EndInvoke($Jobs[$Counter])
+ $Errors += $Data.ErrorLogObjects
+ $Counter++
+ $PowerShellObject.Runspace.Dispose()
+ $PowerShellObject.Dispose()
+ }
+}
+
+end
+{
+ return $Errors
+ $Results = $null
+ $AllContent = $null
+}
\ No newline at end of file
diff --git a/PowerShell/Get-SQLServerGlobalTraceFlags.ps1 b/PowerShell/Get-SQLServerGlobalTraceFlags.ps1
new file mode 100644
index 00000000..124ac835
--- /dev/null
+++ b/PowerShell/Get-SQLServerGlobalTraceFlags.ps1
@@ -0,0 +1,42 @@
+<#
+.Synopsis
+ Display all active trace flags on SQL Server
+.DESCRIPTION
+ Display all active trace flags on SQL Server
+.EXAMPLE
+ The following command scripts out the permissions of login account [John] and generates the script at "c:\temp\clone.sql"
+ Notice, parameters [OldLogin] and [NewLogin] uses the same value of "John"
+ Clone-SQLLogin -Server Server1, Server2 -OldLogin John -NewLogin John -FilePath "c:\temp\clone.sql"
+
+.EXAMPLE
+ Get-SQLServerGlobalTraceFlags
+.NOTES
+ Original link: https://naturalselectiondba.wordpress.com/2016/04/21/sql-server-use-powershell-to-find-what-trace-flags-are-running/
+ Author: Matthew Darwin
+#>
+
+function Get-SQLServerGlobalTraceFlags
+{
+ [cmdletbinding()]
+ param([string]$Server)
+
+ #create an smo object for the SQL Server
+ $SQLServer = new-object ("Microsoft.SQLServer.Management.Smo.Server") $Server
+
+ #get the trace flag status
+ $TraceFlags = $SQLServer.EnumActiveGlobalTraceFlags()
+
+ #loop through the trace flags and add the servername in order to create an object with all the required rows to import into a table later
+ ForEach($TraceFlag in $TraceFlags)
+ {
+ $data = @{"ServerName" = $Server
+ ; "TraceFlag" = $TraceFlag.TraceFlag
+ ; "Status" = $TraceFlag.Status}
+
+ $Output = new-object psobject -Property $data
+ write-output $output
+ }
+
+}
+
+export-modulemember -Function Get-SQLServerGlobalTraceFlags
diff --git a/PowerShell/Get-SQLServerSecurityReview.ps1 b/PowerShell/Get-SQLServerSecurityReview.ps1
new file mode 100644
index 00000000..baec0e03
--- /dev/null
+++ b/PowerShell/Get-SQLServerSecurityReview.ps1
@@ -0,0 +1,1049 @@
+<#
+.SYNOPSIS
+ The Script retrives the Security Best Practises for SQL Server and put's all that info in a html document.
+.DESCRIPTION
+ The Following information collectors can be found in the report.
+1. Server Information
+2. Database owners
+3. Windows Authenticated Logins
+4. SQL Authenticated Logins
+5. Server Level Permissions
+6. Server Role Members
+7. Database Level Permissions
+8. Database Role Members
+9. Job Owners
+10. Login Account for SQL Services
+11. SQL Server Network Protocols
+12. SQL Server TCP Port
+13. SQL Server Login Auditing Property Setting
+14. SQL Server Global Configuration Parameter (Secrity Affecting One's)
+.PARAMETER Computer
+Specify the Computer\Machine\Sever Name here to make IO analysis for the Server. One hostname per run.
+For Example: Get-SQLSecurityReview -computer ServerName ......
+.PARAMETER instance
+Specify the SQL instance Name to make IO analysis for the Server. One SQL instance per run.
+For Example: Get-SQLSecurityReview ...... -instance ServerName\SQLInstance ......
+.PARAMETER report
+Specify the location for the output report
+For Example: Get-SQLSecurityReview ...... C:\temp\ServerName$SQLInstance-Security_Review.html
+.EXAMPLE
+Get-SQLSecurityReview -computer ServerName -instance ServerName\SQLInstance -report C:\temp\ServerName$SQLInstance-Security_Review.html
+This will generate a html color coded report for localhost with sql instance jupiter
+and will dump the report @ location - C:\temp\ServerName$SQLInstance-Security_Review.html
+.NOTES
+ Author: Sandeep Arora arora@pythian.com sandeep16arora@gmail.com
+ Version Info:
+ 1.1 - 01/15/2016 - Initial Draft
+ 1.2 - 06/25/2016 - Bug Fixes with SMO Objects for Collecting SQL Server Port Info and Details for Networking Protocols
+ Verified on following platforms
+ Powershell v2.0 and higher versions
+ Microsoft SQL Server 2008 and higher versions
+ Windows Server 2008 and higher versions
+#>
+
+[CmdletBinding()]
+Param(
+ [Parameter(Mandatory=$true, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)]
+ [Alias('hostname')]
+ [string]$computer,
+
+ [Parameter(Mandatory=$true, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)]
+ [string]$instance,
+
+ [Parameter(Mandatory=$true, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)]
+ [string]$report
+ )
+
+Function Get-SQLServerInfo {
+ [CmdletBinding()]
+ Param(
+ [Parameter(Mandatory=$true)]
+ [Alias('instance')]
+ [string]$sqlinstance
+ )
+ BEGIN{
+ Try{
+ $query = @"
+ exec sp_configure 'show advanced options', 1;
+ RECONFIGURE with override;
+ ------------------------------------------------
+ SET NOCOUNT ON
+ create table #spconfig(s_name varchar(50), mini bigint, maxi bigint, config_value bigint, run_value bigint)
+ insert into #spconfig(s_name, mini, maxi,config_value, run_value) execute sp_configure
+ declare @testvaluec as int
+ declare @testvaluer as int
+ set @testvaluec = (select config_value from #spconfig where s_name like '%xp_cmdshell%' )
+ set @testvaluer = (select run_value from #spconfig where s_name like '%xp_cmdshell%' )
+ ---------------------------------------------------------------------------------------------------------------
+ ---------------------------------------------CONDITION 1
+ IF (@testvaluec =0 AND @testvaluer = 0)
+ ----------------------------------------------BLOCK A
+ BEGIN
+ ---------------------------------------------------
+ exec sp_configure 'show advanced options', 1;
+ RECONFIGURE with override;
+ exec sp_configure 'xp_cmdshell', 1;
+ RECONFIGURE with override;
+ ---------------------------------------------------------------
+ declare @rootdir nvarchar(1000)
+ exec master.dbo.xp_instance_regread
+ N'HKEY_LOCAL_MACHINE',
+ N'SOFTWARE\Microsoft\MSSQLServer\Setup',
+ N'SQLPath', @rootdir OUTPUT
+ IF EXISTS(SELECT 1 FROM [master].[sys].[databases] WHERE [name] = 'zzTempDBForDefaultPath')
+ BEGIN
+ DROP DATABASE zzTempDBForDefaultPath
+ END;
+ CREATE DATABASE zzTempDBForDefaultPath;
+ DECLARE @Default_Data_Path1 VARCHAR(512),
+ @Default_Log_Path2 VARCHAR(512);
+ SELECT @Default_Data_Path1 =
+ ( SELECT LEFT(physical_name,LEN(physical_name)-CHARINDEX('\',REVERSE(physical_name))+1)
+ FROM sys.master_files mf
+ INNER JOIN sys.[databases] d
+ ON mf.[database_id] = d.[database_id]
+ WHERE d.[name] = 'zzTempDBForDefaultPath' AND type = 0);
+ SELECT @Default_Log_Path2 =
+ ( SELECT LEFT(physical_name,LEN(physical_name)-CHARINDEX('\',REVERSE(physical_name))+1)
+ FROM sys.master_files mf
+ INNER JOIN sys.[databases] d
+ ON mf.[database_id] = d.[database_id]
+ WHERE d.[name] = 'zzTempDBForDefaultPath' AND type = 1);
+ IF EXISTS(SELECT 1 FROM [master].[sys].[databases] WHERE [name] = 'zzTempDBForDefaultPath')
+ BEGIN
+ DROP DATABASE zzTempDBForDefaultPath
+ END
+ declare @ErrLogPath1 nvarchar(500)
+ exec master.dbo.xp_instance_regread
+ N'HKEY_LOCAL_MACHINE',
+ N'Software\Microsoft\MSSQLServer\MSSQLServer\Parameters',
+ N'SqlArg1', @ErrLogPath1 OUTPUT
+ DECLARE @DBEngineLogin VARCHAR(100)
+ EXECUTE master.dbo.xp_instance_regread
+ @rootkey = N'HKEY_LOCAL_MACHINE',
+ @key = N'SYSTEM\CurrentControlSet\Services\MSSQLServer',
+ @value_name = N'ObjectName',
+ @value = @DBEngineLogin OUTPUT
+ DECLARE @tmpNewValue TABLE (newvalue varchar(500))
+ INSERT INTO @tmpNewValue EXEC xp_cmdshell 'systeminfo | findstr /c:"System Manufacturer"'
+ DECLARE @localVariable varchar(500)
+ SET @localVariable = (SELECT top 1 rtrim(ltrim(newvalue)) FROM @tmpNewValue )
+ --case when @localVariable like '%VMware%' OR @localVariable like '%hyper%'Then 'Virtual' else 'Physical' end as 'ServerType'
+ select
+ Case SERVERPROPERTY('IsClustered') when 1 then 'CLUSTERED' else 'STANDALONE' end as 'ServerType',
+ case when @localVariable like '%VMware%' OR @localVariable like '%hyper%'Then 'Virtual' else 'Physical' end as 'ServerType(PhysicalorVirtual)',
+ SERVERPROPERTY('MachineName') as 'MachineName',
+ (SELECT TOP(1) c.local_net_address
+ FROM sys.dm_exec_connections AS c
+ WHERE c.local_net_address IS NOT NULL) as IPAddress,'MSSQL' as 'Technology',
+ @@servername as 'InstanceName',
+ (SELECT top 1 local_tcp_port
+ FROM sys.dm_exec_connections
+ WHERE local_tcp_port IS NOT NULL
+ and net_transport = 'TCP' and protocol_type not like 'Database Mirroring' and endpoint_id = 4) as 'port',
+ @DBEngineLogin as 'ServiceAccount',
+ left(@@VERSION, CHARINDEX(' - ',@@version)-1) as 'Version',
+ SERVERPROPERTY ('Edition') as 'Edition',
+ SERVERPROPERTY('productversion') 'VersionNumber',
+ SERVERPROPERTY ('productlevel') as 'ServicePack',
+ (select stuff((SELECT ', '+ cast (ROW_NUMBER() Over(order by dbid) as varchar)+'.'+ UPPER(name)
+ FROM sys.sysdatabases FOR XML PATH ('')), 1, 1, '') as 'DB') as 'Databases',
+ @Default_Data_Path1 as 'data', @Default_Log_Path2 as 'log',
+ (select top 1 filename from sys.sysaltfiles where name like '%tempdev%' and filename like '%.mdf') as 'tempdbdata',
+ (select top 1 filename from sys.sysaltfiles where name like '%templog%' and filename like '%.ldf') as 'tempdblog',
+ @rootdir as 'root',
+ SUBSTRING(substring(@ErrLogPath1, 1, len(@ErrLogPath1) - charindex('\', reverse(@ErrLogPath1))),3,500) as 'ErrorLogPath'
+ ---------------------------------------------------------------
+ exec sp_configure 'show advanced options', 1;
+ RECONFIGURE with override;
+ exec sp_configure 'xp_cmdshell', 0;
+ RECONFIGURE with override;
+ exec sp_configure 'show advanced options', 0;
+ Reconfigure with override;
+ ----------------------------------------------------------------
+ Drop Table #spconfig
+ END
+ ----------------------------------------------------------------
+ ---------------------------------------------CONDITION 2
+ ELSE IF (@testvaluec =1 AND @testvaluer = 1)
+ ----------------------------------------------------------BLOCK B
+ BEGIN
+ -------------------------------------------------------------------
+ declare @rootdir3 nvarchar(500)
+ exec master.dbo.xp_instance_regread
+ N'HKEY_LOCAL_MACHINE',
+ N'SOFTWARE\Microsoft\MSSQLServer\Setup',
+ N'SQLPath', @rootdir3 OUTPUT
+
+ IF EXISTS(SELECT 1 FROM [master].[sys].[databases] WHERE [name] = 'zzTempDBForDefaultPath')
+
+ BEGIN
+ DROP DATABASE zzTempDBForDefaultPath
+ END;
+
+ CREATE DATABASE zzTempDBForDefaultPath;
+
+ DECLARE @Default_Data_Path3 VARCHAR(512),
+ @Default_Log_Path4 VARCHAR(512);
+
+ SELECT @Default_Data_Path3 =
+ ( SELECT LEFT(physical_name,LEN(physical_name)-CHARINDEX('\',REVERSE(physical_name))+1)
+ FROM sys.master_files mf
+ INNER JOIN sys.[databases] d
+ ON mf.[database_id] = d.[database_id]
+ WHERE d.[name] = 'zzTempDBForDefaultPath' AND type = 0);
+
+ SELECT @Default_Log_Path4 =
+ ( SELECT LEFT(physical_name,LEN(physical_name)-CHARINDEX('\',REVERSE(physical_name))+1)
+ FROM sys.master_files mf
+ INNER JOIN sys.[databases] d
+ ON mf.[database_id] = d.[database_id]
+ WHERE d.[name] = 'zzTempDBForDefaultPath' AND type = 1);
+
+ IF EXISTS(SELECT 1 FROM [master].[sys].[databases] WHERE [name] = 'zzTempDBForDefaultPath')
+ BEGIN
+ DROP DATABASE zzTempDBForDefaultPath
+ END
+ DECLARE @DBEngineLogin1 VARCHAR(100)
+ EXECUTE master.dbo.xp_instance_regread
+ @rootkey = N'HKEY_LOCAL_MACHINE',
+ @key = N'SYSTEM\CurrentControlSet\Services\MSSQLServer',
+ @value_name = N'ObjectName',
+ @value = @DBEngineLogin1 OUTPUT
+
+ declare @ErrLogPath nvarchar(500)
+ exec master.dbo.xp_instance_regread
+ N'HKEY_LOCAL_MACHINE',
+ N'Software\Microsoft\MSSQLServer\MSSQLServer\Parameters',
+ N'SqlArg1', @ErrLogPath OUTPUT
+
+ DECLARE @tmpNewValue1 TABLE (newvalue varchar(500))
+ INSERT INTO @tmpNewValue1 EXEC xp_cmdshell 'systeminfo | findstr /c:"System Manufacturer"'
+ DECLARE @localVariable1 varchar(500)
+ SET @localVariable1 = (SELECT top 1 rtrim(ltrim(newvalue)) FROM @tmpNewValue1 )
+ --case when @localVariable like '%VMware%' OR @localVariable like '%hyper%'Then 'Virtual' else 'Physical' end as 'ServerType'
+ select
+ Case SERVERPROPERTY('IsClustered') when 1 then 'CLUSTERED' else 'STANDALONE' end as 'ServerType',
+ case when @localVariable like '%VMware%' OR @localVariable like '%hyper%'Then 'Virtual' else 'Physical' end as 'ServerType(PhysicalorVirtual)',
+ SERVERPROPERTY('MachineName') as 'MachineName',
+ (SELECT TOP(1) c.local_net_address FROM sys.dm_exec_connections AS c
+ WHERE c.local_net_address IS NOT NULL) as IPAddress,'MSSQL' as 'Technology',
+ @@servername as 'InstanceName',
+ (SELECT top 1 local_tcp_port
+ FROM sys.dm_exec_connections
+ WHERE local_tcp_port IS NOT NULL
+ and net_transport = 'TCP' and protocol_type not like 'Database Mirroring' and endpoint_id = 4) as 'port',
+ @DBEngineLogin1 as 'ServiceAccount',
+ left(@@VERSION, CHARINDEX(' - ',@@version)-1) as 'Version',
+ SERVERPROPERTY ('Edition') as 'Edition',
+ SERVERPROPERTY('productversion') 'VersionNumber',
+ SERVERPROPERTY ('productlevel') as 'ServicePack',
+ (select stuff((SELECT ', '+ cast (ROW_NUMBER() Over(order by dbid) as varchar)+'.'+ UPPER(name)
+ FROM sys.sysdatabases FOR XML PATH ('')), 1, 1, '') as 'DB') as 'Databases',
+ @Default_Data_Path3 as 'data', @Default_Log_Path4 as 'log',
+ (select top 1 filename from sys.sysaltfiles where name like '%tempdev%' and filename like '%.mdf') as 'tempdbdata',
+ (select top 1 filename from sys.sysaltfiles where name like '%templog%' and filename like '%.ldf') as 'tempdblog',
+ @rootdir3 as 'root',
+ SUBSTRING(substring(@ErrLogPath, 1, len(@ErrLogPath) - charindex('\', reverse(@ErrLogPath))),3,500) as 'ErrorLogPath'
+ -------------------------------------------------------------------
+ exec sp_configure 'show advanced options', 0;
+ Reconfigure with override;
+ ---------------------------------------------------------
+ drop table #spconfig
+ END
+ ----------------------------------------------------------
+"@
+ $ErrorActionPreference = "Stop"
+ $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
+ $SqlConnection.ConnectionString = "Data Source = $sqlinstance; Initial Catalog = Master; Integrated Security=true; Connection Timeout=300;"
+
+ $SqlCmd = New-Object System.Data.SqlClient.SqlCommand
+ $SqlCmd.CommandText = $query
+ $SqlCmd.CommandTimeout = 0;
+ $SqlCmd.Connection = $SqlConnection
+
+ $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
+ $SqlAdapter.SelectCommand = $SqlCmd
+
+ $DataSet = New-Object System.Data.DataSet
+ $SqlAdapter.Fill($DataSet) | Out-Null
+ $ErrorActionPreference = "Continue"
+ }
+ Catch{
+ Write-Host "Unable to connect to the SQL Instance [$sqlinstance] in specified time-out period of 300s. Please Check the Instance availability and try again." -ForegroundColor "Red"
+ }
+ }
+ Process{
+ return $DataSet.Tables[0]
+ }
+ END{
+ $SqlConnection.Close()
+ }
+}
+
+Function Get-DBOwners {
+ [CmdletBinding()]
+ Param(
+ [Parameter(Mandatory=$true)]
+ [Alias('instance')]
+ [string]$sqlinstance
+ )
+ BEGIN{
+ Try{
+ $query = @"
+ select d.name [Database], d.owner_sid [Owner SID], p.name [Owner], p.type_desc [Owner Type]
+ from sys.databases d left outer join sys.server_principals p on (d.owner_sid = p.sid)
+ where d.database_id > 4 order by 1
+"@
+ $ErrorActionPreference = "Stop"
+ $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
+ $SqlConnection.ConnectionString = "Data Source = $sqlinstance; Initial Catalog = Master; Integrated Security=true; Connection Timeout=60;"
+
+ $SqlCmd = New-Object System.Data.SqlClient.SqlCommand
+ $SqlCmd.CommandText = $query
+ $SqlCmd.Connection = $SqlConnection
+
+ $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
+ $SqlAdapter.SelectCommand = $SqlCmd
+
+ $DataSet = New-Object System.Data.DataSet
+ $SqlAdapter.Fill($DataSet) | Out-Null
+ $ErrorActionPreference = "Continue"
+ }
+ Catch{
+ Write-Host "Unable to connect to the SQL Instance [$sqlinstance] in specified time-out period of 60s. Please Check the Instance availability and try again." -ForegroundColor "Red"
+ }
+ }
+ Process{
+ return $DataSet.Tables[0]
+ }
+ END{
+ $SqlConnection.Close()
+ }
+}
+
+Function Get-WindowAuthLogins {
+ [CmdletBinding()]
+ Param(
+ [Parameter(Mandatory=$true)]
+ [Alias('instance')]
+ [string]$sqlinstance
+ )
+ BEGIN{
+ Try{
+ $query = @"
+ select name [Login], type_desc [Type],
+ case when is_disabled = 0 then 'N'
+ else 'Y'
+ end as [Disabled?],
+ create_date [Create Date],
+ default_database_name [Default Database]
+ from sys.server_principals
+ where type in ('U', 'G')
+"@
+ $ErrorActionPreference = "Stop"
+ $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
+ $SqlConnection.ConnectionString = "Data Source = $sqlinstance; Initial Catalog = Master; Integrated Security=true; Connection Timeout=60;"
+
+ $SqlCmd = New-Object System.Data.SqlClient.SqlCommand
+ $SqlCmd.CommandText = $query
+ $SqlCmd.Connection = $SqlConnection
+
+ $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
+ $SqlAdapter.SelectCommand = $SqlCmd
+
+ $DataSet = New-Object System.Data.DataSet
+ $SqlAdapter.Fill($DataSet) | Out-Null
+ $ErrorActionPreference = "Continue"
+ }
+ Catch{
+ Write-Host "Unable to connect to the SQL Instance [$sqlinstance] in specified time-out period of 60s. Please Check the Instance availability and try again." -ForegroundColor "Red"
+ }
+ }
+ Process{
+ return $DataSet.Tables[0]
+ }
+ END{
+ $SqlConnection.Close()
+ }
+}
+
+Function Get-SQLAuthLogins {
+ [CmdletBinding()]
+ Param(
+ [Parameter(Mandatory=$true)]
+ [Alias('instance')]
+ [string]$sqlinstance
+ )
+ BEGIN{
+ Try{
+ $query = @"
+ select name [Login], type_desc [Type],
+ case when is_disabled = 0 then 'N'
+ else 'Y'
+ end as [Disabled?],
+ create_date [Create Date],
+ default_database_name [Default Database],
+ case when is_policy_checked = 0 then 'N'
+ else 'Y'
+ end as [Enforce Password Policy],
+ case when is_expiration_checked = 0 then 'N'
+ else 'Y'
+ end as [Enforce Password Expiration]
+ from sys.sql_logins
+ order by 1
+"@
+ $ErrorActionPreference = "Stop"
+ $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
+ $SqlConnection.ConnectionString = "Data Source = $sqlinstance; Initial Catalog = Master; Integrated Security=true; Connection Timeout=30;"
+
+ $SqlCmd = New-Object System.Data.SqlClient.SqlCommand
+ $SqlCmd.CommandText = $query
+ $SqlCmd.Connection = $SqlConnection
+
+ $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
+ $SqlAdapter.SelectCommand = $SqlCmd
+
+ $DataSet = New-Object System.Data.DataSet
+ $SqlAdapter.Fill($DataSet) | Out-Null
+ $ErrorActionPreference = "Continue"
+ }
+ Catch{
+ Write-Host "Unable to connect to the SQL Instance [$sqlinstance] in specified time-out period of 30s. Please Check the Instance availability and try again." -ForegroundColor "Red"
+ }
+ }
+ Process{
+ return $DataSet.Tables[0]
+ }
+ END{
+ $SqlConnection.Close()
+ }
+}
+
+Function Get-ServerLevelPermissions {
+ [CmdletBinding()]
+ Param(
+ [Parameter(Mandatory=$true)]
+ [Alias('instance')]
+ [string]$sqlinstance
+ )
+ BEGIN{
+ Try{
+ $query = @"
+ select pa.name [Grantee Login], pa.type_desc [Type], pb.name [Grantor Login],
+ permission_name [Permission], state_desc [State]
+ from sys.server_permissions s
+ inner join sys.server_principals pa on (s.grantee_principal_id = pa.principal_id)
+ inner join sys.server_principals pb on (s.grantor_principal_id = pb.principal_id)
+ where pa.type in ('S', 'U', 'G', 'R')
+ order by 1,4
+"@
+ $ErrorActionPreference = "Stop"
+ $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
+ $SqlConnection.ConnectionString = "Data Source = $sqlinstance; Initial Catalog = Master; Integrated Security=true; Connection Timeout=30;"
+
+ $SqlCmd = New-Object System.Data.SqlClient.SqlCommand
+ $SqlCmd.CommandText = $query
+ $SqlCmd.Connection = $SqlConnection
+
+ $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
+ $SqlAdapter.SelectCommand = $SqlCmd
+
+ $DataSet = New-Object System.Data.DataSet
+ $SqlAdapter.Fill($DataSet) | Out-Null
+ $ErrorActionPreference = "Continue"
+ }
+ Catch{
+ Write-Host "Unable to connect to the SQL Instance [$sqlinstance] in specified time-out period of 30s. Please Check the Instance availability and try again." -ForegroundColor "Red"
+ }
+ }
+ Process{
+ return $DataSet.Tables[0]
+ }
+ END{
+ $SqlConnection.Close()
+ }
+}
+
+Function Get-ServerRoleMembers {
+ [CmdletBinding()]
+ Param(
+ [Parameter(Mandatory=$true)]
+ [Alias('instance')]
+ [string]$sqlinstance
+ )
+ BEGIN{
+ Try{
+ $query = @"
+ select pa.name [Role], pb.name [Login]
+ from sys.server_role_members r
+ inner join sys.server_principals pa on (r.role_principal_id = pa.principal_id)
+ inner join sys.server_principals pb on (r.member_principal_id = pb.principal_id)
+ order by 1,2
+"@
+ $ErrorActionPreference = "Stop"
+ $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
+ $SqlConnection.ConnectionString = "Data Source = $sqlinstance; Initial Catalog = Master; Integrated Security=true; Connection Timeout=60;"
+
+ $SqlCmd = New-Object System.Data.SqlClient.SqlCommand
+ $SqlCmd.CommandText = $query
+ $SqlCmd.Connection = $SqlConnection
+
+ $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
+ $SqlAdapter.SelectCommand = $SqlCmd
+
+ $DataSet = New-Object System.Data.DataSet
+ $SqlAdapter.Fill($DataSet) | Out-Null
+ $ErrorActionPreference = "Continue"
+ }
+ Catch{
+ Write-Host "Unable to connect to the SQL Instance [$sqlinstance] in specified time-out period of 60s. Please Check the Instance availability and try again." -ForegroundColor "Red"
+ }
+ }
+ Process{
+ return $DataSet.Tables[0]
+ }
+ END{
+ $SqlConnection.Close()
+ }
+}
+
+Function Get-DBLevelPermissions {
+ [CmdletBinding()]
+ Param(
+ [Parameter(Mandatory=$true)]
+ [Alias('instance')]
+ [string]$sqlinstance
+ )
+ BEGIN{
+ Try{
+ $query = @"
+ if exists (select [id] from tempdb..sysobjects where [id] = OBJECT_ID ('tempdb..#tmpTable'))
+ drop table #tmpTable
+ create table #tmpTable (
+ [Database] sysname NOT NULL,
+ [Grantee Login] sysname NOT NULL,
+ [Type] sysname NOT NULL,
+ [Grantor Login] sysname NOT NULL,
+ [Permission] sysname NOT NULL,
+ [Applies To] sysname NOT NULL,
+ [State] sysname NOT NULL)
+ exec sp_msforeachdb
+ 'use [?];
+ insert into #tmpTable
+ select distinct db_name() [Database], pa.name [Grantee Login], pa.type_desc [Type], pb.name [Grantor Login],
+ permission_name [Permission], class_desc [Applies To], state_desc [State]
+ from sys.database_permissions d
+ inner join sys.database_principals pa on (d.grantee_principal_id = pa.principal_id)
+ inner join sys.database_principals pb on (d.grantor_principal_id = pb.principal_id)
+ where pa.type in (''S'', ''U'', ''G'', ''A'', ''R'')'
+ select * from #tmpTable order by 1,2,5,6
+ drop table #tmpTable
+"@
+ $ErrorActionPreference = "Stop"
+ $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
+ $SqlConnection.ConnectionString = "Data Source = $sqlinstance; Initial Catalog = Master; Integrated Security=true; Connection Timeout=60;"
+
+ $SqlCmd = New-Object System.Data.SqlClient.SqlCommand
+ $SqlCmd.CommandText = $query
+ $SqlCmd.Connection = $SqlConnection
+
+ $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
+ $SqlAdapter.SelectCommand = $SqlCmd
+
+ $DataSet = New-Object System.Data.DataSet
+ $SqlAdapter.Fill($DataSet) | Out-Null
+ $ErrorActionPreference = "Continue"
+ }
+ Catch{
+ Write-Host "Unable to connect to the SQL Instance [$sqlinstance] in specified time-out period of 60s. Please Check the Instance availability and try again." -ForegroundColor "Red"
+ }
+ }
+ Process{
+ return $DataSet.Tables[0]
+ }
+ END{
+ $SqlConnection.Close()
+ }
+}
+
+Function Get-DBRoleMembers {
+ [CmdletBinding()]
+ Param(
+ [Parameter(Mandatory=$true)]
+ [Alias('instance')]
+ [string]$sqlinstance
+ )
+ BEGIN{
+ Try{
+ $query = @"
+ if exists (select [id] from tempdb..sysobjects where [id] = OBJECT_ID ('tempdb..#tmpTable'))
+ drop table #tmpTable
+ create table #tmpTable (
+ [Database] sysname NOT NULL,
+ [Role] sysname NOT NULL,
+ [Login] sysname NOT NULL)
+ exec sp_msforeachdb
+ 'use [?];
+ insert into #tmpTable
+ select db_name() [Database], pa.name [Role], pb.name [Login]
+ from sys.database_role_members r
+ inner join sys.database_principals pa on (r.role_principal_id = pa.principal_id)
+ inner join sys.database_principals pb on (r.member_principal_id = pb.principal_id)'
+ select [Database], Role, Login from #tmpTable
+ order by 1,2,3
+ drop table #tmpTable
+"@
+ $ErrorActionPreference = "Stop"
+ $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
+ $SqlConnection.ConnectionString = "Data Source = $sqlinstance; Initial Catalog = Master; Integrated Security=true; Connection Timeout=30;"
+
+ $SqlCmd = New-Object System.Data.SqlClient.SqlCommand
+ $SqlCmd.CommandText = $query
+ $SqlCmd.Connection = $SqlConnection
+
+ $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
+ $SqlAdapter.SelectCommand = $SqlCmd
+
+ $DataSet = New-Object System.Data.DataSet
+ $SqlAdapter.Fill($DataSet) | Out-Null
+ $ErrorActionPreference = "Continue"
+ }
+ Catch{
+ Write-Host "Unable to connect to the SQL Instance [$sqlinstance] in specified time-out period of 30s. Please Check the Instance availability and try again." -ForegroundColor "Red"
+ }
+ }
+ Process{
+ return $DataSet.Tables[0]
+ }
+ END{
+ $SqlConnection.Close()
+ }
+}
+
+Function Get-SQLJobOwner {
+ [CmdletBinding()]
+ Param(
+ [Parameter(Mandatory=$true)]
+ [Alias('instance')]
+ [string]$sqlinstance
+ )
+ BEGIN{
+ Try{
+ $query = @"
+ select j.name [Job], p.name [Owner],
+ case
+ when p.type like 'S' then 'SQL Login'
+ when p.type like 'U' then 'Windows Login'
+ end as 'Login Type'
+ from msdb..sysjobs j inner join sys.server_principals p on (j.owner_sid = p.sid)
+"@
+ $ErrorActionPreference = "Stop"
+ $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
+ $SqlConnection.ConnectionString = "Data Source = $sqlinstance; Initial Catalog = Master; Integrated Security=true; Connection Timeout=30;"
+
+ $SqlCmd = New-Object System.Data.SqlClient.SqlCommand
+ $SqlCmd.CommandText = $query
+ $SqlCmd.Connection = $SqlConnection
+
+ $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
+ $SqlAdapter.SelectCommand = $SqlCmd
+
+ $DataSet = New-Object System.Data.DataSet
+ $SqlAdapter.Fill($DataSet) | Out-Null
+ $ErrorActionPreference = "Continue"
+ }
+ Catch{
+ Write-Host "Unable to connect to the SQL Instance [$sqlinstance] in specified time-out period of 30s. Please Check the Instance availability and try again." -ForegroundColor "Red"
+ }
+ }
+ Process{
+ return $DataSet.Tables[0]
+ }
+ END{
+ $SqlConnection.Close()
+ }
+}
+
+Function Get-SQLServiceAccount {
+ [CmdletBinding()]
+ Param(
+ [Parameter(Mandatory=$true, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)]
+ [Alias('hostname')]
+ [string[]]$ComputerName
+ )
+ BEGIN{}
+ PROCESS{
+ if (Test-Connection $Computer -Quiet -Count 2) {
+ return Get-WmiObject -Class Win32_Service | Select Caption, startname, StartMode, Started | Where-Object {$_.Caption -like '*SQL*'}
+ }
+ else {
+ Write-Host "Could not connect to $Computer." -ForegroundColor "Red"
+ }
+ }
+ END{}
+}
+
+Function Get-SQLNetworkingProtocols {
+ [CmdletBinding()]
+ Param(
+ [Parameter(Mandatory=$true)]
+ [Alias('hostname')]
+ [string]$ComputerName
+ ,
+ [Parameter(Mandatory=$true)]
+ [Alias('instance')]
+ [string]$sqlinstance
+ )
+ BEGIN{
+ if (Get-Module -ListAvailable | ?{$_.Name -eq 'SQLPS'}){Push-location; Import-Module SQLPS -DisableNameChecking -WarningAction SilentlyContinue; Pop-Location;} else {Add-PSSnapin SQL* -WarningAction SilentlyContinue -ErrorAction SilentlyContinue;}
+ try {add-type -AssemblyName "Microsoft.SqlServer.SqlWmiManagement, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" -EA Stop}
+ catch {add-type -AssemblyName "Microsoft.SqlServer.SqlWmiManagement"}
+ $wmi = new-object "Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer"
+ if ($sqlinstance -like '*\*') {$sqlinstance = $sqlinstance.Split("\")[1].Split(' ')} else {$sqlinstance = 'MSSQLSERVER'}
+ $ComputerName = $ComputerName.ToUpper();
+ try{
+ $uri = "ManagedComputer[@Name='" + $ComputerName + "']/ ServerInstance[@Name='" + $sqlinstance + "']/ServerProtocol[@Name='Tcp']"
+ $Tcp = $wmi.GetSmoObject($uri)
+ $uri = "ManagedComputer[@Name='" + $ComputerName + "']/ ServerInstance[@Name='" + $sqlinstance + "']/ServerProtocol[@Name='np']"
+ $np = $wmi.GetSmoObject($uri)
+ $uri = "ManagedComputer[@Name='" + $ComputerName + "']/ ServerInstance[@Name='" + $sqlinstance + "']/ServerProtocol[@Name='sm']"
+ $sm = $wmi.GetSmoObject($uri)
+ try{
+ $uri = "ManagedComputer[@Name='" + $ComputerName + "']/ ServerInstance[@Name='" + $sqlinstance + "']/ServerProtocol[@Name='via']"
+ $via = $wmi.GetSmoObject($uri)
+ }
+ catch{
+ Write-Host "VIA Protocol is discontinued"
+ }
+ }
+ catch{
+ Write-Host "Unable to connect to the SQL Instance [$sqlinstance] in specified time-out period of 30s. Please Check the Instance availability and try again." -ForegroundColor "Red"
+ }
+ }
+ PROCESS{
+ $sm | select @{n="Protocol Name";e={if($_.Name -like 'sm'){"Shared Memory"}}}, IsEnabled
+ $np | select @{n="Protocol Name";e={if($_.Name -like 'np'){"Named Pipes"}}}, IsEnabled
+ $Tcp | select @{n="Protocol Name";e={if($_.Name -like 'Tcp'){"TCP\IP"}}}, IsEnabled
+ $via | select @{n="Protocol Name";e={if($_.Name -like 'via'){"Via"}}}, IsEnabled
+ }
+ END{}
+}
+
+Function Get-SQLTCPPort {
+ [CmdletBinding()]
+ Param(
+ [string]$ComputerName,
+ [string]$sqlinstance
+ )
+ BEGIN{
+ if (Get-Module -ListAvailable | ?{$_.Name -eq 'SQLPS'}){Push-location; Import-Module SQLPS -DisableNameChecking -WarningAction SilentlyContinue; Pop-location;} else {Add-PSSnapin SQL* -WarningAction SilentlyContinue -ErrorAction SilentlyContinue;}
+ try {add-type -AssemblyName "Microsoft.SqlServer.SqlWmiManagement, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" -EA Stop}
+ catch {add-type -AssemblyName "Microsoft.SqlServer.SqlWmiManagement"}
+ $wmi = new-object "Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer"
+ if ($sqlinstance -like '*\*') {$sqlinstance = $sqlinstance.Split("\")[1].Split(' ')} else {$sqlinstance = 'MSSQLSERVER'}
+ Try {
+ $ComputerName = $ComputerName.ToUpper();
+ $uri = "ManagedComputer[@Name='$ComputerName']/ ServerInstance[@Name='$sqlinstance']/ServerProtocol[@Name='Tcp']"
+ $Tcp = $wmi.GetSmoObject($uri);
+ }
+ Catch{
+ Write-Host "Unable to connect to the SQL Instance [$sqlinstance] in specified time-out period of 30s. Please Check the Instance availability and try again." -ForegroundColor "Red"
+ }
+ }
+ PROCESS{
+ return $wmi.GetSmoObject($uri + "/IPAddress[@Name='IPAll']").IPAddressProperties;
+ }
+ END{}
+}
+
+Function Get-LoginAuditing {
+ [CmdletBinding()]
+ Param(
+ [Parameter(Mandatory=$true)]
+ [Alias('instance')]
+ [string]$sqlinstance
+ )
+ BEGIN{
+ Try{
+ $query = @"
+ declare @AuditLevel int
+ exec master..xp_instance_regread
+ @rootkey='HKEY_LOCAL_MACHINE',
+ @key='SOFTWARE\Microsoft\MSSQLServer\MSSQLServer',
+ @value_name='AuditLevel',
+ @value=@AuditLevel output
+ select case
+ when @AuditLevel = 0 then 'None'
+ when @AuditLevel = 1 then 'Successful Logins Only'
+ when @AuditLevel = 2 then 'Failed Logins Only'
+ when @AuditLevel = 3 then 'Successful Logins'
+ end as 'LoginAuditing'
+"@
+ $ErrorActionPreference = "Stop"
+ $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
+ $SqlConnection.ConnectionString = "Data Source = $sqlinstance; Initial Catalog = Master; Integrated Security=true; Connection Timeout=30;"
+
+ $SqlCmd = New-Object System.Data.SqlClient.SqlCommand
+ $SqlCmd.CommandText = $query
+ $SqlCmd.Connection = $SqlConnection
+
+ $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
+ $SqlAdapter.SelectCommand = $SqlCmd
+
+ $DataSet = New-Object System.Data.DataSet
+ $SqlAdapter.Fill($DataSet) | Out-Null
+ $ErrorActionPreference = "Continue"
+ }
+ Catch{
+ Write-Host "Unable to connect to the SQL Instance [$sqlinstance] in specified time-out period of 30s. Please Check the Instance availability and try again." -ForegroundColor "Red"
+ }
+ }
+ Process{
+ return $DataSet.Tables[0]
+ }
+ END{
+ $SqlConnection.Close()
+ }
+}
+
+Function Get-SQLGlobalSettings {
+ [CmdletBinding()]
+ Param(
+ [Parameter(Mandatory=$true)]
+ [Alias('instance')]
+ [string]$sqlinstance
+ )
+ BEGIN{
+ Try{
+ $query = @"
+ exec sp_configure 'show advanced options', 1;
+ RECONFIGURE with override;
+ SET NOCOUNT ON
+ create table #spconfig(s_name varchar(50), mini bigint, maxi bigint, config_value bigint, run_value bigint)
+ insert into #spconfig(s_name, mini, maxi,config_value, run_value) execute sp_configure
+ select s_name,
+ case when run_value = 1 then 'Enabled'
+ when run_value = 0 then 'Disbaled'
+ End as 'CurrentSetting'
+ from #spconfig where s_name in ('xp_cmdshell','SMO and DMO XPs','remote access','default trace enabled')
+ drop table #spconfig
+ exec sp_configure 'show advanced options', 0;
+ RECONFIGURE with override;
+"@
+ $ErrorActionPreference = "Stop"
+ $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
+ $SqlConnection.ConnectionString = "Data Source = $sqlinstance; Initial Catalog = Master; Integrated Security=true; Connection Timeout=30;"
+
+ $SqlCmd = New-Object System.Data.SqlClient.SqlCommand
+ $SqlCmd.CommandText = $query
+ $SqlCmd.Connection = $SqlConnection
+
+ $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
+ $SqlAdapter.SelectCommand = $SqlCmd
+
+ $DataSet = New-Object System.Data.DataSet
+ $SqlAdapter.Fill($DataSet) | Out-Null
+ $ErrorActionPreference = "Continue"
+ }
+ Catch{
+ Write-Host "Unable to connect to the SQL Instance [$sqlinstance] in specified time-out period of 30s. Please Check the Instance availability and try again." -ForegroundColor "Red"
+ }
+ }
+ Process{
+ return $DataSet.Tables[0]
+ }
+ END{
+ $SqlConnection.Close()
+ }
+}
+
+Write-Host "[$(Get-date -DisplayHint date -Format g)]Script Execution Started ....`r`n"
+Write-Host "Collecting SQL Server Instance details ....`r`n"
+$serverinfo = Get-SQLServerInfo -sqlinstance "$instance"
+Write-Host "Checking Database Owners ....`r`n"
+$dbowners = Get-DBOwners -sqlinstance "$instance"
+Write-Host "Collecting details for Logins using Windows Authentication ....`r`n"
+$winauth = Get-WindowAuthLogins -sqlinstance "$instance"
+Write-Host "Collecting details for Logins using SQL Server Authentication ....`r`n"
+$sqlauth = Get-SQLAuthLogins -sqlinstance "$instance"
+Write-Host "Collecting Server Level Permissions ....`r`n"
+$serlvlperm = Get-ServerLevelPermissions -sqlinstance "$instance"
+Write-Host "Collecting Server Roles assigned to Logins ....`r`n"
+$serrolmem = Get-ServerRoleMembers -sqlinstance "$instance"
+Write-Host "Collecting Database Level Permissions ....`r`n"
+$dblvlperm = Get-DBLevelPermissions -sqlinstance "$instance"
+Write-Host "Collecting Database Roles Assigned to Logins ....`r`n"
+$dbrolmem = Get-DBRoleMembers -sqlinstance "$instance"
+Write-Host "Collecting Job Owner Details ....`r`n"
+$jobowners = Get-SQLJobOwner -sqlinstance "$instance"
+Write-Host "Checking SQL Server Services Logon Accounts ....`r`n"
+$servaccount = Get-SQLServiceAccount -ComputerName "$computer"
+Write-Host "Collecting Enabled Networking Protocols for SQL Server ...."
+$sqlprotocols = Get-SQLNetworkingProtocols -computer "$computer" -sqlinstance "$instance"
+Write-Host "`r`nCollecting SQL Server Port Details ....`r`n"
+$tcpports = Get-SQLTCPPort -computer "$computer" -sqlinstance "$instance"
+Write-Host "Checking if Login Auditing is Enabled ....`r`n"
+$loginaudit = Get-LoginAuditing -sqlinstance "$instance"
+Write-Host "Evaluating Configuration Parameters for Security Risks ....`r`n"
+$config = Get-SQLGlobalSettings -sqlinstance "$instance"
+Write-Host "[$(Get-date -DisplayHint date -Format g)]Finished Script Execution. Formatting Report ....`r`n"
+
+#Final Reporting
+$css = @"
+
+"@
+
+
+if($serverinfo){
+ $serverinfo = $serverinfo | select ServerType, "ServerType(PhysicalorVirtual)", MachineName, Technology, InstanceName, ServiceAccount, @{n="Version";e={if($_.Version -like '*2005*'){'
Error Encountered in reporting the details. Check the script log for details. If nothing is reported in the log then no details exist for this collector.
Error Encountered in reporting the details. Check the script log for details. If nothing is reported in the log then no details exist for this collector.
Error Encountered in reporting the details. Check the script log for details. If nothing is reported in the log then no details exist for this collector.
Error Encountered in reporting the details. Check the script log for details. If nothing is reported in the log then no details exist for this collector.
Error Encountered in reporting the details. Check the script log for details. If nothing is reported in the log then no details exist for this collector.
Error Encountered in reporting the details. Check the script log for details. If nothing is reported in the log then no details exist for this collector.
Error Encountered in reporting the details. Check the script log for details. If nothing is reported in the log then no details exist for this collector.
Error Encountered in reporting the details. Check the script log for details. If nothing is reported in the log then no details exist for this collector.
Error Encountered in reporting the details. Check the script log for details. If nothing is reported in the log then no details exist for this collector.
Error Encountered in reporting the details. Check the script log for details. If nothing is reported in the log then no details exist for this collector.
Error Encountered in reporting the details. Check the script log for details. If nothing is reported in the log then no details exist for this collector.
Error Encountered in reporting the details. Check the script log for details. If nothing is reported in the log then no details exist for this collector.
Error Encountered in reporting the details. Check the script log for details. If nothing is reported in the log then no details exist for this collector.
"
+
+
+$head = @"
+System Report - $($env:computername)
+
+
+
+
+"@
+
+
+$convertParams = @{
+ head = $head
+ body = $fragments
+}
+
+convertto-html @convertParams | out-file -FilePath $Path
+
+Get-Item -Path $Path
\ No newline at end of file
diff --git a/PowerShell/Get-Windows-Block-Size.ps1 b/PowerShell/Get-Windows-Block-Size.ps1
new file mode 100644
index 00000000..b6320523
--- /dev/null
+++ b/PowerShell/Get-Windows-Block-Size.ps1
@@ -0,0 +1,27 @@
+<#
+.SYNOPSIS
+ Get disk block size
+.DESCRIPTION
+ Get disk block size
+.PARAMETR
+ serverList - specify path to server list or live empty
+.EXAMPLE
+ Just run script
+.NOTES
+ Requires: Powershell version 3 or higher
+ Tested on: Windows 10, 7
+ Author: Naveen Kumar
+ Author Modified: Konstantin Tranov kast218@gmail.com
+ Created date: 2017-09-11
+ Last modified: 2017-09-11
+#>
+
+$serverList = "C:\ServerList.txt";
+
+if(Test-Path $serverList){
+$ServerList = Get-Content $serverList;
+Get-WmiObject -Class Win32_volume -Filter "FileSystem='NTFS'" -ComputerName $serverList | Select-Object PSComputerName, Name, Lable, BlockSize | Format-Table -AutoSize;
+}
+else{
+Get-CimInstance -ClassName Win32_Volume -Filter "FileSystem='NTFS'" | Select-Object Name, Label, BlockSize | Format-Table -AutoSize;
+}
diff --git a/PowerShell/Get-port-information-for-SQL-Server-instances.ps1 b/PowerShell/Get-port-information-for-SQL-Server-instances.ps1
new file mode 100644
index 00000000..4f1a243c
--- /dev/null
+++ b/PowerShell/Get-port-information-for-SQL-Server-instances.ps1
@@ -0,0 +1,99 @@
+<#
+.SYNOPSIS
+ Automated way to get all port information for SQL Server instances
+.DESCRIPTION
+ Automated way to get all port information for SQL Server instances via powershell script
+.EXAMPLE
+ ./Get-port-information-for-SQL-Server-instances.ps1
+.LINK
+ Script posted over:
+ https://www.mssqltips.com/sqlservertip/3542/automated-way-to-get-all-port-information-for-sql-server-instances/
+.NOTES
+ Author: K. Brian Kelley
+ Created Date: 2015-09-03
+#>
+
+# Store Current Location to return to it when we're done
+Push-Location;
+
+# Let's get all the possible hives in the registry on a given system
+# We'll use Where-Object to filter down to only those hives which begin with MSSQL
+# This gets rid SSAS, SSIS, and SSRS for versions of SQL Server 2008 and up. It also
+# gets rid of any hives that are under "Microsoft SQL Server" that aren't for instance
+# configuration (or at least not what we're looking for)
+Get-ChildItem -Path 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server' | Where-Object {$_.Name -like '*MSSQL*'} | foreach {
+
+ # Get Instance Name
+ $props = Get-ItemProperty -path $_.PSPath;
+
+ # If there is no default value, this isn't an instance. We need to trap in case the
+ # property doesn't exist
+ try {
+ $InstanceName = $props.psobject.Properties["(default)"].value;
+ }
+ catch {
+ $InstanceName = "";
+ }
+
+ # If there is a valid instance name, proceed farther
+ if ($InstanceName.length -gt 0) {
+
+ # Navigate the child keys
+ foreach ($key in Get-ChildItem -path $_.pspath){
+
+ # Find entries belonging to actual database engine instances
+ if ($key.name -like "*MSSQLServer*")
+ {
+
+ # Navigate to the key where the TCP settings are stored
+ Set-Location -path $key.pspath;
+ cd .\SuperSocketNetLib\tcp -ErrorAction SilentlyContinue;
+
+ # Ensure we're only reporting against the right keys
+
+ $TCPKey = Get-Location;
+
+ if ($TCPKey -like '*SuperSocketNetLib*') {
+
+ $TCPProps = Get-ItemProperty $TCPKey;
+
+ # Find out if TCP is enabled
+ $Enabled = $TCPProps.psobject.Properties["enabled"].value;
+
+ # Begin the reporting
+ Write-Host "Instance Name: $InstanceName";
+ Write-Host "------------------------------------------------------------------------------";
+
+ # If TCP is not enabled, there's point finding all the ports. Therefore, we check.
+ if ($Enabled -eq 1)
+ {
+ foreach ($Key in gci $TCPKey)
+ {
+ $IPprops = Get-ItemProperty $Key.pspath;
+ $IPAddress = $IPProps.psobject.Properties["IpAddress"].Value;
+
+ # For the Key IPAll, there is no IPAddress value. therefore, we trap for it.
+ if ($IPAddress -eq $null)
+ {
+ $IPAddress = "All"
+ }
+
+ Write-Host " IP Address: $IPAddress";
+ Write-Host " Dyn. Ports: ", $IPProps.psobject.Properties["TcpDynamicPorts"].Value;
+ Write-Host " Sta. Ports: ", $IPProps.psobject.Properties["TcpPort"].Value;
+
+ }
+ } else {
+ Write-Host " TCP not enabled."
+ }
+
+ Write-Host "------------------------------------------------------------------------------";
+ Write-Host "";
+ }
+ }
+ }
+ }
+}
+
+# Return to original location
+Pop-Location;
diff --git a/PowerShell/Multiply_SQL_Server_Connections.ps1 b/PowerShell/Multiply_SQL_Server_Connections.ps1
index dbbf531e..d839a3e5 100644
--- a/PowerShell/Multiply_SQL_Server_Connections.ps1
+++ b/PowerShell/Multiply_SQL_Server_Connections.ps1
@@ -1,66 +1,66 @@
-<#
-.SYNOPSIS
- Creates multiply connections to a SQL Server
-.DESCRIPTION
- This script creates a number of connections ($MaxConnections)
- to a SQL Server instance ($Server) that connect to a random database and exist/run for
- a certain amount of time ($WaitType/$WaitTime)
- Driver variables
-.PARAMETER MaxConnections
- Number of parallel connections
-.PARAMETER Server
- Server to connect to
-.PARAMETER WaitType
- Type of wait. DELAY or TIME
- If DELAY then wait for the amount of time.
- If TIME then wait until the time specified.
- Note: Connections are only exist until the wait is over.
- They are active the whole time.
-.PARAMETER WaitLength
- Length of wait. Format is HH:MM:SS
-.EXAMPLE
- C:\PS>Multiply_SQL_Server_Connections.ps1
-.NOTES
- Author: Kenneth Fisher
- Original Link: http://sqlstudies.com/2016/02/24/powershell-script-to-create-multiple-sql-server-connections/
- Created Date: 2016-02-24
-#>
-$MaxConnections = 2; # Number of parallel connections
-$Server= "(local)\sql2014cs"; # Server to connect to
-$WaitType="DELAY"; # Type of wait: DELAY or TIME
-$WaitLength="00:00:10"; # Length of wait. Format is HH:MM:SS
- # If DELAY then wait for the amount of time.
- # If TIME then wait until the time specified.
- # Note: Connections are only exist until the wait is over.
- # They are active the whole time.
-
-#Set Initial collections and objects
-$SqlInstance = New-Object Microsoft.SqlServer.Management.Smo.Server $Server;
-$DbConnections = @();
-$dbs = $SqlInstance.Databases | Where-Object {$_.IsSystemObject -eq 0};
-
-#Build DB connection array
-for($i=0;$i -le $MaxConnections-1;$i++){
- $randdb = Get-Random -Minimum 1 -Maximum $dbs.Count
- $DbConnections += $dbs[$randdb].Name
-}
-
-#Loop through DB Connection array, create script block for establishing SMO connection/query
-#Start-Job for each script block
-foreach ($DBName in $DbConnections ) {
-
-# All of that extra information after "Smo" tells it to load just v12 (for when you have multiple
-# versions of SQL installed.) Note: V12 is 2014.
- $cmdstr =@"
-`Add-Type -AssemblyName "Microsoft.SqlServer.Smo,Version=$(12).0.0.0,Culture=neutral,PublicKeyToken=89845dcd8080cc91"
-`[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")
-`$SqlConn = New-Object Microsoft.SqlServer.Management.Smo.Server ("$Server")
-`$SqlConn.Databases['$DBName'].ExecuteNonQuery("WAITFOR $WaitType '$WaitLength'")
-"@
-
-#Uncomment the next like to print the command string for debugging
-# $cmdstr
-#Execute script block in jobs to run the command asyncronously
-$cmd = [ScriptBlock]::Create($cmdstr)
-Start-Job -ScriptBlock $cmd
-}
+<#
+.SYNOPSIS
+ Creates multiply connections to a SQL Server
+.DESCRIPTION
+ This script creates a number of connections ($MaxConnections)
+ to a SQL Server instance ($Server) that connect to a random database and exist/run for
+ a certain amount of time ($WaitType/$WaitTime)
+ Driver variables
+.PARAMETER MaxConnections
+ Number of parallel connections
+.PARAMETER Server
+ Server to connect to
+.PARAMETER WaitType
+ Type of wait. DELAY or TIME
+ If DELAY then wait for the amount of time.
+ If TIME then wait until the time specified.
+ Note: Connections are only exist until the wait is over.
+ They are active the whole time.
+.PARAMETER WaitLength
+ Length of wait. Format is HH:MM:SS
+.EXAMPLE
+ C:\PS>Multiply_SQL_Server_Connections.ps1
+.NOTES
+ Author: Kenneth Fisher
+ Original Link: http://sqlstudies.com/2016/02/24/powershell-script-to-create-multiple-sql-server-connections/
+ Created Date: 2016-02-24
+#>
+$MaxConnections = 2; # Number of parallel connections
+$Server= "(local)\sql2014cs"; # Server to connect to
+$WaitType="DELAY"; # Type of wait: DELAY or TIME
+$WaitLength="00:00:10"; # Length of wait. Format is HH:MM:SS
+ # If DELAY then wait for the amount of time.
+ # If TIME then wait until the time specified.
+ # Note: Connections are only exist until the wait is over.
+ # They are active the whole time.
+
+#Set Initial collections and objects
+$SqlInstance = New-Object Microsoft.SqlServer.Management.Smo.Server $Server;
+$DbConnections = @();
+$dbs = $SqlInstance.Databases | Where-Object {$_.IsSystemObject -eq 0};
+
+#Build DB connection array
+for($i=0;$i -le $MaxConnections-1;$i++){
+ $randdb = Get-Random -Minimum 1 -Maximum $dbs.Count
+ $DbConnections += $dbs[$randdb].Name
+}
+
+#Loop through DB Connection array, create script block for establishing SMO connection/query
+#Start-Job for each script block
+foreach ($DBName in $DbConnections ) {
+
+# All of that extra information after "Smo" tells it to load just v12 (for when you have multiple
+# versions of SQL installed.) Note: V12 is 2014.
+ $cmdstr =@"
+`Add-Type -AssemblyName "Microsoft.SqlServer.Smo,Version=$(12).0.0.0,Culture=neutral,PublicKeyToken=89845dcd8080cc91"
+`[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")
+`$SqlConn = New-Object Microsoft.SqlServer.Management.Smo.Server ("$Server")
+`$SqlConn.Databases['$DBName'].ExecuteNonQuery("WAITFOR $WaitType '$WaitLength'")
+"@
+
+#Uncomment the next like to print the command string for debugging
+# $cmdstr
+#Execute script block in jobs to run the command asyncronously
+$cmd = [ScriptBlock]::Create($cmdstr)
+Start-Job -ScriptBlock $cmd
+}
diff --git a/PowerShell/ParameterCaseCheck.ps1 b/PowerShell/ParameterCaseCheck.ps1
new file mode 100644
index 00000000..66cb0b71
--- /dev/null
+++ b/PowerShell/ParameterCaseCheck.ps1
@@ -0,0 +1,38 @@
+<#
+.Synopsis
+ Search for any parameter that does not match the column name.
+
+.OUTPUTS
+ Any parameter that does not match the column name
+
+.NOTES
+ Original link: https://nocolumnname.blog/2018/05/25/finding-parameters-that-do-not-match-column-names/
+ Author: Shane O'Neill
+#>
+
+$PatternMatch = '(?\w+)\s*=\s*@(?\w+)'
+
+$FindStoredProcedureParameters = @{
+ SqlInstance = 'localhost'
+ Database = 'master'
+ Pattern = $PatternMatch
+ IncludeSystemDatabases = $true
+}
+
+Find-DbaStoredProcedure @FindStoredProcedureParameters |
+ ForEach-Object -Process {
+ $ParentRow = $_
+
+ $_ | ForEach-Object StoredProcedureTextFound | Select-String -Pattern $PatternMatch -AllMatches | ForEach-Object Matches | ForEach-Object -Process {
+ [PSCustomObject]@{
+ ServerName = $ParentRow.SqlInstance
+ DatabaseName = $ParentRow.Database
+ SchemaName = $ParentRow.Schema
+ ProcedureName = $ParentRow.Name
+ TextFound = ($_.Groups | Where-Object Name -eq '0').Value
+ ColumnName = ($_.Groups | Where-Object Name -eq 'ColumnName').Value
+ ParameterName = ($_.Groups | Where-Object Name -eq 'ParameterName').Value
+ }
+ }
+} | Where-Object { ($_.ColumnName -ne $_.ParameterName) } |
+ Select-Object -Property * -Unique
diff --git a/PowerShell/Parse-TSQL.ps1 b/PowerShell/Parse-TSQL.ps1
new file mode 100644
index 00000000..89725a4c
--- /dev/null
+++ b/PowerShell/Parse-TSQL.ps1
@@ -0,0 +1,39 @@
+#requires -version 5.0
+#requires -modules dbatools,pester
+
+<#
+.Synopsis
+ Ensure that some SQL Scripts in a directory would parse so there was some guarantee that they were valid T-SQL.
+
+.OUTPUTS
+ Any invalid TSQL
+
+.NOTES
+ Original link: https://sqldbawithabeard.com/2018/07/25/a-powershell-pester-check-for-parsing-sql-scripts/
+ Author: Rob Sewell
+#>
+
+Describe "Testing SQL" {
+ Context "Running Parser" {
+ ## Load assembly
+ $dbatoolsPath = 'C:\Program Files\WindowsPowerShell\Modules\dbatools';
+
+ $Parserdll = (Get-ChildItem $dbatoolsPath -Include Microsoft.SqlServer.Management.SqlParser.dll -Recurse)[0].FullName;
+ [System.Reflection.Assembly]::LoadFile($Parserdll) | Out-Null;
+
+ $TraceDll = (Get-ChildItem $dbatoolsPath -Include Microsoft.SqlServer.Diagnostics.Strace.dll -Recurse)[0].FullName;
+ [System.Reflection.Assembly]::LoadFile($TraceDll) | Out-Null;
+
+ $ParseOptions = New-Object Microsoft.SqlServer.Management.SqlParser.Parser.ParseOptions;
+ $ParseOptions.BatchSeparator = 'GO';
+ $files = Get-ChildItem -Path $Env:Directory -Include *.sql -Recurse; ## This variable is set as a Build Process Variable or put your path here
+ $files.ForEach{
+ It "$($Psitem.FullName) Should Parse SQL correctly" {
+ $filename = $Psitem.FullName;
+ $sql = Get-Content -LiteralPath "$fileName";
+ $Script = [Microsoft.SqlServer.Management.SqlParser.Parser.Parser]::Parse($SQL, $ParseOptions);
+ $Script.Errors | Should -BeNullOrEmpty;
+ }
+ }
+ }
+}
diff --git a/PowerShell/Read-XEL-File.ps1 b/PowerShell/Read-XEL-File.ps1
new file mode 100644
index 00000000..9dc3f10f
--- /dev/null
+++ b/PowerShell/Read-XEL-File.ps1
@@ -0,0 +1,40 @@
+#requires -version 3.0
+
+<#
+.Synopsis
+ Read Extended Event .xel file.
+
+.OUTPUTS
+ First 50 rows of .xel file delimeted columns by ; and rows by \r\n
+
+.NOTES
+ Original link: https://sqlserverpowershell.com/2017/04/06/read-an-extended-events-file-via-powershell/
+ Author: Scott Newman
+#>
+
+$xelFilePath = 'c:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\Log\system_health_0_131916022434590000.xel';
+$xelDDLPath = 'C:\Program Files\Microsoft SQL Server\140\Shared\';
+
+Add-Type -Path ($xelDDLPath+'Microsoft.SqlServer.XE.Core.dll');
+Add-Type -Path ($xelDDLPath+'Microsoft.SqlServer.XEvent.Linq.dll');
+
+$events = New-Object Microsoft.SqlServer.XEvent.Linq.QueryableXEventData($xelFilePath)
+$sb = New-Object System.Text.StringBuilder
+
+$events | select -First 50 | %{
+ $event = $_
+ [void]$sb.Append("$($event.Timestamp);;");
+
+ for($i=0;$i-lt($event.Fields.Count-1);$i++){
+ [void]$sb.Append("$($event.Fields[$i].Value.ToString().Replace("`r`n", ''));;");
+ }
+
+ $event.Actions | %{
+ $action = $_
+ [void]$sb.Append("$($action.value.ToString().Replace("`r`n", ''));;");
+ }
+ [void]$sb.Append("ServerName;;");
+
+ [void]$sb.AppendLine();
+}
+$sb.ToString();
diff --git a/PowerShell/ResetSqlSaPassword.psm1 b/PowerShell/ResetSqlSaPassword.psm1
index c7c6e821..ac2a0b3f 100644
--- a/PowerShell/ResetSqlSaPassword.psm1
+++ b/PowerShell/ResetSqlSaPassword.psm1
@@ -1,338 +1,338 @@
-#Requires -Version 2
-Function Reset-SqlSaPassword {
- <#
- .SYNOPSIS
- This function will allow administrators to regain access to SQL Servers in the event that passwords or access was lost.
-
- Supports SQL Server 2005 and above. Windows Server administrator access is required.
-
- .DESCRIPTION
- This function allows administrators to regain access to local or remote SQL Servers by either resetting the sa password, adding sysadmin role to existing login,
- or adding a new login (SQL or Windows) and granting it sysadmin privileges.
-
- This is accomplished by stopping the SQL services or SQL Clustered Resource Group, then restarting SQL via the command-line
- using the /mReset-SqlSaPassword paramter which starts the server in Single-User mode, and only allows this script to connect.
-
- Once the service is restarted, the following tasks are performed:
- - Login is added if it doesn't exist
- - If login is a Windows User, an attempt is made to ensure it exists
- - If login is a SQL Login, password policy will be set to OFF when creating the login, and SQL Server authentication will be set to Mixed Mode.
- - Login will be enabled and unlocked
- - Login will be added to sysadmin role
-
- If failures occur at any point, a best attempt is made to restart the SQL Server.
-
- In order to make this script as portable as possible, System.Data.SqlClient and Get-WmiObject are used (as opposed to requiring the Failover Cluster Admin tools or SMO).
- If using this function against a remote SQL Server, ensure WinRM is configured and accessible. If this is not possible, run the script locally.
-
- Tested on Windows XP, 7, 8.1, Server 2012 and Windows Server Technical Preview 2.
- Tested on SQL Server 2005 SP4 through 2016 CTP2.
-
- THIS CODE IS PROVIDED "AS IS", WITH NO WARRANTIES.
-
- .PARAMETER SqlServer
- The SQL Server instance. SQL Server must be 2005 and above, and can be a clustered or stand-alone instance.
-
- .PARAMETER Login
- By default, the Login parameter is "sa" but any other SQL or Windows account can be specified. If a login does not
- currently exist, it will be added.
-
- When adding a Windows login to remote servers, ensure the SQL Server can add the login (ie, don't add WORKSTATION\Admin to remoteserver\instance. Domain users and
- Groups are valid input.
-
- .NOTES
- Author: Chrissy LeMaire
- Requires: Admin access to server (not SQL Services),
- Remoting must be enabled and accessible if $sqlserver is not local
- DateUpdated: 2015-June-06
- Version: 0.8
-
- .LINK
- https://gallery.technet.microsoft.com/scriptcenter/Reset-SQL-SA-Password-15fb488d
-
- .EXAMPLE
- Reset-SqlSaPassword -SqlServer sqlcluster
-
- Prompts for password, then resets the "sa" account password on sqlcluster.
-
- .EXAMPLE
- Reset-SqlSaPassword -SqlServer sqlserver\sqlexpress -Login ad\administrator
-
- Adds the domain account "ad\administrator" as a sysadmin to the SQL instance.
- If the account already exists, it will be added to the sysadmin role.
-
- .EXAMPLE
- Reset-SqlSaPassword -SqlServer sqlserver\sqlexpress -Login sqladmin
-
- Prompts for passsword, then adds a SQL Login "sqladmin" with sysadmin privleges.
- If the account already exists, it will be added to the sysadmin role and the password will be reset.
-
- #>
- [CmdletBinding()]
- param(
- [Parameter(Mandatory = $true)]
- [string]$SqlServer,
- [string]$Login = "sa"
- )
-
- BEGIN {
- Function ConvertTo-PlainText {
- <#
- .SYNOPSIS
- Converts a SecureString to plain text
-
- .EXAMPLE
- ConvertTo-PlainText $password
-
- .OUTPUT
- String
-
- #>
- [CmdletBinding()]
- param(
- [Parameter(Mandatory = $true)]
- [Security.SecureString]$Password
- )
-
- $marshal = [Runtime.InteropServices.Marshal]
- $plaintext = $marshal::PtrToStringAuto( $marshal::SecureStringToBSTR($Password) )
- return $plaintext
- }
-
- Function Invoke-ResetSqlCmd {
- <#
- .SYNOPSIS
- Executes a SQL statement against specified computer, and uses "Reset-SqlSaPassword" as the
- Application Name.
-
- .EXAMPLE
- Invoke-ResetSqlCmd -sqlserver $sqlserver -sql $sql
-
- .OUTPUT
- $true or $false
-
- #>
- [CmdletBinding()]
- param(
- [Parameter(Mandatory = $true)]
- [string]$sqlserver,
- [string]$sql
- )
- try {
- $connstring = "Data Source=$sqlserver;Integrated Security=True;Connect Timeout=2;Application Name=Reset-SqlSaPassword"
- $conn = New-Object System.Data.SqlClient.SqlConnection $connstring
- $conn.Open()
- $cmd = New-Object system.data.sqlclient.sqlcommand($null, $conn)
- $cmd.CommandText = $sql
- $cmd.ExecuteNonQuery() | Out-Null
- $cmd.Dispose()
- $conn.Close()
- $conn.Dispose()
- return $true
- } catch { return $false }
- }
- }
-
- PROCESS {
-
- # Get hostname
- $baseaddress = $sqlserver.Split("\")[0]
- if ($baseaddress -eq "." -or $baseaddress -eq $env:COMPUTERNAME) {
- $ipaddr = "."
- $hostname = $env:COMPUTERNAME
- $baseaddress = $env:COMPUTERNAME
- }
-
- # If server is not local, get IP address and NetBios name in case CNAME records were referenced in the SQL hostname
- if ($baseaddress -ne $env:COMPUTERNAME) {
- # Test Connection first using Test-Connection which requires ICMP access then failback to tcp if pings are blocked
- Write-Output "Testing connection to $baseaddress"
- $testconnect = Test-Connection -ComputerName $baseaddress -Count 1 -Quiet
-
- if ($testconnect -eq $false) {
- Write-Output "First attempt using ICMP failed. Trying to connect using sockets. This may take up to 20 seconds."
- $tcp = New-Object System.Net.Sockets.TcpClient
- try {
- $tcp.Connect($hostname, 135)
- $tcp.Close()
- $tcp.Dispose()
- } catch { throw "Can't connect to $baseaddress either via ping or tcp (WMI port 135)" }
- }
- Write-Output "Resolving IP address"
- try{
- $hostentry = [System.Net.Dns]::GetHostEntry($baseaddress)
- $ipaddr = ($hostentry.AddressList | Where-Object { $_ -notlike '169.*' } | Select -First 1).IPAddressToString
- } catch { throw "Could not resolve SqlServer IP or NetBIOS name" }
-
- Write-Output "Resolving NetBIOS name"
- try {
- $hostname = (Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE -ComputerName $ipaddr).PSComputerName
- if ($hostname -eq $null) { $hostname = (nbtstat -A $ipaddr | Where-Object {$_ -match '\<00\> UNIQUE'} | ForEach-Object {$_.SubString(4,14)}).Trim() }
- }
- catch { throw "Could not access remote WMI object. Check permissions and firewall." }
- }
-
- # Setup remote session if server is not local
- if ($hostname -ne $env:COMPUTERNAME) {
- try { $session = New-PSSession -ComputerName $hostname }
- catch {
- throw "Can't access $hostname using PSSession. Check your firewall settings and ensure Remoting is enabled or run the script locally."
- }
- }
-
- Write-Output "Detecting login type"
- # Is login a Windows login? If so, does it exist?
- if ($login -match "\\") {
- Write-Output "Windows login detected. Checking to ensure account is valid."
- $windowslogin = $true
- try {
- if ($hostname -eq $env:COMPUTERNAME) {
- $account = New-Object System.Security.Principal.NTAccount($args)
- $sid = $account.Translate([System.Security.Principal.SecurityIdentifier])
- } else {
- Invoke-Command -ErrorAction Stop -Session $session -Args $login -ScriptBlock {
- $account = New-Object System.Security.Principal.NTAccount($args)
- $sid = $account.Translate([System.Security.Principal.SecurityIdentifier])
- }
- }
- } catch { throw "SQL Server cannot resolve Windows User or Group $login." }
- }
-
- # If it's not a Windows login, it's a SQL login, so it needs a password.
- if ($windowslogin -ne $true) {
- Write-Output "SQL login detected"
- do {$Password = Read-Host -AsSecureString "Please enter a new password for $login" } while ( $Password.Length -eq 0 )
- }
-
- # Get instance and service display name, then get services
- $instance = ($sqlserver.split("\"))[1]
- if ($instance -eq $null) { $instance = "MSSQLSERVER" }
- $displayName = "SQL Server ($instance)"
-
- try {
- $instanceservices = Get-Service -ComputerName $ipaddr | Where-Object { $_.DisplayName -like "*($instance)*" -and $_.Status -eq "Running" }
- $sqlservice = Get-Service -ComputerName $ipaddr | Where-Object { $_.DisplayName -eq "SQL Server ($instance)" }
- } catch { throw "Cannot connect to WMI on $hostname or SQL Service does not exist. Check permissions, firewall and SQL Server running status." }
-
- if ($instanceservices -eq $null) { throw "Couldn't find SQL Server instance. Check the spelling, ensure the service is running and try again." }
-
- Write-Output "Attempting to stop SQL Services"
-
- # Check to see if service is clustered. Clusters don't support -m (since the cluster service
- # itself connects immediately) or -f, so they are handled differently.
- try { $checkcluster = Get-Service -ComputerName $ipaddr | Where-Object { $_.Name -eq "ClusSvc" -and $_.Status -eq "Running" } }
- catch { throw "Can't check services. Check permissions and firewall." }
-
- if ($checkcluster -ne $null) {
- $clusterResource = Get-WmiObject -Authentication PacketPrivacy -Impersonation Impersonate -class "MSCluster_Resource" -namespace "root\mscluster" -computername $hostname |
- Where-Object { $_.Name.StartsWith("SQL Server") -and $_.OwnerGroup -eq "SQL Server ($instance)" }
- }
-
- # Take SQL Server offline so that it can be started in single-user mode
- if ($clusterResource.count -gt 0) {
- $isclustered = $true
- try { $clusterResource | Where-Object { $_.Name -eq "SQL Server" } | ForEach-Object { $_.TakeOffline(60) } }
- catch {
- $clusterResource | Where-Object { $_.Name -eq "SQL Server" } | ForEach-Object { $_.BringOnline(60) }
- $clusterResource | Where-Object { $_.Name -ne "SQL Server" } | ForEach-Object { $_.BringOnline(60) }
- throw "Could not stop the SQL Service. Restarted SQL Service and quit."
- }
- } else {
- try {
- Stop-Service -InputObject $sqlservice -Force
- Write-Output "Successfully stopped SQL service"
- } catch {
- Start-Service -InputObject $instanceservices
- throw "Could not stop the SQL Service. Restarted SQL service and quit."
- }
- }
-
- # /mReset-SqlSaPassword Starts an instance of SQL Server in single-user mode and only allows this script to connect.
- Write-Output "Starting SQL Service from command line"
- try {
- if ($hostname -eq $env:COMPUTERNAME) {
- $netstart = net start ""$displayname"" /mReset-SqlSaPassword 2>&1
- if ("$netstart" -notmatch "success") { throw }
- }
- else {
- $netstart = Invoke-Command -ErrorAction Stop -Session $session -Args $displayname -ScriptBlock { net start ""$args"" /mReset-SqlSaPassword } 2>&1
- foreach ($line in $netstart) {
- if ($line.length -gt 0) { Write-Output $line }
- }
- }
- } catch {
- Stop-Service -InputObject $sqlservice -Force -ErrorAction SilentlyContinue
-
- if ($isclustered) {
- $clusterResource | Where-Object Name -eq "SQL Server" | ForEach-Object { $_.BringOnline(60) }
- $clusterResource | Where-Object Name -ne "SQL Server" | ForEach-Object { $_.BringOnline(60) }
- } else {
- Start-Service -InputObject $instanceservices -ErrorAction SilentlyContinue
- }
- throw "Couldn't execute net start command. Restarted services and quit."
- }
-
- Write-Output "Reconnecting to SQL instance"
- try { Invoke-ResetSqlCmd -SqlServer $sqlserver -Sql "SELECT 1" | Out-Null }
- catch {
- try {
- Start-Sleep 3
- Invoke-ResetSqlCmd -SqlServer $sqlserver -Sql "SELECT 1" | Out-Null
- } catch {
- Stop-Service Input-Object $sqlservice -Force -ErrorAction SilentlyContinue
- if ($isclustered) {
- $clusterResource | Where-Object { $_.Name -eq "SQL Server" } | ForEach-Object { $_.BringOnline(60) }
- $clusterResource | Where-Object { $_.Name -ne "SQL Server" } | ForEach-Object { $_.BringOnline(60) }
- } else { Start-Service -InputObject $instanceservices -ErrorAction SilentlyContinue }
- throw "Could not stop the SQL Service. Restarted SQL Service and quit."
- }
- }
-
- # Get login. If it doesn't exist, create it.
- Write-Output "Adding login $login if it doesn't exist"
- if ($windowslogin -eq $true) {
- $sql = "IF NOT EXISTS (SELECT name FROM master.sys.server_principals WHERE name = '$login')
- BEGIN CREATE LOGIN [$login] FROM WINDOWS END"
- if ($(Invoke-ResetSqlCmd -SqlServer $sqlserver -Sql $sql) -eq $false) { Write-Warning "Couldn't create login." }
- } elseif ($login -ne "sa") {
- # Create new sql user
- $sql = "IF NOT EXISTS (SELECT name FROM master.sys.server_principals WHERE name = '$login')
- BEGIN CREATE LOGIN [$login] WITH PASSWORD = '$(ConvertTo-PlainText $Password)', CHECK_POLICY = OFF, CHECK_EXPIRATION = OFF END"
- if ($(Invoke-ResetSqlCmd -SqlServer $sqlserver -Sql $sql) -eq $false) { Write-Warning "Couldn't create login." }
- }
-
- # If $login is a SQL Login, Mixed mode authentication is required.
- if ($windowslogin -ne $true) {
- Write-Output "Enabling mixed mode authentication"
- Write-Output "Ensuring account is unlocked"
- $sql = "EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'LoginMode', REG_DWORD, 2"
- if ($(Invoke-ResetSqlCmd -SqlServer $sqlserver -Sql $sql) -eq $false) { Write-Warning "Couldn't set to Mixed Mode." }
-
- $sql = "ALTER LOGIN [$login] WITH CHECK_POLICY = OFF
- ALTER LOGIN [$login] WITH PASSWORD = '$(ConvertTo-PlainText $Password)' UNLOCK"
- if ($(Invoke-ResetSqlCmd -SqlServer $sqlserver -Sql $sql) -eq $false) { Write-Warning "Couldn't unlock account." }
- }
-
- Write-Output "Ensuring login is enabled"
- $sql = "ALTER LOGIN [$login] ENABLE"
- if ($(Invoke-ResetSqlCmd -SqlServer $sqlserver -Sql $sql) -eq $false) { Write-Warning "Couldn't enable login." }
-
- if ($login -ne "sa") {
- Write-Output "Ensuring login exists within sysadmin role"
- $sql = "EXEC sp_addsrvrolemember '$login', 'sysadmin'"
- if ($(Invoke-ResetSqlCmd -SqlServer $sqlserver -Sql $sql) -eq $false) { Write-Warning "Couldn't add to syadmin role." }
- }
-
- Write-Output "Finished with login tasks"
- Write-Output "Restarting SQL Server"
- Stop-Service -InputObject $sqlservice -Force -ErrorAction SilentlyContinue
- if ($isclustered -eq $true) {
- $clusterResource | Where-Object { $_.Name -eq "SQL Server" } | ForEach-Object { $_.BringOnline(60) }
- $clusterResource | Where-Object { $_.Name -ne "SQL Server" } | ForEach-Object { $_.BringOnline(60) }
- } else { Start-Service -InputObject $instanceservices -ErrorAction SilentlyContinue }
- }
-
- END {
- Write-Output "Script complete!"
- }
+#Requires -Version 2
+Function Reset-SqlSaPassword {
+ <#
+ .SYNOPSIS
+ This function will allow administrators to regain access to SQL Servers in the event that passwords or access was lost.
+
+ Supports SQL Server 2005 and above. Windows Server administrator access is required.
+
+ .DESCRIPTION
+ This function allows administrators to regain access to local or remote SQL Servers by either resetting the sa password, adding sysadmin role to existing login,
+ or adding a new login (SQL or Windows) and granting it sysadmin privileges.
+
+ This is accomplished by stopping the SQL services or SQL Clustered Resource Group, then restarting SQL via the command-line
+ using the /mReset-SqlSaPassword paramter which starts the server in Single-User mode, and only allows this script to connect.
+
+ Once the service is restarted, the following tasks are performed:
+ - Login is added if it doesn't exist
+ - If login is a Windows User, an attempt is made to ensure it exists
+ - If login is a SQL Login, password policy will be set to OFF when creating the login, and SQL Server authentication will be set to Mixed Mode.
+ - Login will be enabled and unlocked
+ - Login will be added to sysadmin role
+
+ If failures occur at any point, a best attempt is made to restart the SQL Server.
+
+ In order to make this script as portable as possible, System.Data.SqlClient and Get-WmiObject are used (as opposed to requiring the Failover Cluster Admin tools or SMO).
+ If using this function against a remote SQL Server, ensure WinRM is configured and accessible. If this is not possible, run the script locally.
+
+ Tested on Windows XP, 7, 8.1, Server 2012 and Windows Server Technical Preview 2.
+ Tested on SQL Server 2005 SP4 through 2016 CTP2.
+
+ THIS CODE IS PROVIDED "AS IS", WITH NO WARRANTIES.
+
+ .PARAMETER SqlServer
+ The SQL Server instance. SQL Server must be 2005 and above, and can be a clustered or stand-alone instance.
+
+ .PARAMETER Login
+ By default, the Login parameter is "sa" but any other SQL or Windows account can be specified. If a login does not
+ currently exist, it will be added.
+
+ When adding a Windows login to remote servers, ensure the SQL Server can add the login (ie, don't add WORKSTATION\Admin to remoteserver\instance. Domain users and
+ Groups are valid input.
+
+ .NOTES
+ Author: Chrissy LeMaire
+ Requires: Admin access to server (not SQL Services),
+ Remoting must be enabled and accessible if $sqlserver is not local
+ DateUpdated: 2015-June-06
+ Version: 0.8
+
+ .LINK
+ https://gallery.technet.microsoft.com/scriptcenter/Reset-SQL-SA-Password-15fb488d
+
+ .EXAMPLE
+ Reset-SqlSaPassword -SqlServer sqlcluster
+
+ Prompts for password, then resets the "sa" account password on sqlcluster.
+
+ .EXAMPLE
+ Reset-SqlSaPassword -SqlServer sqlserver\sqlexpress -Login ad\administrator
+
+ Adds the domain account "ad\administrator" as a sysadmin to the SQL instance.
+ If the account already exists, it will be added to the sysadmin role.
+
+ .EXAMPLE
+ Reset-SqlSaPassword -SqlServer sqlserver\sqlexpress -Login sqladmin
+
+ Prompts for passsword, then adds a SQL Login "sqladmin" with sysadmin privleges.
+ If the account already exists, it will be added to the sysadmin role and the password will be reset.
+
+ #>
+ [CmdletBinding()]
+ param(
+ [Parameter(Mandatory = $true)]
+ [string]$SqlServer,
+ [string]$Login = "sa"
+ )
+
+ BEGIN {
+ Function ConvertTo-PlainText {
+ <#
+ .SYNOPSIS
+ Converts a SecureString to plain text
+
+ .EXAMPLE
+ ConvertTo-PlainText $password
+
+ .OUTPUT
+ String
+
+ #>
+ [CmdletBinding()]
+ param(
+ [Parameter(Mandatory = $true)]
+ [Security.SecureString]$Password
+ )
+
+ $marshal = [Runtime.InteropServices.Marshal]
+ $plaintext = $marshal::PtrToStringAuto( $marshal::SecureStringToBSTR($Password) )
+ return $plaintext
+ }
+
+ Function Invoke-ResetSqlCmd {
+ <#
+ .SYNOPSIS
+ Executes a SQL statement against specified computer, and uses "Reset-SqlSaPassword" as the
+ Application Name.
+
+ .EXAMPLE
+ Invoke-ResetSqlCmd -sqlserver $sqlserver -sql $sql
+
+ .OUTPUT
+ $true or $false
+
+ #>
+ [CmdletBinding()]
+ param(
+ [Parameter(Mandatory = $true)]
+ [string]$sqlserver,
+ [string]$sql
+ )
+ try {
+ $connstring = "Data Source=$sqlserver;Integrated Security=True;Connect Timeout=2;Application Name=Reset-SqlSaPassword"
+ $conn = New-Object System.Data.SqlClient.SqlConnection $connstring
+ $conn.Open()
+ $cmd = New-Object system.data.sqlclient.sqlcommand($null, $conn)
+ $cmd.CommandText = $sql
+ $cmd.ExecuteNonQuery() | Out-Null
+ $cmd.Dispose()
+ $conn.Close()
+ $conn.Dispose()
+ return $true
+ } catch { return $false }
+ }
+ }
+
+ PROCESS {
+
+ # Get hostname
+ $baseaddress = $sqlserver.Split("\")[0]
+ if ($baseaddress -eq "." -or $baseaddress -eq $env:COMPUTERNAME) {
+ $ipaddr = "."
+ $hostname = $env:COMPUTERNAME
+ $baseaddress = $env:COMPUTERNAME
+ }
+
+ # If server is not local, get IP address and NetBios name in case CNAME records were referenced in the SQL hostname
+ if ($baseaddress -ne $env:COMPUTERNAME) {
+ # Test Connection first using Test-Connection which requires ICMP access then failback to tcp if pings are blocked
+ Write-Output "Testing connection to $baseaddress"
+ $testconnect = Test-Connection -ComputerName $baseaddress -Count 1 -Quiet
+
+ if ($testconnect -eq $false) {
+ Write-Output "First attempt using ICMP failed. Trying to connect using sockets. This may take up to 20 seconds."
+ $tcp = New-Object System.Net.Sockets.TcpClient
+ try {
+ $tcp.Connect($hostname, 135)
+ $tcp.Close()
+ $tcp.Dispose()
+ } catch { throw "Can't connect to $baseaddress either via ping or tcp (WMI port 135)" }
+ }
+ Write-Output "Resolving IP address"
+ try{
+ $hostentry = [System.Net.Dns]::GetHostEntry($baseaddress)
+ $ipaddr = ($hostentry.AddressList | Where-Object { $_ -notlike '169.*' } | Select -First 1).IPAddressToString
+ } catch { throw "Could not resolve SqlServer IP or NetBIOS name" }
+
+ Write-Output "Resolving NetBIOS name"
+ try {
+ $hostname = (Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE -ComputerName $ipaddr).PSComputerName
+ if ($hostname -eq $null) { $hostname = (nbtstat -A $ipaddr | Where-Object {$_ -match '\<00\> UNIQUE'} | ForEach-Object {$_.SubString(4,14)}).Trim() }
+ }
+ catch { throw "Could not access remote WMI object. Check permissions and firewall." }
+ }
+
+ # Setup remote session if server is not local
+ if ($hostname -ne $env:COMPUTERNAME) {
+ try { $session = New-PSSession -ComputerName $hostname }
+ catch {
+ throw "Can't access $hostname using PSSession. Check your firewall settings and ensure Remoting is enabled or run the script locally."
+ }
+ }
+
+ Write-Output "Detecting login type"
+ # Is login a Windows login? If so, does it exist?
+ if ($login -match "\\") {
+ Write-Output "Windows login detected. Checking to ensure account is valid."
+ $windowslogin = $true
+ try {
+ if ($hostname -eq $env:COMPUTERNAME) {
+ $account = New-Object System.Security.Principal.NTAccount($args)
+ $sid = $account.Translate([System.Security.Principal.SecurityIdentifier])
+ } else {
+ Invoke-Command -ErrorAction Stop -Session $session -Args $login -ScriptBlock {
+ $account = New-Object System.Security.Principal.NTAccount($args)
+ $sid = $account.Translate([System.Security.Principal.SecurityIdentifier])
+ }
+ }
+ } catch { throw "SQL Server cannot resolve Windows User or Group $login." }
+ }
+
+ # If it's not a Windows login, it's a SQL login, so it needs a password.
+ if ($windowslogin -ne $true) {
+ Write-Output "SQL login detected"
+ do {$Password = Read-Host -AsSecureString "Please enter a new password for $login" } while ( $Password.Length -eq 0 )
+ }
+
+ # Get instance and service display name, then get services
+ $instance = ($sqlserver.split("\"))[1]
+ if ($instance -eq $null) { $instance = "MSSQLSERVER" }
+ $displayName = "SQL Server ($instance)"
+
+ try {
+ $instanceservices = Get-Service -ComputerName $ipaddr | Where-Object { $_.DisplayName -like "*($instance)*" -and $_.Status -eq "Running" }
+ $sqlservice = Get-Service -ComputerName $ipaddr | Where-Object { $_.DisplayName -eq "SQL Server ($instance)" }
+ } catch { throw "Cannot connect to WMI on $hostname or SQL Service does not exist. Check permissions, firewall and SQL Server running status." }
+
+ if ($instanceservices -eq $null) { throw "Couldn't find SQL Server instance. Check the spelling, ensure the service is running and try again." }
+
+ Write-Output "Attempting to stop SQL Services"
+
+ # Check to see if service is clustered. Clusters don't support -m (since the cluster service
+ # itself connects immediately) or -f, so they are handled differently.
+ try { $checkcluster = Get-Service -ComputerName $ipaddr | Where-Object { $_.Name -eq "ClusSvc" -and $_.Status -eq "Running" } }
+ catch { throw "Can't check services. Check permissions and firewall." }
+
+ if ($checkcluster -ne $null) {
+ $clusterResource = Get-WmiObject -Authentication PacketPrivacy -Impersonation Impersonate -class "MSCluster_Resource" -namespace "root\mscluster" -computername $hostname |
+ Where-Object { $_.Name.StartsWith("SQL Server") -and $_.OwnerGroup -eq "SQL Server ($instance)" }
+ }
+
+ # Take SQL Server offline so that it can be started in single-user mode
+ if ($clusterResource.count -gt 0) {
+ $isclustered = $true
+ try { $clusterResource | Where-Object { $_.Name -eq "SQL Server" } | ForEach-Object { $_.TakeOffline(60) } }
+ catch {
+ $clusterResource | Where-Object { $_.Name -eq "SQL Server" } | ForEach-Object { $_.BringOnline(60) }
+ $clusterResource | Where-Object { $_.Name -ne "SQL Server" } | ForEach-Object { $_.BringOnline(60) }
+ throw "Could not stop the SQL Service. Restarted SQL Service and quit."
+ }
+ } else {
+ try {
+ Stop-Service -InputObject $sqlservice -Force
+ Write-Output "Successfully stopped SQL service"
+ } catch {
+ Start-Service -InputObject $instanceservices
+ throw "Could not stop the SQL Service. Restarted SQL service and quit."
+ }
+ }
+
+ # /mReset-SqlSaPassword Starts an instance of SQL Server in single-user mode and only allows this script to connect.
+ Write-Output "Starting SQL Service from command line"
+ try {
+ if ($hostname -eq $env:COMPUTERNAME) {
+ $netstart = net start ""$displayname"" /mReset-SqlSaPassword 2>&1
+ if ("$netstart" -notmatch "success") { throw }
+ }
+ else {
+ $netstart = Invoke-Command -ErrorAction Stop -Session $session -Args $displayname -ScriptBlock { net start ""$args"" /mReset-SqlSaPassword } 2>&1
+ foreach ($line in $netstart) {
+ if ($line.length -gt 0) { Write-Output $line }
+ }
+ }
+ } catch {
+ Stop-Service -InputObject $sqlservice -Force -ErrorAction SilentlyContinue
+
+ if ($isclustered) {
+ $clusterResource | Where-Object Name -eq "SQL Server" | ForEach-Object { $_.BringOnline(60) }
+ $clusterResource | Where-Object Name -ne "SQL Server" | ForEach-Object { $_.BringOnline(60) }
+ } else {
+ Start-Service -InputObject $instanceservices -ErrorAction SilentlyContinue
+ }
+ throw "Couldn't execute net start command. Restarted services and quit."
+ }
+
+ Write-Output "Reconnecting to SQL instance"
+ try { Invoke-ResetSqlCmd -SqlServer $sqlserver -Sql "SELECT 1" | Out-Null }
+ catch {
+ try {
+ Start-Sleep 3
+ Invoke-ResetSqlCmd -SqlServer $sqlserver -Sql "SELECT 1" | Out-Null
+ } catch {
+ Stop-Service Input-Object $sqlservice -Force -ErrorAction SilentlyContinue
+ if ($isclustered) {
+ $clusterResource | Where-Object { $_.Name -eq "SQL Server" } | ForEach-Object { $_.BringOnline(60) }
+ $clusterResource | Where-Object { $_.Name -ne "SQL Server" } | ForEach-Object { $_.BringOnline(60) }
+ } else { Start-Service -InputObject $instanceservices -ErrorAction SilentlyContinue }
+ throw "Could not stop the SQL Service. Restarted SQL Service and quit."
+ }
+ }
+
+ # Get login. If it doesn't exist, create it.
+ Write-Output "Adding login $login if it doesn't exist"
+ if ($windowslogin -eq $true) {
+ $sql = "IF NOT EXISTS (SELECT name FROM master.sys.server_principals WHERE name = '$login')
+ BEGIN CREATE LOGIN [$login] FROM WINDOWS END"
+ if ($(Invoke-ResetSqlCmd -SqlServer $sqlserver -Sql $sql) -eq $false) { Write-Warning "Couldn't create login." }
+ } elseif ($login -ne "sa") {
+ # Create new sql user
+ $sql = "IF NOT EXISTS (SELECT name FROM master.sys.server_principals WHERE name = '$login')
+ BEGIN CREATE LOGIN [$login] WITH PASSWORD = '$(ConvertTo-PlainText $Password)', CHECK_POLICY = OFF, CHECK_EXPIRATION = OFF END"
+ if ($(Invoke-ResetSqlCmd -SqlServer $sqlserver -Sql $sql) -eq $false) { Write-Warning "Couldn't create login." }
+ }
+
+ # If $login is a SQL Login, Mixed mode authentication is required.
+ if ($windowslogin -ne $true) {
+ Write-Output "Enabling mixed mode authentication"
+ Write-Output "Ensuring account is unlocked"
+ $sql = "EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'LoginMode', REG_DWORD, 2"
+ if ($(Invoke-ResetSqlCmd -SqlServer $sqlserver -Sql $sql) -eq $false) { Write-Warning "Couldn't set to Mixed Mode." }
+
+ $sql = "ALTER LOGIN [$login] WITH CHECK_POLICY = OFF
+ ALTER LOGIN [$login] WITH PASSWORD = '$(ConvertTo-PlainText $Password)' UNLOCK"
+ if ($(Invoke-ResetSqlCmd -SqlServer $sqlserver -Sql $sql) -eq $false) { Write-Warning "Couldn't unlock account." }
+ }
+
+ Write-Output "Ensuring login is enabled"
+ $sql = "ALTER LOGIN [$login] ENABLE"
+ if ($(Invoke-ResetSqlCmd -SqlServer $sqlserver -Sql $sql) -eq $false) { Write-Warning "Couldn't enable login." }
+
+ if ($login -ne "sa") {
+ Write-Output "Ensuring login exists within sysadmin role"
+ $sql = "EXEC sp_addsrvrolemember '$login', 'sysadmin'"
+ if ($(Invoke-ResetSqlCmd -SqlServer $sqlserver -Sql $sql) -eq $false) { Write-Warning "Couldn't add to syadmin role." }
+ }
+
+ Write-Output "Finished with login tasks"
+ Write-Output "Restarting SQL Server"
+ Stop-Service -InputObject $sqlservice -Force -ErrorAction SilentlyContinue
+ if ($isclustered -eq $true) {
+ $clusterResource | Where-Object { $_.Name -eq "SQL Server" } | ForEach-Object { $_.BringOnline(60) }
+ $clusterResource | Where-Object { $_.Name -ne "SQL Server" } | ForEach-Object { $_.BringOnline(60) }
+ } else { Start-Service -InputObject $instanceservices -ErrorAction SilentlyContinue }
+ }
+
+ END {
+ Write-Output "Script complete!"
+ }
}
\ No newline at end of file
diff --git a/PowerShell/SQL_Server_Discovery_Report.ps1 b/PowerShell/SQL_Server_Discovery_Report.ps1
new file mode 100644
index 00000000..e82d9532
--- /dev/null
+++ b/PowerShell/SQL_Server_Discovery_Report.ps1
@@ -0,0 +1,156 @@
+ <#
+ .SYNOPSIS
+ SQL Server discovery report.
+
+ .DESCRIPTION
+ Runs the SQL Server discovery report (opens in default browser). Run as Administrator!!!
+
+ .INPUTS
+ None
+
+ .OUTPUTS
+ None
+
+ .NOTES
+ Version: 1.1
+
+ Author: Dave Mason
+ https://twitter.com/BeginTry
+ https://itsalljustelectrons.blogspot.com/
+
+ Creation Date: 2018/04/18
+
+ Assumptions:
+ 1. The sub-folder "Microsoft SQL Server" exists in %PROGRAMFILES%,
+ even if SQL was installed to a non-default path. This has been
+ verified on SQL 2008R2 and SQL 2012. Further verification may be needed.
+ 2. The numbered sub-folders in "%PROGRAMFILES%\Microsoft SQL Server" correlate to
+ installed versions of SQL Server. The numbers sync with database compatibility
+ levels. For example:
+ 140 "%PROGRAMFILES%\Microsoft SQL Server\140" SQL Server 2017
+ 130 "%PROGRAMFILES%\Microsoft SQL Server\130" SQL Server 2016
+ 120 "%PROGRAMFILES%\Microsoft SQL Server\120" SQL Server 2014
+ 110 "%PROGRAMFILES%\Microsoft SQL Server\110" SQL Server 2012
+ 100 "%PROGRAMFILES%\Microsoft SQL Server\100" SQL Server 2008 R2
+ If this version/folder/naming convention remains intact for future versions,
+ this script should continue to work with no enhancements.
+ 3. The discovery report displays installed components for the version of SQL
+ Server associated with setup.exe, along with installed components of all
+ lesser versions of SQL Server that are installed.
+
+ History:
+ 2018/04/23 DMason
+ Output a message if no installed SQL Server features are found.
+ Enhancements for older versions of SQL Server (2008, 2005).
+ Thanks to Wayne Sheffield for verifying the Setup.exe Bootstrap path for
+ SQL Server 2008 R2 and for providing paths for SQL Server 2008 and 2005.
+ https://twitter.com/DBAWayne
+ https://blog.waynesheffield.com/wayne/
+
+#>
+
+#Locate the "%PROGRAMFILES%\Microsoft SQL Server" folder.
+$MSSQLpath = [System.IO.Path]::Combine($env:ProgramFiles, "Microsoft SQL Server")
+$lstCompatLevelDirs = New-Object "System.Collections.Generic.List[Int32]"
+
+<#
+ Iterate through the "Microsoft SQL Server" sub-folders.
+ Sub-folder names that are numeric are added to List of type Int32.
+#>
+Get-ChildItem -Directory $MSSQLpath |
+ ForEach-Object {
+ [Int32]$DirNum = 0
+
+ if ([Int32]::TryParse($_.Name, [ref]$DirNum))
+ {
+ $lstCompatLevelDirs.Add($DirNum)
+ }
+ }
+
+#Sort() the List, then Reverse() it so there is DESCENDING order.
+$lstCompatLevelDirs.Sort()
+$lstCompatLevelDirs.Reverse()
+
+[bool] $setupExeFound = $false
+
+<#
+ Find the Setup Bootstrap Setup.exe file in the "highest" sub-folder.
+ Here are a few examples:
+ "%PROGRAMFILES%\Microsoft SQL Server\140\Setup Bootstrap\SQL2017\setup.exe"
+ "%PROGRAMFILES%\Microsoft SQL Server\130\Setup Bootstrap\SQLServer2016\setup.exe"
+ "%PROGRAMFILES%\Microsoft SQL Server\120\Setup Bootstrap\SQLServer2014\setup.exe"
+ "%PROGRAMFILES%\Microsoft SQL Server\110\Setup Bootstrap\SQLServer2012\setup.exe"
+ "%PROGRAMFILES%\Microsoft SQL Server\100\Setup Bootstrap\SQLServer2008R2\Setup.exe"
+#>
+ForEach($int in $lstCompatLevelDirs)
+{
+ #The "Setup Bootstrap" path. For example: "%PROGRAMFILES%\Microsoft SQL Server\140\Setup Bootstrap
+ [string]$SetupBootstrap = [System.IO.Path]::Combine(
+ [System.IO.Path]::Combine($MSSQLpath, $int.ToString()),
+ "Setup Bootstrap")
+
+ if ([System.IO.Directory]::Exists($SetupBootstrap))
+ {
+ <#
+ Iterate through the list of sub-folders with names that match the pattern "SQL*"
+ #>
+ ForEach($sqlSubDir in [System.IO.Directory]::GetDirectories($SetupBootstrap, "SQL*"))
+ {
+ <#
+ Search for "setup.exe".
+ If found:
+ Run the exe with the appropriate parameters to run the discovery report.
+ Break out of the loops.
+ #>
+ [string]$setupExe = [System.IO.Path]::Combine($sqlSubDir, "setup.exe")
+
+ if ([System.IO.File]::Exists($setupExe))
+ {
+ $setupExeFound = $true
+ Start-Process -FilePath $setupExe -ArgumentList "/Action=RunDiscovery"
+ break
+ }
+ }
+ }
+
+ if($setupExeFound)
+ {
+ break
+ }
+}
+
+<#
+ If the Setup.exe is still not found, search for it in hard-coded paths that correspond
+ to older versions that didn't use the current version/folder/naming convention.
+
+ 2008: "%PROGRAMFILES%\Microsoft SQL Server\100\Setup Bootstrap\Release\Setup.exe"
+ 2005: "%PROGRAMFILES%\Microsoft SQL Server\90\Setup Bootstrap\Setup.exe"
+#>
+if(-Not $setupExeFound)
+{
+ $lstOldSqlVersionSetupExePaths = New-Object "System.Collections.Generic.List[string]"
+
+ #SQL 2008
+ $lstOldSqlVersionSetupExePaths.Add([System.IO.Path]::Combine($MSSQLpath, "100\Setup Bootstrap\Release\Setup.exe"))
+
+ #SQL 2005
+ $lstOldSqlVersionSetupExePaths.Add([System.IO.Path]::Combine($MSSQLpath, "90\Setup Bootstrap\Setup.exe"))
+
+ #TODO: add strings to the array for even older versions of SQL (gulp).
+
+
+ ForEach($setupExe in $lstOldSqlVersionSetupExePaths)
+ {
+ if ([System.IO.File]::Exists($setupExe))
+ {
+ $setupExeFound = $true
+ Start-Process -FilePath $setupExe -ArgumentList "/Action=RunDiscovery"
+ break
+ }
+ }
+}
+
+if(-Not $setupExeFound)
+{
+ Write-Host "No installed SQL Server features found." -ForegroundColor Yellow
+}
diff --git a/PowerShell/SQL_Server_Test_backups.ps1 b/PowerShell/SQL_Server_Test_backups.ps1
index 8ed1a21c..465cfa59 100644
--- a/PowerShell/SQL_Server_Test_backups.ps1
+++ b/PowerShell/SQL_Server_Test_backups.ps1
@@ -1,355 +1,355 @@
-<#
-.SYNOPSIS
- The SQL_Server_Test_backups script will reach out to a sql server central management server, derive a server list and database backup list.
- Then asynchronously restore them to a test server followed by integrity checks.
-.EXAMPLE
- .\SQL_Server_Test_backups.ps1 -cmsname "localhost" -servergroup "Production" -testservername "localhost" -randommultiplier 0.1 -loggingdbname "BackupTest"
- .\SQL_Server_Test_backups.ps1 -cmsname "localhost" -servergroup "Production" -testservername "localhost" -randommultiplier 0.5 -loggingdbname "BackupTest" -recurse
-.INPUTS
- [string]$cmsname - the central management server to connect to.
- [string]$servergroup - the root server group to parse.
- [string]$testservername - the test server to restore to.
- [string]$loggingdbname - name of the database on the test server to log results to.
- [decimal]$randommultiplier - decimal multiplier for the number of servers and databases to test at a time. e.g. 0.1=10%, 1=100%.
- [switch]$recurse - switch to determine whether the server group should be recursively searched.
-.OUTPUTS
- none.
-.NOTES
- Author: Derik Hammer
- Original Link: http://www.sqlshack.com/backup-testing-powershell-part-1-test/
- Created Date: 2014-10-21
-#>
-[CmdletBinding()]
-param
-(
- [Parameter(Mandatory=$true)]
- [ValidateNotNullorEmpty()]
- [string]$cmsName,
- [Parameter(Mandatory=$true)]
- [ValidateNotNullorEmpty()]
- [string]$serverGroup,
- [Parameter(Mandatory=$true)]
- [ValidateNotNullorEmpty()]
- [string]$testServerName,
- [Parameter(Mandatory=$true)]
- [ValidateNotNullorEmpty()]
- [string]$loggingDbName,
- [Parameter(Mandatory=$true)]
- [ValidateNotNullorEmpty()]
- [decimal]$randomMultiplier,
- [parameter(Mandatory=$false)]
- [switch]$recurse
-)
-Import-Module SQLPS -DisableNameChecking
-$ErrorActionPreference = "Continue";
-Trap {
- $err = $_.Exception
- while ( $err.InnerException )
- {
- $err = $err.InnerException
- write-output $err.Message
- throw $_.Exception;
- };
- continue
- }
-Function Parse-ServerGroup($serverGroup)
-{
- $results = $serverGroup.RegisteredServers;
- foreach($group in $serverGroup.ServerGroups)
- {
- $results += Parse-ServerGroup -serverGroup $group;
- }
- return $results;
-}
-Function Get-ServerList ([string]$cmsName, [string]$serverGroup, [switch]$recurse)
-{
- $connectionString = "data source=$cmsName;initial catalog=master;integrated security=sspi;"
- $sqlConnection = New-Object ("System.Data.SqlClient.SqlConnection") $connectionstring
- $conn = New-Object ("Microsoft.SQLServer.Management.common.serverconnection") $sqlconnection
- $cmsStore = New-Object ("Microsoft.SqlServer.Management.RegisteredServers.RegisteredServersStore") $conn
- $cmsRootGroup = $cmsStore.ServerGroups["DatabaseEngineServerGroup"].ServerGroups[$serverGroup]
-
- if($recurse)
- {
- return Parse-ServerGroup -serverGroup $cmsRootGroup | select ServerName
- }
- else
- {
- return $cmsRootGroup.RegisteredServers | select ServerName
- }
-}
-[scriptblock]$restoreDatabaseFunction =
-{
- Function Restore-Database
- {
- <# .synopsis
- restores a full database backup to target server. it will move the database files to the default data and log directories on the target server.
- .example
- restore-database -servername "localhost" -newdbname "testdb" -backupfilepath "D:\Backup\testdb.bak"
- restore-database -servername "localhost" -newdbname "testdb" -backupfilepath "\\KINGFERGUS\Shared\Backup\testdb.bak" -dropdbbeforerestore -conductintegritychecks
- .inputs
- [string]$servername - the server to restore to.
- [string]$newdbname - the database name that you'd like to use for the restore.
- [string]$backupfilepath - local or unc path for the *.bak file (.bak extension is required).
- [string]$origservername - name of the server where the backup originated. used for logging purposes.
- [string]$loggingdbname - name of the logging database.
- [switch]$dropdbbeforerestore - set if you would like the database matching $newdbname to be dropped before restored.
- the intent of this would be to ensure exclusive access to the database can be had during restore.
- [switch]$conductintegritychecks - set if you would like dbcc checktables to be run on the entire database after restore.
- .outputs
- none.
- #>
- [CmdletBinding()]
- param
- (
- [Parameter(Mandatory=$true)]
- [ValidateNotNullorEmpty()]
- [string]$serverName,
- [Parameter(Mandatory=$true)]
- [ValidateNotNullorEmpty()]
- [string]$newDBName,
- [parameter(Mandatory=$true)]
- [ValidateNotNullorEmpty()]
- [string]$backupFilePath,
- [parameter(Mandatory=$true)]
- [ValidateNotNullorEmpty()]
- [string]$origServerName,
- [parameter(Mandatory=$true)]
- [ValidateNotNullorEmpty()]
- [string]$loggingDbName,
- [parameter(Mandatory=$false)]
- [switch]$dropDbBeforeRestore,
- [parameter(Mandatory=$false)]
- [switch]$conductIntegrityChecks
- )
- Import-Module SQLPS -DisableNameChecking
-
- ## BEGIN input validation ##
- $ErrorActionPreference = "Stop";
- Trap {
- $err = $_.Exception
- while ( $err.InnerException )
- {
- $err = $err.InnerException
- write-output $err.Message
- throw $_.Exception;
- };
- continue
- }
- if($backupFilePath -notlike "*.bak")
- {
- throw "the file extension should be .bak."
- }
-
- if(!(test-path -Path $backupFilePath))
- {
- throw "Could not find the backup file."
- }
- # Test connection
- $server = New-Object ("Microsoft.SqlServer.Management.Smo.Server") $serverName
- if($server.Version.Major -eq $null)
- {
- throw "Could not establish connection to $serverName."
- }
- ## END input validation ##
-
- # Create restore object and specify its settings
- $smoRestore = new-object("Microsoft.SqlServer.Management.Smo.Restore")
- $smoRestore.Database = $newDBName
- $smoRestore.NoRecovery = $false;
- $smoRestore.ReplaceDatabase = $true;
- $smoRestore.Action = "Database"
-
- # Create location to restore from
- $backupDevice = New-Object("Microsoft.SqlServer.Management.Smo.BackupDeviceItem") ($backupFilePath, "File")
- $smoRestore.Devices.Add($backupDevice)
-
- # Get the file list from backup file
- $dbFileList = $smoRestore.ReadFileList($server)
- # Specify new data file (mdf)
- $smoRestoreDataFile = New-Object("Microsoft.SqlServer.Management.Smo.RelocateFile")
- $defaultData = $server.DefaultFile
- if (($defaultData -eq $null) -or ($defaultData -eq ""))
- {
- $defaultData = $server.MasterDBPath
- }
- $smoRestoreDataFile.PhysicalFileName = "$defaultData$newDBName" + ".mdf";
- $smoRestoreDataFile.LogicalFileName = $dbFileList.Select("FileId = 1").LogicalName
- $smoRestore.RelocateFiles.Add($smoRestoreDataFile) | Out-Null
-
- # Specify new log file (ldf)
- $smoRestoreLogFile = New-Object("Microsoft.SqlServer.Management.Smo.RelocateFile")
- $defaultLog = $server.DefaultLog
- if (($defaultLog -eq $null) -or ($defaultLog -eq ""))
- {
- $defaultLog = $server.MasterDBLogPath
- }
- $smoRestoreLogFile.PhysicalFileName = "$defaultData$newDBName" + "_Log.ldf";
- $smoRestoreLogFile.LogicalFileName = $dbFileList.Select("FileId = 2").LogicalName
- $smoRestore.RelocateFiles.Add($smoRestoreLogFile) | Out-Null
- # Loop through remaining files to generate relocation file paths.
- $smoRestoreFile = New-Object("Microsoft.SqlServer.Management.Smo.RelocateFile")
- foreach($file in $dbFileList.Select("FileId > 2"))
- {
- $smoRestoreFile = New-Object("Microsoft.SqlServer.Management.Smo.RelocateFile")
- $smoLogicalName = $file.LogicalName;
- $smoRestoreFile.LogicalFileName = $smoLogicalName
- $smoRestoreFile.PhysicalFileName = "$defaultData$smoLogicalName" + ".ndf";
- $smoRestore.RelocateFiles.Add($smoRestoreFile) | Out-Null
- }
-
- # Ensure exclusive access
- if($dropDbBeforeRestore -and $server.Databases[$newDBName] -ne $null)
- {
- $server.KillAllProcesses($newDBName);
- $server.KillDatabase($newDBName);
- }
- #Log restore process - start
- [string]$restoreResultId = [System.Guid]::NewGuid().ToString();
- [string]$sql = "INSERT INTO [dbo].[RestoreResult]
- ([restoreResultId]
- ,[originatingServerName]
- ,[databaseName]
- ,[backupFilePath])
- VALUES
- ('$restoreResultId'
- ,'$origServerName'
- ,'$newDBName'
- ,'$backupFilePath');"
- Invoke-Sqlcmd -ServerInstance $serverName -Database $loggingDbName -Query $sql -QueryTimeout 30;
- # Restore the database
- $errList = @();
- try
- {
- $smoRestore.SqlRestore($server)
- }
- catch
- {
- [System.Exception]
- $err = $_.Exception
- $errList += $err;
- while ( $err.InnerException )
- {
- $err = $err.InnerException
- $errList += $err;
- write-output $err.Message
- };
- }
- #Log restore process - end
- $restoreEndUtc = Get-Date;
- [string]$restoreEnd = $restoreEndUtc.ToUniversalTime();
- [string]$errMsg;
- foreach($msg in $errList)
- {
- $errMsg += $msg + "'r'n";
- }
- $sql = "UPDATE [dbo].[RestoreResult]
- SET [endDateTime] = '$restoreEnd' ";
- if($errMsg -ne $null)
- {
- $sql += ",[errorMessage] = '$errMsg' ";
- }
- $sql += "WHERE restoreResultId = '$restoreResultId';";
- Invoke-Sqlcmd -ServerInstance $serverName -Database $loggingDbName -Query $sql -QueryTimeout 30;
- if($conductIntegrityChecks)
- {
- #Log integrity checks - start
- [string]$checkDbResultId = [System.Guid]::NewGuid().ToString();
- [string]$sql = "INSERT INTO [dbo].[CheckDbResult]
- ([checkDbResultId]
- ,[restoreResultId])
- VALUES
- ('$checkDbResultId'
- ,'$restoreResultId');"
- Invoke-Sqlcmd -ServerInstance $serverName -Database $loggingDbName -Query $sql -QueryTimeout 30;
- #Integrity checks
- $errList = @();
- try
- {
- $server.Databases[$newDBName].CheckTables("None");
- }
- catch
- {
- [System.Exception]
- $err = $_.Exception
- $errList += $err;
- while ( $err.InnerException )
- {
- $err = $err.InnerException
- $errList += $err;
- write-output $err.Message
- };
- }
- #Log integrity checks - end
- $checkDbEndUtc = Get-Date;
- [string]$checkDbEnd = $restoreEndUtc.ToUniversalTime();
- [string]$errMsg;
- foreach($msg in $errList)
- {
- $errMsg += $msg + "'r'n";
- }
- $sql = "UPDATE [dbo].[CheckDbResult]
- SET [endDateTime] = '$checkDbEnd' ";
- if($errMsg -ne $null)
- {
- $sql += ",[errorMessage] = '$errMsg' ";
- }
- $sql += "WHERE checkDbResultId = '$checkDbResultId';";
- Invoke-Sqlcmd -ServerInstance $serverName -Database $loggingDbName -Query $sql -QueryTimeout 30;
- }
- # clean up databases
- $server.KillAllProcesses($newDBName);
- $server.KillDatabase($newDBName);
-
- Write-Host -Object "Restore-Database has completed processing."
- }
-}
-if($recurse)
-{
- $serverList = Get-ServerList -cmsName $cmsName -serverGroup $serverGroup -recurse
-}
-else
-{
- $serverList = Get-ServerList -cmsName $cmsName -serverGroup $serverGroup
-}
-$servers = $serverList | Get-Random -Count ([Math]::Ceiling([decimal]$serverList.Count * $randomMultiplier))
-$jobs = @()
-foreach($svr in $servers)
-{
- $server = New-Object ("Microsoft.SqlServer.Management.Smo.Server") $svr.ServerName;
- $databaseList = $server.Databases | Where-Object { $_.IsSystemObject -eq $false };
- $databaseList = $databaseList | Get-Random -Count ([Math]::Ceiling([decimal]$databaseList.Count * $randomMultiplier)) | select Name;
- $backupSetQuery = "SELECT TOP 1 BMF.physical_device_name
- FROM msdb.dbo.backupmediafamily BMF
- INNER JOIN msdb.dbo.backupset BS ON BS.media_set_id = BMF.media_set_id
- WHERE BS.database_name = '`$(databaseName)'
- AND BS.type = 'D'
- AND BS.is_copy_only = 0
- AND BMF.physical_device_name NOT LIKE '{%'
- ORDER BY BS.backup_finish_date DESC";
- foreach($database in $databaseList)
- {
- $params = "databaseName = " + $database.Name;
- $results = @();
- $results += Invoke-Sqlcmd -ServerInstance $server.Name -Query $backupSetQuery -Variable $params -QueryTimeout 30;
- if($results.Count -eq 0 -or $results -eq $null)
- {
- continue;
- }
- [string]$backupPath = $results[0].physical_device_name;
-
- # set arguments
- $arguments = @()
- $arguments += $testServerName;
- $arguments += $database.Name;
- $arguments += $backupPath;
- $arguments += $loggingDbName;
- $arguments += $svr.ServerName;
- # start job
- $jobs += Start-job -ScriptBlock {Restore-Database -serverName $args[0] -newDBName $args[1] -backupFilePath $args[2] -loggingDbName $args[3] -origServerName $args[4] –dropDbBeforeRestore -conductIntegrityChecks} `
- -InitializationScript $restoreDatabaseFunction -ArgumentList($arguments) -Name $database.Name;
-
- }
-}
-$jobs | Wait-Job | Receive-Job
+<#
+.SYNOPSIS
+ The SQL_Server_Test_backups script will reach out to a sql server central management server, derive a server list and database backup list.
+ Then asynchronously restore them to a test server followed by integrity checks.
+.EXAMPLE
+ .\SQL_Server_Test_backups.ps1 -cmsname "localhost" -servergroup "Production" -testservername "localhost" -randommultiplier 0.1 -loggingdbname "BackupTest"
+ .\SQL_Server_Test_backups.ps1 -cmsname "localhost" -servergroup "Production" -testservername "localhost" -randommultiplier 0.5 -loggingdbname "BackupTest" -recurse
+.INPUTS
+ [string]$cmsname - the central management server to connect to.
+ [string]$servergroup - the root server group to parse.
+ [string]$testservername - the test server to restore to.
+ [string]$loggingdbname - name of the database on the test server to log results to.
+ [decimal]$randommultiplier - decimal multiplier for the number of servers and databases to test at a time. e.g. 0.1=10%, 1=100%.
+ [switch]$recurse - switch to determine whether the server group should be recursively searched.
+.OUTPUTS
+ none.
+.NOTES
+ Author: Derik Hammer
+ Original Link: http://www.sqlshack.com/backup-testing-powershell-part-1-test/
+ Created Date: 2014-10-21
+#>
+[CmdletBinding()]
+param
+(
+ [Parameter(Mandatory=$true)]
+ [ValidateNotNullorEmpty()]
+ [string]$cmsName,
+ [Parameter(Mandatory=$true)]
+ [ValidateNotNullorEmpty()]
+ [string]$serverGroup,
+ [Parameter(Mandatory=$true)]
+ [ValidateNotNullorEmpty()]
+ [string]$testServerName,
+ [Parameter(Mandatory=$true)]
+ [ValidateNotNullorEmpty()]
+ [string]$loggingDbName,
+ [Parameter(Mandatory=$true)]
+ [ValidateNotNullorEmpty()]
+ [decimal]$randomMultiplier,
+ [parameter(Mandatory=$false)]
+ [switch]$recurse
+)
+Import-Module SQLPS -DisableNameChecking
+$ErrorActionPreference = "Continue";
+Trap {
+ $err = $_.Exception
+ while ( $err.InnerException )
+ {
+ $err = $err.InnerException
+ write-output $err.Message
+ throw $_.Exception;
+ };
+ continue
+ }
+Function Parse-ServerGroup($serverGroup)
+{
+ $results = $serverGroup.RegisteredServers;
+ foreach($group in $serverGroup.ServerGroups)
+ {
+ $results += Parse-ServerGroup -serverGroup $group;
+ }
+ return $results;
+}
+Function Get-ServerList ([string]$cmsName, [string]$serverGroup, [switch]$recurse)
+{
+ $connectionString = "data source=$cmsName;initial catalog=master;integrated security=sspi;"
+ $sqlConnection = New-Object ("System.Data.SqlClient.SqlConnection") $connectionstring
+ $conn = New-Object ("Microsoft.SQLServer.Management.common.serverconnection") $sqlconnection
+ $cmsStore = New-Object ("Microsoft.SqlServer.Management.RegisteredServers.RegisteredServersStore") $conn
+ $cmsRootGroup = $cmsStore.ServerGroups["DatabaseEngineServerGroup"].ServerGroups[$serverGroup]
+
+ if($recurse)
+ {
+ return Parse-ServerGroup -serverGroup $cmsRootGroup | select ServerName
+ }
+ else
+ {
+ return $cmsRootGroup.RegisteredServers | select ServerName
+ }
+}
+[scriptblock]$restoreDatabaseFunction =
+{
+ Function Restore-Database
+ {
+ <# .synopsis
+ restores a full database backup to target server. it will move the database files to the default data and log directories on the target server.
+ .example
+ restore-database -servername "localhost" -newdbname "testdb" -backupfilepath "D:\Backup\testdb.bak"
+ restore-database -servername "localhost" -newdbname "testdb" -backupfilepath "\\KINGFERGUS\Shared\Backup\testdb.bak" -dropdbbeforerestore -conductintegritychecks
+ .inputs
+ [string]$servername - the server to restore to.
+ [string]$newdbname - the database name that you'd like to use for the restore.
+ [string]$backupfilepath - local or unc path for the *.bak file (.bak extension is required).
+ [string]$origservername - name of the server where the backup originated. used for logging purposes.
+ [string]$loggingdbname - name of the logging database.
+ [switch]$dropdbbeforerestore - set if you would like the database matching $newdbname to be dropped before restored.
+ the intent of this would be to ensure exclusive access to the database can be had during restore.
+ [switch]$conductintegritychecks - set if you would like dbcc checktables to be run on the entire database after restore.
+ .outputs
+ none.
+ #>
+ [CmdletBinding()]
+ param
+ (
+ [Parameter(Mandatory=$true)]
+ [ValidateNotNullorEmpty()]
+ [string]$serverName,
+ [Parameter(Mandatory=$true)]
+ [ValidateNotNullorEmpty()]
+ [string]$newDBName,
+ [parameter(Mandatory=$true)]
+ [ValidateNotNullorEmpty()]
+ [string]$backupFilePath,
+ [parameter(Mandatory=$true)]
+ [ValidateNotNullorEmpty()]
+ [string]$origServerName,
+ [parameter(Mandatory=$true)]
+ [ValidateNotNullorEmpty()]
+ [string]$loggingDbName,
+ [parameter(Mandatory=$false)]
+ [switch]$dropDbBeforeRestore,
+ [parameter(Mandatory=$false)]
+ [switch]$conductIntegrityChecks
+ )
+ Import-Module SQLPS -DisableNameChecking
+
+ ## BEGIN input validation ##
+ $ErrorActionPreference = "Stop";
+ Trap {
+ $err = $_.Exception
+ while ( $err.InnerException )
+ {
+ $err = $err.InnerException
+ write-output $err.Message
+ throw $_.Exception;
+ };
+ continue
+ }
+ if($backupFilePath -notlike "*.bak")
+ {
+ throw "the file extension should be .bak."
+ }
+
+ if(!(test-path -Path $backupFilePath))
+ {
+ throw "Could not find the backup file."
+ }
+ # Test connection
+ $server = New-Object ("Microsoft.SqlServer.Management.Smo.Server") $serverName
+ if($server.Version.Major -eq $null)
+ {
+ throw "Could not establish connection to $serverName."
+ }
+ ## END input validation ##
+
+ # Create restore object and specify its settings
+ $smoRestore = new-object("Microsoft.SqlServer.Management.Smo.Restore")
+ $smoRestore.Database = $newDBName
+ $smoRestore.NoRecovery = $false;
+ $smoRestore.ReplaceDatabase = $true;
+ $smoRestore.Action = "Database"
+
+ # Create location to restore from
+ $backupDevice = New-Object("Microsoft.SqlServer.Management.Smo.BackupDeviceItem") ($backupFilePath, "File")
+ $smoRestore.Devices.Add($backupDevice)
+
+ # Get the file list from backup file
+ $dbFileList = $smoRestore.ReadFileList($server)
+ # Specify new data file (mdf)
+ $smoRestoreDataFile = New-Object("Microsoft.SqlServer.Management.Smo.RelocateFile")
+ $defaultData = $server.DefaultFile
+ if (($defaultData -eq $null) -or ($defaultData -eq ""))
+ {
+ $defaultData = $server.MasterDBPath
+ }
+ $smoRestoreDataFile.PhysicalFileName = "$defaultData$newDBName" + ".mdf";
+ $smoRestoreDataFile.LogicalFileName = $dbFileList.Select("FileId = 1").LogicalName
+ $smoRestore.RelocateFiles.Add($smoRestoreDataFile) | Out-Null
+
+ # Specify new log file (ldf)
+ $smoRestoreLogFile = New-Object("Microsoft.SqlServer.Management.Smo.RelocateFile")
+ $defaultLog = $server.DefaultLog
+ if (($defaultLog -eq $null) -or ($defaultLog -eq ""))
+ {
+ $defaultLog = $server.MasterDBLogPath
+ }
+ $smoRestoreLogFile.PhysicalFileName = "$defaultData$newDBName" + "_Log.ldf";
+ $smoRestoreLogFile.LogicalFileName = $dbFileList.Select("FileId = 2").LogicalName
+ $smoRestore.RelocateFiles.Add($smoRestoreLogFile) | Out-Null
+ # Loop through remaining files to generate relocation file paths.
+ $smoRestoreFile = New-Object("Microsoft.SqlServer.Management.Smo.RelocateFile")
+ foreach($file in $dbFileList.Select("FileId > 2"))
+ {
+ $smoRestoreFile = New-Object("Microsoft.SqlServer.Management.Smo.RelocateFile")
+ $smoLogicalName = $file.LogicalName;
+ $smoRestoreFile.LogicalFileName = $smoLogicalName
+ $smoRestoreFile.PhysicalFileName = "$defaultData$smoLogicalName" + ".ndf";
+ $smoRestore.RelocateFiles.Add($smoRestoreFile) | Out-Null
+ }
+
+ # Ensure exclusive access
+ if($dropDbBeforeRestore -and $server.Databases[$newDBName] -ne $null)
+ {
+ $server.KillAllProcesses($newDBName);
+ $server.KillDatabase($newDBName);
+ }
+ #Log restore process - start
+ [string]$restoreResultId = [System.Guid]::NewGuid().ToString();
+ [string]$sql = "INSERT INTO [dbo].[RestoreResult]
+ ([restoreResultId]
+ ,[originatingServerName]
+ ,[databaseName]
+ ,[backupFilePath])
+ VALUES
+ ('$restoreResultId'
+ ,'$origServerName'
+ ,'$newDBName'
+ ,'$backupFilePath');"
+ Invoke-Sqlcmd -ServerInstance $serverName -Database $loggingDbName -Query $sql -QueryTimeout 30;
+ # Restore the database
+ $errList = @();
+ try
+ {
+ $smoRestore.SqlRestore($server)
+ }
+ catch
+ {
+ [System.Exception]
+ $err = $_.Exception
+ $errList += $err;
+ while ( $err.InnerException )
+ {
+ $err = $err.InnerException
+ $errList += $err;
+ write-output $err.Message
+ };
+ }
+ #Log restore process - end
+ $restoreEndUtc = Get-Date;
+ [string]$restoreEnd = $restoreEndUtc.ToUniversalTime();
+ [string]$errMsg;
+ foreach($msg in $errList)
+ {
+ $errMsg += $msg + "'r'n";
+ }
+ $sql = "UPDATE [dbo].[RestoreResult]
+ SET [endDateTime] = '$restoreEnd' ";
+ if($errMsg -ne $null)
+ {
+ $sql += ",[errorMessage] = '$errMsg' ";
+ }
+ $sql += "WHERE restoreResultId = '$restoreResultId';";
+ Invoke-Sqlcmd -ServerInstance $serverName -Database $loggingDbName -Query $sql -QueryTimeout 30;
+ if($conductIntegrityChecks)
+ {
+ #Log integrity checks - start
+ [string]$checkDbResultId = [System.Guid]::NewGuid().ToString();
+ [string]$sql = "INSERT INTO [dbo].[CheckDbResult]
+ ([checkDbResultId]
+ ,[restoreResultId])
+ VALUES
+ ('$checkDbResultId'
+ ,'$restoreResultId');"
+ Invoke-Sqlcmd -ServerInstance $serverName -Database $loggingDbName -Query $sql -QueryTimeout 30;
+ #Integrity checks
+ $errList = @();
+ try
+ {
+ $server.Databases[$newDBName].CheckTables("None");
+ }
+ catch
+ {
+ [System.Exception]
+ $err = $_.Exception
+ $errList += $err;
+ while ( $err.InnerException )
+ {
+ $err = $err.InnerException
+ $errList += $err;
+ write-output $err.Message
+ };
+ }
+ #Log integrity checks - end
+ $checkDbEndUtc = Get-Date;
+ [string]$checkDbEnd = $restoreEndUtc.ToUniversalTime();
+ [string]$errMsg;
+ foreach($msg in $errList)
+ {
+ $errMsg += $msg + "'r'n";
+ }
+ $sql = "UPDATE [dbo].[CheckDbResult]
+ SET [endDateTime] = '$checkDbEnd' ";
+ if($errMsg -ne $null)
+ {
+ $sql += ",[errorMessage] = '$errMsg' ";
+ }
+ $sql += "WHERE checkDbResultId = '$checkDbResultId';";
+ Invoke-Sqlcmd -ServerInstance $serverName -Database $loggingDbName -Query $sql -QueryTimeout 30;
+ }
+ # clean up databases
+ $server.KillAllProcesses($newDBName);
+ $server.KillDatabase($newDBName);
+
+ Write-Host -Object "Restore-Database has completed processing."
+ }
+}
+if($recurse)
+{
+ $serverList = Get-ServerList -cmsName $cmsName -serverGroup $serverGroup -recurse
+}
+else
+{
+ $serverList = Get-ServerList -cmsName $cmsName -serverGroup $serverGroup
+}
+$servers = $serverList | Get-Random -Count ([Math]::Ceiling([decimal]$serverList.Count * $randomMultiplier))
+$jobs = @()
+foreach($svr in $servers)
+{
+ $server = New-Object ("Microsoft.SqlServer.Management.Smo.Server") $svr.ServerName;
+ $databaseList = $server.Databases | Where-Object { $_.IsSystemObject -eq $false };
+ $databaseList = $databaseList | Get-Random -Count ([Math]::Ceiling([decimal]$databaseList.Count * $randomMultiplier)) | select Name;
+ $backupSetQuery = "SELECT TOP 1 BMF.physical_device_name
+ FROM msdb.dbo.backupmediafamily BMF
+ INNER JOIN msdb.dbo.backupset BS ON BS.media_set_id = BMF.media_set_id
+ WHERE BS.database_name = '`$(databaseName)'
+ AND BS.type = 'D'
+ AND BS.is_copy_only = 0
+ AND BMF.physical_device_name NOT LIKE '{%'
+ ORDER BY BS.backup_finish_date DESC";
+ foreach($database in $databaseList)
+ {
+ $params = "databaseName = " + $database.Name;
+ $results = @();
+ $results += Invoke-Sqlcmd -ServerInstance $server.Name -Query $backupSetQuery -Variable $params -QueryTimeout 30;
+ if($results.Count -eq 0 -or $results -eq $null)
+ {
+ continue;
+ }
+ [string]$backupPath = $results[0].physical_device_name;
+
+ # set arguments
+ $arguments = @()
+ $arguments += $testServerName;
+ $arguments += $database.Name;
+ $arguments += $backupPath;
+ $arguments += $loggingDbName;
+ $arguments += $svr.ServerName;
+ # start job
+ $jobs += Start-job -ScriptBlock {Restore-Database -serverName $args[0] -newDBName $args[1] -backupFilePath $args[2] -loggingDbName $args[3] -origServerName $args[4] –dropDbBeforeRestore -conductIntegrityChecks} `
+ -InitializationScript $restoreDatabaseFunction -ArgumentList($arguments) -Name $database.Name;
+
+ }
+}
+$jobs | Wait-Job | Receive-Job
$jobs | Remove-Job
\ No newline at end of file
diff --git a/PowerShell/SQL_Server_linked_server_connection_check.ps1 b/PowerShell/SQL_Server_linked_server_connection_check.ps1
index bfbe39b5..f5c0f40c 100644
--- a/PowerShell/SQL_Server_linked_server_connection_check.ps1
+++ b/PowerShell/SQL_Server_linked_server_connection_check.ps1
@@ -1,114 +1,114 @@
-<#
-.SYNOPSIS
- Test the connection for each linked server defined in a SQL Server.
-.DESCRIPTION
- This script will test the connection for each linked server defined.
- This script will accept an input of a server name. If no name is passed,
- the script will default to the current computer name.
- This script will output to a file.
-.PARAMETER ServerName
- If no name is passed, the script will default to the current computer name.
-.PARAMETER OutputFile
- If no name is passed, the script will default to C:\linked_server_output.txt.
-.EXAMPLE
- SQL_Server_linked_server_connection_check.ps1 -ServerName "ServerName" -OutputFile "C:\linked_server_output.txt"
-.NOTES
- Author: Thomas LaRock
- Original Link: http://thomaslarock.com/2016/03/sql-server-linked-server-connection-test
- Created Date: 2016-02-29
-#>
-
-<# Input a server name and output file. #>
-Param(
-[Parameter(Mandatory = $false, Position=1)]
-[String]$ServerName,
-
-[Parameter(Mandatory = $false, Position=2)]
-[String]$OutputFile
-)
-
-<# Load the assemblies. #>
-[system.reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")|Out-Null
-[system.reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.SqlWmiManagement")|Out-Null
-
-<# If no server name is passed set to the current server name. #>
-if ($ServerName.Length -eq 0){$ServerName = $env:COMPUTERNAME}
-
-<# If no output file set the output file path, and initialize. #>
-if ($OutputFile.Length -eq 0){$OutputFile = "C:\linked_server_output.txt"}
-"$(Get-Date) Starting Linked Server connection test for server $ServerName." | Out-File $OutputFile
-
-<# Create new objects for managed computer and SQL server instances.
- We use ServerInstances to get friendly names for installed instances,
- and we get a list of services to skip those not currentoy running. #>
-$mc = new-object Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer $ServerName
-$Instances = $mc.ServerInstances
-$Services = $mc.Services
-
-<# Begin outer loop for each SQL instance installed. #>
-foreach($Instance in $Instances)
-{
-$Servername = $Instance.Parent.Name
-
-<# Begin inner loop, for all services installed. #>
-foreach ($ServiceName in $Services)
-{
- <# We are filtering for services that are running. #>
- if ($ServiceName.ServiceState -eq "Running")
- {
- <# Using wildcard search to find services that are like the instance name. #>
- if ($ServiceName.Name -like ("*" + $Instance.Name + "*"))
- {
- <# Build string for sql server name. If -ne, assume named instance. #>
- if ($Instance.Name -ne "MSSQLSERVER")
- {
- <# Build connection name. #>
- $ServerName = $ServerName + "\" + $Instance.name
- }
-
- <# Build SQL Server object. #>
- $Server = New-Object Microsoft.SqlServer.Management.Smo.Server($ServerName)
-
- <# Attempt to connect to this instance by returning the Version property. #>
- try
- {
- $Server.Version | Out-Null
- "$(Get-Date) $ServerName connection attempt." | Out-File $OutputFile -Append
-
- <# If connection above is successful, get array of linked servers. #>
- $LSNames = $Server.LinkedServers
- "$(Get-Date) $ServerName connection success." | Out-File $OutputFile -Append
-
- <# If no linked servers defined. #>
- if ($LSNames.Count -eq 0)
- {
- "$(Get-Date) $ServerName no linked servers found." | Out-File $OutputFile -Append
- }
-
- <# For each linked server test the connection. #>
- foreach ($LSname in $LSnames)
- {
- if ($LSname -ne $null)
- {
- try
- {
- $LSname.testconnection()
- $Connectivity = $true
- "$(Get-Date) $ServerName $LSname connection success." | Out-File $OutputFile -Append
- }
- catch
- {
- $Connectivity = $false
- "$(Get-Date) $ServerName $LSname connection failure." | Out-File $OutputFile -Append
- }
- }
- }
- }
- catch [System.Exception]
- {
- "$(Get-Date) $ServerName Server connection failed." | Out-File $OutputFile -Append
- }
- }
- }
-}
-}
+<#
+.SYNOPSIS
+ Test the connection for each linked server defined in a SQL Server.
+.DESCRIPTION
+ This script will test the connection for each linked server defined.
+ This script will accept an input of a server name. If no name is passed,
+ the script will default to the current computer name.
+ This script will output to a file.
+.PARAMETER ServerName
+ If no name is passed, the script will default to the current computer name.
+.PARAMETER OutputFile
+ If no name is passed, the script will default to C:\linked_server_output.txt.
+.EXAMPLE
+ SQL_Server_linked_server_connection_check.ps1 -ServerName "ServerName" -OutputFile "C:\linked_server_output.txt"
+.NOTES
+ Author: Thomas LaRock
+ Original Link: http://thomaslarock.com/2016/03/sql-server-linked-server-connection-test
+ Created Date: 2016-02-29
+#>
+
+<# Input a server name and output file. #>
+Param(
+[Parameter(Mandatory = $false, Position=1)]
+[String]$ServerName,
+
+[Parameter(Mandatory = $false, Position=2)]
+[String]$OutputFile
+)
+
+<# Load the assemblies. #>
+[system.reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")|Out-Null
+[system.reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.SqlWmiManagement")|Out-Null
+
+<# If no server name is passed set to the current server name. #>
+if ($ServerName.Length -eq 0){$ServerName = $env:COMPUTERNAME}
+
+<# If no output file set the output file path, and initialize. #>
+if ($OutputFile.Length -eq 0){$OutputFile = "C:\linked_server_output.txt"}
+"$(Get-Date) Starting Linked Server connection test for server $ServerName." | Out-File $OutputFile
+
+<# Create new objects for managed computer and SQL server instances.
+ We use ServerInstances to get friendly names for installed instances,
+ and we get a list of services to skip those not currentoy running. #>
+$mc = new-object Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer $ServerName
+$Instances = $mc.ServerInstances
+$Services = $mc.Services
+
+<# Begin outer loop for each SQL instance installed. #>
+foreach($Instance in $Instances)
+{
+$Servername = $Instance.Parent.Name
+
+<# Begin inner loop, for all services installed. #>
+foreach ($ServiceName in $Services)
+{
+ <# We are filtering for services that are running. #>
+ if ($ServiceName.ServiceState -eq "Running")
+ {
+ <# Using wildcard search to find services that are like the instance name. #>
+ if ($ServiceName.Name -like ("*" + $Instance.Name + "*"))
+ {
+ <# Build string for sql server name. If -ne, assume named instance. #>
+ if ($Instance.Name -ne "MSSQLSERVER")
+ {
+ <# Build connection name. #>
+ $ServerName = $ServerName + "\" + $Instance.name
+ }
+
+ <# Build SQL Server object. #>
+ $Server = New-Object Microsoft.SqlServer.Management.Smo.Server($ServerName)
+
+ <# Attempt to connect to this instance by returning the Version property. #>
+ try
+ {
+ $Server.Version | Out-Null
+ "$(Get-Date) $ServerName connection attempt." | Out-File $OutputFile -Append
+
+ <# If connection above is successful, get array of linked servers. #>
+ $LSNames = $Server.LinkedServers
+ "$(Get-Date) $ServerName connection success." | Out-File $OutputFile -Append
+
+ <# If no linked servers defined. #>
+ if ($LSNames.Count -eq 0)
+ {
+ "$(Get-Date) $ServerName no linked servers found." | Out-File $OutputFile -Append
+ }
+
+ <# For each linked server test the connection. #>
+ foreach ($LSname in $LSnames)
+ {
+ if ($LSname -ne $null)
+ {
+ try
+ {
+ $LSname.testconnection()
+ $Connectivity = $true
+ "$(Get-Date) $ServerName $LSname connection success." | Out-File $OutputFile -Append
+ }
+ catch
+ {
+ $Connectivity = $false
+ "$(Get-Date) $ServerName $LSname connection failure." | Out-File $OutputFile -Append
+ }
+ }
+ }
+ }
+ catch [System.Exception]
+ {
+ "$(Get-Date) $ServerName Server connection failed." | Out-File $OutputFile -Append
+ }
+ }
+ }
+}
+}
diff --git a/PowerShell/SQL_Server_table_to_csv.ps1 b/PowerShell/SQL_Server_table_to_csv.ps1
index a64d8c38..f9aef2cf 100644
--- a/PowerShell/SQL_Server_table_to_csv.ps1
+++ b/PowerShell/SQL_Server_table_to_csv.ps1
@@ -1,57 +1,57 @@
-<#
-.SYNOPSIS
- Export SQL Server table to csv file
-.DESCRIPTION
- This script export SQL Server table to csv file
-.PARAMETER sqlCmd.CommandText
- SQL query for export data
-.EXAMPLE
- C:\PS>
-
-.NOTES
- Author: Bill Graziano
- Original Link: http://www.sqlteam.com/article/fast-csv-import-in-powershell-to-sql-server
- Created Date: 2014-03-18
-#>
-$ConnectionString = "localhsot"
-$streamWriter = New-Object System.IO.StreamWriter ".\SimpleCsvOut3.txt"
-$sqlConn = New-Object System.Data.SqlClient.SqlConnection $ConnectionString
-$sqlCmd = New-Object System.Data.SqlClient.SqlCommand
-$sqlCmd.Connection = $sqlConn
-$sqlCmd.CommandText = "SELECT * FROM sys.tables"
-$sqlConn.Open();
-$reader = $sqlCmd.ExecuteReader();
-
-# Initialze the arry the hold the values
-$array = @()
-for ( $i = 0 ; $i -lt $reader.FieldCount; $i++ )
- { $array += @($i) }
-
-# Write Header
-$streamWriter.Write($reader.GetName(0))
-for ( $i = 1; $i -lt $reader.FieldCount; $i ++)
-{ $streamWriter.Write($("," + $reader.GetName($i))) }
-
-$streamWriter.WriteLine("") # Close the header line
-
-while ($reader.Read())
-{
- # get the values;
- $fieldCount = $reader.GetValues($array);
-
- # add quotes if the values have a comma
- for ($i = 0; $i -lt $array.Length; $i++)
- {
- if ($array[$i].ToString().Contains(","))
- {
- $array[$i] = '"' + $array[$i].ToString() + '"';
- }
- }
-
- $newRow = [string]::Join(",", $array);
-
- $streamWriter.WriteLine($newRow)
-}
-$reader.Close();
-$sqlConn.Close();
-$streamWriter.Close();
+<#
+.SYNOPSIS
+ Export SQL Server table to csv file
+.DESCRIPTION
+ This script export SQL Server table to csv file
+.PARAMETER sqlCmd.CommandText
+ SQL query for export data
+.EXAMPLE
+ C:\PS>
+
+.NOTES
+ Author: Bill Graziano
+ Original Link: http://www.sqlteam.com/article/fast-csv-import-in-powershell-to-sql-server
+ Created Date: 2014-03-18
+#>
+$ConnectionString = "localhsot"
+$streamWriter = New-Object System.IO.StreamWriter ".\SimpleCsvOut3.txt"
+$sqlConn = New-Object System.Data.SqlClient.SqlConnection $ConnectionString
+$sqlCmd = New-Object System.Data.SqlClient.SqlCommand
+$sqlCmd.Connection = $sqlConn
+$sqlCmd.CommandText = "SELECT * FROM sys.tables"
+$sqlConn.Open();
+$reader = $sqlCmd.ExecuteReader();
+
+# Initialze the arry the hold the values
+$array = @()
+for ( $i = 0 ; $i -lt $reader.FieldCount; $i++ )
+ { $array += @($i) }
+
+# Write Header
+$streamWriter.Write($reader.GetName(0))
+for ( $i = 1; $i -lt $reader.FieldCount; $i ++)
+{ $streamWriter.Write($("," + $reader.GetName($i))) }
+
+$streamWriter.WriteLine("") # Close the header line
+
+while ($reader.Read())
+{
+ # get the values;
+ $fieldCount = $reader.GetValues($array);
+
+ # add quotes if the values have a comma
+ for ($i = 0; $i -lt $array.Length; $i++)
+ {
+ if ($array[$i].ToString().Contains(","))
+ {
+ $array[$i] = '"' + $array[$i].ToString() + '"';
+ }
+ }
+
+ $newRow = [string]::Join(",", $array);
+
+ $streamWriter.WriteLine($newRow)
+}
+$reader.Close();
+$sqlConn.Close();
+$streamWriter.Close();
diff --git a/PowerShell/Send-SqlDataToExcel.ps1 b/PowerShell/Send-SqlDataToExcel.ps1
new file mode 100644
index 00000000..603de6a5
--- /dev/null
+++ b/PowerShell/Send-SqlDataToExcel.ps1
@@ -0,0 +1,297 @@
+Function Send-SQLDataToExcel {
+ <#
+ .SYNOPSIS
+ Inserts a DataTable - returned by SQL query into an ExcelSheet, more efficiently than sending it via Export-Excel
+ .DESCRIPTION
+ This command can accept a data table object or take a SQL statement and run it against a database connection.
+ If running a SQL statement, the accepts either
+ * an object representing a session with a SQL server or ODBC database, or
+ * a connection String to make a session.
+ The command takes most of the parameters of Export-Excel, and after inserting the table into the worksheet it
+ calls Export-Excel to carry out other tasks on the sheet. It is more efficient to do this than to get data-rows
+ and pipe them into Export-Excel, stripped off the database 'housekeeping' properties.
+ .PARAMETER DataTable
+ A System.Data.DataTable object containing the data to be inserted into the spreadsheet without running a query.
+ .PARAMETER Session
+ An active ODBC Connection or SQL connection object representing a session with a database which will be queried to get the data .
+ .PARAMETER Connection
+ A database connection string to be used to create a database session; either
+ * A Data source name written in the form DSN=ODBC_Data_Source_Name, or
+ * A full odbc or SQL Connection string, or
+ * The name of a SQL server.
+ .PARAMETER MSSQLServer
+ Specifies the connection string is for SQL server, not ODBC.
+ .PARAMETER SQL
+ The SQL query to run against the session which was passed in -Session or set up from -Connection.
+ .PARAMETER Database
+ Switches to a specific database on a SQL server.
+ .PARAMETER QueryTimeout
+ Override the default query time of 30 seconds.
+ .PARAMETER Path
+ Path to a new or existing .XLSX file.
+ .PARAMETER WorkSheetName
+ The name of a sheet within the workbook - "Sheet1" by default.
+ .PARAMETER KillExcel
+ Closes Excel - prevents errors writing to the file because Excel has it open.
+ .PARAMETER Title
+ Text of a title to be placed in the top left cell.
+ .PARAMETER TitleBold
+ Sets the title in boldface type.
+ .PARAMETER TitleSize
+ Sets the point size for the title.
+ .PARAMETER TitleBackgroundColor
+ Sets the cell background color for the title cell.
+ .PARAMETER TitleFillPattern
+ Sets the fill pattern for the title cell.
+ .PARAMETER Password
+ Sets password protection on the workbook.
+ .PARAMETER IncludePivotTable
+ Adds a Pivot table using the data in the worksheet.
+ .PARAMETER PivotTableName
+ If a Pivot table is created from command line parameters, specificies the name of the new sheet holding the pivot. If Omitted this will be "WorksheetName-PivotTable"
+ .PARAMETER PivotRows
+ Name(s) columns from the spreadhseet which will provide the Row name(s) in a pivot table created from command line parameters.
+ .PARAMETER PivotColumns
+ Name(s) columns from the spreadhseet which will provide the Column name(s) in a pivot table created from command line parameters.
+ .PARAMETER PivotFilter
+ Name(s) columns from the spreadhseet which will provide the Filter name(s) in a pivot table created from command line parameters.
+ .PARAMETER PivotData
+ In a pivot table created from command line parameters, the fields to use in the table body is given as a Hash table in the form ColumnName = Average|Count|CountNums|Max|Min|Product|None|StdDev|StdDevP|Sum|Var|VarP .
+ .PARAMETER PivotDataToColumn
+ If there are multiple datasets in a PivotTable, by default they are shown seperatate rows under the given row heading; this switch makes them seperate columns.
+ .PARAMETER NoTotalsInPivot
+ In a pivot table created from command line parameters, prevents the addition of totals to rows and columns.
+ .PARAMETER IncludePivotChart
+ Include a chart with the Pivot table - implies -IncludePivotTable.
+ .PARAMETER ChartType
+ The type for Pivot chart (one of Excel's defined chart types)
+ .PARAMETER NoLegend
+ Exclude the legend from the pivot chart.
+ .PARAMETER ShowCategory
+ Add category labels to the pivot chart.
+ .PARAMETER ShowPercent
+ Add Percentage labels to the pivot chart.
+ .PARAMETER PivotTableDefinition
+ Instead of describing a single pivot table with mutliple commandline paramters; you can use a HashTable in the form PivotTableName = Definition;
+ Definition is itself a hashtable with Sheet PivotTows, PivotColumns, PivotData, IncludePivotChart and ChartType values.
+ .PARAMETER ConditionalFormat
+ One or more conditional formatting rules defined with New-ConditionalFormattingIconSet.
+ .PARAMETER ConditionalText
+ Applies a 'Conditional formatting rule' in Excel on all the cells. When specific conditions are met a rule is triggered.
+ .PARAMETER BoldTopRow
+ Makes the top Row boldface.
+ .PARAMETER NoHeader
+ Does not put field names at the top of columns.
+ .PARAMETER RangeName
+ Makes the data in the worksheet a named range.
+ .PARAMETER AutoNameRange
+ Makes each column a named range.
+ .PARAMETER TableName
+ Makes the data in the worksheet a table with a name applies a style to it. Name must not contain spaces.
+ .PARAMETER TableStyle
+ Selects the style for the named table - defaults to 'Medium6'.
+ .PARAMETER BarChart
+ Creates a "quick" bar chart using the first text column as labels and the first numeric column as values
+ .PARAMETER ColumnChart
+ Creates a "quick" column chart using the first text column as labels and the first numeric column as values
+ .PARAMETER LineChart
+ Creates a "quick" line chart using the first text column as labels and the first numeric column as values
+ .PARAMETER PieChart
+ Creates a "quick" pie chart using the first text column as labels and the first numeric column as values
+ .PARAMETER ExcelChartDefinition
+ A hash table containing ChartType, Title, NoLegend, ShowCategory, ShowPercent, Yrange, Xrange and SeriesHeader for one or more [non-pivot] charts.
+ .PARAMETER StartRow
+ Row to start adding data. 1 by default. Row 1 will contain the title if any. Then headers will appear (Unless -No header is specified) then the data appears.
+ .PARAMETER StartColumn
+ Column to start adding data - 1 by default.
+ .PARAMETER FreezeTopRow
+ Freezes headers etc. in the top row.
+ .PARAMETER FreezeFirstColumn
+ Freezes titles etc. in the left column.
+ .PARAMETER FreezeTopRowFirstColumn
+ Freezes top row and left column (equivalent to Freeze pane 2,2 ).
+ .PARAMETER FreezePane
+ Freezes panes at specified coordinates (in the form RowNumber , ColumnNumber).
+ .PARAMETER AutoFilter
+ Enables the 'Filter' in Excel on the complete header row. So users can easily sort, filter and/or search the data in the select column from within Excel.
+ .PARAMETER AutoSize
+ Sizes the width of the Excel column to the maximum width needed to display all the containing data in that cell.
+ .PARAMETER Show
+ Opens the Excel file immediately after creation. Convenient for viewing the results instantly without having to search for the file first.
+ .PARAMETER CellStyleSB
+ A script block which is run at the end of the process to apply styles to cells (although it can be used for other purposes).
+ The script block is given three paramaters; an object containing the current worksheet, the Total number of Rows and the number of the last column.
+ .PARAMETER ReturnRange
+ If specified, Export-Excel returns the range of added cells in the format "A1:Z100"
+ .PARAMETER PassThru
+ If specified, Export-Excel returns an object representing the Excel package without saving the package first. To save it you need to call the save or Saveas method or send it back to Export-Excel.
+
+ .EXAMPLE
+ C:\> Send-SQLDataToExcel -MsSQLserver -Connection localhost -SQL "select name,type,type_desc from [master].[sys].[all_objects]" -Path .\temp.xlsx -WorkSheetname master -AutoSize -FreezeTopRow -AutoFilter -BoldTopRow
+
+ Connects to the local SQL server and selects 3 columns from [Sys].[all_objects] and exports then to a sheet named master with some basic header management
+ .EXAMPLE
+ C:\> $SQL="SELECT top 25 Name,Length From TestData ORDER BY Length DESC"
+ C:\> $Connection = ' Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=C:\Users\James\Documents\Database1.accdb;'
+
+ C:\> Send-SQLDataToExcel -Connection $connection -SQL $sql -path .\demo1.xlsx -WorkSheetname "Sizes" -AutoSize
+
+ This declares a SQL statement and creates an ODBC connection string to read from an Access file and extracts data from it and sends it to a new worksheet
+
+ .EXAMPLE
+ C:\> $SQL="SELECT top 25 DriverName, Count(RaceDate) as Races, Count(Win) as Wins, Count(Pole) as Poles, Count(FastestLap) as Fastlaps FROM Results GROUP BY DriverName ORDER BY (count(win)) DESC"
+ C:\> $Connection = 'Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};Dbq=C:\users\James\Documents\f1Results.xlsx;'
+
+ C:\> Send-SQLDataToExcel -Connection $connection -SQL $sql -path .\demo1.xlsx -WorkSheetname "Winners" -AutoSize -AutoNameRange -ConditionalFormat @{DataBarColor="Blue"; Range="Wins"}
+
+ This declares a SQL statement and creates an ODBC connection string to read from an Excel file, it then runs the statement and outputs the resulting data to a new spreadsheet.
+ The spreadsheet is formatted and a data bar added to show make the drivers' wins clearer.
+ (the F1 results database is available from https://1drv.ms/x/s!AhfYu7-CJv4ehNdZWxJE9LMAX_N5sg )
+ .EXAMPLE
+ C:\> $SQL = "SELECT top 25 DriverName, Count(RaceDate) as Races, Count(Win) as Wins, Count(Pole) as Poles, Count(FastestLap) as Fastlaps FROM Results GROUP BY DriverName ORDER BY (count(win)) DESC"
+ C:\> Get-SQL -Session F1 -excel -Connection "C:\Users\mcp\OneDrive\public\f1\f1Results.xlsx" -sql $sql -OutputVariable Table | out-null
+
+ C:\> Send-SQLDataToExcel -DataTable $Table -Path ".\demo3.xlsx" -WorkSheetname Gpwinners -autosize -TableName winners -TableStyle Light6 -show
+
+ This uses Get-SQL (at least V1.1 - download from the gallery with Install-Module -Name GetSQL - note the function is Get-SQL the module is GetSQL without the "-" )
+ to simplify making database connections and building /submitting SQL statements.
+ Here it uses the same SQL statement as before; -OutputVariable leaves a System.Data.DataTable object in $table
+ and Send-SQLDataToExcel puts $table into the worksheet and sets it as an Excel table.
+ (the F1 results database is available from https://1drv.ms/x/s!AhfYu7-CJv4ehNdZWxJE9LMAX_N5sg )
+ .EXAMPLE
+ C:\> $SQL = "SELECT top 25 DriverName, Count(Win) as Wins FROM Results GROUP BY DriverName ORDER BY (count(win)) DESC"
+ C:\> Send-SQLDataToExcel -Session $DbSessions["f1"] -SQL $sql -Path ".\demo3.xlsx" -WorkSheetname Gpwinners -autosize -ColumnChart
+
+ Like the previous example, this uses Get-SQL (download from the gallery with Install-Module -Name GetSQL). It uses the connection which Get-SQL made rather than an ODFBC connection string
+ Here the data is presented as a quick chart.
+ .EXAMPLE
+ C:\> Send-SQLDataToExcel -path .\demo3.xlsx -WorkSheetname "LR" -Connection "DSN=LR" -sql "SELECT name AS CollectionName FROM AgLibraryCollection Collection ORDER BY CollectionName"
+
+ This example uses an Existing ODBC datasource name "LR" which maps to an adobe lightroom database and gets a list of collection names into a worksheet
+ #>
+ [CmdletBinding()]
+ [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingPlainTextForPassword","")]
+ param (
+ [Parameter(ParameterSetName="SQLConnection", Mandatory=$true)]
+ [Parameter(ParameterSetName="ODBCConnection",Mandatory=$true)]
+ $Connection,
+ [Parameter(ParameterSetName="ExistingSession",Mandatory=$true)]
+ [System.Data.Common.DbConnection]$Session,
+ [Parameter(ParameterSetName="SQLConnection",Mandatory=$true)]
+ [switch]$MsSQLserver,
+ [Parameter(ParameterSetName="SQLConnection")]
+ [String]$DataBase,
+ [Parameter(ParameterSetName="SQLConnection", Mandatory=$true)]
+ [Parameter(ParameterSetName="ODBCConnection",Mandatory=$true)]
+ [Parameter(ParameterSetName="ExistingSession",Mandatory=$true)]
+ [string]$SQL,
+ [int]$QueryTimeout,
+ [Parameter(ParameterSetName="Pre-FetchedData",Mandatory=$true)]
+ [System.Data.DataTable]$DataTable,
+ $Path,
+ [String]$WorkSheetname = 'Sheet1',
+ [Switch]$KillExcel,
+ [Switch]$Show,
+ [String]$Title,
+ [OfficeOpenXml.Style.ExcelFillStyle]$TitleFillPattern = 'None',
+ [Switch]$TitleBold,
+ [Int]$TitleSize = 22,
+ $TitleBackgroundColor,
+ [String]$Password,
+ [Hashtable]$PivotTableDefinition,
+ [Switch]$IncludePivotTable,
+ [String[]]$PivotRows,
+ [String[]]$PivotColumns,
+ $PivotData,
+ [String[]]$PivotFilter,
+ [Switch]$PivotDataToColumn,
+ [Switch]$NoTotalsInPivot,
+ [Switch]$IncludePivotChart,
+ [OfficeOpenXml.Drawing.Chart.eChartType]$ChartType = 'Pie',
+ [Switch]$NoLegend,
+ [Switch]$ShowCategory,
+ [Switch]$ShowPercent,
+ [Switch]$AutoSize,
+ [Switch]$FreezeTopRow,
+ [Switch]$FreezeFirstColumn,
+ [Switch]$FreezeTopRowFirstColumn,
+ [Int[]]$FreezePane,
+ [Switch]$AutoFilter,
+ [Switch]$BoldTopRow,
+ [Switch]$NoHeader,
+ [String]$RangeName,
+ [String]$TableName,
+ [OfficeOpenXml.Table.TableStyles]$TableStyle = 'Medium6',
+ [Switch]$Barchart,
+ [Switch]$PieChart,
+ [Switch]$LineChart ,
+ [Switch]$ColumnChart ,
+ [Object[]]$ExcelChartDefinition,
+ [Switch]$AutoNameRange,
+ [Object[]]$ConditionalFormat,
+ [Object[]]$ConditionalText,
+ [ScriptBlock]$CellStyleSB,
+ [Int]$StartRow = 1,
+ [Int]$StartColumn = 1,
+ [Switch]$ReturnRange,
+ [Switch]$Passthru
+ )
+
+ if ($KillExcel) {
+ Get-Process excel -ErrorAction Ignore | Stop-Process
+ while (Get-Process excel -ErrorAction Ignore) {Start-Sleep -Milliseconds 250}
+ }
+
+ #We were either given a session object or a connection string (with, optionally a MSSQLServer parameter)
+ # If we got -MSSQLServer, create a SQL connection, if we didn't but we got -Connection create an ODBC connection
+ if ($MsSQLserver -and $Connection) {
+ if ($Connection -notmatch "=") {$Connection = "server=$Connection;trusted_connection=true;timeout=60"}
+ $Session = New-Object -TypeName System.Data.SqlClient.SqlConnection -ArgumentList $Connection
+ if ($Session.State -ne 'Open') {$Session.Open()}
+ if ($DataBase) {$Session.ChangeDatabase($DataBase) }
+ }
+ elseif ($Connection) {
+ $Session = New-Object -TypeName System.Data.Odbc.OdbcConnection -ArgumentList $Connection ; $Session.ConnectionTimeout = 30
+ }
+
+ If ($session) {
+ #A session was either passed in or just created. If it's a SQL one make a SQL DataAdapter, otherwise make an ODBC one
+ if ($Session.GetType().name -match "SqlConnection") {
+ $dataAdapter = New-Object -TypeName System.Data.SqlClient.SqlDataAdapter -ArgumentList (
+ New-Object -TypeName System.Data.SqlClient.SqlCommand -ArgumentList $SQL, $Session)
+ }
+ else {
+ $dataAdapter = New-Object -TypeName System.Data.Odbc.OdbcDataAdapter -ArgumentList (
+ New-Object -TypeName System.Data.Odbc.OdbcCommand -ArgumentList $SQL, $Session )
+ }
+ if ($QueryTimeout) {$dataAdapter.SelectCommand.CommandTimeout = $ServerTimeout}
+
+ #Both adapter types output the same kind of table, create one and fill it from the adapter
+ $DataTable = New-Object -TypeName System.Data.DataTable
+ $rowCount = $dataAdapter.fill($dataTable)
+ Write-Verbose -Message "Query returned $rowCount row(s)"
+ }
+ if ($DataTable.Rows.Count) {
+ #ExportExcel user a -NoHeader parameter so that's what we use here, but needs to be the other way around.
+ $printHeaders = -not $NoHeader
+ if ($Title) {$r = $StartRow +1 }
+ else {$r = $StartRow}
+ #Get our Excel sheet and fill it with the data
+ $excelPackage = Export-Excel -Path $Path -WorkSheetname $WorkSheetname -PassThru
+ $excelPackage.Workbook.Worksheets[$WorkSheetname].Cells[$r,$StartColumn].LoadFromDataTable($dataTable, $printHeaders ) | Out-Null
+
+ #Apply date format
+ for ($c=0 ; $c -lt $DataTable.Columns.Count ; $c++) {
+ if ($DataTable.Columns[$c].DataType -eq [datetime]) {
+ Set-ExcelColumn -Worksheet $excelPackage.Workbook.Worksheets[$WorkSheetname] -Column ($c +1) -NumberFormat 'Date-Time'
+ }
+ }
+
+ #Call export-excel with any parameters which don't relate to the SQL query
+ "Connection", "Database" , "Session", "MsSQLserver", "Destination" , "SQL" , "DataTable", "Path" | ForEach-Object {$null = $PSBoundParameters.Remove($_) }
+ Export-Excel -ExcelPackage $excelPackage @PSBoundParameters
+ }
+ else {Write-Warning -Message "No Data to insert."}
+ #If we were passed a connection and opened a session, close that session.
+ if ($Connection) {$Session.close() }
+}
diff --git a/PowerShell/Set_Extended_Events_Sessions_to_AutoStart.ps1 b/PowerShell/Set_Extended_Events_Sessions_to_AutoStart.ps1
index b293cde8..214218f9 100644
--- a/PowerShell/Set_Extended_Events_Sessions_to_AutoStart.ps1
+++ b/PowerShell/Set_Extended_Events_Sessions_to_AutoStart.ps1
@@ -1,97 +1,97 @@
-<
-.Synopsis
- Connects to the servers in the DBA Database and for Servers above 2012 sets alwayson_health Extended Events Sessions to Auto-Start and starts it if it is not running
-.DESCRIPTION
- Sets Extended Events Sessions to Auto-Start and starts it if it is not running
-.EXAMPLE
- Alter the XEvent name and DBADatabase name or add own server list and run
-.NOTES
- Author: Rob Sewell
- Original Link: https://sqldbawithabeard.com/2016/03/28/using-powershell-to-set-extended-events-sessions-to-autostart/#comments
- Created Date: 2016-03-20
->
-$DBADatabaseServer
-$XEName = 'AlwaysOn_health'
-## Query to gather the servers required
-$Query = @"
-
-SELECT
-
-IL.ServerName
-
-FROM [dbo].[InstanceList] IL
-
-WHERE NotContactable = 0
-
-AND Inactive = 0
-
-"@
-
-Try
-{
-$Results = (Invoke-Sqlcmd -ServerInstance $DBADatabaseServer -Database DBADatabase -Query $query -ErrorAction Stop).ServerName
-}
-
-catch
-{
-Write-Error "Unable to Connect to the DBADatabase - Please Check"
-}
-
-foreach($Server in $Results)
-
- {
- try
- {
- $srv = New-Object ('Microsoft.SqlServer.Management.Smo.Server') $Server
- }
- catch
- {
- Write-Output " Failed to connect to $Server"
- continue
- }
- # To ensure we have a connection to the server
- if (!( $srv.version)){
- Write-Output " Failed to Connect to $Server"
- continue
- }
- if($srv.versionmajor -ge '11')
- {
- ## NOTE this checks if there are Availability Groups - you may need to change this
- if ($srv.AvailabilityGroups.Name)
- {
- $AGNames = $srv.AvailabilityGroups.Name
- ## Can we connect to the XEStore?
- if(Test-Path SQLSERVER:\XEvent\$Server)
- {
- $XEStore = get-childitem -path SQLSERVER:\XEvent\$Server -ErrorAction SilentlyContinue | where {$_.DisplayName -ieq 'default'}
- $AutoStart = $XEStore.Sessions[$XEName].AutoStart
- $Running = $XEStore.Sessions[$XEName].IsRunning
- Write-Output "$server for $AGNames --- $XEName -- $AutoStart -- $Running"
- if($AutoStart -eq $false)
-
- {
- $XEStore.Sessions[$XEName].AutoStart = $true
- $XEStore.Sessions[$XEName].Alter()
- }
-
- if($Running -eq $false)
- {
- $XEStore.Sessions[$XEName].Start()
- }
- }
- else
- {
- Write-Output "Failed to connect to XEvent on $Server"
- }
- }
-
- else
- {
- ## Write-Output "No AGs on $Server"
- }
- }
- else
- {
- ## Write-Output "$server not 2012 or above"
- }
-}
+<#
+.Synopsis
+ Connects to the servers in the DBA Database and for Servers above 2012 sets alwayson_health Extended Events Sessions to Auto-Start and starts it if it is not running
+.DESCRIPTION
+ Sets Extended Events Sessions to Auto-Start and starts it if it is not running
+.EXAMPLE
+ Alter the XEvent name and DBADatabase name or add own server list and run
+.NOTES
+ Author: Rob Sewell
+ Original Link: https://sqldbawithabeard.com/2016/03/28/using-powershell-to-set-extended-events-sessions-to-autostart/#comments
+ Created Date: 2016-03-20
+#>
+$DBADatabaseServer
+$XEName = 'AlwaysOn_health'
+## Query to gather the servers required
+$Query = @"
+
+SELECT
+
+IL.ServerName
+
+FROM [dbo].[InstanceList] IL
+
+WHERE NotContactable = 0
+
+AND Inactive = 0
+
+"@
+
+Try
+{
+$Results = (Invoke-Sqlcmd -ServerInstance $DBADatabaseServer -Database DBADatabase -Query $query -ErrorAction Stop).ServerName
+}
+
+catch
+{
+Write-Error "Unable to Connect to the DBADatabase - Please Check"
+}
+
+foreach($Server in $Results)
+
+ {
+ try
+ {
+ $srv = New-Object ('Microsoft.SqlServer.Management.Smo.Server') $Server
+ }
+ catch
+ {
+ Write-Output " Failed to connect to $Server"
+ continue
+ }
+ # To ensure we have a connection to the server
+ if (!( $srv.version)){
+ Write-Output " Failed to Connect to $Server"
+ continue
+ }
+ if($srv.versionmajor -ge '11')
+ {
+ ## NOTE this checks if there are Availability Groups - you may need to change this
+ if ($srv.AvailabilityGroups.Name)
+ {
+ $AGNames = $srv.AvailabilityGroups.Name
+ ## Can we connect to the XEStore?
+ if(Test-Path SQLSERVER:\XEvent\$Server)
+ {
+ $XEStore = get-childitem -path SQLSERVER:\XEvent\$Server -ErrorAction SilentlyContinue | where {$_.DisplayName -ieq 'default'}
+ $AutoStart = $XEStore.Sessions[$XEName].AutoStart
+ $Running = $XEStore.Sessions[$XEName].IsRunning
+ Write-Output "$server for $AGNames --- $XEName -- $AutoStart -- $Running"
+ if($AutoStart -eq $false)
+
+ {
+ $XEStore.Sessions[$XEName].AutoStart = $true
+ $XEStore.Sessions[$XEName].Alter()
+ }
+
+ if($Running -eq $false)
+ {
+ $XEStore.Sessions[$XEName].Start()
+ }
+ }
+ else
+ {
+ Write-Output "Failed to connect to XEvent on $Server"
+ }
+ }
+
+ else
+ {
+ ## Write-Output "No AGs on $Server"
+ }
+ }
+ else
+ {
+ ## Write-Output "$server not 2012 or above"
+ }
+}
diff --git a/PowerShell/Shred-XElogs.ps1 b/PowerShell/Shred-XElogs.ps1
new file mode 100644
index 00000000..f5c36b93
--- /dev/null
+++ b/PowerShell/Shred-XElogs.ps1
@@ -0,0 +1,183 @@
+<#
+.SYNOPSIS
+ Load Extended Events via Powershell.
+.PARAMETR
+ fileWithPath
+.PARAMETR
+ serverName
+.PARAMETR
+ fileName
+.EXAMPLE
+ Shred-XElogs -fileWithPath $XEFilePath -serverName $server -fileName $XEFile
+.NOTES
+ Author: Aakash Patel
+ Created date: 2017-08-22
+ Original Link: http://www.sqlservercentral.com/articles/PowerShell/160582
+
+#>
+
+ Function Shred-XElogs{
+ param(
+ [Parameter(Position=0, Mandatory=$true)] [string] $fileWithPath,
+ [Parameter(Position=1, Mandatory=$true)] [string] $serverName,
+ [Parameter(Position=2, Mandatory=$true)] [string] $fileName
+ )
+ Try
+ {
+ #Load the required assemblies
+ $dllpath = "C:\Program Files\Microsoft SQL Server\110\Shared\Microsoft.SqlServer.XEvent.Linq.dll"
+ if(([appdomain]::currentdomain.getassemblies() | Where {$_.Location -match "Microsoft.SqlServer.XEvent.Linq.dll"}) -eq $null)
+ {
+ Write-Host "Assembly not found. Loading it from $dllpath" `r`n
+ [System.Reflection.Assembly]::LoadFrom($dllpath)
+ }
+ else
+ {
+ write-host "Assembly is already loaded." `r`n
+ }
+ [System.Reflection.Assembly]::LoadFrom($dllpath)
+ #create data table
+ $dt = New-Object System.Data.Datatable
+ #Define Columns
+ $server_name = New-Object system.Data.DataColumn 'server_name',([string])
+ $xe_load_date = New-Object system.Data.DataColumn 'xe_load_date',([DateTime])
+ $start_date = New-Object system.Data.DataColumn 'start_date',([DateTime])
+ $end_time = New-Object system.Data.DataColumn 'end_time',([datetime])
+ $text_data = New-Object system.Data.DataColumn 'text_data',([string])
+ $duration = New-Object system.Data.DataColumn 'duration',([int64])
+ $logicalreads = New-Object system.Data.DataColumn 'logicalreads',([int64])
+ $physicalreads = New-Object system.Data.DataColumn 'physicalreads',([int])
+ $EndResult = New-Object system.Data.DataColumn 'EndResult',([int])
+ $RowCount = New-Object system.Data.DataColumn 'RowCount',([int])
+ $ObjectName = New-Object system.Data.DataColumn 'ObjectName',([string])
+ $writes = New-Object system.Data.DataColumn 'writes',([int])
+ $CPU = New-Object system.Data.DataColumn 'CPU',([int64])
+ $event_name = New-Object system.Data.DataColumn 'event_name',([string])
+ $database_id = New-Object system.Data.DataColumn 'database_id',([int])
+ $hostname = New-Object system.Data.DataColumn 'hostname',([string])
+ $application_name = New-Object system.Data.DataColumn 'application_name',([string])
+ $login_name = New-Object system.Data.DataColumn 'login_name',([string])
+ $hostname = New-Object system.Data.DataColumn 'hostname',([string])
+ $spid = New-Object system.Data.DataColumn 'spid',([int])
+ $xe_log_file = New-Object system.Data.DataColumn 'xe_log_file',([string])
+ # create columns
+ [void]$dt.Columns.Add($server_name)
+ [void]$dt.Columns.Add($xe_load_date)
+ [void]$dt.Columns.Add($start_date)
+ [void]$dt.Columns.Add($end_time)
+ [void]$dt.Columns.Add($text_data)
+ [void]$dt.Columns.Add($duration)
+ [void]$dt.Columns.Add($logicalreads)
+ [void]$dt.Columns.Add($physicalreads)
+ [void]$dt.Columns.Add($EndResult)
+ [void]$dt.Columns.Add($RowCount)
+ [void]$dt.Columns.Add($ObjectName)
+ [void]$dt.Columns.Add($writes)
+ [void]$dt.Columns.Add($CPU)
+ [void]$dt.Columns.Add($event_name)
+ [void]$dt.Columns.Add($database_id)
+ [void]$dt.Columns.Add($hostname)
+ [void]$dt.Columns.Add($application_name)b
+ [void]$dt.Columns.Add($login_name)
+ [void]$dt.Columns.Add($spid)
+ [void]$dt.Columns.Add($xe_log_file)
+ $events = New-Object Microsoft.SqlServer.XEvent.Linq.QueryableXEventData($fileWithPath)
+ $events | % {
+ $currentEvent = $_
+ $row = $dt.NewRow()
+ $audittime = Get-Date
+ $row.server_name = $serverName
+ $row.xe_load_date = [DateTime] $audittime
+ $row.end_time = $currentEvent.Timestamp.LocalDateTime
+ $row.duration = $currentEvent.Fields["duration"].Value
+ $row.logicalreads = $currentEvent.Fields["logical_reads"].Value
+ $row.physicalreads = $currentEvent.Fields["physical_reads"].Value
+ $row.EndResult = $currentEvent.Fields["result"].Value.Key
+ $row.RowCount = $currentEvent.Fields["row_count"].Value
+ $row.ObjectName = $currentEvent.Fields["object_name"].Value
+ $row.writes = $currentEvent.Fields["writes"].Value
+ $row.CPU = $currentEvent.Fields["cpu_time"].Value
+ $row.event_name = $currentEvent.name
+ $row.database_id = $currentEvent.Actions["database_id"].Value
+ $row.hostname = $currentEvent.Actions["client_hostname"].Value
+ $row.application_name = $currentEvent.Actions["client_app_name"].Value
+ $row.login_name = $currentEvent.Actions["server_principal_name"].Value
+ $row.spid = $currentEvent.Actions["session_id"].Value
+ $row.xe_log_file = $fileName
+ if($currentEvent.name -eq 'sql_batch_completed') {$row.text_data = $currentEvent.Fields["batch_text"].Value}
+ else {$row.text_data = $currentEvent.Fields["statement"].Value}
+ $dt.Rows.Add($row)
+ }
+ $cn = new-object System.Data.SqlClient.SqlConnection("Data Source=MyDevServer.domainname;Integrated Security=SSPI;Initial Catalog=AdventureWorks");
+ $cn.Open()
+ $bc = new-object ("System.Data.SqlClient.SqlBulkCopy") $cn
+ $bc.BulkCopyTimeout = 1200 #you can increase if required
+ $bc.DestinationTableName = "dbo.xe_audit_collection"
+ [void]$bc.ColumnMappings.Add("server_name",$dt.Columns.ColumnName[0])
+ [void]$bc.ColumnMappings.Add("xe_load_date",$dt.Columns.ColumnName[1])
+ [void]$bc.ColumnMappings.Add("end_time",$dt.Columns.ColumnName[3])
+ [void]$bc.ColumnMappings.Add("text_data",$dt.Columns.ColumnName[4])
+ [void]$bc.ColumnMappings.Add("duration", $dt.Columns.ColumnName[5])
+ [void]$bc.ColumnMappings.Add("logicalreads",$dt.Columns.ColumnName[6])
+ [void]$bc.ColumnMappings.Add("physicalreads",$dt.Columns.ColumnName[7])
+ [void]$bc.ColumnMappings.Add("EndResult",$dt.Columns.ColumnName[8])
+ [void]$bc.ColumnMappings.Add("RowCount",$dt.Columns.ColumnName[9])
+ [void]$bc.ColumnMappings.Add("ObjectName",$dt.Columns.ColumnName[10] )
+ [void]$bc.ColumnMappings.Add("writes",$dt.Columns.ColumnName[11])
+ [void]$bc.ColumnMappings.Add("CPU",$dt.Columns.ColumnName[12])
+ [void]$bc.ColumnMappings.Add("event_name",$dt.Columns.ColumnName[13] )
+ [void]$bc.ColumnMappings.Add("database_id",$dt.Columns.ColumnName[14])
+ [void]$bc.ColumnMappings.Add("hostname",$dt.Columns.ColumnName[15] )
+ [void]$bc.ColumnMappings.Add("application_name", $dt.Columns.ColumnName[16])
+ [void]$bc.ColumnMappings.Add("login_name",$dt.Columns.ColumnName[17])
+ [void]$bc.ColumnMappings.Add("spid",$dt.Columns.ColumnName[18)
+ [void]$bc.ColumnMappings.Add("xe_log_file",$dt.Columns.ColumnName[19] )
+ $bc.WriteToServer($dt)
+ write-host " $($dt.rows.count) Rows have been transferred to SQL Server destination"`r`n
+ $cn.Close()
+ $events.Dispose()
+ $result = "`n Loading of file $XEFilePath complete! `n"
+ }
+ Catch
+ {
+ $result = $_.Exception
+ $FailedItem = $_.Exception.ItemName
+
+ }
+ return $result
+ }
+ #### Load your First File #####
+ $XEFilePath = "Z:\xe_log\OLTPServer\xe_troubleshoot_log_01.xel" ## file location
+ $server = "OLTPServer" ## server name, you are collecting XE data
+ $XEFile = "xe_troubleshoot_log_01.xel" ## XE File Name
+ Shred-XElogs -fileWithPath $XEFilePath -serverName $server -fileName $XEFile
+
+ <#
+--------------------Destination Table Definition ---------------
+ CREATE TABLE [dbo].[xe_audit_collection](
+ [xe_id] [bigint] IDENTITY(1,1) NOT NULL,
+ [server_name] [sysname] NOT NULL,
+ [xe_load_date] [datetime2](7) NULL,
+ [end_time] [datetime2](7) NULL,
+ [text_data] [varchar](max) NULL,
+ [duration] [bigint] NULL,
+ [logicalreads] [bigint] NULL,
+ [physicalreads] [bigint] NULL,
+ [EndResult] [int] NULL,
+ [RowCount] [bigint] NULL,
+ [ObjectName] [varchar](250) NULL,
+ [writes] [bigint] NULL,
+ [CPU] [bigint] NULL,
+ [event_name] [varchar](100) NULL,
+ [database_id] [int] NULL,
+ [hostname] [sysname] NOT NULL,
+ [application_name] [sysname] NULL,
+ [login_name] [sysname] NULL,
+ [spid] [int] NULL,
+ [xe_log_file] [varchar](250) NULL,
+ [start_time] AS (dateadd(millisecond, -CONVERT([int],[duration]/(1000)),[end_time])) PERSISTED
+ )
+ GO
+-----------------------------------------------------------------
+#>
+
\ No newline at end of file
diff --git a/PowerShell/Test-SQLScripts.ps1 b/PowerShell/Test-SQLScripts.ps1
new file mode 100644
index 00000000..e18fdcd1
--- /dev/null
+++ b/PowerShell/Test-SQLScripts.ps1
@@ -0,0 +1,265 @@
+<#
+.SYNOPSIS
+Scans a (list of) T-SQL script files(s) and returns information about the operations being performed by them.
+
+.DESCRIPTION
+This function utilizes the SQL Server ScriptDom Parser object to parse and return information about each batch and statements within each batch
+of T-SQL commands they contain. It will return an object that contains high-level information, as well as a batches object which in turn contains
+statement objects.
+
+.PARAMETER Files
+The [System.IO.FileInfo] object containing the files you want to scan. This type of object is usually returned from a Get-ChildItem cmdlet, so you can pipe the
+results of it to this function. Required.
+
+.PARAMETER PathToScriptDomLibrary
+This function requires the use of the Microsoft.SqlServer.TransactSql.ScriptDom object, which is NOT part of the standard SQL Server client libraries. Instead,
+it is installed as part of a SQL Server installation. Which means to use this function, you either have to run it on a host that has SQL Server installed, or you
+need a copy of the library locally. If you're using the latter, you need to manually provide the path to the Microsoft.SqlServer.TransactSql.ScriptDom.DLL file.
+This path will be used as part of Add-Type to load the library which contains all the required namespaces and object code. Defaults to empty.
+
+.PARAMETER UseQuotedIdentifier
+Whether or not the quoted identifier option is turned on for the parser. Defaults to true and is passed to the object instantiation.
+
+.NOTES
+Out-of-the-box this function will search for:
+ - DML statements (INSERT, UPDATE, DELETE)
+ - Certain DDL Statements:
+ - ALTER TABLE
+ - DROP INDEX
+ - CREATE INDEX
+ - CREATE PROCEDURE
+ - DROP PROCEDURE
+
+You can extend the tests by adding a new [ParserKey] object to the $ParserKeys array. For now, these defined tests live in the code
+but I expect them to be an external json file at some point.
+
+Author: Drew Furgiuele (@pittfurg, port1433.com)
+Tags: T-SQL, Parser
+
+.LINK
+
+.EXAMPLE
+$Results = Get-ChildItem -Path C:\Scripts | ./Test-SQLScripts.ps1
+
+Execute the parser against a list of files returned from the Get-ChildItem cmdlet and store the returned object in the $Results variable
+
+.EXAMPLE
+$Results = Get-ChildItem -Path C:\Scripts | ./Test-SQLScripts.ps1 -PathToScriptDomLibrary "C:\Program Files (x86)\Microsoft SQL Server\130\SDK\Assemblies\Microsoft.SqlServer.TransactSql.ScriptDom.dll"
+
+Same as above example, but manually point to where the parser library is stored (useful for hosts that don't have SQL Server installed and you manually
+copied the library to it).
+
+
+#>
+[cmdletbinding()]
+param(
+ [Parameter(
+ Mandatory = $true,
+ Position = 0,
+ ValueFromPipeline = $true,
+ ValueFromPipelineByPropertyName = $true)
+ ] [System.IO.FileInfo] $Files,
+ [Parameter(Mandatory=$false)] [string] $PathToScriptDomLibrary = $null,
+ [Parameter(Mandatory=$false)] [string] $UseQuotedIdentifier = $true
+)
+
+
+begin {
+ $ParserKeys = @()
+
+ Class ParserKey {
+ [string] $ObjectType
+ [string] $SchemaSpecification
+ ParserKey ([string] $ObjectType, [string] $SchemaSpecification) {
+ $this.ObjectType = $ObjectType
+ $this.SchemaSpecification = $SchemaSpecification
+ }
+ }
+
+ $ParserKeys += New-Object Parserkey ("SelectStatement","Queryexpression.Fromclause.Tablereferences.Schemaobject")
+ $ParserKeys += New-Object Parserkey ("InsertStatement","InsertSpecification.Target.SchemaObject")
+ $ParserKeys += New-Object Parserkey ("UpdateStatement","UpdateSpecification.Target.SchemaObject")
+ $ParserKeys += New-Object Parserkey ("DeleteStatement","DeleteSpecification.Target.SchemaObject")
+ $ParserKeys += New-Object Parserkey ("AlterTableAddTableElementStatement","SchemaObjectName")
+ $ParserKeys += New-Object Parserkey ("AlterTableDropTableElementStatement","SchemaObjectName")
+ $ParserKeys += New-Object Parserkey ("DropIndexStatement","DropIndexClauses.Object")
+ $ParserKeys += New-Object Parserkey ("CreateIndexStatement","OnName")
+ $ParserKeys += New-Object Parserkey ("CreateProcedureStatement","ProcedureReference.Name")
+ $ParserKeys += New-Object Parserkey ("CreateTableStatement","SchemaObjectName")
+ $ParserKeys += New-Object Parserkey ("DropProcedureStatement","Objects")
+ $ParserKeys += New-Object Parserkey ("DropTableStatement","Objects")
+
+
+ function Get-UpdatedTableFromReferences($TableReference) {
+ Write-Verbose "Looks like a joined DML statement, need to get into the references..."
+ if ($TableReference.FirstTableReference) {
+ Get-UpdatedTableFromReferences $TableReference.FirstTableReference
+ } else {
+ Write-Verbose "closing recursion..."
+ Return $TableReference.SchemaObject
+ }
+ }
+
+ function Get-Statement ($Statement, $Keys) {
+ $StatementObject = [PSCustomObject] @{
+ PSTypeName = "Parser.DOM.Statement"
+ ScriptName = $f.Name
+ BatchNumber= $TotalBatches
+ StatementNumber = $TotalStatements
+ StatementType = $null
+ Action = $null
+ IsQualified = $false
+ OnObjectSchema = $null
+ OnObjectName = $null
+ }
+
+ Add-Member -InputObject $StatementObject -Type ScriptMethod -Name ToString -Value { $this.psobject.typenames[0] } -Force
+
+ $StatementObject.Action = ($Statement.ScriptTokenStream | Where-Object {$_.Line -eq $Statement.StartLine -and $_.Column -eq $Statement.StartColumn}).Text.ToUpper()
+
+ if ($statementObject.Action -eq "If") {
+ Write-Verbose "Found an an 'IF' statement, looking at the 'THEN' part of the statement..."
+ if ($Statement.ThenStatement.StatementList.Statements.Count -ge 1) {
+ $SubStatements = $Statement.ThenStatement.StatementList.Statements
+ ForEach ($su in $subStatements) {
+ $StatementObject = Get-Statement $su $keys
+ }
+ } else {
+ $StatementObject = Get-Statement $Statement.ThenStatement $keys
+ }
+ $StatementObject.IsQualified = $true
+ } else {
+ $Property = $Statement
+ $ObjectType = ($Keys | Where-Object {$_.ObjectType -eq $Statement.gettype().name}).ObjectType
+ Write-Verbose "Object type: $ObjectType"
+ if ($ObjectType -eq "UpdateStatement" -and $statement.UpdateSpecification.WhereClause -ne $null -and $statement.UpdateSpecification.SetClauses -ne $null) {
+ $SchemaObject = Get-UpdatedTableFromReferences $Statement.UpdateSpecification.FromClause.TableReferences.FirstTableReference
+ $StatementObject.OnObjectSchema = $SchemaObject.SchemaIdentifier.Value
+ $StatementObject.OnObjectName = $SchemaObject.BaseIdentifier.Value
+ } elseif ($ObjectType -eq "SelectStatement" -and $statement.Queryexpression.fromclause.tablereferences.FirstTableReference -ne $null) {
+ $SchemaObject = Get-UpdatedTableFromReferences $statement.Queryexpression.fromclause.tablereferences.FirstTableReference
+ $StatementObject.OnObjectSchema = $SchemaObject.SchemaIdentifier.Value
+ $StatementObject.OnObjectName = $SchemaObject.BaseIdentifier.Value
+ } else {
+ try {
+ $StatementObject.StatementType = $Statement.GetType().Name.ToString()
+ $SplitDefinition = (($Keys | Where-Object {$_.ObjectType -eq $Statement.gettype().name}).SchemaSpecification).Split(".")
+ ForEach ($def in $SplitDefinition) {
+ $Property = $Property | Select-Object -ExpandProperty $def
+ }
+ $StatementObject.OnObjectSchema = $Property.SchemaIdentifier.Value
+ $StatementObject.OnObjectName = $Property.BaseIdentifier.Value
+ } catch {
+ Write-Warning "Parsed statement has no descernible statement type. Maybe define one as a parser key?"
+ }
+ }
+ }
+ return $StatementObject
+
+ }
+
+ $LibraryLoaded = $false
+ $ObjectCreated = $false
+ $LibraryVersions = @(13,12,11)
+
+ if ($PathToScriptDomLibrary -ne "") {
+ try {
+ Add-Type -Path $PathToScriptDomLibrary -ErrorAction SilentlyContinue
+ Write-Verbose "Loaded library from path $PathToScriptDomLibrary"
+ } catch {
+ throw "Couldn't load the required ScriptDom library from the path specified!"
+ }
+ } else {
+ ForEach ($v in $LibraryVersions)
+ {
+ if (!$LibraryLoaded) {
+ try {
+ Add-Type -AssemblyName "Microsoft.SqlServer.TransactSql.ScriptDom,Version=$v.0.0.0,Culture=neutral,PublicKeyToken=89845dcd8080cc91" -ErrorAction SilentlyContinue
+ Write-Verbose "Loaded version $v.0.0.0 of the ScriptDom library."
+ $LibraryLoaded = $true
+ } catch {
+ Write-Verbose "Couldn't load version $v.0.0.0 of the ScriptDom library."
+ }
+ }
+ }
+ }
+
+ ForEach ($v in $LibraryVersions)
+ {
+ if (!$ObjectCreated) {
+ try {
+ $ParserNameSpace = "Microsoft.SqlServer.TransactSql.ScriptDom.TSql" + $v + "0Parser"
+ $Parser = New-Object $ParserNameSpace($UseQuotedIdentifier)
+ $ObjectCreated = $true
+ Write-Verbose "Created parser object for version $v..."
+ } catch {
+ Write-Verbose "Couldn't load version $v.0.0.0 of the ScriptDom library."
+ }
+ }
+ }
+
+ if (!$ObjectCreated) {
+ throw "Unable to create ScriptDom library; did you load the right version of the library?"
+ }
+
+}
+
+
+process {
+ ForEach ($f in $Files) {
+ $CurrentFileName = $f.FullName
+ Write-Verbose "Parsing $CurrentFileName..."
+ $Reader = New-Object System.IO.StreamReader($f.FullName)
+ $Errors= $null
+ $Fragment = $Parser.Parse($Reader, [ref] $Errors)
+
+ [bool] $HasErrors = $false
+ if ($Errors -ne $null) {
+ [bool] $HasErrors = $true
+ }
+
+ $ScriptObject = [PSCustomObject] @{
+ PSTypeName = "Parser.DOM.Script"
+ ScriptName = $f.Name
+ ScriptFilePath = $f.FullName
+ NumberOfBatches = $Fragment.Batches.Count
+ HasParseErrors = $HasErrors
+ Errors = $Errors
+ Batches = @()
+ }
+
+ Add-Member -InputObject $ScriptObject -Type ScriptMethod -Name ToString -Value { $this.psobject.typenames[0] } -Force
+
+
+ $TotalBatches = 0
+ ForEach ($b in $Fragment.Batches) {
+ $TotalBatches++;
+
+ $BatchObject = [pscustomobject] @{
+ PSTypeName = "Parser.DOM.Batch"
+ ScriptName = $f.Name
+ BatchNumber = $TotalBatches
+ Statements = @()
+ }
+
+ Add-Member -InputObject $BatchObject -Type ScriptMethod -Name ToString -Value { $this.psobject.typenames[0] } -Force
+
+ $TotalStatements = 0
+ ForEach ($s in $b.Statements) {
+ $TotalStatements++
+ $StatementObject = Get-Statement $s $ParserKeys
+
+ $BatchObject.Statements += $StatementObject
+ }
+ $ScriptObject.Batches += $BatchObject
+ }
+
+ $Reader.Close()
+
+ $ScriptObject
+ }
+}
+
+end {
+ $Reader.Dispose()
+}
diff --git a/PowerShell/Truncate-AllTables.ps1 b/PowerShell/Truncate-AllTables.ps1
new file mode 100644
index 00000000..abc10b30
--- /dev/null
+++ b/PowerShell/Truncate-AllTables.ps1
@@ -0,0 +1,70 @@
+<#
+.SYNOPSIS
+ Truncate all tables in database.
+.DESCRIPTION
+ Truncate all tables in database. Drop and recreate all foreign keys.
+.PARAMETR
+ Machine - specify path to computer
+.PARAMETR
+ SqlInstance - specify SQL Server instance name
+.PARAMETR
+ DBname - specify database name
+.EXAMPLE
+Truncate-AllTables -Machine "hostname"
+.NOTES
+ Requires: Powershell version 3 or higher, sqlps module
+ Tested on: SQL Server 2014/2016
+ Author: Jeffrey Yao
+ Author Modified: Alexandr Titenko
+ Created date: 2016-03-15
+ Last modified: 2017-02-16
+#>
+
+function Truncate-AllTables {
+
+ param (
+ #Specify path to computer
+ [Parameter(Mandatory=$false)]
+ [String]$Machine = $env:COMPUTERNAME,
+ #Specify SQL Server instance name
+ [Parameter(Mandatory=$false)]
+ [String]$SqlInstance = 'default',
+ #Specify database name
+ [Parameter(Mandatory=$false)]
+ [String]$DBname = 'DBName'
+ )
+import-module sqlps -DisableNameChecking;
+set-location c:\;
+Write-Host "[*] Start at $(Get-Date -Format 'HH.mm.ss')" -foreground:yellow
+$sw = [Diagnostics.Stopwatch]::StartNew()
+
+[String]$FT_index='';
+
+[Microsoft.SqlServer.Management.Smo.Database]$db = get-item "sqlserver:\sql\$Machine\$SqlInstance\databases\$($DBname)";
+$db.tables.Refresh();
+
+#script out FKs and save it to variable $fk_script
+$db.tables | % -begin {[string]$fk_script=''} -process {$_.foreignkeys.refresh(); $_.foreignkeys | % {$fk_script +=$_.script() +";`r`n"} }
+
+#drop foreign keys
+$db.tables | % -begin {$fks=@()} -process { $fks += $_.ForeignKeys };
+foreach ($fk in $fks) {$fk.drop();}
+
+foreach ($t in $db.tables )
+{
+ $t.TruncateData(); #direct truncate
+ write-host "truncate table [$($t.Schema)].[$($t.name)]" -ForegroundColor yellow
+}
+
+#resetup the FKs
+$db.ExecuteNonQuery($fk_script);
+$db = $null;
+$svr = $null;
+
+Write-Host "[*] Finish at $(Get-Date -Format 'HH.mm.ss')" -foreground:yellow
+Write-Host "Duration:"
+$sw.Stop();
+$sw.Elapsed | Format-Table -Property Minutes, Seconds, Milliseconds -AutoSize;
+}
+
+Truncate-AllTables
\ No newline at end of file
diff --git a/PowerShell/WOX_Permissions.ps1 b/PowerShell/WOX_Permissions.ps1
index 5618ca15..d4c69b2a 100644
--- a/PowerShell/WOX_Permissions.ps1
+++ b/PowerShell/WOX_Permissions.ps1
@@ -1,116 +1,116 @@
- # ========================================================================================================
- #
- # NAME: WOX_Permissions.ps1
- #
- # This script can be used to step through the various levels of security on each of your SQL Server instances.
- # It is recommended to run this script with a domain account that can access the AD to collect group information.
- # Thanks go to Greg Burns whose original post here: http://www.alaskasql.org/Blog/Post/35/Audit-All-SQL-User-Security-with-PowerShell
- # inspired this evolution.
- #
- # This script returns:
- # - The Server Name, Versionm, edition and Login mode
- # - For each Login found on the SQL Server instance
- # - Name
- # - Type - SQL or Windows
- # - Create date
- # - Default DB
- # - Disabled?
- # - Server role (in Red if sysadmin)
- # - If Type is a Windows AD group each member's name and Login
- # - Database roles
- # - Any explicitily granted permissions
- #
- # The script runs based on a list of server names located in c:\temp\instances.txt.
- # Named instances can be listed as Hostname\instancename.
- # The text file should contain one instance per line.
- # All output is to the console (Formatting was easier).
- #
- # (C) 2016, WaterOx Consulting, Inc.
- # See https://WaterOxConsulting.com/eula for the End User Licensing Agreement.
- #
- # ========================================================================================================
-
- Function GetDBUserInfo($Dbase)
- {
- if ($dbase.status -eq "Normal") # ensures the DB is online before checking
- {$users = $Dbase.users | where {$_.login -eq $SQLLogin.name} # Ignore the account running this as it is assumed to be an admin account on all servers
- foreach ($u in $users)
- {
- if ($u)
- {
- $DBRoles = $u.enumroles()
- foreach ($role in $DBRoles) {
- if ($role -eq "db_owner") {
- write-host $role "on"$Dbase.name -foregroundcolor "red" #if db_owner set text color to red
- }
- else {
- write-host $role "on"$Dbase.name
- }
- }
- #Get any explicitily granted permissions
- foreach($perm in $Dbase.EnumObjectPermissions($u.Name)){
- write-host $perm.permissionstate $perm.permissiontype "on" $perm.objectname "in" $DBase.name }
- }
- } # Next user in database
- }
- #else
- #Skip to next database.
- }
- #Main portion of script start
- [reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") | out-null #ensure we have SQL SMO available
-
- foreach ($SQLsvr in get-content "C:\temp\Instances.txt") # read the instance source file to get instance names
- {
- $svr = new-object ("Microsoft.SqlServer.Management.Smo.Server") $SQLsvr
- write-host "================================================================================="
- write-host "SQL Instance: " $svr.name
- write-host "SQL Version:" $svr.VersionString
- write-host "Edition:" $svr.Edition
- write-host "Login Mode:" $svr.LoginMode
- write-host "================================================================================="
- $SQLLogins = $svr.logins
- foreach ($SQLLogin in $SQLLogins)
- {
-
- write-host "Login : " $SQLLogin.name
- write-host "Login Type : " $SQLLogin.LoginType
- write-host "Created : " $SQLLogin.CreateDate
- write-host "Default DB : " $SQLLogin.DefaultDatabase
- Write-Host "Disabled : " $SQLLogin.IsDisabled
-
- $SQLRoles = $SQLLogin.ListMembers()
- if ($SQLRoles) {
- if ($SQLRoles = "SysAdmin"){ write-host "Server Role : " $SQLRoles -foregroundcolor "red"}
- else { write-host "Server Role : " $SQLRoles
- } } else {"Server Role : Public"}
-
-
- If ( $SQLLogin.LoginType -eq "WindowsGroup" ) { #get individuals in any Windows domain groups
- write-host "Group Members:"
- try {
- $ADGRoupMembers = get-adgroupmember $SQLLogin.name.Split("\")[1] -Recursive
- foreach($member in $ADGRoupMembers){
- write-host " Account: " $member.name "("$member.SamAccountName")"
- }
- }
- catch
- {
- #Sometimes there are 'ghost' groups left behind that are no longer in the domain, this highlights those still in SQL
- write-host "Unable to locate group " $SQLLogin.name.Split("\")[1] " in the AD Domain" -foregroundcolor Red
- }
- }
- #Check the permissions in the DBs the Login is linked to.
- if ($SQLLogin.EnumDatabaseMappings())
- {write-host "Permissions:"
- foreach ( $DB in $svr.Databases)
- {
- GetDBUserInfo($DB)
- } # Next Database
- }
- Else
- {write-host "None."
- }
-
- write-host " ----------------------------------------------------------------------------"
- } # Next Login
- } # Next Server
+ # ========================================================================================================
+ #
+ # NAME: WOX_Permissions.ps1
+ #
+ # This script can be used to step through the various levels of security on each of your SQL Server instances.
+ # It is recommended to run this script with a domain account that can access the AD to collect group information.
+ # Thanks go to Greg Burns whose original post here: http://www.alaskasql.org/Blog/Post/35/Audit-All-SQL-User-Security-with-PowerShell
+ # inspired this evolution.
+ #
+ # This script returns:
+ # - The Server Name, Versionm, edition and Login mode
+ # - For each Login found on the SQL Server instance
+ # - Name
+ # - Type - SQL or Windows
+ # - Create date
+ # - Default DB
+ # - Disabled?
+ # - Server role (in Red if sysadmin)
+ # - If Type is a Windows AD group each member's name and Login
+ # - Database roles
+ # - Any explicitily granted permissions
+ #
+ # The script runs based on a list of server names located in c:\temp\instances.txt.
+ # Named instances can be listed as Hostname\instancename.
+ # The text file should contain one instance per line.
+ # All output is to the console (Formatting was easier).
+ #
+ # (C) 2016, WaterOx Consulting, Inc.
+ # See https://WaterOxConsulting.com/eula for the End User Licensing Agreement.
+ #
+ # ========================================================================================================
+
+ Function GetDBUserInfo($Dbase)
+ {
+ if ($dbase.status -eq "Normal") # ensures the DB is online before checking
+ {$users = $Dbase.users | where {$_.login -eq $SQLLogin.name} # Ignore the account running this as it is assumed to be an admin account on all servers
+ foreach ($u in $users)
+ {
+ if ($u)
+ {
+ $DBRoles = $u.enumroles()
+ foreach ($role in $DBRoles) {
+ if ($role -eq "db_owner") {
+ write-host $role "on"$Dbase.name -foregroundcolor "red" #if db_owner set text color to red
+ }
+ else {
+ write-host $role "on"$Dbase.name
+ }
+ }
+ #Get any explicitily granted permissions
+ foreach($perm in $Dbase.EnumObjectPermissions($u.Name)){
+ write-host $perm.permissionstate $perm.permissiontype "on" $perm.objectname "in" $DBase.name }
+ }
+ } # Next user in database
+ }
+ #else
+ #Skip to next database.
+ }
+ #Main portion of script start
+ [reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") | out-null #ensure we have SQL SMO available
+
+ foreach ($SQLsvr in get-content "C:\temp\Instances.txt") # read the instance source file to get instance names
+ {
+ $svr = new-object ("Microsoft.SqlServer.Management.Smo.Server") $SQLsvr
+ write-host "================================================================================="
+ write-host "SQL Instance: " $svr.name
+ write-host "SQL Version:" $svr.VersionString
+ write-host "Edition:" $svr.Edition
+ write-host "Login Mode:" $svr.LoginMode
+ write-host "================================================================================="
+ $SQLLogins = $svr.logins
+ foreach ($SQLLogin in $SQLLogins)
+ {
+
+ write-host "Login : " $SQLLogin.name
+ write-host "Login Type : " $SQLLogin.LoginType
+ write-host "Created : " $SQLLogin.CreateDate
+ write-host "Default DB : " $SQLLogin.DefaultDatabase
+ Write-Host "Disabled : " $SQLLogin.IsDisabled
+
+ $SQLRoles = $SQLLogin.ListMembers()
+ if ($SQLRoles) {
+ if ($SQLRoles = "SysAdmin"){ write-host "Server Role : " $SQLRoles -foregroundcolor "red"}
+ else { write-host "Server Role : " $SQLRoles
+ } } else {"Server Role : Public"}
+
+
+ If ( $SQLLogin.LoginType -eq "WindowsGroup" ) { #get individuals in any Windows domain groups
+ write-host "Group Members:"
+ try {
+ $ADGRoupMembers = get-adgroupmember $SQLLogin.name.Split("\")[1] -Recursive
+ foreach($member in $ADGRoupMembers){
+ write-host " Account: " $member.name "("$member.SamAccountName")"
+ }
+ }
+ catch
+ {
+ #Sometimes there are 'ghost' groups left behind that are no longer in the domain, this highlights those still in SQL
+ write-host "Unable to locate group " $SQLLogin.name.Split("\")[1] " in the AD Domain" -foregroundcolor Red
+ }
+ }
+ #Check the permissions in the DBs the Login is linked to.
+ if ($SQLLogin.EnumDatabaseMappings())
+ {write-host "Permissions:"
+ foreach ( $DB in $svr.Databases)
+ {
+ GetDBUserInfo($DB)
+ } # Next Database
+ }
+ Else
+ {write-host "None."
+ }
+
+ write-host " ----------------------------------------------------------------------------"
+ } # Next Login
+ } # Next Server
diff --git a/PowerShell/When-SQL-Serve-was-Rebooted.ps1 b/PowerShell/When-SQL-Serve-was-Rebooted.ps1
new file mode 100644
index 00000000..6a0eee94
--- /dev/null
+++ b/PowerShell/When-SQL-Serve-was-Rebooted.ps1
@@ -0,0 +1,50 @@
+<#
+.SYNOPSIS
+ When SQL Server was rebooted
+.DESCRIPTION
+ Sets Extended Events Sessions to Auto-Start and starts it if it is not running
+.EXAMPLE
+ ./When-SQL-Serve-was-Rebooted.ps1
+.LINK
+ Script posted over:
+ https://simplesqlserver.com/2016/06/01/powershell-when-were-my-servers-rebooted/
+.NOTES
+ Author: Steve Hood
+ Created Date: 2016-06-01
+#>
+
+Import-Module ActiveDirectory
+
+#either method works for getting a list of groups. You can type in all of your groups or make a query to find them all.
+#$groups = "Test SQL Servers", "Prod SQL Servers 1", "Prod SQL Servers 2", "SQL Cluster Servers 1", "SQL Cluster Servers 2"
+
+$groups = Get-ADGroup -Filter {name -like "*SQL *"} | where-object {$_.distinguishedname -like "*OU=SUS Group*"}
+
+ForEach ($group in $groups) {
+ $computerlist = Get-ADGroupMember $group -Recursive | SELECT name
+
+ #If there were any computers in the list, do this. It skips empty groups.
+ if ($computerlist) {
+ $computerlistcount = $computerlist.Count
+
+ #It returns an object instead of an array if there was only one, so count would be null
+ if (!$computerlistcount) {
+ $computerlistcount = 1
+ }
+
+ Write-Host ""
+ Write-Host "$computerlistcount server(s) in" $group.name
+ }
+
+ ForEach ($computer in $computerlist) {
+ try {
+ Get-WmiObject win32_operatingsystem -ComputerName $computer.name -ErrorAction Stop | select csname, @{LABEL='LastBootUpTime';EXPRESSION={$_.ConverttoDateTime($_.lastbootuptime)}}
+ }
+ catch {
+ #This logic is lacking. I don't care what error you got, just say you couldn't connect and we'll move on.
+ #For this script, it probably means the server is in the middle of a reboot
+ Write-Host "Could not connect to" $computer.name
+ Continue
+ }
+ }
+}
diff --git a/README.md b/README.md
index 8d38b353..33fe4da9 100644
--- a/README.md
+++ b/README.md
@@ -3,64 +3,91 @@
[![stars badge]][stars]
[![forks badge]][forks]
[![issues badge]][issues]
+[![contributors_badge]][contributors]
+
+[licence badge]:https://img.shields.io/badge/license-MIT-blue.svg
+[stars badge]:https://img.shields.io/github/stars/ktaranov/sqlserver-kit.svg
+[forks badge]:https://img.shields.io/github/forks/ktaranov/sqlserver-kit.svg
+[issues badge]:https://img.shields.io/github/issues/ktaranov/sqlserver-kit.svg
+[contributors_badge]:https://img.shields.io/github/contributors/ktaranov/sqlserver-kit.svg
+
+[licence]:https://github.com/ktaranov/sqlserver-kit/blob/master/LICENSE.md
+[stars]:https://github.com/ktaranov/sqlserver-kit/stargazers
+[forks]:https://github.com/ktaranov/sqlserver-kit/network
+[issues]:https://github.com/ktaranov/sqlserver-kit/issues
+[contributors]:https://github.com/ktaranov/sqlserver-kit/graphs/contributors
Useful links, scripts, tools and best practice for Microsoft SQL Server Database
-Headers:
- - [Repo Folders and Fles](#repo-folders-and-files)
+
+
+## Table of Contents
+ - [Repo Folders and Files](#repo-folders-and-files)
- [SQL Server Web Resources](#sql-server-web-resources)
- - [SQL Server Express direct download links](#sql-server-express-direct-download-links)
- - [Microsoft Adventure Works Sample Databases download links](#microsoft-adventure-works-sample-databases-download-links)
- - [Microsoft Transact-SQL Hints](#microsoft-transact-sql-hints)
+ - [SQL Server Blogs](#blogs)
+ - [Security Resources](#security)
+ - [SQL Server Free Videos](#free-videos)
+ - [Free Database Podcasts](#podcasts)
+ - [SQL Courses](#courses)
+ - [SQL Server Backwards Compatibility](#backwards-compatibility)
+ - [Social, Forum and Messenger SQL Server Groups](#sql-social)
+ - [SQL Server Open Source Projects](#open-source)
+ - [BIML Resources and Bloggers](#biml-resources-and-bloggers)
- [PowerShell and SQL Server](#powershell-and-sql-server)
- [TSQL Format Code](#tsql-format-code)
- - [Free SQL Server Ebooks](#free-sql-server-ebooks)
+ - [SQL Server Test Data Generation](#sql-server-test-data-generation)
+ - [Free SQL Server and R ebooks](#free-ebooks)
- [License](#license)
## Repo Folders and Files
- - [SQL Server Data Types](/SQL Server Data Types.md)
- - [SQL Server Edition](/SQL Server Edition.md)
- - [SQL Server Name Convention and T-SQL Programming Style](/SQL Server Name Convention and T-SQL Programming Style.md)
- - [SQL Server Licensing](/SQL Server Licensing.md)
- - [SQL Server People](/SQL Server People.md 'Most Valuable SQL Server professionals')
- - [SQL Server Trace Flag](/SQL Server Trace Flag.md 'Complete list - 300 Trace Flags') (Complete list - 300 trace flags)
- - [SQL Server Version](/SQL Server Version.md 'List of all Microsoft SQL Sever versions') (Complete list - from SQL Server 1.0 to SQL Server 2016)
+ - [SQL Server Data Types](/SQL%20Server%20Data%20Types.md)
+ - [SQL Server Drivers](/SQL%20Server%20Drivers.md)
+ - [SQL Server Edition](/SQL%20Server%20Edition.md)
+ - [SQL Server Hints](/SQL%20Server%20Hints.md)
+ - [SQL Server Name Convention and T-SQL Programming Style](/SQL%20Server%20Name%20Convention%20and%20T-SQL%20Programming%20Style.md)
+ - [SQL Server Licensing](/SQL%20Server%20Licensing.md)
+ - [SQL Server People](/SQL%20Server%20People.md 'Most Valuable SQL Server professionals')
+ - [SQL Server Trace Flag](/SQL%20Server%20Trace%20Flag.md 'Complete list - 593 Trace Flags') (**Complete list - 593 trace flags**)
+ - [SQL Server Version](/SQL%20Server%20Version.md 'List of all Microsoft SQL Sever versions') (**Complete list - from SQL Server 1.0 to SQL Server 2019**)
- [Articles](/Articles)
- [CLR procedures](/CLR)
- - [SQL#](/CLR/SQLsharp_SETUP.sql) free version - QUICKEST and EASIEST way to extending the power of T-SQL with C#
- [SplitterB_CLR](/CLR/SplitterB_CLR.sql)
+ - [Extended Events](/Extended_Events)
- [Known Errors](/Errors)
+ - [SQL Server Sample Databases and Datasets](/Sample_Databases)
+ - [Scripts](/Scripts)
+ - **Awesome SQL Server Diagnostic Information Queries** (by Glenn Alan Berry)
+ - [Azure SQL Database Diagnostic Information Queries](/Scripts/Azure%20SQL%20Database%20Diagnostic%20Information%20Queries.sql)
+ - [SQL Server 2019 Diagnostic Information Queries](/Scripts/SQL%20Server%202019%20Diagnostic%20Information%20Queries.sql)
+ - [SQL Server 2017 Diagnostic Information Queries](/Scripts/SQL%20Server%202017%20Diagnostic%20Information%20Queries.sql)
+ - [SQL Server 2016 Diagnostic Information Queries](/Scripts/SQL%20Server%202016%20Diagnostic%20Information%20Queries.sql)
+ - [SQL Server 2014 Diagnostic Information Queries](Scripts/SQL%20Server%202014%20Diagnostic%20Information%20Queries.sql)
+ - [SQL Server 2012 Diagnostic Information Queries](/Scripts/SQL%20Server%202012%20Diagnostic%20Information%20Queries.sql)
+ - [SQL Server 2008 R2 Diagnostic Information Queries](/Scripts/SQL%20Server%202008%20R2%20Diagnostic%20Information%20Queries.sql)
+ - [SQL Server 2008 Diagnostic Information Queries](/Scripts/SQL%20Server%202008%20Diagnostic%20Information%20Queries.sql)
+ - [SQL Server 2005 Diagnostic Information Queries](/Scripts/SQL%20Server%202005%20Diagnostic%20Information%20Queries.sql)
+ - [Table count alternative](/Scripts/Table%20Count%20alternative.sql) (by Jes Schultz Borland)
+ - [Foreign Key batch rename](/Scripts/Foreign%20Key%20batch%20rename.sql) (by Wes Henriksen)
+ - [Count character matches](/Scripts/Count%20character%20matches.sql)
+ - and many others...
- [Solution](/Solution)
- [dbWarden](/Solution/dbWarden) a free SQL Server Monitoring Package (by Stevie Rounds and Michael Rounds)
- [Base line Collector script](/Solution/BaselineCollector) (by Robert Virag)
- - [Ola Maintenance Solution](/Solution/Ola_Maintenance_Solution) (by Ola Hallengren)
- - [SQLQueryStress](/Solution/SQLQueryStress) (by Adam Machanic)
- [SysJobHistory](/Solution/SysJobHistory) (by David Wentzel)
- [SSMS](/SSMS)
- - [SSMS addons](/SSMS/SSMS_Addins.md) (28 useful free and paid SSMS Addins)
+ - [SSMS addins](/SSMS/SSMS_Addins.md) (**36 useful free and paid SSMS Addins**)
- [SSMS Snippets](/SSMS/SSMS_Snippets)
- - [SSMS Shortcuts](/SSMS/SSMS_Shortcuts.md)
- - [Scripts](/Scripts)
- - **Awesome SQL Server Diagnostic Information Queries** (by Glenn Alan Berry)
- - [SQL Server 2016 Diagnostic Information Queries](/Scripts/SQL Server 2016 Diagnostic Information Queries.sql)
- - [SQL Server 2014 Diagnostic Information Queries](/Scripts/SQL Server 2014 Diagnostic Information Queries.sql)
- - [SQL Server 2012 Diagnostic Information Queries](/Scripts/SQL Server 2012 Diagnostic Information Queries.sql)
- - [SQL Server 2008 R2 Diagnostic Information Queries](/Scripts/SQL Server 2008 R2 Diagnostic Information Queries.sql)
- - [SQL Server 2008 Diagnostic Information Queries](/Scripts/SQL Server 2008 Diagnostic Information Queries.sql)
- - [Table count alternative](/Scripts/Table Count alternative.sql) (by Jes Schultz Borland)
- - [Foreign Key batch rename](/Scripts/Foreign Key batch rename.sql) (by Wes Henriksen)
- - [Count character matches](/Scripts/Count character matches.sql)
- - and many others...
+ - [SSMS Shortcuts](/SSMS/SSMS_Shortcuts.md) (**More than 300 Shortcuts**)
+ - [SSMS Tips](/SSMS/SSMS_Tips.md) (**Complete guide about hidden gems of SSMS**)
- [Stored Procedure](/Stored_Procedure)
- - [sp_DBPermissions](/Stored_Procedure/sp_DBPermissions.sql) (by Kenneth Fisher)
- - [sp_SrvPermissions](/Stored_Procedure/sp_SrvPermissions.sql) (by Kenneth Fisher)
- - [sp_RestoreGene](/Stored_Procedure/sp_RestoreGene.sql) (by Paul Brewer)
- - [usp_who5](/Stored_Procedure/usp_who5.sql) (by Sean Smith)
- - [usp_String_Search](/Stored_Procedure/usp_String_Search.sql) (by Sean Smith)
- - [usp_BulkUpload](/Stored_Procedure/usp_BulkUpload.sql)
- - [usp_TableUnpivot](/Stored_Procedure/usp_TableUnpivot.sql)
- - [usp_SSIS_ScriptEnvironment](/Stored_Procedure/usp_SSIS_ScriptEnvironment.sql)
+ - [sp_DBPermissions](/Stored_Procedure/dbo.sp_DBPermissions.sql) (by Kenneth Fisher)
+ - [sp_SrvPermissions](/Stored_Procedure/dbo.sp_SrvPermissions.sql) (by Kenneth Fisher)
+ - [sp_RestoreGene](/Stored_Procedure/dbo.sp_RestoreGene.sql) (by Paul Brewer)
+ - [usp_who5](/Stored_Procedure/dbo.usp_who5.sql) (by Sean Smith)
+ - [usp_String_Search](/Stored_Procedure/dbo.usp_String_Search.sql) (by Sean Smith)
+ - [usp_BulkUpload](/Stored_Procedure/dbo.usp_BulkUpload.sql)
+ - [usp_TableUnpivot](/Stored_Procedure/dbo.usp_TableUnpivot.sql)
- and many others...
- [User Defined Function](/User_Defined_Function)
- [udf_parseJSON](/User_Defined_Function/udf_parseJSON.sql)
@@ -69,14 +96,18 @@ Headers:
- [udf_SplitStringByDelimiter](/User_Defined_Function/udf_SplitStringByDelimiter.sql)
- [udf_Tally](/User_Defined_Function/udf_Tally.sql)
- and many others...
- - [Utilities](/Utilities) (complete list of 124 SQL Server paid and free Utilities and Tools)
+ - [Utilities](/Utilities) (**Complete list of 276 SQL Server paid and free Utilities and Tools**)
+
+**[⬆ back to top](#table-of-contents)**
## SQL Server Web Resources
- - Blogs
+ - Blogs
+ - [Brent Ozar feedly reading list](https://github.com/BrentOzar/sqlblogs)
- [SQL Central Blog Scripts](http://www.sqlservercentral.com/Scripts/)
- [SQL Central Blog Articles](http://www.sqlservercentral.com/Articles/)
- [SQL Central Blog Stairways](http://www.sqlservercentral.com/stairway/)
+ - [DatabaseWeekly](http://www.databaseweekly.com/)
- [MSSQLTips](https://www.mssqltips.com/get-free-sql-server-tips/)
- [BRENT OZAR](https://www.brentozar.com/) scripts, videos and articles
- [Simple-talk Articles](https://www.simple-talk.com/)
@@ -87,6 +118,9 @@ Headers:
- [Weblogs SQLTeam Blogs](http://weblogs.sqlteam.com/)
- [SQLMag](http://sqlmag.com/)
- [SQLShack](http://www.sqlshack.com/)
+ - [LessThanDot SQL Server Blog](http://blogs.lessthandot.com/index.php/category/datamgmt/dbprogramming/mssqlserver/)
+ - [SQLBlog](http://sqlblog.com)
+ - [DatabseJournal SQL Server Blog](http://www.databasejournal.com/features/mssql/)
- [SQLPass](http://www.sqlpass.org/Home.aspx)
- [Vertabelo Blog](http://www.vertabelo.com/blog)
- [Midnightdba Blog](http://www.midnightdba.com/Jen/)
@@ -101,7 +135,38 @@ Headers:
- [Curated SQL](http://curatedsql.com/)
- [Blog do Ezequiel](https://blogs.msdn.microsoft.com/blogdoezequiel/)
- [SQLHA Blog](http://sqlha.com/blog/)
- - Free Videos
+ - [SQLSecurity Blog](http://www.sqlsecurity.com/home)
+ - [SQL.ru SQL Server](http://www.sql.ru/blogs/t-sql) (Russian)
+ - [C# Corner SQL Server Articles](http://www.c-sharpcorner.com/technologies/sql-server)
+ - [TechTarget Blog](http://searchsqlserver.techtarget.com/)
+ - [Toad SQL Server Blog](http://www.toadworld.com/platforms/sql-server/b/weblog)
+ - [SQL-Articles](http://sql-articles.com/articles/)
+ - [DallasDBAs Blog](http://dallasdbas.com/blog/)
+ - [UpSearch Blog](https://upsearch.com/blog/)
+ - [ProData Blog](http://blogs.prodata.ie/)
+ - [Red9 SQL Server Performance Blog](https://red9.com/blog/)
+ - [DallasDBAs.com Blog](http://dallasdbas.com/blog/)
+ - [SQLBI Blog](http://www.sqlbi.com)
+ - [RDX Blog](http://blog.rdx.com)
+ - [Codingsight](http://codingsight.com/)
+ - [Solomon Rutzky's SQL Quantum Leap Blog](https://SqlQuantumLeap.com/)
+ - Security (great thanks to [Troy Hunt](https://www.troyhunt.com/troys-ultimate-list-of-security-links/))
+ - SQL injection
+ - [sqlmap](http://sqlmap.org/) – The tool for mounting SQL injection attacks tests against a running site
+ - [Drupal 7 SQL injection flaw of 2014](https://www.drupal.org/PSA-2014-003) – great example of how impactful it still is (patch it within 7 hours or you’re owned)
+ - [Ethical Hacking: SQL Injection](http://www.pluralsight.com/courses/ethical-hacking-sql-injection) – If you really want to go deep, here’s five and a half hours worth of Pluralsight content
+ - Exploit databases and breach coverage
+ - [seclists.org](http://seclists.org) – Heaps of exploits consolidated from various bug tracking lists
+ - [Exploit Database](https://www.exploit-db.com/) – Very comprehensive list of vulnerabilities
+ - [PunkSPIDER](https://www.punkspider.org/) – Lots of vulnerabilities of all kinds all over the web (about 90M sites scanned with over 3M vulns at present)
+ - [Data Loss DB](http://datalossdb.org/) – Good list of breaches including stats on number of records compromised
+ - [Information is Beautiful: World’s Biggest Data Breaches](http://www.informationisbeautiful.net/visualizations/worlds-biggest-data-breaches-hacks/) – Fantastic visualisation of incidents that give a great indication of scale
+ - [Biggest data breaches in history](https://www.comparitech.com/blog/information-security/biggest-data-breaches-in-history/) (by Dave Albaugh)
+ - [Microsoft SQL Server Permissions Posters](https://github.com/Microsoft/sql-server-samples/tree/master/samples/features/security/permissions-posters)
+ - [Module Signing Info](https://modulesigning.info/) - Info and resources related to module signing (i.e. Certificates, Asymmetric Keys, `ADD SIGNATURE`, etc) in T-SQL and SQLCLR
+ - Free Videos
+ - [Youtube Brent Ozar](https://www.youtube.com/user/BrentOzar/videos)
+ - [SQLPASSTV videos](https://www.youtube.com/user/SQLPASSTV/videos)
- [IDERA Resource Center](https://www.idera.com/resourcecentral)
- [MSSQLTips SQL Server Webcasts and Videos](https://www.mssqltips.com/sql-server-webcasts/)
- [SQL Server Videos](http://www.sqlservervideos.com/)
@@ -109,7 +174,18 @@ Headers:
- [Veeam Learn Microsoft SQL Server](http://go.veeam.com/learn-microsoft-sql-server-free-video-tutorial-course.html)
- [MidnightDBA ITBookWorm Video](http://midnightdba.itbookworm.com/)
- [SQL Server Hangouts](https://www.youtube.com/playlist?list=PLvcGRPk71pmRi2UZHKfyruJKu_zHZ0ROc) (by Boris Hristov, Cathrine Wilhelmsen)
- - Free Database Podcasts
+ - [Youtube russianVC](https://www.youtube.com/channel/UC0UA5gKnOq9TM1RNvMIArwg) (Russian)
+ - [Youtube Redgate Videos](https://www.youtube.com/redgate)
+ - [User Group.tv](http://usergroup.tv/) (by Shawn Weisfeld)
+ - [SQLPass Virtual Chapters](http://www.sqlpass.org/passchapters/virtualchapters.aspx)
+ - [Youtube SQLpassion](https://www.youtube.com/channel/UCkrUQVPrv36Musorn0K4KoA)
+ - [SQLBits Video](https://sqlbits.com/)
+ - [Business Intelligence Videos](http://www.bidn.com/Videos/Videos)
+ - [Pragmatic Works Free Training Webinars](http://pragmaticworks.com/Training/FreeTrainingWebinars)
+ - [Youtube Pragmatic Works Video](https://www.youtube.com/user/PragmaticWorks) (by Devin Knight and Manuel Quintana)
+ - [MVP: Data Platform](https://channel9.msdn.com/Blogs/MVP-Data-Platform)
+ - [Build 2018 conference](http://sqlservercode.blogspot.ru/2018/05/azure-sql-data-warehouse-azure-sql.html)
+ - Free Database Podcasts
- [SQL Server Radio](http://www.sqlserverradio.com/) (by Guy Glantser and Matan Yungman)
- [SQL Data Partners](http://sqldatapartners.com/podcast/) (by Carlos L Chacon, César Oviedo and Adrian Miranda)
- [Away from the Keyboard](http://awayfromthekeyboard.com/) (by Cecil Phillip and Richie Rump)
@@ -118,112 +194,242 @@ Headers:
- [NET Rocks!](http://www.dotnetrocks.com/) (by Richard Campbell and Carl Franklin)
- [SQL Down Under Podcast](http://www.sqldownunder.com/Podcasts) (by Greg Low)
- [Free sql server video tutorials for beginners](http://csharp-video-tutorials.blogspot.ru/p/free-sql-server-video-tutorials-for.html) (by PRAGIM Technologies)
- - Courses
- - [MVA SQL Server Courses](https://mva.microsoft.com/product-training/sql-server)
- - [Lynda Courses](http://www.lynda.com/SQL-Server-training-tutorials/456-0.html)
- - [Veeam Free Courses](https://go.veeam.com/microsoft-sql-series-webinars.html)
- - [SQLSkills Trainings](https://www.sqlskills.com/sql-server-training/online-training/)
- - [Brent Ozar Team Trainings](https://learnfrom.brentozar.com/)
- - [Pluralsight Courses](https://www.pluralsight.com/search?q=sql+server&categories=all)
- - SQL Server Backwards Compatibility
- - [2014 Backwards Compatibility](http://msdn.microsoft.com/en-us/library/cc707787.aspx)
- - [2012 Backwards Compatibility](http://msdn.microsoft.com/en-us/library/cc707787(v=sql.110).aspx)
- - [2008 R2 Backwards Compatibility](http://msdn.microsoft.com/en-us/library/cc707787(v=sql.105).aspx)
- - [2008 Backwards Compatibility](http://msdn.microsoft.com/en-us/library/cc707787(v=sql.100).aspx)
+ - [Midnight DBA Podcast](http://midnightdba.itbookworm.com/Show) (by Sean and Jen McCown)
+ - [Dear SQL DBA](https://www.littlekendra.com/dearsqldba/) (by Kendra Little)
+ - [GroupBy.org - Group By is a free online event for the community, by the community](https://groupby.org/) (by Brent Ozar team)
+ - [DevopsCafe](http://devopscafe.org/) (by John Willis and Damon Edwards)
+ - [SQLPlayer](http://sqlplayer.net/) (by Kamil Nowinski and Damian Widera)
+ - [Data Driven](http://datadriven.tv/) (by Frank La Vigne and Andy Leonard)
+ - [SQL Down Under Podcast](https://www.sqldownunder.com) (by Greg Low)
+ - [SQL Undercover Podcast](https://sqlundercover.com/category/podcast/) (by David Fowler and Adrian Buckman)
+ - Courses
+ - Free
+ - [Learn SQL Server by solving problems](https://sqlworkbooks.com/courses-overview/) (by Little Kendra)
+ - [Codecademy Learn SQL](https://www.codecademy.com/learn/learn-sql)
+ - [Codecademy SQL: Table Transformation](https://www.codecademy.com/learn/sql-table-transformation)
+ - [Codecademy SQL: Analyzing Business Metrics](https://www.codecademy.com/learn/sql-analyzing-business-metrics)
+ - [MVA SQL Server Courses](https://mva.microsoft.com/product-training/sql-server)
+ - [How to Think Like the SQL Server Engine](https://learnfrom.brentozar.com/courses/how-to-think-like-the-engine-an-introduction-to-sql-server-internals/)
+ - [Number and Date Tables](https://www.brentozar.com/archive/2016/01/video-free-training-of-the-week-number-and-date-tables/)
+ - [Free SQL Tutorials](http://www.guru99.com/sql.html)
+ - [OpenedX Microsoft Courses](https://openedx.microsoft.com/)
+ - [SQLBolt - Learn SQL with simple, interactive exercises](https://sqlbolt.com/)
+ - [SQL Tutorial](https://sqlzoo.net)
+ - [HackerRank.com - SQL interactive exercises and many others languages](https://www.hackerrank.com/domains/sql)
+ - [SQL-EX.ru - Practical skills of SQL language](http://www.sql-ex.ru) (Russian, English)
+ - Paid
+ - [Lynda Courses](http://www.lynda.com/SQL-Server-training-tutorials/456-0.html)
+ - [Veeam Free Courses](https://go.veeam.com/microsoft-sql-series-webinars.html)
+ - [SQLSkills Trainings](https://www.sqlskills.com/sql-server-training/online-training/)
+ - [Brent Ozar Team Trainings](https://learnfrom.brentozar.com/)
+ - [Pluralsight Courses](https://www.pluralsight.com/search?q=sql+server&categories=all)
+ - [SolidQ Classes](https://training.solidq.com/classes/)
+ - [JOOQ SQL Masterclass](http://www.jooq.org/training/)
+ - [Learn SQL Server High Availability & Disaster Recovery](https://learnsqlserverhadr.com/) (by Edwin M Sarmiento)
+ - [Madeira Data Solutions Academy](http://madeira-data-solutions.teachable.com/)
+ - [SQLpassion Online Academy](http://www.sqlpassion.at/online-training/index.html) (by Klaus Aschenbrenner)
+ - SQL Server Backwards Compatibility
+ - [2017 Backwards Compatibility](https://docs.microsoft.com/en-us/sql/database-engine/sql-server-database-engine-backward-compatibility)
+ - [2016 Backwards Compatibility](https://docs.microsoft.com/en-us/sql/database-engine/sql-server-database-engine-backward-compatibility)
+ - [2014 Backwards Compatibility](https://msdn.microsoft.com/en-us/library/cc280407(v=sql.120).aspx)
+ - [2012 Backwards Compatibility](https://msdn.microsoft.com/en-us/library/cc707787(v=sql.110).aspx)
+ - [2008 R2 Backwards Compatibility](https://msdn.microsoft.com/en-us/library/cc707787(v=sql.105).aspx)
+ - [2008 Backwards Compatibility](https://msdn.microsoft.com/en-us/library/cc707787(v=sql.100).aspx)
- [2005 Backwards Compatibility](http://technet.microsoft.com/en-us/library/ms143532(v=sql.90).aspx)
+ - SQL Server System Views Map
+ - [SQL Server 2008 System Views Map](https://www.microsoft.com/en-us/download/details.aspx?id=9301)
+ - [SQL Server 2012 System Views Map](https://www.microsoft.com/en-us/download/details.aspx?id=39083)
+ - Microsoft Troubleshooting and security guides
+ - [Solving Connectivity errors to SQL Server](https://support.microsoft.com/en-us/help/4009936/solving-connectivity-errors-to-sql-server)
+ - [Troubleshooting connectivity issues with Microsoft Azure SQL Database](https://support.microsoft.com/en-in/help/10085/troubleshooting-connectivity-issues-with-microsoft-azure-sql-database)
+ - [Troubleshooting Always On Issues](https://support.microsoft.com/en-us/help/10179/troubleshooting-alwayson-issues)
+ - [Guide for enhancing privacy and addressing GDPR requirements with the Microsoft SQL platform](https://aka.ms/gdprsqlwhitepaper)
+ - Social, Forum and Messenger SQL Server Groups
+ - [SQL Server help and feedback](https://docs.microsoft.com/en-us/sql/sql-server/sql-server-get-help?view=sql-server-2017)
+ - [SQLServerCentral Forum](http://www.sqlservercentral.com/Forums/) (more than 10^6 People)
+ - [Slack #sqlhelp](https://sqlcommunity.slack.com/messages/sqlhelp/) (more than 900 People)
+ - [Slack #firstresponderkit](https://sqlcommunity.slack.com/messages/firstresponderkit/) (more then 90 People)
+ - [Twitter #sqlhelp](https://twitter.com/hashtag/sqlhelp) (more than 500 People)
+ - [SQL.ru SQL Server Forum](http://www.sql.ru/forum/microsoft-sql-server) (more than 10^5 People, Russian)
+ - [VK.com #sqlcom](https://vk.com/sqlcom) (more than 3600 People, Russian)
+ - [SQL Server User Group Meetings](https://www.mssqltips.com/sql-server-user-groups/)
+ - [Russian SQL Server User Group](https://www.facebook.com/groups/144858492215825/) (900 People, Russian)
+ - [SQLcom.ru telegram channel](https://t.me/sqlcom) (609 People, Russian)
+ - Open Source Projects
+ - [Brent Ozar SQL Server First Responder Kit](https://github.com/BrentOzarULTD/SQL-Server-First-Responder-Kit) (Github)
+ - [SQL Server Ola Hallengren's Maintenance Solution](https://github.com/olahallengren/sql-server-maintenance-solution) (by Ola Hallengren) (Github)
+ - [Standby restore script output for Ola Hallengren's Maintenance Solution](https://github.com/jzagelbaum/OlaHallengrenRestoreScript) (by jzagelbaum) (Github)
+ - [SqlQueryStress - SQL query stress simulator for SQL Server](https://github.com/ErikEJ/SqlQueryStress) (by Adam Machanic and Erik Ejlskov Jensen)
+ - [Statistic Parser](https://github.com/Jorriss/StatisticsParser) (by Richie Rump) (Github)
+ - [SQL Generator](https://github.com/Jorriss/sqlgenerator) (by Richie Rump) (Github)
+ - [Columnstore Indexes Scripts Library](https://github.com/NikoNeugebauer/CISL) (by Niko Neugebauer) (Github)
+ - [MOSL - Memory Optimized Script Library](https://github.com/NikoNeugebauer/MOSL) (by Niko Neugebauer) (Github)
+ - [mssql-docker - Official Microsoft repository for SQL Server in Docker resources](https://github.com/ktaranov/mssql-docker) (by Microsoft) (Github)
+ - [SQLCover - TSQL code coverage tool for SQL Server 2008+](https://github.com/GoEddie/SQLCover) (by Ed Elliott) (Github)
+ - [tSQLt testing framework for Microsoft SQL Server](https://github.com/tSQLt-org/tSQLt) (Github)
+ - [T-SQL SimMetrics string matching algorithms](https://github.com/GuerrillaAnalytics/similarity) (Github)
+ - [Azure Blob Storage Backup](https://github.com/bornsql/azureblobstoragesync) (by Randolph West) (Github)
+ - [StackExchange.DataExplorer - free tool for executing SQL queries against Stack Exchange databases](https://github.com/StackExchange/StackExchange.DataExplorer) (Github)
+ - [Machine Learning Templates with SQL Server 2016 R Services](https://github.com/Microsoft/SQL-Server-R-Services-Samples) (by Sheri Gilley) (Github)
+ - [Campaign Optimization - Predicting How and When to Contact Leads Implemented on SQL Server 2016 R Services](https://github.com/Microsoft/r-server-campaign-optimization) (by Sheri Gilley) (Github)
+ - [SQL Server Performance Dashboards - contains all Microsoft based reports, custom built reports, modified reports and the TSQL setup](http://sqldashboards.codeplex.com/) (by Arun Sirpal)
+ - [tigertoolbox - Repository for Tiger team for "as-is" solutions and tools/scripts that the team publishes for SQL Server](https://github.com/Microsoft/tigertoolbox) (Github)
+ - [SQL Server FineBuild - makes it easy for anyone to produce a best-practice installation and configuration of SQL Server](https://sqlserverfinebuild.codeplex.com/) (by Brian Davis)
+ - [Pssdiag/Sqldiag Manager - is a graphic interface that provides customization capabilities to collect data for SQL Server using sqldiag collector engine](https://github.com/Microsoft/DiagManager) (Github)
+ - [sql-xplat-cli - Repository for the new SQL cross-platform command line tools](https://github.com/Microsoft/sql-xplat-cli) (by Microsoft)
+ - [dbfs - A tool for mounting MS SQL Server DMVs using FUSE](https://github.com/Microsoft/dbfs) (by Microsoft)
+ - [Opserver - Stack Exchange's Monitoring System](https://github.com/opserver/Opserver) (by Stack Exchange)
+ - [Bosum - Time Series Alerting Framework](https://github.com/bosun-monitor/bosun) (by Stack Exchange)
+ - [BismNormalizer - is a free and open-source tool to manage Microsoft Analysis Services tabular models](https://github.com/christianwade/BismNormalizer) (by Christian Wade)
+ - [DbSharp - is a DAL Generator](https://www.codeproject.com/Articles/776811/DbSharp-DAL-generator-tool) (by Higty)
+ - [YourSqlDba - Database maintenance solution as a single SQL script](https://github.com/pelsql/YourSqlDba) (by Maurice Pelchat)
+ - [OpenQueryStore - collection of scripts that add Query Store like functionality to pre-SQL Server 2016 Instance](https://github.com/OpenQueryStore/OpenQueryStore)
+ - [ssis-dashboard - HTML5 SQL Server Integration Services Dashboard](https://github.com/yorek/ssis-dashboard) (by Davide Mauri)
+ - [SQL Server Regex - run regular expressions in SQL Server](https://github.com/DevNambi/sql-server-regex) (by Dev Nambi)
+ - [Binary Formatter - format binary files (e.g. DLL / CER / PVK) into hex bytes string for SQL script](https://github.com/SqlQuantumLeap/BinaryFormatter) (by Solomon Rutzky / Sql Quantum Leap)
+ - [ExtendedTSQLCollector - Custom collector types to extend and simplify the features offered by the built-in SQL Server Data Collector and read data from Extended Events and/or queries](https://github.com/spaghettidba/ExtendedTSQLCollector) (by Gianluca Sartori)
+ - [XESmartTarget - configurable target for SQL Server Extended Events](https://github.com/spaghettidba/XESmartTarget) (by Gianluca Sartori)
+ - [Schemazen - script and create SQL Server objects quickly](https://github.com/sethreno/schemazen) (by Seth Reno)
+ - [soddi - StackOverflow Data Dump Importer](https://github.com/BrentOzarULTD/soddi) (by Brent Ozar team)
+ - [Automatically fix high VLF counts in SQL Server 2012+](https://github.com/tboggiano/autofix-vlfs) (by Tracy Boggiano)
+ - [splittinglargefiles - Process for splitting large files in a filegroup that has grown out of control.](https://github.com/tboggiano/splittinglargefiles) (by Tracy Boggiano)
+ - [olamaintconfigtables - This are tables and jobs that can use to run Ola's scripts as T-SQL Jobs and run on Linux](https://github.com/tboggiano/olamaintconfigtables) (by Tracy Boggiano)
+ - [SQL Undercover Toolbox - A collection of cool and useful tools, procedures and scripts for the discerning DBA ](https://github.com/SQLUndercover/UndercoverToolbox) (by SQL Undercover)
+ - [dba-database - Database containing DBA helper code and open source software](https://github.com/amtwo/dba-database) (by Andy Mallon)
+ - [SQLServerSpaceAnalysis PowerBI](https://github.com/SQLJana/SQLServerSpaceAnalysis) (by Jana Sattainathan)
+ - [SQL Server Telegram Bot](https://github.com/ionflux/mssql-telegram-bot/)
+ - [ZabbixMSSQL - Zabbix Template and tools for Microsoft SQL Server](https://github.com/dreik/ZabbixMSSQL) (by Sergey Kolesnik)
+ - [AGLatency - analyze AG log block movement latency between replicas and create report accordingly](https://github.com/suyouquan/AGLatency) (by Simon Su)
+ - [SQLSetupTools - FixMissingMSI, Product Browser, SQL Registry Viewer](https://github.com/suyouquan/SQLSetupTools) (by Simon Su)
+ - [tsql-parser - Library Written in C# For Parsing SQL Server T-SQL Scripts in .Net](https://github.com/bruce-dunwiddie/tsql-parser) (by Bruce Dunwiddie)
+ - [tsqllint - Configurable linting for TSQL](https://github.com/tsqllint/tsqllint) (by tsqllint)
+ - [Rezoom.SQL - F# ORM for SQL databases](https://github.com/rspeele/Rezoom.SQL) (by Robert Peele)
+ - [SQLtoExcel - Exports the output of one or more TSQL script queries to Excel](https://github.com/BeginTry/SQLtoExcel) (by Dave Mason)
+ - [Analysis Services - Analysis Services samples and community projects](https://github.com/Microsoft/Analysis-Services) (by Microsoft)
+ - [ms-sql-express-replication - replication library written for MS SQL Sever Express edition](https://github.com/janhalama/ms-sql-express-replication) (by Jan Halama)
+ - [SQL query builder, written in C#](https://github.com/sqlkata/querybuilder)
+ - [php-crud-api - Single file PHP script that adds a REST API to a SQL database](https://github.com/mevdschee/php-crud-api) (by Maurits van der Schee)
- Other
- - [SQL Server Management Studio](https://msdn.microsoft.com/en-us/library/mt238290.aspx) installation download link
- - Best backup and index maintenance solution [Ola Maintenance Solution](https://ola.hallengren.com/)
- - [SQL# CLR functions](http://www.sqlsharp.com/) (by Sql Quantum Leap)
+ - [sp_whoisactive](http://whoisactive.com/) (by Adam Machanic)
+ - [SQL# SQLCLR functions](https://sqlsharp.com/) (by Sql Quantum Lift)
+ - [SQL Server Latch Classes Library](https://www.sqlskills.com/help/latches/) (by Paul S. Randal)
+ - [SQL Server Wait Types Library](https://www.sqlskills.com/help/waits/) (by Paul S. Randal)
+ - [Waitopedia - is a comprehensive resource of information about SQL Server waits](https://www.spotlightessentials.com/waitopedia) (by Spotlight Essentials)
+ - [SQL Server wait types](https://www.sqlshack.com/sql-server-wait-types/) (by SQLShack.com)
- [SSIS Performance Benchmarks](http://ssisperformance.com/)
- - [Statistic Parser](https://github.com/Jorriss/StatisticsParser) (by Richie Rump)
- [Using Excel to parse Set Statistics IO output](http://vickyharp.com/2012/03/using-excel-to-parse-set-statistics-io-output/) (by Vicky Harp)
- - [SQL Generator](https://github.com/Jorriss/sqlgenerator) (by Richie Rump)
- - [Columnstore Indexes Scripts Library](https://github.com/NikoNeugebauer/CISL) (by Niko Neugebauer)
- [Stackoverflow SQL Server](http://stackoverflow.com/questions/tagged/sql-server)
- [DBA Stackexchange SQL Server](http://dba.stackexchange.com/questions/tagged/sql-server)
- - [BIMLScript Learn resource](http://www.bimlscript.com/)
- - [SQL Server Connection Strings](http://www.connectionstrings.com/sql-server/)
+ - [Server Fault - is a question and answer site for system and network administrators](https://serverfault.com/)
+ - [SQL Server Connection Strings](https://www.connectionstrings.com/sql-server/)
+ - [SQL Connection String Generator for .NET](https://aireforge.com/Tools/ConnectionStringGenerator)
- [SQL Injection Cheat Sheet](https://www.netsparker.com/blog/web-security/sql-injection-cheat-sheet/) (by Ferruh Mavituna)
- [RSS Most Recent SQL Server KBs](https://support.microsoft.com/en-us/rss?rssid=1044)
- [Stackoverflow SQL Anti Patterns](http://stackoverflow.com/questions/346659/what-are-the-most-common-sql-anti-patterns)
- - [SQL Server Latch Classes Library](https://www.sqlskills.com/help/latches/) (by Paul S. Randal)
- [Azure Speed](http://www.azurespeed.com/) (by Blair Chen)
-
-
-## SQL Server Express direct download links
-Original post written by Scott Hanselman: http://www.hanselman.com/blog/DownloadSQLServerExpress.aspx
-Official Microsoft SQL Server Express page: https://www.microsoft.com/en-us/server-cloud/products/sql-server-editions/sql-server-express.aspx
-
-
-### [Download SQL Server 2014 Express](http://www.microsoft.com/en-us/download/details.aspx?id=42299)
-You likely just want SQL Server 2014 Express with Tools. This download includes SQL Management Studio:
- - [SQL Server 2014 Express x64](http://download.microsoft.com/download/E/A/E/EAE6F7FC-767A-4038-A954-49B8B05D04EB/ExpressAndTools%2064BIT/SQLEXPRWT_x64_ENU.exe)
- - [SQL Server 2014 Express x86](http://download.microsoft.com/download/E/A/E/EAE6F7FC-767A-4038-A954-49B8B05D04EB/ExpressAndTools%2032BIT/SQLEXPRWT_x86_ENU.exe)
-
-Here's just SQL Server 2014 Management Studio:
- - [SQL Management Studio x64](http://download.microsoft.com/download/E/A/E/EAE6F7FC-767A-4038-A954-49B8B05D04EB/MgmtStudio%2064BIT/SQLManagementStudio_x64_ENU.exe)
- - [SQL Management Studio x86](http://download.microsoft.com/download/E/A/E/EAE6F7FC-767A-4038-A954-49B8B05D04EB/MgmtStudio%2032BIT/SQLManagementStudio_x86_ENU.exe)
-
-SQL Server 2014 Express with Advanced Services:
- - [Advanced Services x64](http://download.microsoft.com/download/E/A/E/EAE6F7FC-767A-4038-A954-49B8B05D04EB/ExpressAdv%2064BIT/SQLEXPRADV_x64_ENU.exe)
- - [Advanced Services x86](http://download.microsoft.com/download/E/A/E/EAE6F7FC-767A-4038-A954-49B8B05D04EB/ExpressAdv%2032BIT/SQLEXPRADV_x86_ENU.exe)
-
-
-### [Download SQL Server 2012 Express](http://www.microsoft.com/en-us/download/details.aspx?id=29062)
-You likely just want SQL Server 2012 Express with Tools. This download includes SQL Management Studio:
- - [SQL Server 2012 Express x64](http://download.microsoft.com/download/8/D/D/8DD7BDBA-CEF7-4D8E-8C16-D9F69527F909/ENU/x64/SQLEXPRWT_x64_ENU.exe)
-
-Here's just SQL Server 2012 Management Studio:
- - [SQL Management Studio x64](http://download.microsoft.com/download/8/D/D/8DD7BDBA-CEF7-4D8E-8C16-D9F69527F909/ENU/x64/SQLManagementStudio_x64_ENU.exe)
- - [SQL Management Studio x86](http://download.microsoft.com/download/8/D/D/8DD7BDBA-CEF7-4D8E-8C16-D9F69527F909/ENU/x86/SQLManagementStudio_x86_ENU.exe)
-
-
-### [Download SQL Server 2008 Express R2 SP2](http://www.microsoft.com/en-us/download/details.aspx?id=30438)
-You likely just want SQL Server 2008 Express with Tools. This download includes SQL Management Studio:
- - [SQL Server 2008 Express x64](http://download.microsoft.com/download/0/4/B/04BE03CD-EAF3-4797-9D8D-2E08E316C998/SQLEXPRWT_x64_ENU.exe)
- - [SQL Server 2008 Express x86](http://download.microsoft.com/download/0/4/B/04BE03CD-EAF3-4797-9D8D-2E08E316C998/SQLEXPRWT_x86_ENU.exe)
-
-Here's just SQL Server 2008 Management Studio:
- - [SQL Management Studio x64](http://download.microsoft.com/download/0/4/B/04BE03CD-EAF3-4797-9D8D-2E08E316C998/SQLManagementStudio_x64_ENU.exe)
- - [SQL Management Studio x86](http://download.microsoft.com/download/0/4/B/04BE03CD-EAF3-4797-9D8D-2E08E316C998/SQLManagementStudio_x86_ENU.exe)
-
-
-### [Download SQL Server 2005 Express](https://www.microsoft.com/en-us/download/details.aspx?id=21844)
-
-
-## Microsoft Adventure Works Sample Databases download links
- - [AdventureWorks Sample Databases and Scripts for SQL Server 2016 CTP3](https://www.microsoft.com/en-us/download/details.aspx?id=49502)
- - [Microsoft SQL Server Community Projects & Samples](http://sqlserversamples.codeplex.com/)
- - [Adventure Works 2014 Sample Databases](https://msftdbprodsamples.codeplex.com/releases/view/125550)
- - [Adventure Works 2012 Sample Databases](http://msftdbprodsamples.codeplex.com/releases/view/55330)
- - [Microsoft SQL Server 2008 R2 SR1 Sample Databases](https://sqlserversamples.codeplex.com/releases/view/72278)
-
-
-## [Microsoft Transact-SQL Hints](https://msdn.microsoft.com/en-us/library/ms187713.aspx)
- - [Transact-SQL Join Hints](https://msdn.microsoft.com/en-us/library/ms173815.aspx)
- - [Transact-SQL Table Hints](https://msdn.microsoft.com/en-us/library/ms187373.aspx)
- - [Transact-SQL Query Hints](https://msdn.microsoft.com/en-us/library/ms181714.aspx)
+ - [SQLFiddle](http://sqlfiddle.com)
+ - [Experts-Exchange.com MS SQL Server Topics](https://www.experts-exchange.com/topics/ms-sql-server/)
+ - [Paste The Plan - share query plans quickly and easily](https://www.brentozar.com/pastetheplan/) (by Brent Ozar Team)
+ - [StackExchange DataExplorer Query On line](http://data.stackexchange.com/stackoverflow/query/new)
+ - [Dell Databases Wiki](http://en.community.dell.com/techcenter/storage/w/wiki/5018.sc-series-technical-documents) (by Doug Bernhardt)
+ - [SqlServerSearcher - open source C# tool for searching SQL Server objects](https://github.com/CoderAllan/SqlServerSearcher) (by Allan Simonsen)
+ - [DbUp is a .NET library that helps you to deploy changes to SQL Server databases](https://github.com/DbUp/DbUp)
+ - [SQL Server monitor - manages sql server performance](https://github.com/unruledboy/SQLMonitor) (by Wilson Chen)
+ - [How's My Plan? - .SQLPLAN analyzer](http://www.howsmyplan.com/) (by Daniel Janik)
+ - [Minion Backup - The new standard in SQL Server backups](http://minionware.net/backup/) (by Minionware)
+ - [Minion CheckDB - completes the MinionWare maintenance and backups suite](http://minionware.net/checkdb/) (by Minionware)
+ - [Minion Reindex - Index maintenance that is fully automated](http://minionware.net/reindex/) (by Minionware)
+ - [OrcaMDF - C# parser for MDF files](https://github.com/improvedk/OrcaMDF) (by Mark S. Rasmussen)
+ - [Microsoft SQL Server Zabbix templates](https://share.zabbix.com/databases/microsoft-sql-server)
+ - [Telegraf SQL Server Plugin](https://github.com/influxdata/telegraf/tree/master/plugins/inputs/sqlserver) (by influxdata)
+ - [SDU Tools - pure TSQL functions Toolkit](https://sqldownunder.com/sdu-tools/) (by SQLDownUnder)
+ - [Microsoft SQL Server Publications](https://www.microsoft.com/en-us/research/search/?q=sql+server&content-type=publications)
+ - [SQL Server Feedback](https://feedback.azure.com/forums/908035-sql-server)
+ - [Docs Overview SQL Tools](https://docs.microsoft.com/en-us/sql/tools/overview-sql-tools)
+ - [SQL ConstantCare®: clear, personal advice for your SQL Server](https://www.brentozar.com/sql-constantcare/) (by Brent Ozar)
+ - [The SQL Server Execution Plan Reference](https://sqlserverfast.com/epr/) (by Hugo Kornelis)
+ - [EC2 Instance Calculator](https://ec2instances.info/)
+ - [AWS Calculator](https://calculator.aws/#/)
+ - [Azure Instance Calculator](http://www.azureinstances.info/)
+ - [PowerBI Premium Calculator](https://powerbi.microsoft.com/en-us/calculator/)
+ - [Nuodb Oracle and SQL Server Calculator ](https://www.nuodb.com/product/license-cost-calculator)
+ - [Github SQL Trending](https://github.com/trending/sql)
+ - [SQLCallStackResolver - Utility to resolve SQL Server callstacks to their correct symbolic form](https://github.com/arvindshmicrosoft/SQLCallStackResolver) (by Arvind Shyamsundar)
+
+**[⬆ back to top](#table-of-contents)**
+
+
+## BIML Resources and Bloggers
+BIML - [Business Intelligence Markup Language](https://varigence.com/biml)
+
+BIML Resources
+- [BimlScript.com](http://bimlscript.com/)
+- [Varigence](https://varigence.com/Biml)
+- [Biml Forum at Varigence](https://varigence.com/Forums?forumName=Biml)
+- [SQLServerCentral.com](http://www.sqlservercentral.com/search/?q=Biml)
+- [Stairway to Biml](http://www.sqlservercentral.com/stairway/100550/)
+- [Biml User Group at LinkedIn](https://www.linkedin.com/groups/4640985)
+- [Building Blocks of Biml (Pluralsight course by Stacia Misner Varga)](https://app.pluralsight.com/library/courses/building-blocks-biml/table-of-contents)
+- [Biml-tagged posts on this blog](http://sqlblog.com/blogs/andy_leonard/archive/tags/BIML/default.aspx)
+
+BIML Bloggers
+- [Ben Weissman](https://www.solisyon.de/biml-blog-de/)
+- [Bill Fellows](http://billfellows.blogspot.com/search/label/Biml)
+- [Boris Hristov](http://borishristov.com/biml/)
+- [Brian Bønk](http://www.bonk.dk/biml/)
+- [Cathrine Wilhelmsen](http://www.cathrinewilhelmsen.net/biml/)
+- [Datachix: Julie Smith and Audrey Hammonds](http://datachix.com/)
+- [David Stein](http://www.made2mentor.com/category/biml/)
+- [Davide Mauri](http://sqlblog.com/blogs/davide_mauri/archive/tags/BIML/default.aspx)
+- [Erik Hudzik](http://www.anexinet.com/blog/author/ehudzik/)
+- [Hennie de Nooijer](http://bifuture.blogspot.com/search/label/BIML)
+- [John Welch](http://agilebi.com/jwelch/tag/biml/)
+- [Joost van Rossum](http://microsoft-ssis.blogspot.com/search/label/BIML)
+- [Koen Verbeeck](http://blogs.lessthandot.com/index.php/tag/biml/)
+- [Marco Schreuder](http://blog.in2bi.eu/biml/)
+- [Martin Andersson](http://www.frysdisken.net/)
+- [Meagan Longoria](https://datasavvy.wordpress.com/category/biml/)
+- [Nicholas Sorrell](http://sorrell.github.io/)
+- [Paul Te Braak](https://paultebraak.wordpress.com/tag/biml/)
+- [Peter Schott](http://schottsql.blogspot.com/search/label/BIML)
+- [Reeves Smith](https://reevessmith.wordpress.com/category/biml/)
+- [Roelant Vos](http://roelantvos.com/blog/?tag=biml)
+- [Rui Custódio](http://www.bi4all.pt/taxonomy/term/75)
+- [Samuel Vanga](http://samuelvanga.com/category/biml/)
+- [Stephen Leach](http://www.imgroup.com/author/stephen-leach/)
+- [Tim Mitchell](https://www.timmitchell.net/post/tag/biml/)
+- [Warwick Rudd](http://www.sqlmastersconsulting.com.au/SQL-Server-Blog/PID/1675/mcat/1682/evl/0/nsw/t/EDNSearch/Biml)
+
+**[⬆ back to top](#table-of-contents)**
## PowerShell and SQL Server
- [SQL Server & Windows Documentation Using Windows PowerShell](https://sqlpowerdoc.codeplex.com/) (by Kendal Vandyke)
- - [TSQL Code Smells Finder](https://tsqlsmells.codeplex.com/) (by Dave Ballantyne)
- [Stairway to SQL PowerShell](http://www.sqlservercentral.com/stairway/91327/) (by Ben Miller)
- [SQL Server Health Check Script with Powershell](http://www.codeproject.com/Tips/848661/SQL-Server-Health-Check-Script-with-Powershell) (by Atul Kapoor)
- - [Universal SQL Server Installation Scripts](https://github.com/ktaranov/Universal-SQL-Installation-Scripts) (by Prakash Heda)
- - [Powershell SQL Server Performance Health Check ](https://github.com/SpeedySQL/HealthCheck) (by Omid Afzalalghom)
- - [Performance Analysis of Logs (PAL) Tool](http://pal.codeplex.com/) (by svenhau and mikelag)
- - [PSCI - Powershell Continuous Integration](https://github.com/ObjectivityBSS/PSCI) (by Objectivity Bespoke Software Specialists)
- - [SQLTranscriptase - SQL Server Documentation in Powershell](https://github.com/vijaybandi/SQLTranscriptase) (by Vijay Bandi)
- - [SQLPSX](https://github.com/MikeShepard/SQLPSX) (by Mike Shepard)
- - [PowerShell dbatools for SQL Server](https://github.com/ctrlbold/dbatools) (by Chrissy LeMaire)
+ - [Universal SQL Server Installation Scripts](https://github.com/ktaranov/Universal-SQL-Installation-Scripts) (by Prakash Heda) (Github)
+ - [Powershell SQL Server Performance Health Check](https://github.com/SpeedySQL/HealthCheck) (by Omid Afzalalghom) (Github)
+ - [PSCI - Powershell Continuous Integration](https://github.com/ObjectivityBSS/PSCI) (by Objectivity Bespoke Software Specialists) (Github)
+ - [SQLTranscriptase - SQL Server Documentation in Powershell](https://github.com/vijaybandi/SQLTranscriptase) (by Vijay Bandi) (Github)
+ - [SQL Server PowerShell Extensions (SQLPSX)](https://github.com/MikeShepard/SQLPSX) (by Mike Shepard) (Github)
+ - [PowerShell dbatools for SQL Server](https://github.com/ctrlbold/dbatools) (by Chrissy LeMaire) (Github)
- [Create a Monitoring Server for SQL Server with PowerShell](https://www.simple-talk.com/sql/database-administration/create-a-monitoring-server-for-sql-server-with-powershell/) (by Laerte Junior)
- [PowerShell SQLPass articles and video](http://powershell.sqlpass.org/default.aspx)
- [PowerShell Blog NetNerds](https://blog.netnerds.net/)
- [QS Config](http://www.sqlhammer.com/qs-config/) (by Derik Hammer)
- [Idera 89 Free SQL Server PowerShell Scripts](https://www.idera.com/productssolutions/freetools/sqlpowershellscripts)
- - [Performance Analysis of Logs (PAL) Tool](https://pal.codeplex.com/)
+ - [Performance Analysis of Logs (PAL) Tool](https://github.com/clinthuffman/PAL) (by Clint Huffman)
+ - [Powershell SQL Server Library (PSSQLLib)](https://github.com/sanderstad/PSSQLLib) (by Sander Stad) (Github)
+ - [Trello Board: Powershell and SQL Client Tools](https://trello.com/b/NEerYXUU/powershell-sql-client-tools-sqlps-ssms)
+ - [PowerUpSQL: A PowerShell Toolkit for Attacking SQL Server](https://github.com/NetSPI/PowerUpSQL) (Github)
+ - [PowerShell DBA Reports](https://github.com/SQLDBAWithABeard/dbareports) (Github)
+ - [PowerShell sqlCheck](https://bitbucket.org/yardbirdsax/sqlcheck/src) (Bitbucket) (by Josh Feierman)
+ - [ReportingServicesTools - Reporting Services Powershell Tools](https://github.com/Microsoft/ReportingServicesTools) (by Microsoft)
+ - [Powershell xSQLServer module contains DSC resources for deployment and configuration of SQL Server](https://github.com/PowerShell/xSQLServer) (Github by Microsoft)
+ - [Export-DMVInformation - Export the resuts from Glenn Berry's DMV queries directly to Excel](https://github.com/sanderstad/Export-DMVInformation/) (Github) (by Sander Stad)
+ - [Export-QueryToSQLTable - Export one or more query results run against one or more instances/databases to table](https://github.com/SQLJana/Export-QueryToSQLTable) (by Jana Sattainathan) (Github)
+
+**[⬆ back to top](#table-of-contents)**
## TSQL Format Code
@@ -236,45 +442,85 @@ Here's just SQL Server 2008 Management Studio:
- http://www.ssmstoolspack.com/
- http://www.devart.com/dbforge/sql/sqlcomplete/
- http://www.sql-format.com/
+ - http://extras.sqlservercentral.com/prettifier/prettifier.aspx
+
+**[⬆ back to top](#table-of-contents)**
## SQL Server Test Data Generation
- https://www.simple-talk.com/sql/t-sql-programming/generating-test-data-in-tsql/
- - http://www.yandataellan.com/
- https://github.com/benkeen/generatedata
- https://sourceforge.net/projects/dbmonster/
- https://sourceforge.net/projects/spawner/
- http://databene.org/databene-benerator
- - http://stackoverflow.com/questions/591892/tools-for-generating-mock-data
+ - [Tools for Generating Mock Data?](https://stackoverflow.com/q/591892)
+ - https://mockaroo.com
+
+**[⬆ back to top](#table-of-contents)**
+
## Free SQL Server and R ebooks
- - [Avesome Red Gate ebooks](http://www.red-gate.com/community/books/)
+
+SQL Server:
+ - [Awesome Red Gate ebooks](http://www.red-gate.com/community/books/)
+ - SQL Developers
+ - [Defensive Database Programming](http://assets.red-gate.com/community/books/defensive-database-programming.pdf) (by Alex Kuznetsov)
+ - [Inside the SQL Server Query Optimizer](http://assets.red-gate.com/community/books/inside-the-sql-server-query-optimizer.pdf) (by Benjamin Nevarez)
+ - [SQL Server Execution Plans, 2nd Edition](http://assets.red-gate.com/community/books/sql-server-execution-plans-book.zip) (by Grant Fritchey)
+ - [SQL Server Source Control Basics](http://www.red-gate.com/products/sql-development/sql-source-control/entrypage/sql-server-source-control-basics) (by Robert Sheldon, Rob Richardson & Tony Davis)
+ - [The Art of XSD](http://assets.red-gate.com/community/books/the-art-of-xsd.pdf) (by Jacob Sebastian)
+ - [The Redgate Guide to SQL Server Team-based Development](http://assets.red-gate.com/products/sql-development/sql-source-control/entrypage/assets/RG_Guide_to_SQL_Server_Dev.pdf) (by Phil Factor, Grant Fritchey, Alex Kuznetsov, and Mladen Prajdić)
+ - [XML Stairway](https://assets.red-gate.com/simple-talk/stairway-to-xml.pdf)
+ - [119 SQL Code Smells](http://assets.red-gate.com/community/books/sql-code-smells.pdf)
+ - SQL DBA
+ - [SQL Server Internals: In-Memory OLTP](http://www.red-gate.com/library/sql-server-internals-in-memory-oltp) (by Kalen Delaney)
+ - [Fundamentals Of SQL Server 2012 Replication](http://assets.red-gate.com/community/books/fundamentals-of-sql-server-2012-replication.pdf) (by Sebastian Meine)
+ - [Tribal SQL](http://www.red-gate.com/library/tribal-sql)
+ - [SQL Server Transaction Log Management](http://assets.red-gate.com/offerings/transaction-log-management.pdf) (by Tony Davis and Gail Shaw)
+ - [The Art of SQL Server FILESTREAM](http://assets.red-gate.com/community/books/art-of-ss-filestream.pdf) (by Jacob Sebastian and Sven Aelterman)
+ - [SQL Server Concurrency: Locking, Blocking and Row Versioning](http://www.red-gate.com/library/sql-server-concurrency-locking-blocking-and-row-versioning) (by Kalen Delaney)
+ - [SQL Server Backup and Restore](http://assets.red-gate.com/community/books/sql-server-backup-and-restore.pdf) (by Shawn McGehee)
+ - [Troubleshooting SQL Server: A Guide for the Accidental DBA](http://assets.red-gate.com/products/dba/assets/Accidental_DBA_EBook.zip) (by Jonathan Kehayias and Ted Krueger )
+ - [SQL Server Hardware](http://assets.red-gate.com/community/books/sql-server-hardware-ebook.pdf) (by Glen Berry)
- [Microsoft huge collection](https://blogs.msdn.microsoft.com/mssmallbiz/2013/06/18/huge-collection-of-free-microsoft-ebooks-for-you-including-office-office-365-sharepoint-sql-server-system-center-visual-studio-web-development-windows-windows-azure-and-windows-server/)
- [Microsoft large collection](https://blogs.msdn.microsoft.com/mssmallbiz/2012/07/27/large-collection-of-free-microsoft-ebooks-for-you-including-sharepoint-visual-studio-windows-phone-windows-8-office-365-office-2010-sql-server-2012-azure-and-more/)
+ - [Largest FREE Microsoft eBook Giveaway!](https://blogs.msdn.microsoft.com/mssmallbiz/2017/07/11/largest-free-microsoft-ebook-giveaway-im-giving-away-millions-of-free-microsoft-ebooks-again-including-windows-10-office-365-office-2016-power-bi-azure-windows-8-1-office-2013-sharepo/)
- [Microsoft MVA Free ebooks](https://mva.microsoft.com/ebooks)
- [OnlineVideoLectures ebooks](http://onlinevideolecture.com/ebooks/?subject=SQL-Server)
- [Brent Ozar ebooks](http://www.brentozar.com/first-aid/free-database-books-pdfs-download/)
- - [E-books Directory](http://www.e-booksdirectory.com/listing.php?category=569)
+ - [E-books SQL Server Directory](http://www.e-booksdirectory.com/listing.php?category=569)
- [TOAD SQL Server ebooks](https://www.toadworld.com/platforms/sql-server/b/weblog/archive/2013/06/21/huge-collection-of-free-microsoft-sql-server-ebooks)
- [Syncfusion Techportal](http://syncfusion.com/resources/techportal)
- [Modern Storage Strategies for SQL Server](http://www.actualtech.io/gg-modern-storage/)
+ - [Migrating SQL Server Databases to Azure](https://blogs.msdn.microsoft.com/microsoft_press/2016/05/11/free-ebook-microsoft-azure-essentials-migrating-sql-server-databases-to-azure/)
+ - [SQL Sentry Free eBooks](https://www.sqlsentry.com/sql-server-books)
+ - [Microsoft Cloud Security for Enterprise Architects (PDF)](http://download.microsoft.com/download/6/d/f/6dfd7614-bbcf-4572-a871-e446b8cf5d79/msft_cloud_architecture_security.pdf)
+ - [Brent Ozar SQL Server Setup Checklist eBook](http://u.brentozar.com/eBook_SQL_Server_Setup_Checklist.pdf)
+ - [Introducing Microsoft SQL Server 2016](https://info.microsoft.com/Introducing-SQL-Server-2016-eBook.html)
+ - [Giving away millions of free Microsoft Ebooks](https://blogs.msdn.microsoft.com/mssmallbiz/2016/07/10/free-thats-right-im-giving-away-millions-of-free-microsoft-ebooks-again-including-windows-10-office-365-office-2016-power-bi-azure-windows-8-1-office-2013-sharepoint-2016-sha/) (by Eric Ligman)
+ - [Free Phil Factor eBook: Confessions of an IT Manager](https://www.simple-talk.com/opinion/opinion-pieces/free-phil-factor-ebook-confessions-of-an-it-manager/) (by Phil Factor)
+ - [Power BI from Rookie to Rock Star book](http://radacad.com/download-free-power-bi-book-pdf-format) (by Reza Rad)
+ - [Online Book: Analytics with Power BI and R](http://radacad.com/online-book-analytics-with-power-bi-and-r) (by Leila Etaati)
+ - [Architecture of a Database System](http://db.cs.berkeley.edu/papers/fntdb07-architecture.pdf) (by Joseph M. Hellerstein, Michael Stonebraker and James Hamilton)
+ - [Query Optimization with SentryOne Plan Explorer](https://info.sentryone.com/ebook-query-optimization-plan-explorer)
+ - [Troubleshooting SQL Server Performance](https://info.sentryone.com/ebook-troubleshooting-sql-server-performance) (by Kevin Kline)
+
+R:
+ - [BookDown - Write HTML, PDF, ePub, and Kindle books with R Markdown](https://bookdown.org)
+ - [FreeComputerBooks R EBooks](http://freecomputerbooks.com/langRBooks.html)
- [Effective Graphs with Microsoft R Open](http://blog.revolutionanalytics.com/2016/05/e-book-effective-graphs.html)
+ - [Little Book of R for Time Series](http://a-little-book-of-r-for-time-series.readthedocs.io/en/latest/index.html) (by Avril Coghlan)
+ - [Little Book of R for Biomedical Statistics](http://a-little-book-of-r-for-biomedical-statistics.readthedocs.io/en/latest/index.html) (by Avril Coghlan)
+ - [Little Book of R for Multivariate Analysis](http://little-book-of-r-for-multivariate-analysis.readthedocs.io/en/latest/index.html) (by Avril Coghlan)
+ - [Text Mining with R](http://tidytextmining.com/) (by Julia Silge and David Robinson)
+ - [An Introduction to Statistical Learning with Applications in R](http://www-bcf.usc.edu/~gareth/ISL/) (by Gareth James, Daniela Witten, Trevor Hastie and Robert Tibshirani)
+
+**[⬆ back to top](#table-of-contents)**
## License
-[MIT](/LICENSE.md)
+[MIT](/LICENSE)
-If some procedures or scripts are restricted due to **ELUA** (or we can't find original author), please email or add issue - we remove/update it immediately.
+If some procedures or scripts are restricted due to **ELUA** (or we can not find original author), please email us or add issue - we remove/update it immediately.
Thanks for understanding and patience.
-
-
-[licence badge]:https://img.shields.io/badge/license-MIT-blue.svg
-[stars badge]:https://img.shields.io/github/stars/ktaranov/sqlserver-kit.svg
-[forks badge]:https://img.shields.io/github/forks/ktaranov/sqlserver-kit.svg
-[issues badge]:https://img.shields.io/github/issues/ktaranov/sqlserver-kit.svg
-
-[licence]:https://github.com/ktaranov/sqlserver-kit/blob/master/LICENSE.md
-[stars]:https://github.com/ktaranov/sqlserver-kit/stargazers
-[forks]:https://github.com/ktaranov/sqlserver-kit/network
-[issues]:https://github.com/ktaranov/sqlserver-kit/issues
diff --git a/SQL Server DBCC List.md b/SQL Server DBCC List.md
index ac1a0304..c3933df7 100644
--- a/SQL Server DBCC List.md
+++ b/SQL Server DBCC List.md
@@ -3,19 +3,25 @@
Source links:
- [MSDN DBCC (Transact-SQL)](https://msdn.microsoft.com/en-us/library/ms188796.aspx)
- [SQL SERVER – DBCC commands List – documented and undocumented](http://blog.sqlauthority.com/2007/05/15/sql-server-dbcc-commands-list-documented-and-undocumented/) (by Pinal Dave)
+ - [Microsoft SQL Server DBCC Commands list](http://www.sqlservice.se/microsoft-sql-server-dbcc-commands/) (by Steinar Andersen)
+ - [Concept and basics of DBCC Commands in SQL Server](https://www.sqlshack.com/concept-and-basics-of-dbcc-commands-in-sql-server/) (by Mustafa EL-Masry)
-To learn about all the DBCC commands run following script in query analyzer.
-DBCC TRACEON(2520)
-DBCC HELP ('?')
+To learn about all the DBCC commands run following script in query analyzer:
+```
+DBCC TRACEON(2520);
+DBCC HELP ('?');
GO
+```
-To learn about syntax of an individual DBCC command run following script in query analyzer.
-DBCC HELP()
+To learn about syntax of an individual DBCC command run following script in query analyzer:
+```
+DBCC HELP();
GO
+```
Following is the list of all the DBCC commands and their syntax. List contains documented and undocumented DBCC commands.
-
+```
DBCC activecursors [(spid)]
DBCC addextendedproc (function_name, dll_name)
@@ -24,8 +30,7 @@ DBCC addinstance (objectname, instancename)
DBCC adduserobject (name)
-DBCC auditevent (eventclass, eventsubclass, success, loginname
-, rolename, dbusername, loginid)
+DBCC auditevent (eventclass, eventsubclass, success, loginname, rolename, dbusername, loginid)
DBCC autopilot (typeid, dbid, tabid, indid, pages [,flag])
@@ -41,32 +46,31 @@ DBCC cachestats
DBCC callfulltext
-DBCC checkalloc [('database_name'[, NOINDEX | REPAIR])] [WITH NO_INFOMSGS[, ALL_ERRORMSGS][, ESTIMATEONLY]]
+DBCC CHECKALLOC [('database_name'[, NOINDEX | REPAIR])] [WITH NO_INFOMSGS[, ALL_ERRORMSGS][, ESTIMATEONLY]] https://msdn.microsoft.com/en-us/library/ms188422.aspx
-DBCC checkcatalog [('database_name')] [WITH NO_INFOMSGS]
+DBCC CHECKCATALOG [('database_name')] [WITH NO_INFOMSGS] https://msdn.microsoft.com/en-us/library/ms186720.aspx
-DBCC checkconstraints [( 'tab_name' | tab_id | 'constraint_name' | constraint_id )] [WITH ALL_CONSTRAINTS | ALL_ERRORMSGS]
+DBCC CHECKCONSTRAINTS [( 'tab_name' | tab_id | 'constraint_name' | constraint_id )] [WITH ALL_CONSTRAINTS | ALL_ERRORMSGS] https://msdn.microsoft.com/en-us/library/ms189496.aspx
-DBCC checkdb [('database_name'[, NOINDEX | REPAIR])] [WITH NO_INFOMSGS[, ALL_ERRORMSGS] [, PHYSICAL_ONLY][, ESTIMATEONLY][,DBCC TABLOCK]
+DBCC CHECKDB [('database_name'[, NOINDEX | REPAIR])] [WITH NO_INFOMSGS[, ALL_ERRORMSGS] [, PHYSICAL_ONLY][, ESTIMATEONLY][,DBCC TABLOCK] https://msdn.microsoft.com/en-us/library/ms176064.aspx
DBCC checkdbts (dbid, newTimestamp)]
-DBCC checkfilegroup [( [ {'filegroup_name' | filegroup_id} ] [, NOINDEX] )] [WITH NO_INFOMSGS
-[, ALL_ERRORMSGS][, PHYSICAL_ONLY][, ESTIMATEONLY][, TABLOCK]]
+DBCC checkfilegroup [( [ {'filegroup_name' | filegroup_id} ] [, NOINDEX] )] [WITH NO_INFOMSGS[, ALL_ERRORMSGS][, PHYSICAL_ONLY][, ESTIMATEONLY][, TABLOCK]]
DBCC checkident ('table_name'[, { NORESEED | {RESEED [, new_reseed_value] } } ] )
DBCC checkprimaryfile ( {'FileName'} [, opt={0|1|2|3} ])
-DBCC checktable ('table_name'[, {NOINDEX | index_id | REPAIR}])
-[WITH NO_INFOMSGS[, ALL_ERRORMSGS] [, PHYSICAL_ONLY][, ESTIMATEONLY][, TABLOCK]]
+DBCC CHECKTABLE ('table_name'[, {NOINDEX | index_id | REPAIR}]) [WITH NO_INFOMSGS[, ALL_ERRORMSGS] [, PHYSICAL_ONLY][, ESTIMATEONLY][, TABLOCK]] https://msdn.microsoft.com/en-us/library/ms174338.aspx
DBCC cleantable ('database_name'|database_id, 'table_name'|table_id,[batch_size])
DBCC cacheprofile [( {actionid} [, bucketid])
-DBCC clearspacecaches ('database_name'|database_id,
-'table_name'|table_id, 'index_name'|index_id)
+DBCC clearspacecaches ('database_name'|database_id, 'table_name'|table_id, 'index_name'|index_id)
+
+DBCC CLONEDATABASE https://support.microsoft.com/en-us/kb/3177838
DBCC collectstats (on | off)
@@ -102,8 +106,7 @@ DBCC dropextendedproc (function_name)
DBCC dropuserobject ('object_name')
-DBCC dumptrigger ({'BREAK', {0 | 1}} | 'DISPLAY' | {'SET', exception_number}
-| {'CLEAR', exception_number})
+DBCC dumptrigger ({'BREAK', {0 | 1}} | 'DISPLAY' | {'SET', exception_number} | {'CLEAR', exception_number})
DBCC errorlog
@@ -122,7 +125,7 @@ DBCC flushprocindb (database)
DBCC free dll_name (FREE)
-DBCC freeproccache
+DBCC FREEPROCCACHE [ ( { plan_handle | sql_handle | pool_name } ) ] [ WITH NO_INFOMSGS ] https://www.brentozar.com/archive/2016/02/when-shrinking-tempdb-just-wont-shrink/ https://msdn.microsoft.com/en-us/library/ms174283.aspx
dbcc freeze_io (db)
@@ -139,7 +142,7 @@ dbcc ind ( { 'dbname' | dbid }, { 'objname' | objid }, { indid | 0 | -1 | -2 } )
DBCC indexdefrag ({dbid | dbname | 0}, {tableid | tablename}, {indid |indname})
-DBCC inputbuffer (spid)
+DBCC INPUTBUFFER ( session_id [ , request_id ]) [WITH NO_INFOMSGS ] https://msdn.microsoft.com/en-us/library/ms187730.aspx
DBCC invalidate_textptr (textptr)
@@ -156,8 +159,7 @@ DBCC lock ([{'DUMPTABLE' | 'DUMPSTATS' | 'RESETSTATS' | 'HASH'}] |
DBCC lockobjectschema ('object_name')
-DBCC log ([dbid[,{0|1|2|3|4}[,['lsn','[0x]x:y:z']|['numrecs',num]|['xdesid','x:y'] |['extent','x:y']|['pageid','x:y']|['objid',{x,'y'}]|['logrecs',
-{'lop'|op}…]|['output',x,['filename','x']]…]]])
+DBCC log ([dbid[,{0|1|2|3|4}[,['lsn','[0x]x:y:z']|['numrecs',num]|['xdesid','x:y'] |['extent','x:y']|['pageid','x:y']|['objid',{x,'y'}]|['logrecs', {'lop'|op}…]|['output',x,['filename','x']]…]]])
DBCC loginfo [({'database_name' | dbid})]
@@ -190,18 +192,15 @@ DBCC perflog
DBCC perfmon
-DBCC pglinkage (dbid, startfile, startpg, number, printopt={0|1|2}
-, targetfile, targetpg, order={1|0})
+DBCC pglinkage (dbid, startfile, startpg, number, printopt={0|1|2}, targetfile, targetpg, order={1|0})
DBCC pintable (database_id, table_id)
-DBCC procbuf [({'dbname' | dbid}[, {'objname' | objid}
-[, nbufs[, printopt = { 0 | 1 } ]]] )]
+DBCC procbuf [({'dbname' | dbid}[, {'objname' | objid}[, nbufs[, printopt = { 0 | 1 } ]]] )]
DBCC proccache
-DBCC prtipage (dbid, objid, indexid [, [{{level, 0}
-| {filenum, pagenum}}] [,printopt]])
+DBCC prtipage (dbid, objid, indexid [, [{{level, 0} | {filenum, pagenum}}] [,printopt]])
DBCC pss [(uid[, spid[, printopt = { 1 | 0 }]] )]
@@ -247,13 +246,11 @@ DBCC showweights
DBCC shrinkdatabase ({dbid | 'dbname'}, [freespace_percentage
[, {NOTRUNCATE | TRUNCATEONLY}]])
-DBCC shrinkfile ({fileid | 'filename'}, [compress_size
-[, {NOTRUNCATE | TRUNCATEONLY | EMPTYFILE}]])
+DBCC shrinkfile ({fileid | 'filename'}, [compress_size[, {NOTRUNCATE | TRUNCATEONLY | EMPTYFILE}]])
DBCC sqlmgrstats
-DBCC sqlperf (LOGSPACE)({IOSTATS | LRUSTATS | NETSTATS | RASTATS [, CLEAR]}
-| {THREADS} | {LOGSPACE})
+DBCC SQLPERF (LOGSPACE)({IOSTATS | LRUSTATS | NETSTATS | RASTATS [, CLEAR]} | {THREADS} | {LOGSPACE}) https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-sqlperf-transact-sql
DBCC stackdump [( {uid[, spid[, ecid]} | {threadId, 'THREADID'}] )]
@@ -261,7 +258,7 @@ DBCC tab ( dbid, objid )
DBCC tape_control {'query' | 'release'}[,('.tape')]
-DBCC tec [( uid[, spid[, ecid]] )]
+DBCC TEC [( uid[, spid[, ecid]] )] http://sqlonice.com/context-in-perspective-6-taking-sessions-to-task/
DBCC textall [({'database_name'|database_id}[, 'FULL' | FAST] )]
@@ -273,7 +270,7 @@ DBCC traceoff [( tracenum [, tracenum … ] )]
DBCC traceon [( tracenum [, tracenum … ] )]
-DBCC tracestatus (trace# [, …trace#])
+DBCC TRACESTATUS ( [ [ trace# [ ,...n ] ] [ , ] [ -1 ] ] ) [ WITH NO_INFOMSGS ] https://msdn.microsoft.com/en-us/library/ms187809.aspx
DBCC unpintable (dbid, table_id)
@@ -289,3 +286,5 @@ DBCC useroptions DBCC wakeup (spid)
DBCC writepage ({ dbid, 'dbname' }, fileid, pageid, offset, length, data)
+DBCC OPTIMIZER_WHATIF ({property/cost_number | property_name} [, {integer_value | string_value} ]) http://www.sqlhammer.com/dbcc-optimizer_whatif-spoofing-production-hardware
+```
diff --git a/SQL Server Data Types.md b/SQL Server Data Types.md
index 2435ad29..7ce21e14 100644
--- a/SQL Server Data Types.md
+++ b/SQL Server Data Types.md
@@ -1,17 +1,37 @@
# Microsoft SQL Server Data Types
-Complete list of all Microsoft SQL Server Data Types
+Detailed information about Microsoft SQL Server Data Types and its mapping to another databases and program languages analog.
+
+## Table of Contents:
+ - [Source link](#source-link)
+ - [Data Type Precedence (Transact-SQL)](#data-type-precedence)
+ - [Data Type Synonyms (Transact-SQL)](#data-type-synonyms)
+ - [Precision, Scale, and Length (Transact-SQL)](#precision-scale-and-length)
+ - [SQL Server, SSIS and Biml Data Types](#sql-server-ssis-and-biml-data-types)
+ - [SQL Server Data Types Length](#sql-server-data-types-length)
+ - [SQL Server to MySQL, Oracle, PostgreSQL and SQLite Data Type Mapping](#sql-server-to-mysql-oracle-postgresql-sqlite)
+
## Source link
- - [MSDN Data Types](https://msdn.microsoft.com/en-us/library/ms187752.aspx)
- - [MSDN Data Type Precedence](https://msdn.microsoft.com/en-us/library/ms190309.aspx)
- - [MSDN Data Type Synonyms](https://msdn.microsoft.com/en-us/library/ms177566.aspx)
- - [MSDN Precision, Scale, and Length](https://msdn.microsoft.com/en-us/library/ms190476.aspx)
- - [Integration Services Data Types](https://msdn.microsoft.com/en-us/library/ms141036.aspx)
- - [DbType Enumeration](https://msdn.microsoft.com/en-us/library/System.Data.DbType.aspx)
+
+ - [Data Types (Transact-SQL)](https://docs.microsoft.com/en-us/sql/t-sql/data-types/data-types-transact-sql)
+ - [Data Type Precedence (Transact-SQL)](https://docs.microsoft.com/en-us/sql/t-sql/data-types/data-type-precedence-transact-sql)
+ - [Data Type Synonyms (Transact-SQL)](https://docs.microsoft.com/en-us/sql/t-sql/data-types/data-type-synonyms-transact-sql)
+ - [Precision, Scale, and Length](https://docs.microsoft.com/en-us/sql/t-sql/data-types/precision-scale-and-length-transact-sql)
+ - [Integration Services Data Types](https://docs.microsoft.com/en-us/sql/integration-services/data-flow/integration-services-data-types)
+ - [DbType Enumeration](https://docs.microsoft.com/en-us/dotnet/api/system.data.dbtype)
- [SQL Server, SSIS and Biml Data Types](http://www.cathrinewilhelmsen.net/2014/05/27/sql-server-ssis-and-biml-data-types/)
- - [SQL Server Integration Services, Data Type Mapping ](http://milambda.blogspot.ru/2014/02/sql-server-integration-services-data.html)
+ - [SQL Server Integration Services, Data Type Mapping](http://milambda.blogspot.ru/2014/02/sql-server-integration-services-data.html)
+ - [SQL Server Data Type Conversion](https://msdn.microsoft.com/en-us/library/ms191530.aspx)
+ - [SQL Server to MySQL Data Type Conversion](https://convertdb.com/mysql_mssql_mapping)
+ - [SQL Server to Oracle Data Type Conversion](https://docs.oracle.com/cd/B19306_01/gateways.102/b14270/apa.htm)
+ - [SQL Server to PostgreSQL Data Type Conversion](http://www.sqlines.com/sql-server-to-postgresql)
+ - [SQL Server to SQLite Data Type Conversion](http://ericsink.com/mssql_mobile/data_types.html)
+
+**[⬆ back to top](#table-of-contents)**
+
## Data Type Precedence (Transact-SQL)
+
When an operator combines two expressions of different data types, the rules for data type precedence specify that the data type with the lower precedence is converted to the data type with the higher precedence.
If the conversion is not a supported implicit conversion, an error is returned.
When both operand expressions have the same data type, the result of the operation has that data type.
@@ -47,38 +67,44 @@ SQL Server uses the following precedence order for data types:
28. varbinary (including varbinary(max) )
29. binary (lowest)
+**[⬆ back to top](#table-of-contents)**
+
## Data Type Synonyms (Transact-SQL)
+
Data type synonyms are included in SQL Server for ISO compatibility.
The following table lists the synonyms and the SQL Server system data types that they map to.
-| Synonym | SQL Server system data type |
-|-------------------------------|-----------------------------|
-| Binary varying | varbinary |
-| char varying | varchar |
-| character | char |
-| character | char(1) |
-| character(n) | char(n) |
-| character varying(n) | varchar(n) |
-| Dec | decimal |
-| Double precision | float |
-| float[(n)] for n = 1-7 | real |
-| float[(n)] for n = 8-15 | float |
-| integer | int |
-| national character(n) | nchar(n) |
-| national char(n) | nchar(n) |
-| national character varying(n) | nvarchar(n) |
-| national char varying(n) | nvarchar(n) |
-| national text | ntext |
-| timestamp | rowversion |
+| Synonym | System data type |
+|-------------------------------|------------------|
+| Binary varying | varbinary |
+| char varying | varchar |
+| character | char |
+| character | char(1) |
+| character(n) | char(n) |
+| character varying(n) | varchar(n) |
+| Dec | decimal |
+| Double precision | float |
+| float[(n)] for n = 1-7 | real |
+| float[(n)] for n = 8-15 | float |
+| integer | int |
+| national character(n) | nchar(n) |
+| national char(n) | nchar(n) |
+| national character varying(n) | nvarchar(n) |
+| national char varying(n) | nvarchar(n) |
+| national text | ntext |
+| timestamp | rowversion |
Data type synonyms can be used instead of the corresponding base data type name in data definition language (DDL) statements, such as CREATE TABLE, CREATE PROCEDURE, or DECLARE @variable.
However, after the object is created, the synonyms have no visibility.
When the object is created, the object is assigned the base data type that is associated with the synonym.
There is no record that the synonym was specified in the statement that created the object.
+**[⬆ back to top](#table-of-contents)**
+
## Precision, Scale, and Length (Transact-SQL)
+
Precision is the number of digits in a number. Scale is the number of digits to the right of the decimal point in a number. For example, the number 123.45 has a precision of 5 and a scale of 2.
In SQL Server, the default maximum precision of numeric and decimal data types is 38. In earlier versions of SQL Server, the default maximum is 28.
@@ -107,51 +133,216 @@ The operand expressions are denoted as expression e1, with precision p1 and scal
| e1 / e2 | p1 - s1 + s2 + max(6, s1 + p2 + 1) | max(6, s1 + p2 + 1) |
| e1 { UNION \| EXCEPT \| INTERSECT } e2 | max(s1, s2) + max(p1-s1, p2-s2) | max(s1, s2) |
| e1 % e2 | min(p1-s1, p2 -s2) + max( s1,s2 ) | max(s1, s2) |
+
\* The result precision and scale have an absolute maximum of 38. When a result precision is greater than 38, the corresponding scale is reduced to prevent the integral part of a result from being truncated.
+**[⬆ back to top](#table-of-contents)**
+
## SQL Server, SSIS and Biml Data Types
-The table below shows a simplified mapping between SQL Server, SSIS and Biml data types. The table does not include all possible mappings or all data types, but is meant as a quick reference while developing and learning Biml.
-
-| SQL Server | SSIS | Biml |
-|------------------|----------------------|-----------------------|
-| bigint | DT_I8 | Int64 |
-| binary | DT_BYTES | Binary |
-| bit | DT_BOOL | Boolean |
-| char | DT_STR | AnsiStringFixedLength |
-| date | DT_DBDATE | Date |
-| datetime | DT_DBTIMESTAMP | DateTime |
-| datetime2 | DT_DBTIMESTAMP2 | DateTime2 |
-| datetimeoffset | DT_DBTIMESTAMPOFFSET | DateTimeOffset |
-| decimal | DT_NUMERIC | Decimal |
-| float | DT_R8 | Double |
-| geography | DT_IMAGE | Object |
-| geometry | DT_IMAGE | Object |
-| hierarchyid | DT_BYTES | Object |
-| image (*) | DT_IMAGE | Binary |
-| int | DT_I4 | Int32 |
-| money | DT_CY | Currency |
-| nchar | DT_WSTR | StringFixedLength |
-| ntext (*) | DT_NTEXT | String |
-| numeric | DT_NUMERIC | Decimal |
-| nvarchar | DT_WSTR | String |
-| nvarchar(max) | DT_NTEXT | String |
-| real | DT_R4 | Single |
-| rowversion | DT_BYTES | Binary |
-| smalldatetime | DT_DBTIMESTAMP | DateTime |
-| smallint | DT_I2 | Int16 |
-| smallmoney | DT_CY | Currency |
-| sql_variant | DT_WSTR | Object |
-| text (*) | DT_TEXT | AnsiString |
-| time | DT_DBTIME2 | Time |
-| timestamp (*) | DT_BYTES | Binary |
-| tinyint | DT_UI1 | Byte |
-| uniqueidentifier | DT_GUID | Guid |
-| varbinary | DT_BYTES | Binary |
-| varbinary(max) | DT_IMAGE | Binary |
-| varchar | DT_STR | AnsiString |
-| varchar(max) | DT_TEXT | AnsiString |
-| xml | DT_NTEXT | Xml |
+
+The table below shows a simplified mapping between SQL Server, SSIS and Biml data types.
+The table does not include all possible mappings or all data types, but is meant as a quick reference while developing and learning Biml.
+
+| SQL Server | SSIS Variables | SSIS Pipeline Buffer | OLE DB | ADO.NET | Biml |
+|--------------------|----------------|----------------------|-------------------|-------------------|-----------------------|
+| [bigint][1] | Int64 | DT_I8 | LARGE_INTEGER | Int64 | Int64 |
+| [binary][8] | Object | DT_BYTES | - | Binary | Binary |
+| [bit] | Boolean | DT_BOOL | VARIANT_BOOL | Boolean | Boolean |
+| [char][5] | String | DT_STR | VARCHAR | StringFixedLength | AnsiStringFixedLength |
+| [date] | Object | DT_DBDATE | DBDATE | Date | Date |
+| [datetime] | DateTime | DT_DBTIMESTAMP | DATE | DateTime | DateTime |
+| [datetime2] | Object | DT_DBTIMESTAMP2 | DBTIME2 | DateTime2 | DateTime2 |
+| [datetimeoffset] | Object | DT_DBTIMESTAMPOFFSET | DBTIMESTAMPOFFSET | DateTimeOffset | DateTimeOffset |
+| [decimal][2] | Decimal | DT_NUMERIC | NUMERIC | Decimal | Decimal |
+| [float][4] | Double | DT_R8 | FLOAT | Double | Double |
+| [geography] | - | DT_IMAGE | - | Object | Object |
+| [geometry] | - | DT_IMAGE | - | Object | Object |
+| [hierarchyid] | - | DT_BYTES | - | Object | Object |
+| [image] (*) | Object | DT_IMAGE | - | Binary | Binary |
+| [int][1] | Int32 | DT_I4 | LONG | Int32 | Int32 |
+| [money][3] | Object | DT_CY, DT_NUMERIC | CURRENCY | Currency | Currency |
+| [nchar][5] | String | DT_WSTR | NVARCHAR | StringFixedLength | StringFixedLength |
+| [ntext] (*) | String | DT_NTEXT | - | String | String |
+| [numeric] | Decimal | DT_NUMERIC | NUMERIC | Decimal | Decimal |
+| [nvarchar][5] | String | DT_WSTR | NVARCHAR | String | String |
+| [nvarchar](max) | Object | DT_NTEXT | - | - | String |
+| [real] | Single | DT_R4 | FLOAT, DOUBLE | Single | Single |
+| [rowversion] | Object | DT_BYTES | - | Binary | Binary |
+| [smalldatetime] | DateTime | DT_DBTIMESTAMP | DATE | DateTime | DateTime |
+| [smallint][1] | Int16 | DT_I2 | SHORT | Int16 | Int16 |
+| [smallmoney][3] | Object | DT_CY, DT_NUMERIC | CURRENCY | Currency | Currency |
+| [sql_variant] | Object | DT_WSTR, DT_NTEXT | - | Object | Object |
+| [table] | Object | - | - | - | - |
+| [text] (*) | Object | DT_TEXT | - | - | AnsiString |
+| [time] | Object | DT_DBTIME2 | DBTIME2 | Time | Time |
+| [timestamp] (*) | Object | DT_BYTES | - | Binary | Binary |
+| [tinyint][1] | Byte | DT_UI1 | BYTE | Byte | Byte |
+| [uniqueidentifier] | String, Object | DT_GUID | GUID | Guid | Guid |
+| [varbinary][8] | Object | DT_BYTES | - | Binary | Binary |
+| [varbinary(max)][8]| Object | DT_IMAGE | - | Binary | Binary |
+| [varchar][5] | String | DT_STR | VARCHAR | String | AnsiString |
+| [varchar](max) | Object | DT_TEXT | - | - | AnsiString |
+| [xml] | Object | DT_NTEXT | - | - | Xml |
+
+(\* *These data types will be removed in a future version of SQL Server. Avoid using these data types in new projects, and try to change them in current projects*)
+
+**[⬆ back to top](#table-of-contents)**
+
+
+## SQL Server Data Types Length
+
+
+| General Type | Type | N value | Precision | Storage size, bytes | Range (in SQL Server) |
+|-----------------------|--------------------|----------------|-----------------------------------|----------------------:|------------------------------------------------------------------------------------------------------------------------------------------------|
+| Exact Numerics | [bit] | | | 1 | 1, 0 |
+| Exact Numerics | [tinyint][1] | | | 1 | 0 to 255 |
+| Exact Numerics | [smallint][1] | | | 2 | -2^15(-32768) to 2^15(32767) |
+| Exact Numerics | [int][1] | | | 4 | -2^31(-2 147 483 648) to 2^31(2 147 483 647) |
+| Exact Numerics | [bigint][1] | | | 8 | -2^63(-9 233 372 036 854 775 808) to 2^63(9 233 372 036 854 775 807) |
+| Exact Numerics | [decimal][2] | | 1-9 10-19 20-28 29-38 | 5 9 13 17 | from -10^38 +1 through 10^38 -1 |
+| Exact Numerics | [smallmoney][3] | | | 4 | -214 748.3648 to 214 748.3647 |
+| Exact Numerics | [money][3] | | | 8 | -922 337 203 685 477.5808 to 922 337 203 685 477.5807 |
+| Approximate Numerics | [float][4] | 1-24 25-53 | 7 15 | 4 8 | -3.40E+38 to -1.18E-38, 0 and 1.18E-38 to 3.40E+38 -1.79E+308 to -2.23E-308, 0 and 2.23E-308 to 1.79E+308 |
+| Date and Time | [date] | | | 3 | 0001-01-01 through 9999-12-31 January 1, 1 CE through December 31, 9999 CE |
+| Date and Time | [smalldatetime] | | | 4 | 1900-01-01 through 2079-06-06 January 1, 1900 through June 6, 2079 00:00:00 through 23:59:59 |
+| Date and Time | [time] | | 8-11 12-13 14-16 | 3 4 5 | 00:00:00.0000000 through 23:59:59.9999999 |
+| Date and Time | [datetime2] | | 1-2 3-4 5-7 | 6 7 8 | 0001-01-01 through 9999-12-31 January 1, 1 CE through December 31, 9999 CE 00:00:00 through 23:59:59.9999999 |
+| Date and Time | [datetime] | | | 8 | anuary 1, 1753 through December 31, 9999 00:00:00 through 23:59:59.997 |
+| Date and time | [datetimeoffset] | | 26-29 30-34 | 8 10 | 0001-01-01 through 9999-12-31 January 1, 1 CE through December 31, 9999 CE 00:00:00 through 23:59:59.9999999 -14:00 throuth +14:00 |
+| Character Strings | [char][5] | 1-8000 | | n | |
+| Character Strings | [varchar][5] | 1-8000 | | n + 2 | |
+| Character Strings | [varchar](max) | 1-(2^31 - 1) | | 2^31 - 1 + 2 | |
+| Character Strings | [nchar][5] | 1-4000 | | | |
+| Character Strings | [nvarchar][5] | 1-4000 | | | |
+| Character Strings | [nvarchar](max) | 1-(2^31 - 1) | | | |
+| Character Strings | [ntext](*) | 1-(2^30 - 1) | | n + n | |
+| Character Strings | [text](*) | 1-(2^31 - 1) | | | |
+| Binary Strings | [image](*) | 1-(2^31 - 1) | | n | |
+| Binary Strings | [binary][8] | 1-8000 | | n | |
+| Binary Strings | [varbinary][8] | 1-8000 | | n | |
+| Binary Strings | [varbinary(max)][8]| 1-(2^31 - 1) | | n + 2 | |
+| Other Data Types | [cursor] | | | | |
+| Other Data Types | [sql_variant] | | | max 8016 | |
+| Other Data Types | [hierarchyid] | | | max 892 | |
+| Other Data Types | [rowversion] | | | 8 | |
+| Other Data Types | [timestamp](*) | | | | |
+| Other Data Types | [uniqueidentifier] | | | 16 | |
+| Other Data Types | [xml] | | | max 2Gb | |
+| Other Data Types | [table] | | | | |
+| Spatial Data Types | [geometry] | | | | |
+| Spatial Data Types | [geography] | | | | |
+
+**[⬆ back to top](#table-of-contents)**
+
+
+## SQL Server to MySQL, Oracle, PostgreSQL, SQLite Data Type Mapping
+
+
+Common data-type conversions between SQL Server, Oracle, Sybase ASE, and DB2.
+More details [here](https://www.sqlserverscience.com/documentation/common-data-type-conversions-between-sql-server-oracle-sybase-ase-and-db2/)
+
+| Source | Destination |
+|-------------|-------------|
+| MSSQLSERVER | DB2 |
+| MSSQLSERVER | ORACLE |
+| MSSQLSERVER | SYBASE |
+| ORACLE | MSSQLSERVER |
+
+```tsql
+DECLARE @source_dbms SYSNAME = N'%'
+ , @source_version SYSNAME = N'%'
+ , @source_type SYSNAME = N'%'
+ , @destination_dbms SYSNAME = N'%'
+ , @destination_version SYSNAME = N'%'
+ , @destination_type SYSNAME = N'%'
+ , @defaults_only BIT = 0;
+
+SELECT *
+FROM sys.fn_helpdatatypemap (
+ @source_dbms
+ , @source_version
+ , @source_type
+ , @destination_dbms
+ , @destination_version
+ , @destination_type
+ , @defaults_only
+ );
+```
+
+| General Type | Type | MySQL | Oracle | PostgreSQL | SQLite |
+|-----------------------|--------------------|---------------------------------|---------------|-----------------------------|--------:|
+| Exact Numerics | [bit] | [TINYINT(1)][20] | NUMBER(3) | BOOLEAN | INTEGER |
+| Exact Numerics | [tinyint][1] | [TINYINT(3) UNSIGNED][20] | NUMBER(3) | SMALLINT | INTEGER |
+| Exact Numerics | [smallint][1] | [SMALLINT][20] | NUMBER(5) | SMALLINT | INTEGER |
+| Exact Numerics | [int][1] | [INT][20] | NUMBER(10) | INT | INTEGER |
+| Exact Numerics | [bigint][1] | [BIGINT][20] | NUMBER(19) | BIGINT | INTEGER |
+| Exact Numerics | [decimal][2] | [DECIMAL][21] | NUMBER(p[,s]) | DECIMAL(p,s) | REAL |
+| Exact Numerics | [smallmoney][3] | [DECIMAL(10,4)][21] | NUMBER(10,4) | MONEY | REAL |
+| Exact Numerics | [money][3] | [DECIMAL(19,4)][21] | NUMBER(19,4) | MONEY | REAL |
+| Approximate Numerics | [float][4] | [FLOAT][22] | FLOAT(49) | DOUBLE PRECISION | REAL |
+| Date and Time | [date] | [DATE][22] | DATE | DATE | TEXT |
+| Date and Time | [smalldatetime] | [TIMESTAMP][23] | DATE | TIMESTAMP(0) | TEXT |
+| Date and Time | [time] | [TIME][24] | | TIME | TEXT |
+| Date and Time | [datetime2] | [DATETIME][23] | | TIMESTAMP | TEXT |
+| Date and Time | [datetime] | [DATETIME][23] | DATE | TIMESTAMP(3) | TEXT |
+| Date and time | [datetimeoffset] | | | TIMESTAMP with time zone| TEXT |
+| Character Strings | [char][5] | CHAR | CHAR | CHAR | TEXT |
+| Character Strings | [varchar][5] | VARCHAR | VARCHAR2 | VARCHAR | TEXT |
+| Character Strings | [varchar](max) | LONGTEXT | VARCHAR2 | TEXT | TEXT |
+| Character Strings | [nchar][5] | NCHAR | | NCHAR | TEXT |
+| Character Strings | [nvarchar][5] | VARCHAR with character set utf8 | NCHAR | VARCHAR | TEXT |
+| Character Strings | [nvarchar](max) | LONGTEXT | NCHAR | TEXT | TEXT |
+| Character Strings | [ntext][4] (*) | | LONG | TEXT | TEXT |
+| Character Strings | [text][4] (*) | | LONG | TEXT | TEXT |
+| Binary Strings | [image][4] (*) | LONGBLOB | LONG RAW | BYTEA | BLOB |
+| Binary Strings | [binary][8] | BINARY | RAW | BYTEA | BLOB |
+| Binary Strings | [varbinary][8] | | RAW | BYTEA | BLOB |
+| Binary Strings | [varbinary(max)][8]| LONGTEXT | RAW | BYTEA | BLOB |
+| Other Data Types | [cursor] | | | | TEXT |
+| Other Data Types | [sql_variant] | BLOB | | | TEXT |
+| Other Data Types | [hierarchyid] | | | | TEXT |
+| Other Data Types | [rowversion] | | | BYTEA | TEXT |
+| Other Data Types | [timestamp] (*) | | RAW | BYTEA | TEXT |
+| Other Data Types | [uniqueidentifier] | CHAR | CHAR(36) | CHAR(16) | TEXT |
+| Other Data Types | [xml] | | | XML | TEXT |
+| Other Data Types | [table] | | | | - |
+| Spatial Data Types | [geometry] | | | VARCHAR | TEXT |
+| Spatial Data Types | [geography] | | | VARCHAR | TEXT |
+
+**[⬆ back to top](#table-of-contents)**
(\* *These data types will be removed in a future version of SQL Server. Avoid using these data types in new projects, and try to change them in current projects*)
+[1]:https://docs.microsoft.com/sql/t-sql/data-types/int-bigint-smallint-and-tinyint-transact-sql
+[2]:https://docs.microsoft.com/sql/t-sql/data-types/decimal-and-numeric-transact-sql
+[3]:https://docs.microsoft.com/sql/t-sql/data-types/money-and-smallmoney-transact-sql
+[4]:https://docs.microsoft.com/sql/t-sql/data-types/float-and-real-transact-sql
+[5]:https://docs.microsoft.com/sql/t-sql/data-types/char-and-varchar-transact-sql
+[6]:https://docs.microsoft.com/sql/t-sql/data-types/nchar-and-nvarchar-transact-sql
+[7]:https://docs.microsoft.com/sql/t-sql/data-types/ntext-text-and-image-transact-sql
+[8]:https://docs.microsoft.com/sql/t-sql/data-types/binary-and-varbinary-transact-sql
+
+[bit]:https://docs.microsoft.com/sql/t-sql/data-types/bit-transact-sql
+[date]:https://docs.microsoft.com/sql/t-sql/data-types/date-transact-sql
+[smalldatetime]:https://docs.microsoft.com/sql/t-sql/data-types/smalldatetime-transact-sql
+[time]:https://docs.microsoft.com/sql/t-sql/data-types/time-transact-sql
+[datetime2]:https://docs.microsoft.com/sql/t-sql/data-types/datetime2-transact-sql
+[datetime]:https://docs.microsoft.com/sql/t-sql/data-types/datetime-transact-sql
+[datetimeoffset]:https://docs.microsoft.com/sql/t-sql/data-types/datetimeoffset-transact-sql
+[cursor]:https://docs.microsoft.com/sql/t-sql/data-types/cursor-transact-sql
+[sql_variant]:https://docs.microsoft.com/sql/t-sql/data-types/sql-variant-transact-sql
+[hierarchyid]:https://docs.microsoft.com/sql/t-sql/data-types/hierarchyid-data-type-method-reference
+[rowversion]:https://docs.microsoft.com/sql/t-sql/data-types/rowversion-transact-sql
+[timestamp]:https://docs.microsoft.com/sql/t-sql/data-types/rowversion-transact-sql#remarks
+[uniqueidentifier]:https://docs.microsoft.com/sql/t-sql/data-types/uniqueidentifier-transact-sql
+[xml]:https://docs.microsoft.com/sql/t-sql/xml/xml-transact-sql
+[table]:https://docs.microsoft.com/sql/t-sql/data-types/table-transact-sql
+[geometry]:https://docs.microsoft.com/sql/t-sql/spatial-geometry/spatial-types-geometry-transact-sql
+[geography]:https://docs.microsoft.com/sql/t-sql/spatial-geography/spatial-types-geography
+
+[20]:https://dev.mysql.com/doc/refman/8.0/en/integer-types.html
+[21]:https://dev.mysql.com/doc/refman/8.0/en/fixed-point-types.html
+[22]:https://dev.mysql.com/doc/refman/8.0/en/floating-point-types.html
+[23]:https://dev.mysql.com/doc/refman/8.0/en/datetime.html
+[24]:https://dev.mysql.com/doc/refman/8.0/en/time.html
diff --git a/SQL Server Drivers.md b/SQL Server Drivers.md
new file mode 100644
index 00000000..60b43e28
--- /dev/null
+++ b/SQL Server Drivers.md
@@ -0,0 +1,90 @@
+# SQL Server Drivers
+SQL Server supports a wide variety of drivers, which are used by client applications or services to connect and query for data.
+Please see below for a summary of the different drivers, both current and legacy.
+
+[SQL Server Drivers](https://docs.microsoft.com/en-us/sql/connect/sql-server-drivers)
+
+
+## Current SQL Drivers
+The following SQL Drivers are actively developed. Each driver has a support statement that can be found by following the links.
+
+### ADO.NET
+ADO.NET is a library that is a standard part of the .Net framework. It is a C# implementation of the TDS protocol, which is supported by all modern versions of SQL Server.
+This driver is developed, tested, and supported by Microsoft.
+
+[Microsoft ADO.NET for SQL Server](https://docs.microsoft.com/en-us/sql/connect/ado-net/microsoft-ado-net-for-sql-server) | [Download .Net Driver](http://www.microsoft.com/net/download/)
+
+
+### JDBC
+The JDBC SQL driver is a Java implementation of the TDS protocol, which is supported by all modern versions of SQL Server. This driver is developed, tested, and supported by Microsoft.
+
+[Microsoft JDBC Driver for SQL Server](https://docs.microsoft.com/en-us/sql/connect/jdbc/microsoft-jdbc-driver-for-sql-server) | [Download JDBC Driver](https://docs.microsoft.com/en-us/sql/connect/jdbc/download-microsoft-jdbc-driver-for-sql-server?view=sql-server-2017)
+
+
+### ODBC
+The ODBC SQL driver is a C++ implementation of the TDS protocol, which is supported by all modern versions of SQL Server. This driver is developed, tested, and supported by Microsoft.
+
+[Microsoft ODBC Driver for SQL Server](https://docs.microsoft.com/en-us/sql/connect/odbc/microsoft-odbc-driver-for-sql-server) | [Download ODBC Driver](https://docs.microsoft.com/en-us/sql/connect/odbc/download-odbc-driver-for-sql-server)
+
+
+### PHP
+The PHP SQL driver relies on the Microsoft SQL Server ODBC Driver to handle the low-level communication with SQL Server. This driver is developed, tested, and supported by Microsoft.
+
+[Microsoft PHP Driver for SQL Driver](https://docs.microsoft.com/en-us/sql/connect/php/microsoft-php-driver-for-sql-server) | [Download PHP Driver](https://www.microsoft.com/en-us/download/details.aspx?id=20098) | [Github](https://github.com/Microsoft/msphpsql)
+
+
+### Node.js
+The tedious module is a javascript implementation of the TDS protocol, which is supported by all modern versions of SQL Server. The driver is an open source project, available on Github.
+
+[Node.js Driver for SQL Server](https://docs.microsoft.com/en-us/sql/connect/node-js/node-js-driver-for-sql-server) | [Install Node.js Driver](https://docs.microsoft.com/en-us/sql/connect/node-js/step-1-configure-development-environment-for-node-js-development)
+
+
+### Python
+The pymssql module is a Python implementation of the TDS protocol, which is supported by all modern versions of SQL Server.
+
+[Python Driver for SQL Server](https://docs.microsoft.com/en-us/sql/connect/python/python-driver-for-sql-server)
+
+There are several python SQL Drivers available. Choose which one you want to use, and configure your development environment:
+1. [Python SQL Driver - pyodbc](https://docs.microsoft.com/en-us/sql/connect/python/pyodbc/python-sql-driver-pyodbc)
+2. [Python SQL Driver - pymssql](https://docs.microsoft.com/en-us/sql/connect/python/pymssql/python-sql-driver-pymssql)
+
+
+### Ruby
+The TinyTDS gem is a Ruby implementation of the TDS protocol, which is supported by all modern versions of SQL Server.
+
+[Ruby Driver for SQL Server](https://docs.microsoft.com/en-us/sql/connect/ruby/ruby-driver-for-sql-server) | [Install Ruby Driver](https://docs.microsoft.com/en-us/sql/connect/ruby/ruby-driver-for-sql-server)
+
+
+### Rails
+The SQL Server adapter for ActiveRecord v5.1 using SQL Server 2012 or higher.
+
+[SQL Server Adapter For Rails](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter)
+
+
+## Legacy SQL Drivers
+The following SQL Drivers were developed and tested by Microsoft, but are not recommended to be used for new development.
+Each driver has a support statement that can be found by following the links.
+
+
+## OLEDB
+The OLE DB provider will not be included after SQL Server 2012.
+
+[Microsoft OLE DB](https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ms722784(v=vs.85))
+
+
+### ADO
+The ADO SQL driver has a direct dependency on the OLE DB provider. As such, it will not be supported after SQL Server 2012.
+
+[ActiveX Data Objects (ADO)](https://docs.microsoft.com/en-us/sql/ado/guide/data/activex-data-objects-ado)
+
+
+## Another alternatives
+ - [Devart ODBC Drivers](https://www.devart.com/odbc/)
+ - [SNAC - SQL Server Native Client](https://docs.microsoft.com/en-us/sql/relational-databases/native-client/sql-server-native-client)
+ - [RODBC: ODBC Database Access CRAN](https://mran.microsoft.com/package/RODBC/)
+ - [RODBC: ODBC Database Access MRAN](https://mran.microsoft.com/package/RODBC/)
+ - [go-mssqldb - Microsoft SQL server driver written in go language](https://github.com/denisenkom/go-mssqldb)
+ - [Node TDS module for connecting to SQL Server databases](https://github.com/tediousjs/tedious/)
+ - [SQLProvider - a general .NET/Mono SQL database type provider](https://github.com/fsprojects/SQLProvider) (Other database support: SQL Server, SQLite, PostgreSQL, Oracle, MySQL (& MariaDB), MsAccess, Firebird)
+ - [RSQLServer - an R package that provides a SQL Server R Database Interface (DBI), based on the cross-platform jTDS JDBC driver](https://github.com/imanuelcostigan/RSQLServer)
+ - [jTDS JDBC driver](http://jtds.sourceforge.net/index.html)
diff --git a/SQL Server Edition.md b/SQL Server Edition.md
index b4a75e0f..2f72035a 100644
--- a/SQL Server Edition.md
+++ b/SQL Server Edition.md
@@ -1,16 +1,32 @@
# Microsoft SQL Server Edition
Source links:
- - [Official microsoft page](http://www.microsoft.com/en-us/server-cloud/products/sql-server-editions/)
- - [Features Supported by the Editions of SQL Server 2016](https://msdn.microsoft.com/en-us/library/cc645993.aspx)
+ - [Editions and supported features of SQL Server 2017](https://docs.microsoft.com/en-us/sql/sql-server/editions-and-components-of-sql-server-2017?view=sql-server-2017)
+ - [Features Supported by the Editions of SQL Server 2017](https://docs.microsoft.com/en-us/sql/sql-server/editions-and-components-of-sql-server-2017)
+ - [Features Supported by the Editions of SQL Server 2016](https://docs.microsoft.com/en-us/sql/sql-server/editions-and-components-of-sql-server-2016)
- [Features Supported by the Editions of SQL Server 2014](https://msdn.microsoft.com/en-us/library/cc645993%28v=SQL.120%29.aspx)
- [Features Supported by the Editions of SQL Server 2012](https://msdn.microsoft.com/en-us/library/cc645993%28v=SQL.110%29.aspx)
- [Features Supported by the Editions of SQL Server 2008](https://msdn.microsoft.com/en-us/library/cc645993%28v=SQL.100%29.aspx)
- [Features Supported by the Editions of SQL Server 2005](https://technet.microsoft.com/en-us/library/ms143761%28v=sql.90%29.aspx)
+ - [SQL Server 2017 Pricing](https://www.microsoft.com/en-Us/sql-server/sql-server-2017-pricing)
+ - [Azure SQL Database pricing](https://azure.microsoft.com/en-us/pricing/details/sql-database/managed/?cdn=disable)
+ - [An Overview of SQL Server 2016 Licensing](http://sqlmag.com/scaling-success-sql-server-2016/overview-sql-server-2016-licensing)
## Microsoft SQL Server 2016 Edition
-SQL Server 2016 is available in an Evaluation edition for a 180-day trial period. For more information, see the SQL Server [Trial Software Web Site](https://www.microsoft.com/en-us/server-cloud/products/sql-server-2016/default.aspx).
+SQL Server 2016 is available in an Evaluation edition for a 180-day trial period. For more information, see the [SQL Server 2016 Official page](https://www.microsoft.com/en-us/sql-server/sql-server-2016).
+
+ - SQL Server 2016 Enterprise Edition - Core licensing only
+ - SQL Server 2016 Standard Edition - Core or Server + CAL (Client Access License) licensing
+ - SQL Server 2016 Express Edition - Free
+ - SQL Server 2016 Developer Edition - Free
+ - SQL Server 2016 Evaluation Edition - 180 day trial
+
+The Developer edition has the same feature set as the Enterprise edition.
+It is completely free and can be run on any number of devices, but it cannot be used for production workloads.
+You can get it at SQL Server 2016 Developer edition.
+In contrast, the SQL Server 2016 Express editions can be used for production workloads, but they are limited to a single CPU and four cores, 1 GB of RAM (4 GB for the SQL Server 2016 Express with Advanced Services for Reporting Services).
+There is also a 10 GB per databases limitation.
## Microsoft SQL Server 2014 Edition
@@ -38,4 +54,3 @@ SQL Server 2016 is available in an Evaluation edition for a 180-day trial period
| Data warehousing (In-memory columnstore, compression, partitioning) | Yes | No | No | No |
| Advanced high availability (AlwaysOn, multiple, active secondaries; multi-site, geo-clustering) | Yes | No | No | No |
| Advanced transaction processing (In-memory OLTP) | Yes | No | No | No |
-
diff --git a/SQL Server Hints.md b/SQL Server Hints.md
new file mode 100644
index 00000000..dee4f3dd
--- /dev/null
+++ b/SQL Server Hints.md
@@ -0,0 +1,15 @@
+# Microsoft Transact-SQL Hints
+
+ - [Microsoft Transact-SQL Hints](https://docs.microsoft.com/en-us/sql/t-sql/queries/hints-transact-sql)
+ - [Hints (Transact-SQL) - Join](https://docs.microsoft.com/en-us/sql/t-sql/queries/hints-transact-sql-join)
+ - [Hints (Transact-SQL) - Table](https://docs.microsoft.com/en-us/sql/t-sql/queries/hints-transact-sql-table)
+ - [Hints (Transact-SQL) - Query](https://docs.microsoft.com/en-us/sql/t-sql/queries/hints-transact-sql-query)
+
+**Hint names are case-insensitive.**
+
+**Some USE HINT hints may conflict with trace flags enabled at the global or session level, or database scoped configuration settings.
+In this case, the query level hint (USE HINT) always takes precedence.
+If a USE HINT conflicts with another query hint or a trace flag enabled at the query level (such as by QUERYTRACEON), SQL Server will generate an error when trying to execute the query.**
+
+**Separating hints by spaces rather than commas is a deprecated feature: This feature will be removed in a future version of Microsoft SQL Server.
+Do not use this feature in new development work, and modify applications that currently use this feature as soon as possible.**
\ No newline at end of file
diff --git a/SQL Server Name Convention and T-SQL Programming Style.md b/SQL Server Name Convention and T-SQL Programming Style.md
index 9bdf39b9..78b68375 100644
--- a/SQL Server Name Convention and T-SQL Programming Style.md
+++ b/SQL Server Name Convention and T-SQL Programming Style.md
@@ -1,18 +1,36 @@
# SQL Server Name Convention and T-SQL Programming Style
+[Naming convention][99] is a set of rules for choosing the character sequence to be used for identifiers which denote variables, types, functions, and other entities in source code and documentation.
+Reasons for using a naming convention (as opposed to allowing programmers to choose any character sequence) include the following:
+ - To reduce the effort needed to read and understand source code;
+ - To enable code reviews to focus on more important issues than arguing over syntax and naming standards.
+ - To enable code quality review tools to focus their reporting mainly on significant issues other than syntax and style preferences.
-## SQL Server Object Name
+[99]:https://en.wikipedia.org/wiki/Naming_convention_(programming)
+
+
+## Table of Contents
+ - [SQL Server Object Name Convention](#sql-server-object-name-convention)
+ - [SQL Server Data Types Recommendation](#data-types-recommendation)
+ - [T-SQL Programming Style](#t-sql-programming-style)
+ - [General programming style](#general-programming-style)
+ - [Stored procedures and functions programming style](#programming-style)
+ - [Reference and useful links](#reference)
+
+
+
+## SQL Server Object Name Convention
| Object | Code | Notation | Length | Plural | Prefix | Suffix | Abbreviation | Char Mask | Example |
|----------------------------------|------| ---------- |-------:|--------|--------|--------|--------------|--------------|------------------------------------|
| Database | | UPPERCASE | 30 | No | No | No | Yes | [A-z] | MYDATABASE |
| Database Trigger | | PascalCase | 50 | No | DTR_ | No | Yes | [A-z] | DTR_CheckLogin |
-| Schema | | lowercase | 30 | No | No | No | Yes | [A-z][0-9] | myschema |
+| Schema | | lowercase | 30 | No | No | No | Yes | [a-z][0-9] | myschema |
| File Table | | PascalCase | 128 | No | FT_ | No | Yes | [A-z][0-9] | FT_MyTable |
-| Global Temporary Table | | PascalCase | 118 | No | No | No | Yes | ##[A-z][0-9] | ##MyTable |
-| Local Temporary Table | | PascalCase | 118 | No | No | No | Yes | #[A-z][0-9] | #MyTable |
-| Table | U | PascalCase | 30 | No | No | No | Yes | [A-z][0-9] | MyTable |
-| Table Column | | PascalCase | 30 | No | No | No | Yes | [A-z][0-9] | MyColumn |
+| Global Temporary Table | | PascalCase | 117 | No | No | No | Yes | ##[A-z][0-9] | ##MyTable |
+| Local Temporary Table | | PascalCase | 116 | No | No | No | Yes | #[A-z][0-9] | #MyTable |
+| Table | U | PascalCase | 128 | No | No | No | Yes | [A-z][0-9] | MyTable |
+| Table Column | | PascalCase | 128 | No | No | No | Yes | [A-z][0-9] | MyColumn |
| Table Default Values | D | PascalCase | 128 | No | DF_ | No | Yes | [A-z][0-9] | DF_MyTable_MyColumn |
| Table Check Column Constraint | C | PascalCase | 128 | No | CK_ | No | Yes | [A-z][0-9] | CK_MyTable_MyColumn |
| Table Check Table Constraint | C | PascalCase | 128 | No | CTK_ | No | Yes | [A-z][0-9] | CTK_MyTable_MyColumn_AnotherColumn |
@@ -21,67 +39,250 @@
| Table Foreign Key | F | PascalCase | 128 | No | FK_ | No | Yes | [A-z][0-9] | FK_MyTable_ForeignTableID |
| Table Clustered Index | | PascalCase | 128 | No | IXC_ | No | Yes | [A-z][0-9] | IXC_MyTable_MyColumn_AnotherColumn |
| Table Non Clustered Index | | PascalCase | 128 | No | IX_ | No | Yes | [A-z][0-9] | IX_MyTable_MyColumn_AnotherColumn |
-| Table Trigger |TR | PascalCase | 128 | No | TR_ | No | Yes | [A-z][0-9] | TR_MyTable_LogicalName |
-| View |V | PascalCase | 128 | No | VI_ | No | No | [A-z][0-9] | VI_LogicalName |
-| Stored Procedure |P | PascalCase | 128 | No | usp_ | No | No | [A-z][0-9] | usp_LogicalName |
-| Scalar User-Defined Function |FN | PascalCase | 50 | No | udf_ | No | No | [A-z][0-9] | udf_FunctionLogicalName |
-| Table-Valued Function |FN | PascalCase | 50 | No | tvf_ | No | No | [A-z][0-9] | tvf_FunctionLogicalName |
-| Synonym |SN | camelCase | 128 | No | sy_ | No | No | [A-z][0-9] | sy_logicalName |
-| Sequence |SO | PascalCase | 128 | No | sq_ | No | No | [A-z][0-9] | sq_TableName |
+| Table Trigger | TR | PascalCase | 128 | No | TR_ | No | Yes | [A-z][0-9] | TR_MyTable_LogicalName |
+| View | V | PascalCase | 128 | No | VI_ | No | No | [A-z][0-9] | VI_LogicalName |
+| Stored Procedure | P | PascalCase | 128 | No | usp_ | No | No | [A-z][0-9] | usp_LogicalName |
+| Scalar User-Defined Function | FN | PascalCase | 128 | No | udf_ | No | No | [A-z][0-9] | udf_FunctionLogicalName |
+| Table-Valued Function | FN | PascalCase | 128 | No | tvf_ | No | No | [A-z][0-9] | tvf_FunctionLogicalName |
+| Synonym | SN | camelCase | 128 | No | sy_ | No | No | [A-z][0-9] | sy_logicalName |
+| Sequence | SO | PascalCase | 128 | No | sq_ | No | No | [A-z][0-9] | sq_TableName |
| CLR Assembly | | PascalCase | 128 | No | CA | No | Yes | [A-z][0-9] | CALogicalName |
-| CLR Stored Procedures |PC | PascalCase | 128 | No | pc_ | No | Yes | [A-z][0-9] | pc_CAName_LogicalName |
-| CLR Scalar User-Defined Function | | PascalCase | 50 | No | cudf_ | No | No | [A-z][0-9] | cudf_CAName_LogicalName |
-| CLR Table-Valued Function | | PascalCase | 50 | No | ctvf_ | No | No | [A-z][0-9] | ctvf_CAName_LogicalName |
-| CLR User-Defined Aggregates | | PascalCase | 50 | No | ca_ | No | No | [A-z][0-9] | ca_CAName_LogicalName |
-| CLR User-Defined Types | | PascalCase | 50 | No | ct_ | No | No | [A-z][0-9] | ct_CAName_LogicalName |
-| CLR Triggers | | PascalCase | 50 | No | ctr_ | No | No | [A-z][0-9] | ctr_CAName_LogicalName |
+| CLR Stored Procedures | PC | PascalCase | 128 | No | pc_ | No | Yes | [A-z][0-9] | pc_CAName_LogicalName |
+| CLR Scalar User-Defined Function | | PascalCase | 128 | No | cudf_ | No | No | [A-z][0-9] | cudf_CAName_LogicalName |
+| CLR Table-Valued Function | | PascalCase | 128 | No | ctvf_ | No | No | [A-z][0-9] | ctvf_CAName_LogicalName |
+| CLR User-Defined Aggregates | | PascalCase | 128 | No | ca_ | No | No | [A-z][0-9] | ca_CAName_LogicalName |
+| CLR User-Defined Types | | PascalCase | 128 | No | ct_ | No | No | [A-z][0-9] | ct_CAName_LogicalName |
+| CLR Triggers | | PascalCase | 128 | No | ctr_ | No | No | [A-z][0-9] | ctr_CAName_LogicalName |
+
+**[⬆ back to top](#table-of-contents)**
+
+
+
+## SQL Server Data Types Recommendation
+More details about SQL Server data types and mapping it with another databases you can find [here](https://github.com/ktaranov/sqlserver-kit/blob/master/SQL%20Server%20Data%20Types.md)
+
+| General Type | Type | Recommended | What use instead | Why use or not |
+|----------------------|---------------------|----------------|--------------------|-----------------------------------------------------------|
+| Exact Numerics | [bit] | Maybe | [tinyint][1] | |
+| Exact Numerics | [tinyint][1] | Maybe | [int][1] | |
+| Exact Numerics | [smallint][1] | Maybe | [int][1] | |
+| Exact Numerics | [int][1] | Yes | - | |
+| Exact Numerics | [bigint][1] | Yes | [int][1] | |
+| Exact Numerics | [decimal][2] | Yes | - | |
+| Exact Numerics | [smallmoney][3] | No | [decimal][2] | [possibility to loss precision due to rounding errors][9] |
+| Exact Numerics | [money][3] | No | [decimal][2] | [possibility to loss precision due to rounding errors][9] |
+| Approximate Numerics | [real][4] | Yes | - | |
+| Approximate Numerics | [float][4] | Yes | - | |
+| Date and Time | [date] | Yes | - | |
+| Date and Time | [smalldatetime] | Maybe | [date] | |
+| Date and Time | [time] | Yes | - | |
+| Date and Time | [datetime2] | Yes | - | |
+| Date and Time | [datetime] | No | [datetime2] | |
+| Date and time | [datetimeoffset] | Yes | - | |
+| Character Strings | [char][5] | Maybe | | |
+| Character Strings | [varchar][5] | Yes | [varchar][5] | |
+| Character Strings | [varchar(max)][5] | Yes | - | |
+| Character Strings | [nchar][6] | Maybe | [nvarchar][6] | |
+| Character Strings | [nvarchar][6] | Yes | - | |
+| Character Strings | [nvarchar(max)][6] | Yes | - | |
+| Character Strings | [ntext][7] | **Deprecated** | [nvarchar(max)][6] | |
+| Character Strings | [text][7] | **Deprecated** | [nvarchar(max)][6] | |
+| Binary Strings | [image][7] | **Deprecated** | [nvarchar(max)][6] | |
+| Binary Strings | [binary][8] | **Deprecated** | [nvarchar(max)][6] | |
+| Binary Strings | [varbinary][8] | Yes | - | |
+| Binary Strings | [varbinary(max)][8] | Yes | - | |
+| Other Data Types | [cursor] | Maybe | - | |
+| Other Data Types | [sql_variant] | No | [varchar][5]? | |
+| Other Data Types | [hierarchyid] | Maybe | - | |
+| Other Data Types | [rowversion] | Maybe | - | |
+| Other Data Types | [timestamp] | **Deprecated** | [rowversion] | it is just synonym to [rowversion] data type |
+| Other Data Types | [uniqueidentifier] | Yes | - | |
+| Other Data Types | [xml] | Yes | - | |
+| Other Data Types | [table] | Maybe | - | |
+| Spatial Data Types | [geometry] | Yes | - | |
+| Spatial Data Types | [geography] | Yes | - | |
+
+[1]:https://docs.microsoft.com/sql/t-sql/data-types/int-bigint-smallint-and-tinyint-transact-sql
+[2]:https://docs.microsoft.com/sql/t-sql/data-types/decimal-and-numeric-transact-sql
+[3]:https://docs.microsoft.com/sql/t-sql/data-types/money-and-smallmoney-transact-sql
+[4]:https://docs.microsoft.com/sql/t-sql/data-types/float-and-real-transact-sql
+[5]:https://docs.microsoft.com/sql/t-sql/data-types/char-and-varchar-transact-sql
+[6]:https://docs.microsoft.com/sql/t-sql/data-types/nchar-and-nvarchar-transact-sql
+[7]:https://docs.microsoft.com/sql/t-sql/data-types/ntext-text-and-image-transact-sql
+[8]:https://docs.microsoft.com/sql/t-sql/data-types/binary-and-varbinary-transact-sql
+
+[9]:https://www.red-gate.com/hub/product-learning/sql-prompt/avoid-use-money-smallmoney-datatypes
+
+[bit]:https://docs.microsoft.com/sql/t-sql/data-types/bit-transact-sql
+[date]:https://docs.microsoft.com/sql/t-sql/data-types/date-transact-sql
+[smalldatetime]:https://docs.microsoft.com/sql/t-sql/data-types/smalldatetime-transact-sql
+[time]:https://docs.microsoft.com/sql/t-sql/data-types/time-transact-sql
+[datetime2]:https://docs.microsoft.com/sql/t-sql/data-types/datetime2-transact-sql
+[datetime]:https://docs.microsoft.com/sql/t-sql/data-types/datetime-transact-sql
+[datetimeoffset]:https://docs.microsoft.com/sql/t-sql/data-types/datetimeoffset-transact-sql
+[cursor]:https://docs.microsoft.com/sql/t-sql/data-types/cursor-transact-sql
+[sql_variant]:https://docs.microsoft.com/sql/t-sql/data-types/sql-variant-transact-sql
+[hierarchyid]:https://docs.microsoft.com/sql/t-sql/data-types/hierarchyid-data-type-method-reference
+[rowversion]:https://docs.microsoft.com/sql/t-sql/data-types/rowversion-transact-sql
+[timestamp]:https://docs.microsoft.com/sql/t-sql/data-types/rowversion-transact-sql#remarks
+[uniqueidentifier]:https://docs.microsoft.com/sql/t-sql/data-types/uniqueidentifier-transact-sql
+[xml]:https://docs.microsoft.com/sql/t-sql/xml/xml-transact-sql
+[table]:https://docs.microsoft.com/sql/t-sql/data-types/table-transact-sql
+[geometry]:https://docs.microsoft.com/sql/t-sql/spatial-geometry/spatial-types-geometry-transact-sql
+[geography]:https://docs.microsoft.com/sql/t-sql/spatial-geography/spatial-types-geography
+
+**[⬆ back to top](#table-of-contents)**
## T-SQL Programming Style
+SQL Server TSQL Coding Conventions, Best Practices, and Programming Guidelines
### General programming style
- Delimiters: spaces (not tabs)
- - No square brackets [] are allowed in object names and alias, use only symbols [A-z] and numeric [0-9]
- - All finished expressions should have ; at the end
- - All scripts should end with `GO` and line break
- - The first argument in SELECT expression should be on the same line with it: `SELECT LastName ...`
+ - Avoid using asterisk in select statements `SELECT *`, use explicit column names. More details [here](https://www.red-gate.com/hub/product-learning/sql-prompt/finding-code-smells-using-sql-prompt-asterisk-select-list)
+ - No square brackets `[]` and [reserved words](https://github.com/ktaranov/sqlserver-kit/blob/master/Scripts/Check_Reserved_Words_For_Object_Names.sql) in object names and alias, use only Latin symbols **`[A-z]`** and numeric **`[0-9]`**
+ - Prefer [ANSI syntax](http://standards.iso.org/ittf/PubliclyAvailableStandards/c053681_ISO_IEC_9075-1_2011.zip) and functions
+ - All finished expressions should have `;` at the end (this is ANSI standard and Microsoft announced with the SQL Server 2008 release that semicolon statement terminators will become mandatory in a future version so statement terminators other than semicolons (whitespace) are currently deprecated. This deprecation announcement means that you should always use semicolon terminators in new development.)
+ More details [here](http://www.dbdelta.com/always-use-semicolon-statement-terminators/)
+ - All script files should end with `GO` and line break
+ - Avoid non-standard column aliases, use ,if required, double-quotes and always `AS` keyword: `SELECT p.LastName AS "Last Name" FROM dbo.Person AS p;`
+ More details [here](https://www.red-gate.com/hub/product-learning/sql-prompt/sql-prompt-code-analysis-avoid-non-standard-column-aliases).
+ All possible ways using aliases in SQL Server:
+
+ ```sql
+ SELECT Tables = Schema_Name(schema_id)+'.'+[name] FROM sys.tables;
+ SELECT "Tables" = Schema_Name(schema_id)+'.'+[name] FROM sys.tables;
+ SELECT [Tables] = Schema_Name(schema_id)+'.'+[name] FROM sys.tables;
+ SELECT 'Tables' = Schema_Name(schema_id)+'.'+[name] FROM sys.tables;
+ SELECT Schema_Name(schema_id)+'.'+[name] [Tables] FROM sys.tables;
+ SELECT Schema_Name(schema_id)+'.'+[name] 'Tables' FROM sys.tables;
+ SELECT Schema_Name(schema_id)+'.'+[name] "Tables" FROM sys.tables;
+ SELECT Schema_Name(schema_id)+'.'+[name] Tables FROM sys.tables;
+ SELECT Schema_Name(schema_id)+'.'+[name] AS [Tables] FROM sys.tables;
+ SELECT Schema_Name(schema_id)+'.'+[name] AS 'Tables' FROM sys.tables;
+ SELECT Schema_Name(schema_id)+'.'+[name] AS Tables FROM sys.tables;
+ /* Below recommended due to ANSI
+ SELECT Schema_Name(schema_id)+'.'+[name] AS "Tables" FROM sys.tables;
+ ```
+ - The first argument in `SELECT` expression should be on the same line with it: `SELECT LastName …`
- Arguments are divided by line breaks, commas should be placed before an argument:
```sql
SELECT FirstName
- , LastName
+ , LastName
```
+ - For SQL Server >= 2012 use `FETCH-OFFSET` instead `TOP`. But if you use `TOP` avoid use `TOP` in a `SELECT` statement without an `ORDER BY`. More details [here](https://www.red-gate.com/hub/product-learning/sql-prompt/finding-code-smells-using-sql-prompt-top-without-order-select-statement)
+ - Use `TOP` function with brackets because `TOP` has supports use of an expression, such as `(@Rows*2)`, or a subquery: `SELECT TOP(100) LastName …`.
+ More details [here](https://www.red-gate.com/hub/product-learning/sql-prompt/sql-prompt-code-analysis-avoiding-old-style-top-clause). Also `TOP` without brackets does not work with `UPDATE` and `DELETE` statements.
+ - For demo queries use `TOP(100)` or lower value because SQL Server SQL Server uses one sorting method for TOP 1-100 rows, and a different one for 101+ rows
+ More details [here](https://www.brentozar.com/archive/2017/09/much-can-one-row-change-query-plan-part-2/)
- Keywords and data types declaration should be in **UPPERCASE**
- - `FROM, WHERE, INTO, JOIN, ORDER BY` expressions should be aligned so, that all their arguments are placed under each other
- - All objects must used with schema names `FROM dbo.Table`
+ - `FROM, WHERE, INTO, JOIN, GROUP BY, ORDER BY` expressions should be aligned so, that all their arguments are placed under each other (see Example below)
+ - All objects must used with schema names but without database and server name: `FROM dbo.Table`. For stored procedure more details [here](https://www.red-gate.com/hub/product-learning/sql-prompt/finding-code-smells-using-sql-prompt-procedures-lack-schema-qualification)
+ - All system database and tables must be in lower case for properly working in Case Sensitive instance: `master, sys.tables …`
+ - Avoid using [`ISNUMERIC`](https://docs.microsoft.com/en-us/sql/t-sql/functions/isnumeric-transact-sql) function. Use for SQL Server >= 2012 [`TRY_CONVERT`](https://docs.microsoft.com/en-us/sql/t-sql/functions/try-convert-transact-sql) function and for SQL Server < 2012 `LIKE` expression:
+ ```sql
+ CASE WHEN Stuff(LTrim(TapAngle),1,1,'') NOT LIKE '%[^-+.ED0123456789]%' --is it a float?
+ AND Left(LTrim(TapAngle),1) LIKE '[-.+0123456789]'
+ AND TapAngle LIKE '%[0123456789][ED][-+0123456789]%'
+ AND Right(TapAngle ,1) LIKE N'[0123456789]'
+ THEN 'float'
+ WHEN Stuff(LTrim(TapAngle),1,1,'') NOT LIKE '%[^.0123456789]%' --is it numeric
+ AND Left(LTrim(TapAngle),1) LIKE '[-.+0123456789]'
+ AND TapAngle LIKE '%.%' AND TapAngle NOT LIKE '%.%.%'
+ AND TapAngle LIKE '%[0123456789]%'
+ THEN 'float'
+ ELSE NULL
+ END
+ ```
+ More details [here](https://www.red-gate.com/hub/product-learning/sql-prompt/sql-prompt-code-analysis-avoid-using-isnumeric-function-e1029)
+ - Avoid using `INSERT INTO` a permanent table with `ORDER BY`, more details [here](https://www.red-gate.com/hub/product-learning/sql-prompt/sql-prompt-code-analysis-insert-permanent-table-order-pe020)
+ - Avoid using shorthand (`wk, yyyy, d` etc.) with date/time operations, use full names: `month, day, year`. More details [here](https://sqlblog.org/2011/09/20/bad-habits-to-kick-using-shorthand-with-date-time-operations)
+ - Avoid ambiguous formats for date-only literals, use `CAST('yyyymmdd' AS DATE)` format
+ - Avoid treating dates like strings and avoid calculations on the left-hand side of the `WHERE` clause. More details [here](https://sqlblog.org/2009/10/16/bad-habits-to-kick-mis-handling-date-range-queries)
+ - Avoid using [hints](https://docs.microsoft.com/en-us/sql/t-sql/queries/hints-transact-sql) except `OPTION(RECOMPILE)` if needed. More details [here](https://www.red-gate.com/hub/product-learning/sql-prompt/sql-prompt-code-analysis-a-hint-is-used-pe004-7)
+ - Avoid use of `SELECT…INTO` for production code, use instead `CREATE TABLE` + `INSERT INTO …` approach. More details [here](https://www.red-gate.com/hub/product-learning/sql-prompt/use-selectinto-statement)
+ - Use only ISO standard JOINS syntaxes. The “old style” Microsoft/Sybase JOIN style for SQL, which uses the `=*` and `*= syntax, has been deprecated and is no longer used. Queries that use this syntax will fail when the database engine level is 10 (SQL Server 2008) or later (compatibility level 100). The ANSI-89 table citation list (FROM tableA, tableB) is still ISO standard for INNER JOINs only. Neither of these styles are worth using. It is always better to specify the type of join you require, INNER, LEFT OUTER, RIGHT OUTER, FULL OUTER and CROSS, which has been standard since ANSI SQL-92 was published. While you can choose any supported JOIN style, without affecting the query plan used by SQL Server, using the ANSI-standard syntax will make your code easier to understand, more consistent, and portable to other relational database systems.
+ More details [here](https://www.red-gate.com/hub/product-learning/sql-prompt/finding-code-smells-using-sql-prompt-old-style-join-syntax-st001)
+ - Do not use a scalar user-defined function (UDF) in a `JOIN` condition, `WHERE` search condition, or in a `SELECT` list, unless the function is [schema-bound](https://docs.microsoft.com/en-us/sql/t-sql/statements/create-function-transact-sql#best-practices).
+ More details [here](https://www.red-gate.com/hub/product-learning/sql-prompt/misuse-scalar-user-defined-function-constant-pe017)
+ - Use `EXISTS` or `NOT EXISTS` if referencing a subquery, and `IN` or `NOT IN` when have a list of literal values
+ More details [here](https://www.brentozar.com/archive/2018/08/a-common-query-error/)
+ - For concatenate strings:
+ - always using the upper-case `N`;
+ - always store into a variable of type `NVARCHAR(MAX)`;
+ - avoid truncation of string literals, simply ensure that one piece is converted to `NVARCHAR(MAX)`.
+ Example: `SET @NVCmaxVariable = CONVERT(NVARCHAR(MAX), N'anything') + N'something else' + N'another';`
+ More details [here](https://themondaymorningdba.wordpress.com/2018/09/13/them-concatenatin-blues/)
+ - Always specify a length to any text-based data type such as `NVARCHAR` or `VARCHAR`: `DECLARE @myGoodVariable VARCHAR(50);` and not `DECLARE @myBadVariable VARCHAR;`.
+ More details [here](https://www.red-gate.com/hub/product-learning/sql-prompt/using-a-variable-length-datatype-without-explicit-length-the-whys-and-wherefores)
Example:
```sql
+WITH CTE_MyCTE AS (
+ SELECT t1.Value1 AS Val1
+ , t1.Value2 AS Val2
+ , t2.Value3 AS Val3
+ INNER JOIN dbo.Table3 AS t2
+ ON t1.Value1 = t2.Value1
+ WHERE t1.Value1 > 1
+ AND t2.Value2 >= 101
+)
SELECT t1.Value1 AS Val1
, t1.Value2 AS Val2
, t2.Value3 AS Val3
INTO #Table3
- FROM dbo.Table1 AS t1
- INNER JOIN dbo.Table3 AS t2
- ON t1.Value1 = t2.Value1
- WHERE t1.Value1 > 1
- AND t2.Value2 >= 101
+ FROM CTE_MyCTE AS t1
ORDER BY t2.Value2;
```
+**[⬆ back to top](#table-of-contents)**
+
+
### Stored procedures and functions programming style
- - All stored procedures and functions should use ALTER statement and start with the object presence check
- - ALTER statement should be preceded by 2 line breaks
+ - All stored procedures and functions should use `ALTER` statement and start with the object presence check
+ - `ALTER` statement should be preceded by 2 line breaks
- Parameters name should be in **camelCase**
- Parameters should be placed under procedure name divided by line breaks
- - After the ALTER statement and before AS keyword should be placed a comment with execution example
- - The procedure or function should begin with parameter check
+ - After the `ALTER` statement and before AS keyword should be placed a comment with execution example
+ - The procedure or function should begin with parameters check
+ - Create `sp_` procedures only in `master` database - SQL Server will always scan through the system catalog first
- Always use `BEGIN TRY` and `BEGIN CATCH`
- - Use `SET NOCOUNT ON` for stops the message that shows the count of the number of rows affected by a Transact-SQL statement
+ - Always use `/* */` instead in-line comment `--`
+ - Use `SET NOCOUNT ON;` for stops the message that shows the count of the number of rows affected by a Transact-SQL statement. More details [here](https://www.red-gate.com/hub/product-learning/sql-prompt/finding-code-smells-using-sql-prompt-set-nocount-problem-pe008-pe009)
+ - Do not use `SET NOCOUNT OFF;` (because it is default behavior)
+ - Use `RAISERROR` instead `PRINT` if you want to give feedback about the state of the currently executing SQL batch without lags. More details [here](http://sqlity.net/en/984/print-vs-raiserror/) and [here](http://sqlservercode.blogspot.com/2019/01/print-disruptor-of-batch-deletes-in-sql.html)
+ - Use `TOP` expression with `()`:
+```tsql
+-- Not working without ()
+DECLARE @n int = 1;
+SELECT TOP@n name FROM sys.objects;
+```
+ - All code should be self documenting
+ - TSQL code, triggers, stored procedures, functions, should have a standard comment banner:
+```tsql
+summary: >
+ This procedure returns an object build script as a single-row, single column
+ result.
+Revisions:
+ - Author: Bill Gates
+ Version: 1.1
+ Modification: dealt properly with heaps
+ date: 2017-07-15
+ - version: 1.2
+ modification: Removed several bugs and got column-level constraints working
+ date: 2017-06-30
+example:
+ - code: udf_MyFunction 'testValsue';
+returns: >
+ single row, single column result Build_Script.
+```
-Example:
+**[⬆ back to top](#table-of-contents)**
+
+Stored Procedure Example:
```sql
IF OBJECT_ID('dbo.usp_StoredProcedure', 'P') IS NULL
@@ -92,6 +293,7 @@ GO
ALTER PROCEDURE dbo.usp_StoredProcedure (
@parameterValue1 SMALLINT
, @parameterValue2 NVARCHAR(300)
+ , @debug BIT = 0
)
/*
EXECUTE dbo.usp_StoredProcedure
@@ -100,6 +302,7 @@ EXECUTE dbo.usp_StoredProcedure
*/
AS
SET NOCOUNT ON;
+
BEGIN TRY
IF (@parameterValue1 < 0 OR @parameterValue2 NOT IN ('SIMPLE', 'BULK', 'FULL'))
RAISERROR('Not valid data parameter!', 16, 1);
@@ -116,31 +319,41 @@ BEGIN CATCH
', User name: ' + CONVERT(sysname, CURRENT_USER);
PRINT ERROR_MESSAGE();
END CATCH;
+
GO
```
-## Offical Reference
- - [Database object TECHNET] (Limitations)
- - [User-Defined Functions MSDN]
- - [Synonim TECHNET]
- - [Primary and Foreign Key Constraints MSDN]
- - [sys.objects MSDN]
- - [Constraints TECHNET]
- - [CHECK Constraint TECHNET]
- - [SQL Server CLR Integration MSDN]
- - [CLR Databse Objects MSDN]
- - [User-defined Functions]
- - [MSDN SET NOCOUNT ON](https://msdn.microsoft.com/en-us/library/ms189837.aspx)
-
-[Database object TECHNET]:http://technet.microsoft.com/en-us/library/ms172451%28v=sql.110%29.aspx
-[User-Defined Functions MSDN]:http://msdn.microsoft.com/en-us/library/ms191007.aspx
-[Synonim TECHNET]:http://technet.microsoft.com/en-us/library/ms187552(v=sql.110).aspx
-[Primary and Foreign Key Constraints MSDN]:http://msdn.microsoft.com/en-us/library/ms179610.aspx
-[sys.objects MSDN]:http://msdn.microsoft.com/en-us/library/ms190324.aspx
-[Constraints TECHNET]:http://technet.microsoft.com/en-us/library/ms189862%28v=sql.105%29.aspx
-[CHECK Constraint TECHNET]:http://technet.microsoft.com/en-us/library/ms188258%28v=sql.105%29.aspx
-[SQL Server CLR Integration MSDN]:http://msdn.microsoft.com/en-us/library/ms254498%28v=vs.110%29.aspx
-[CLR Databse Objects MSDN]:http://msdn.microsoft.com/en-us/library/ms345099%28SQL.100%29.aspx
-[CLR Stored Procedures]:http://msdn.microsoft.com/en-us/library/ms131094%28v=sql.100%29.aspx
-[User-defined Functions]:http://msdn.microsoft.com/en-us/library/ms191320.aspx
+**[⬆ back to top](#table-of-contents)**
+
+
+
+## Official Reference and useful links
+ - [Transact-SQL Formatting Standards](https://www.simple-talk.com/sql/t-sql-programming/transact-sql-formatting-standards-%28coding-styles%29/) (by Robert Sheldon)
+ - [Subjectivity: Naming Standards](http://blogs.sqlsentry.com/aaronbertrand/subjectivity-naming-standards/) (by Aaron Bertrand)
+ - [General Database Conventions](http://kejser.org/database-naming-conventions/general-database-conventions/) (by Thomas Kejser)
+ - [Writing Readable SQL](http://www.codeproject.com/Articles/126380/Writing-Readable-SQL) (by Red Gate_)
+ - [SQL Style Guide](http://www.sqlstyle.guide/) (by Simon Holywell)
+ - [SQL Code Layout and Beautification](https://www.simple-talk.com/sql/t-sql-programming/sql-code-layout-and-beautification/) (by William Brewer)
+ - [TSQL Coding Style](http://www.databasejournal.com/features/mssql/tsql-coding-style.html) (by Gregory Larsen)
+ - [Database object Limitations](http://technet.microsoft.com/en-us/library/ms172451%28v=sql.110%29.aspx)
+ - [User-Defined Functions MSDN](http://msdn.microsoft.com/en-us/library/ms191007.aspx)
+ - [Synonim TECHNET](http://technet.microsoft.com/en-us/library/ms187552(v=sql.110).aspx)
+ - [Primary and Foreign Key Constraints MSDN](http://msdn.microsoft.com/en-us/library/ms179610.aspx)
+ - [sys.objects MSDN](http://msdn.microsoft.com/en-us/library/ms190324.aspx)
+ - [Constraints TECHNET](http://technet.microsoft.com/en-us/library/ms189862%28v=sql.105%29.aspx)
+ - [CHECK Constraint TECHNET](http://technet.microsoft.com/en-us/library/ms188258%28v=sql.105%29.aspx)
+ - [SQL Server CLR Integration MSDN](http://msdn.microsoft.com/en-us/library/ms254498%28v=vs.110%29.aspx)
+ - [CLR Databse Objects MSDN](http://msdn.microsoft.com/en-us/library/ms345099%28SQL.100%29.aspx)
+ - [CLR Stored Procedures](http://msdn.microsoft.com/en-us/library/ms131094%28v=sql.100%29.aspx)
+ - [User-defined Functions](http://msdn.microsoft.com/en-us/library/ms191320.aspx)
+ - [MSDN SET NOCOUNT ON](https://docs.microsoft.com/en-us/sql/t-sql/statements/set-nocount-transact-sql)
+ - [T-SQL Coding Guidelines Presentation](http://www.slideshare.net/chris1adkin/t-sql-coding-guidelines) (by Chris Adkin)
+ - [Sql Coding Style](http://c2.com/cgi/wiki?SqlCodingStyle)
+ - [SQL Server Code Review Checklist for Developers](https://www.sqlshack.com/sql-server-code-review-checklist-for-developers/) (by Samir Behara)
+ - [SQL Formatting standards – Capitalization, Indentation, Comments, Parenthesis](https://solutioncenter.apexsql.com/sql-formatting-standards-capitalization-indentation-comments-parenthesis/) (by ApexSQL)
+ - [In The Cloud: The Importance of Being Organized](http://sqlblog.com/blogs/john_paul_cook/archive/2017/05/16/in-the-cloud-the-importance-of-being-organized.aspx)
+ - [Naming Conventions in Azure](http://www.sqlchick.com/entries/2017/6/24/naming-conventions-in-azure)
+ - [The Basics of Good T-SQL Coding Style – Part 3: Querying and Manipulating Data](https://www.simple-talk.com/sql/t-sql-programming/basics-good-t-sql-coding-style-part-3-querying-manipulating-data/)
+
+**[⬆ back to top](#table-of-contents)**
diff --git a/SQL Server People.md b/SQL Server People.md
index 1a944ac6..9eee4ad0 100644
--- a/SQL Server People.md
+++ b/SQL Server People.md
@@ -1,53 +1,114 @@
# Microsoft SQL Server People
Most valuable professionals in Microsoft SQL Server Database world
-| Name | Site/Blog | City | Twitter | Email | MVP | MVP page |
-|---------------------|----------------------------|-----------|-------------------|-----------------------------------|----:|------------------|
-| Brent Ozar | [Brent Ozar Blog] | Las Vegas | [@BrentO] | help@brentozar.com | 7 | [Ozar MVP] |
-| Adam Machanic | [SQLBlog] | Boston | [@AdamMachanic] | NULL | 12 | [Machanic MVP] |
-| Ola Hallengren | [Ola Maintenance Solution] | NULL | [@olahallengren] | ola@hallengren.com | 3 | [Hallengren MVP] |
-| Erland Sommarskog | [Sommarskog Blog] | NULL | NULL | esquel@sommarskog.se | 13 | [Sommarskog MVP] |
-| Phil Factor | [Phil Simple-Talk] | NULL | [@phil_factor] | NULL | - | - |
-| Robert Sheldon | [Robert Simple-Talk] | NULL | NULL | NULL | - | - |
-| Glenn Alan Berry | [Glenn Blog] | NULL | [@GlennAlanBerry] | glenn@SQLskills.com | 9 | [Berry MVP] |
-| Kenneth Fisher | [Kenneth Blog] | NULL | [@sqlstudent144] | sqlstudent144@gmail.com | - | - |
-| Kendra Little | [Kendra Blog] | NULL | [@Kendra_Little] | NULL | 4 | [Little MVP] |
-| Jeff Moden | [Jeff Articles] | NULL | NULL | NULL | 8 | [Moden MVP] |
-| Paul White | [Paul SQLBlog] | NULL | [@SQL_Kiwi] | NULL | 5 | [White MVP] |
-| Jason Strate | [Jason Blog] | NULL | [@StrateSQL] | NULL | 7 | [Strate MVP] |
-| Jeremiah Peschka | [Jeremiah Blog] | NULL | [@peschkaj] | jeremiah.peschka@gmail.com | 5 | [Peschka MVP] |
-| Gail Shaw | [Gail Blog] | NULL | [@SQLintheWild] | NULL | 8 | [Shaw MVP] |
-| Aaron Bertrand | [Aaron Articles] | NULL | [@AaronBertrand] | NULL | 19 | [Bertrand MVP] |
-| Kevin Kline | [Kevin Blog] | NULL | [@kekline] | kevin_e_kline@yahoo.com | 13 | [Kline MVP] |
-| Robert Virag | [Robert Blog] | NULL | NULL | NULL | - | - |
-| John Sansom | [John Blog] | NULL | [@SqlBrit] | NULL | - | - |
-| Jes Borland | [Jes Articles] | NULL | [@grrl_geek] | NULL | 4 | [Borland MVP] |
-| Sean Smith | [Sean Scripts] | NULL | NULL | NULL | - | - |
-| Richie Rump | [Richie Blog] | NULL | [@Jorriss] | NULL | - | - |
-| Tara Kizer | [Tara Articles] | NULL | [@TaraKizer] | NULL | 9 | [Kizer MVP] |
-| Paul S. Randal | [Paul Articles] | NULL | [@PaulRandal] | paul@sqlskills.com | 8 | [Randal MVP] |
-| Klaus Aschenbrenner | [Klaus Blog] | NULL | [@Aschenbrenner] | klaus.aschenbrenner@sqlpassion.at | - | - |
-| Grant Fritchey | [Grant Blog] | NULL | [@GFritchey] | NULL | 7 | [Fritchey MVP] |
-| Kendal Van Dyke | [KendaL Blog] | NULL | [@SQLDBA] | NULL | - | - |
-| Tim Ford | [Tim Blog] | NULL | [@sqlagentman] | NULL | 7 | [Ford MVP] |
-| Steve Jones | [Steve Jones Blog] | NULL | [@way0utwest] | NULL | 9 | [Jones MVP] |
-| Thomas Larock | [Thomas Larock Blog] | NULL | [@sqlrockstar] | NULL | 7 | [LaRock MVP] |
-| Mike Fal | [Mike Fal Blog] | NULL | [@Mike_Fal] | NULL | - | - |
-| Derik Hammer | [Derik Hammer Blog] | NULL | [@drayhammer] | NULL | - | - |
-| Chrissy LeMaire | [Chrissy LeMaire Blog] | NULL | [@cl] | NULL | 1 | [LeMaire MVP] |
-| Tim Mitchell | [Tim Mitchell Blog] | NULL | [@Tim_Mitchell] | NULL | 7 | [Mitchell MVP] |
-| Melissa Connors | [Melissa Connors Articles] | NULL | [@MelikaNoKaOi] | NULL | - | - |
-| Ken Van Hyning | - | NULL | [@sqltoolsguy] | NULL | - | - |
-| Itzik Ben-Gan | [Itzik Ben-Gan Blog] | NULL | [@ItzikBenGan] | NULL | 17 | [Ben-Gan MVP] |
-| Ed Elliott | [Ed Elliott Blog] | London | [@EdDebug] | ed.elliott@outlook.com | - | - |
-| Andy Yun | [Andy Yun Blog] | NULL | [@SQLBek] | NULL | - | - |
+| Name | Site/Blog | Country | City | Twitter | Email | MVP | MVP page |
+|---------------------|------------------------------|---------|------------------|--------------------|-----------------------------------|----:|--------------------|
+| Lori Edwards | [Lori Edwards Blog] | USA | Tucson | [@loriedwards] | NULL | 0 | - |
+| Dave Ballantyne | [Dave Ballantyne] | GBR | England | [@davebally] | NULL | 0 | - |
+| Randolph West | [Randolph West Blog] | CAN | Calgary | [@rabryst] | NULL | 1 | [Randolph MVP] |
+| Andrea Allred | [Andrea Allred Blog] | USA | Utah | [@royalsql] | NULL | 0 | - |
+| John Morehouse | [John Morehouse Blog] | KY | Louisville | [@SqlrUs] | NULL | 0 | - |
+| Ginger Grant | [Ginger Grant Blog] | USA | NULL | [@DesertIsleSQL] | NULL | 2 | [Grant MVP] |
+| Mike Walsh | [Straight Path Solutions] | USA | New Hamphire | [@mike_walsh] | NULL | 7 | [Walsh MVP] |
+| James Anderson | [James Anderson Blog] | GBR | Southampton | [@DatabaseAvenger] | NULL | 0 | - |
+| James Serra | [James Serra Blog] | USA | Texas | [@JamesSerra] | NULL | 0 | - |
+| Doug Lane | [Doug Lane Blog] | USA | Eastern Iowa | [@thedouglane] | NULL | 0 | - |
+| Drew Furgiuele | [Drew Furgiuele Blog] | USA | Dublin | [@Pittfurg] | NULL | 0 | - |
+| Cody Konior | [Cody Konior Blog] | AUS | Perth | [@codykonior] | NULL | 0 | - |
+| Stephen Wynkoop | [Stephen Wynkoop Site] | USA | Tucson | [@swynk] | NULL | 0 | - |
+| Brent Ozar | [Brent Ozar Blog] | USA | Chicago | [@BrentO] | help@brentozar.com | 7 | [Ozar MVP] |
+| Adam Machanic | [SQLBlog] | USA | Boston | [@AdamMachanic] | NULL | 13 | [Machanic MVP] |
+| Ola Hallengren | [Ola Maintenance Solution] | SWE | NULL | [@olahallengren] | ola@hallengren.com | 3 | [Hallengren MVP] |
+| Erland Sommarskog | [Sommarskog Blog] | SWE | Stockholm | NULL | esquel@sommarskog.se | 14 | [Sommarskog MVP] |
+| Phil Factor | [Phil Simple-Talk] | | NULL | [@phil_factor] | NULL | 0 | - |
+| Robert Sheldon | [Robert Simple-Talk] | | NULL | NULL | NULL | 0 | - |
+| Glenn Alan Berry | [Glenn Blog] | USA | Denwer | [@GlennAlanBerry] | glenn@SQLskills.com | 10 | [Berry MVP] |
+| Kenneth Fisher | [Kenneth Blog] | | NULL | [@sqlstudent144] | sqlstudent144@gmail.com | 0 | - |
+| Kendra Little | [Kendra Blog] | | NULL | [@Kendra_Little] | NULL | 4 | [Little MVP] |
+| Jeff Moden | [Jeff Articles] | | NULL | NULL | NULL | 8 | [Moden MVP] |
+| Paul White | [Paul SQLBlog] | NZL | Paraparaumu | [@SQL_Kiwi] | SQLkiwi@gmail.com | 5 | [White MVP] |
+| Jason Strate | [Jason Blog] | | NULL | [@StrateSQL] | NULL | 7 | [Strate MVP] |
+| Jeremiah Peschka | [Jeremiah Blog] | | NULL | [@peschkaj] | jeremiah.peschka@gmail.com | 5 | [Peschka MVP] |
+| Gail Shaw | [Gail Blog] | ZAF | Johannesburg | [@SQLintheWild] | NULL | 8 | [Shaw MVP] |
+| Aaron Bertrand | [Aaron Articles] | | NULL | [@AaronBertrand] | NULL | 20 | [Bertrand MVP] |
+| Kevin Kline | [Kevin Blog] | | NULL | [@kekline] | kevin_e_kline@yahoo.com | 13 | [Kline MVP] |
+| John Sansom | [John Blog] | | NULL | [@SqlBrit] | NULL | 0 | - |
+| Jes Borland | [Jes Articles] | | NULL | [@grrl_geek] | NULL | 4 | [Borland MVP] |
+| Sean Smith | [Sean Scripts] | | NULL | NULL | NULL | 0 | - |
+| Richie Rump | [Richie Blog] | | NULL | [@Jorriss] | NULL | 0 | - |
+| Tara Kizer | [Tara Articles] | USA | San Diego | [@TaraKizer] | NULL | 9 | [Kizer MVP] |
+| Paul S. Randal | [Paul Articles] | | NULL | [@PaulRandal] | paul@sqlskills.com | 8 | [Randal MVP] |
+| Klaus Aschenbrenner | [Klaus Blog] | | NULL | [@Aschenbrenner] | klaus.aschenbrenner@sqlpassion.at | 0 | - |
+| Grant Fritchey | [Grant Blog] | | NULL | [@GFritchey] | NULL | 7 | [Fritchey MVP] |
+| Kendal Van Dyke | [KendaL Blog] | | NULL | [@SQLDBA] | NULL | 0 | - |
+| Tim Ford | [Tim Blog] | | NULL | [@sqlagentman] | NULL | 7 | [Ford MVP] |
+| Steve Jones | [Steve Jones Blog] | | NULL | [@way0utwest] | NULL | 9 | [Jones MVP] |
+| Thomas Larock | [Thomas Larock Blog] | | NULL | [@sqlrockstar] | NULL | 9 | [LaRock MVP] |
+| Derik Hammer | [Derik Hammer Blog] | USA | Oklahoma | [@drayhammer] | NULL | 1 | [Derik MVP] |
+| Chrissy LeMaire | [Chrissy LeMaire Blog] | | NULL | [@cl] | NULL | 1 | [LeMaire MVP] |
+| Tim Mitchell | [Tim Mitchell Blog] | | NULL | [@Tim_Mitchell] | NULL | 7 | [Mitchell MVP] |
+| Melissa Connors | [Melissa Connors Articles] | | NULL | [@MelikaNoKaOi] | NULL | 0 | - |
+| Ken Van Hyning | - | | NULL | [@sqltoolsguy] | NULL | 0 | - |
+| Itzik Ben-Gan | [Itzik Ben-Gan Blog] | | NULL | [@ItzikBenGan] | NULL | 17 | [Ben-Gan MVP] |
+| Ed Elliott | [Ed Elliott Blog] | ENG | London | [@EdDebug] | ed.elliott@outlook.com | 0 | - |
+| Andy Yun | [Andy Yun Blog] | | NULL | [@SQLBek] | NULL | 0 | - |
+| Sander Stad | [Sander Stad Blog] | | NULL | [@SQLStad] | NULL | 0 | - |
+| Guy Glantser | - | | NULL | [@guy_glantser] | NULL | 2 | [Glantser MVP] |
+| Matan Yungman | - | ISR | Tel Aviv | [@MatanYungman] | NULL | 0 | [Yungman MVP] |
+| Julie Koesmarno | [July Blog] | USA | Redmond | [@MsSQLGirl] | NULL | 0 | - |
+| Michael J Swart | [Michael Blog] | CAN | Waterloo | [@MJSwart] | NULL | 5 | [Swart MVP] |
+| Dmitry Pilugin | [Dmitry Blog] | RUS | Moscow | [@SomewereSomehow] | pilugin@inbox.ru | 4 | [Pilugin MVP] |
+| Buck Woody | [Buck Blog] | | NULL | [@buckwoodymsft] | NULL | 0 | - |
+| Steve Stedman | [Steve Stedman Blog] | USA | Austin | [@stedman] | NULL | 0 | - |
+| Daniel Hutmacher | [Daniel Hutmacher Blog] | USA | Austin | [@dhmacher] | NULL | 0 | - |
+| Niko Neugebauer | [Niko Blog] | PRT | NULL | [@NikoNeugebauer] | niko@nikoport.com | 6 | [Neugebauer MVP] |
+| Mike Fal | [Mike Fal Blog] | USA | Denver | [@Mike_Fal] | NULL | 0 | - |
+| Robert L Davis | [Robert Blog] | USA | New York | [@SQLSoldier] | NULL | 3 | [Davis MVP] |
+| Chris Shaw | [Chris Shaw Blog] | USA | Colorado | [@SQLShaw] | NULL | 8 | [Shaw MVP] |
+| Andy Mallon | [Andy Mallon Blog] | USA | Boston | [@AMtwo] | NULL | 0 | - |
+| Remus Rusanu | [Remus Rusanu Blog] | USA | Seattle | [@rusanu] | NULL | 0 | - |
+| Dan Guzman | [Dan Guzman Blog] | USA | St. Louis | NULL | NULL | 15 | [Guzman MVP] |
+| Frank Gill | [Frank Gill Blog] | USA | Chicago | [@skreebydba] | NULL | 0 | - |
+| Mohammad Darab | [Mohammad Darab Blog] | USA | Washington | [@mwdarab] | NULL | 0 | - |
+| Kimberly Tripp | [Kimberly Tripp Articles] | USA | Redmond | [@KimberlyLTripp] | NULL | 13 | [Kimberly MVP] |
+| Raul Gonzalez | [Raul Gonzalez Blog] | | NULL | [@SQLDoubleG] | NULL | 0 | - |
+| Rob Sewell | [Rob Sewell Blog] | GBR | Somerset | [@sqldbawithbeard] | NULL | 1 | [Swell MVP] |
+| Jonathan Kehayias | [Jonathan Kehayias Articles] | USA | Tampa | [@SQLPoolBoy] | NULL | 9 | [Kehayias MVP] |
+| Thomas Kejser | [Thomas Kejser Blog] | DNK | NULL | NULL | thomas@kejser.org | 0 | - |
+| Patrick Keisler | [Patrick Keisler Blog] | USA | New York | [@patrickkeisler] | NULL | 0 | - |
+| Markus Winand | [Markus Winand Blog] | AUT | Vienna | [@MarkusWinand] | NULL | 0 | - |
+| Kevin Feasel | [Kevin Feasel Blog] | USA | Durham | [@feaselkl] | NULL | 2 | [Feasel MVP] |
+| Wayne Sheffield | [Wayne Sheffield Blog] | USA | Richmond | [@DBAWayne] | NULL | 1 | [Sheffield MVP] |
+| Ewald Cress | [Ewald Cress Blog] | | NULL | [@sqlOnIce] | NULL | 0 | |
+| Dmitri Korotkevitch | [Dmitri Korotkevitch Blog] | USA | Tampa | [@aboutsqlserver] | dk@aboutsqlserver.com | 6 | [Korotkevitch MVP] |
+| Bert Wagner | [Bert Wagner Blog] | | NULL | [@bertwagner] | NULL | 0 | |
+| Erik Darling | [Erik Darling Articles] | USA | NULL | NULL | NULL | 0 | |
+| Thomas Rushton | [Thomas Rushton Blog] | USA | NULL | NULL | NULL | 0 | |
+| Solomon Rutzky | [Sql Quantum Leap] | USA | Raleigh | [@SqlQuantumLeap] | [Contact Solomon Rutzky][1] | 0 | |
+| Ned Otter | [Ned Otter Blog] | USA | New York | [@NedOtter] | [Contact Ned Otter][2] | 0 | |
+| Joe Obbish | [Joe Obbish Blog] | | NULL | NULL | NULL | 0 | |
+| Stephen Bennett | [Stephen Bennett Blog] | ENG | London | NULL | NULL | 0 | |
+| Brian Davis | [Brian Davis Articles] | USA | NULL | [@brian78] | NULL | 0 | |
+[Stephen Wynkoop Site]:https://www.sswug.org/
+[Cody Konior Blog]:https://www.codykonior.com/categories/#sql
+[Drew Furgiuele Blog]:http://port1433.com/
+[Doug Lane Blog]:http://www.douglane.net/blog/
+[James Serra Blog]:http://www.jamesserra.com/
+[James Anderson Blog]:http://thedatabaseavenger.com/
+[Straight Path Solutions]:https://straightpathsql.com/
+[Ginger Grant Blog]:http://www.desertislesql.com/wordpress1/
+[John Morehouse Blog]:http://sqlrus.com/
+[Andrea Allred Blog]:https://royalsql.com/
+[Randolph West Blog]:https://rabryst.ca/
+[Dave Ballantyne]:clearskysql.co.uk/
+[Lori Edwards Blog]:https://blogs.sentryone.com/author/LoriEdwards/
[Brent Ozar Blog]:http://www.brentozar.com/
-[SQLBlog]:http://sqlblog.com
+[SQLBlog]:http://sqlblog.com/
[Ola Maintenance Solution]:https://ola.hallengren.com/
[Sommarskog Blog]:http://www.sommarskog.se/
-[Phil Simple-Talk]:https://www.simple-talk.com/author/phil-factor/
+[Phil Simple-Talk]:https://www.red-gate.com/simple-talk/author/phil-factor/
[Robert Simple-Talk]:https://www.simple-talk.com/author/robert-sheldon/
[Glenn Blog]:https://sqlserverperformance.wordpress.com/
[Kenneth Blog]:http://sqlstudies.com/
@@ -78,9 +139,59 @@ Most valuable professionals in Microsoft SQL Server Database world
[Tim Mitchell Blog]:https://www.timmitchell.net
[Melissa Connors Articles]:http://blogs.sqlsentry.com/author/melissaconnors/
[Itzik Ben-Gan Blog]:http://tsql.solidq.com/
-[Ed Elliott Blog]:https://the.agilesql.club/Blogs/Ed-Elliott/About
+[Ed Elliott Blog]:https://the.agilesql.club/Blogs/Ed-Elliott/
[Andy Yun Blog]:https://sqlbek.wordpress.com
+[Sander Stad Blog]:http://www.sqlstad.nl
+[July Blog]:http://www.mssqlgirl.com/
+[Michael Blog]:http://michaeljswart.com/
+[Dmitry Blog]:http://www.queryprocessor.com/
+[Buck Blog]:https://thelonedba.wordpress.com/
+[Steve Stedman Blog]:http://stevestedman.com
+[Daniel Hutmacher Blog]:https://sqlsunday.com
+[Niko Blog]:http://www.nikoport.com
+[Robert Blog]:http://www.sqlsoldier.com/wp/
+[Chris Shaw Blog]:https://chrisshaw.wordpress.com
+[Andy Mallon Blog]:http://www.am2.co/
+[Remus Rusanu Blog]:http://rusanu.com/
+[Dan Guzman Blog]:http://www.dbdelta.com/
+[Frank Gill Blog]:https://skreebydba.com/
+[Mohammad Darab Blog]:https://mohammaddarab.com/blog/
+[Kimberly Tripp Articles]:https://www.sqlskills.com/blogs/kimberly/
+[Raul Gonzalez Blog]:http://www.sqldoubleg.com
+[Rob Sewell Blog]:https://sqldbawithabeard.com/
+[Jonathan Kehayias Articles]:https://www.sqlskills.com/blogs/jonathan/
+[Niko Blog]:http://www.nikoport.com
+[Thomas Kejser Blog]:http://kejser.org/
+[Patrick Keisler Blog]:http://www.patrickkeisler.com
+[Markus Winand Blog]:http://use-the-index-luke.com
+[Kevin Feasel Blog]:https://36chambers.wordpress.com/
+[Wayne Sheffield Blog]:http://blog.waynesheffield.com/
+[Ewald Cress Blog]:http://sqlonice.com
+[Dmitri Korotkevitch Blog]:http://aboutsqlserver.com/
+[Bert Wagner Blog]:https://blog.bertwagner.com/
+[Erik Darling Articles]:https://www.brentozar.com/archive/author/erik-darling/
+[Thomas Rushton Blog]:https://thelonedba.wordpress.com/
+[Sql Quantum Leap]:https://SqlQuantumLeap.com/
+[1]:https://SqlQuantumLeap.com/contact/
+[Ned Otter Blog]:http://nedotter.com/
+[2]:http://nedotter.com/contact/
+[Joe Obbish Blog]:https://orderbyselectnull.com/
+[Stephen Bennett Blog]:https://sqlnotesfromtheunderground.wordpress.com/
+[Brian Davis Articles]:https://blogs.sentryone.com/author/briandavis/
+[@swynk]:https://twitter.com/swynk
+[@codykonior]:https://twitter.com/codykonior
+[@Pittfurg]:https://twitter.com/pittfurg
+[@thedouglane]:https://twitter.com/thedouglane
+[@JamesSerra]:https://twitter.com/jamesserra
+[@DatabaseAvenger]:https://twitter.com/databaseavenger
+[@mike_walsh]:https://twitter.com/mike_walsh
+[@DesertIsleSQL]:https://twitter.com/desertislesql
+[@SqlrUs]:https://twitter.com/sqlrus
+[@RoyalSQL]:https://twitter.com/royalsql
+[@rabryst]:https://twitter.com/rabryst
+[@davebally]:https://twitter.com/davebally
+[@loriedwards]:https://twitter.com/loriedwards
[@BrentO]:https://twitter.com/BrentO
[@AdamMachanic]:https://twitter.com/AdamMachanic
[@olahallengren]:https://twitter.com/olahallengren
@@ -113,7 +224,43 @@ Most valuable professionals in Microsoft SQL Server Database world
[@sqltoolsguy]:https://twitter.com/sqltoolsguy
[@ItzikBenGan]:https://twitter.com/ItzikBenGan
[@EdDebug]:https://twitter.com/EdDebug
+[@SQLBek]:https://twitter.com/SQLBek
+[@SQLStad]:https://twitter.com/SQLStad
+[@guy_glantser]:https://twitter.com/guy_glantser
+[@MatanYungman]:https://twitter.com/MatanYungman
+[@MsSQLGirl]:https://twitter.com/MsSQLGirl
+[@MJSwart]:https://twitter.com/MJSwart
+[@SomewereSomehow]:https://twitter.com/SomewereSomehow
+[@buckwoodymsft]:https://twitter.com/buckwoodymsft
+[@stedman]:https://twitter.com/stedman
+[@dhmacher]:https://twitter.com/dhmacher
+[@NikoNeugebauer]:https://twitter.com/NikoNeugebauer
+[@SQLSoldier]:https://twitter.com/SQLSoldier
+[@SQLShaw]:https://twitter.com/SQLShaw
+[@AMtwo]:https://twitter.com/AMtwo
+[@rusanu]:https://twitter.com/rusanu
+[@skreebydba]:https://twitter.com/skreebydba
+[@mwdarab]:https://twitter.com/
+[@KimberlyLTripp]:https://twitter.com/KimberlyLTripp
+[@SQLDoubleG]:https://twitter.com/SQLDoubleG
+[@sqldbawithbeard]:https://twitter.com/@sqldbawithbeard
+[@SQLPoolBoy]:https://twitter.com/SQLPoolBoy
+[@NikoNeugebauer]:https://twitter.com/NikoNeugebauer
+[@patrickkeisler]:https://twitter.com/patrickkeisler
+[@MarkusWinand]:https://twitter.com/MarkusWinand
+[@feaselkl]:https://twitter.com/feaselkl
+[@DBAWayne]:https://twitter.com/DBAWayne
+[@sqlOnIce]:https://twitter.com/sqlOnIce
+[@aboutsqlserver]:https://twitter.com/aboutsqlserver
+[@bertwagner]:https://twitter.com/bertwagner
+[@SqlQuantumLeap]:https://twitter.com/SqlQuantumLeap
+[@NedOtter]:https://twitter.com/NedOtter
+[@brian78]:https://twitter.com/brian78
+[Swell MVP]:https://mvp.microsoft.com/en-us/PublicProfile/5002693?fullName=Rob%20%20Sewell
+[Walsh MVP]:https://mvp.microsoft.com/en-us/PublicProfile/4032569?fullName=Mike%20%20Walsh
+[Grant MVP]:https://mvp.microsoft.com/en-us/PublicProfile/5001878?fullName=Ginger%20%20Grant
+[Randolph MVP]:https://mvp.microsoft.com/en-us/PublicProfile/5002351?fullName=Randolph%20%20West
[Ozar MVP]:https://mvp.microsoft.com/en-us/PublicProfile/4025575?fullName=Brent%20%20Ozar
[Machanic MVP]:https://mvp.microsoft.com/en-us/PublicProfile/10761?fullName=Adam%20%20Machanic
[Hallengren MVP]:https://mvp.microsoft.com/en-us/PublicProfile/5000459?fullName=Ola%20%20Hallengren
@@ -133,7 +280,21 @@ Most valuable professionals in Microsoft SQL Server Database world
[Fritchey MVP]:https://mvp.microsoft.com/en-us/PublicProfile/4025126?fullName=Grant%20%20Fritchey
[Ford MVP]:https://mvp.microsoft.com/en-us/PublicProfile/4025585?fullName=Timothy%20%20Ford
[Jones MVP]:https://mvp.microsoft.com/en-us/PublicProfile/4014238?fullName=Steve%20%20Jones
+[Derik MVP]:https://mvp.microsoft.com/en-us/PublicProfile/5002574?fullName=Derik%20%20Hammer
[LaRock MVP]:https://mvp.microsoft.com/en-us/PublicProfile/4025219?fullName=Thomas%20%20LaRock
[LeMaire MVP]:https://mvp.microsoft.com/en-us/PublicProfile/5001321?fullName=Chrissy%20%20LeMaire
[Mitchell MVP]:https://mvp.microsoft.com/en-us/PublicProfile/4027186?fullName=Tim%20%20Mitchell
[Ben-Gan MVP]:https://mvp.microsoft.com/en-us/PublicProfile/6819?fullName=Itzik%20%20Ben-Gan
+[Glantser MVP]:https://mvp.microsoft.com/en-us/PublicProfile/5001253?fullName=Guy%20%20Glantser
+[Yungman MVP]:https://mvp.microsoft.com/en-us/PublicProfile/5001675?fullName=Matan%20%20Yungman
+[Swart MVP]:https://mvp.microsoft.com/en-us/PublicProfile/4038219?fullName=Michael%20J%20Swart
+[Pilugin MVP]:https://mvp.microsoft.com/en-us/PublicProfile/5000995?fullName=Dmitry%20%20Pilugin
+[Davis MVP]:https://mvp.microsoft.com/en-us/PublicProfile/5000945?fullName=Robert%20L%20Davis
+[Shaw MVP]:https://mvp.microsoft.com/en-us/PublicProfile/4025121?fullName=Chris%20%20Shaw
+[Guzman MVP]:https://mvp.microsoft.com/en-us/PublicProfile/5439?fullName=Dan%20%20Guzman
+[Kimberly MVP]:https://mvp.microsoft.com/en-us/PublicProfile/8566?fullName=Kimberly%20L.%20Tripp
+[Kehayias MVP]:https://mvp.microsoft.com/en-us/PublicProfile/4021854?fullName=Jonathan%20Matthew%20Kehayias
+[Neugebauer MVP]:https://mvp.microsoft.com/en-us/PublicProfile/4033494?fullName=Niko%20%20Neugebauer
+[Feasel MVP]:https://mvp.microsoft.com/en-us/PublicProfile/5001922?fullName=Kevin%20%20Feasel
+[Sheffield MVP]:https://mvp.microsoft.com/en-us/PublicProfile/5002585?fullName=Wayne%20%20Sheffield
+[Korotkevitch MVP]:https://mvp.microsoft.com/en-us/PublicProfile/4039717?fullName=Dmitri%20%20Korotkevitch
diff --git a/SQL Server Trace Flag.md b/SQL Server Trace Flag.md
index 00bba4dc..1ad41d2a 100644
--- a/SQL Server Trace Flag.md
+++ b/SQL Server Trace Flag.md
@@ -1,51 +1,122 @@
# Microsoft SQL Server Trace Flags
-Complete list of Microsoft SQL Server trace flags (300 trace flags).
+Detailed list of all (documented and undocumented) Microsoft SQL Server trace flags (**593** trace flags).
+
+⚠ **REMEMBER: Be extremely careful with trace flags, test in your development environment first.
+And consult professionals first if you are the slightest uncertain about the effects of your changes.**
+
+⚠ **Some trace flags were introduced in specific SQL Server versions.
+For more information on the applicable version, see the Microsoft Support article associated with a specific trace flag.**
+
+⚠ **Trace flag behavior may not be supported in future releases of SQL Server.**
Headers:
+ - [Unknown trace flags](#unknown-trace-flags")
- [What are Microsoft SQL Server Trace Flags?](#what-are-microsoft-sql-server-trace-flags)
- [How do I turn Trace Flags on and off?](#how-do-i-turn-trace-flags-on-and-off)
- [How do I know what Trace Flags are turned on at the moment?](#how-do-i-know-what-trace-flags-are-turned-on-at-the-moment)
- [What Are the Optimizer Rules?](#what-are-the-optimizer-rules)
+ - [Recommended Trace Flags](#recommended-trace-flags)
- [Trace flags list](#trace-flags-list)
Source links:
+ - [A Topical Collection of SQL Server Flags](https://sqlcrossjoin.wordpress.com/2013/10/28/a-topical-collection-of-sql-server-flags/) (by Aaron Morelli)
- [Steinar Andersen great post](http://www.sqlservice.se/updated-microsoft-sql-server-trace-flag-list/)
- [Yusuf Anis trace flag table](http://www.sqlservercentral.com/articles/trace+flags/70131/)
- - MSDN TF list: http://sqlserverpedia.com/wiki/Trace_Flags
- - Albert van der Sel TF list: http://antapex.org/traceflags_sqlserver.txt
- - Technet Wiki TF list: http://social.technet.microsoft.com/wiki/contents/articles/13105.trace-flags-in-sql-server.aspx
- - Amit Banerjee TF list: http://troubleshootingsql.com/2012/07/01/sql-server-2008-trace-flags/
- - Paul Randal discussing TF Pro’s and Con’s: http://www.sqlskills.com/blogs/paul/the-pros-and-cons-of-trace-flags/
- - **Some trace flags needs to be specified with "t" rather than with "T" in startup options!**: http://technet.microsoft.com/en-us/library/ms190737(v=sql.110).aspx
+ - [Docs Trace Flags]
+ - [Albert van der Sel TF list](http://antapex.org/traceflags_sqlserver.txt)
+ - [TECHNET List Of SQL Server Trace Flags]
+ - [Amit Banerjee TF list](http://troubleshootingsql.com/2012/07/01/sql-server-2008-trace-flags/)
+ - [Paul Randal discussing TF Pro’s and Con’s](http://www.sqlskills.com/blogs/paul/the-pros-and-cons-of-trace-flags/)
+ - **When specifying a trace flag with the -T option, use an uppercase "T" to pass the trace flag number.
+A lowercase "t" is accepted by SQL Server, but this sets other internal trace flags that are required only by SQL Server support engineers.
+(Parameters specified in the Control Panel startup window are not read.)**: https://technet.microsoft.com/en-us/en-en/library/ms190737%28v=sql.120%29.aspx
- [Enabling SQL Server Trace Flag for a Poor Performing Query Using QUERYTRACEON](https://www.mssqltips.com/sqlservertip/3320/enabling-sql-server-trace-flag-for-a-poor-performing-query-using-querytraceon/)
- [Disabling SQL Server Optimizer Rules with QUERYRULEOFF](https://www.mssqltips.com/sqlservertip/4175/disabling-sql-server-optimizer-rules-with-queryruleoff/)
-
-**Thanks to:**
- - Steinar Andersen
- - Brent Ozar
+ - [SQLskills SQL101: Trace Flags](https://www.sqlskills.com/blogs/erin/sqlskills-101-trace-flags/)
+ - [Derik Hammer - Trace Flag Recommendation](http://www.sqlhammer.com/deriks-favorite-trace-flags/)
+ - [Brent Ozar - Bad Idea Jeans: Finding Undocumented Trace Flags](https://rebrand.ly/brent-finding-undocumented-trace-flags)
+ - [Joe Obbish - A Method to Find Trace Flags](https://rebrand.ly/joe-finding-undocumented-trace-flags)
+
+**Great thanks to:**
+ - Aaron Morelli ([b](https://sqlcrossjoin.wordpress.com) | [@sqlcrossjoin](https://twitter.com/sqlcrossjoin))
+ - Steinar Andersen ([b](http://www.sqlservice.se/) | [@SQLSteinar](https://twitter.com/SQLSteinar))
+ - Brent Ozar ([b](https://www.brentozar.com/) | [@BrentO](https://twitter.com/BrentO))
- Yusuf Anis
- Lars Utterström
- Martin Höglund
- Håkan Winther
- Toine Rozemeijer
- - Robert L Davis aka @sqlsoldier
- - sql_handle aka @sql_handle
+ - Robert L Davis ([b](http://www.sqlsoldier.com/wp/) | [@SQLSoldier](https://twitter.com/SQLSoldier))
+ - Lonny Niederstadt ([b](http://sql-sasquatch.blogspot.ru/) | [@sql_handle](https://twitter.com/@sql_handle))
- Andrzej Kukuła
-
-
-## What are Microsoft SQL Server Trace Flags?
-Trace Flags are settings that in some way or another alters the behavior of various SQL Server functions: https://msdn.microsoft.com/en-us/library/ms188396.aspx
-
-
-## How do I turn Trace Flags on and off?
- - You can use the [DBCC TRACEON](https://msdn.microsoft.com/en-us/library/ms187329.aspx "Official MSDN DBCC TRACEON Article") and [DBCC TRACEOFF](https://msdn.microsoft.com/en-us/library/ms174401.aspx "Official MSDN DBCC TRACEOFF Article") commands
- - You can use the [-T option](https://technet.microsoft.com/en-us/library/ms190737%28v=sql.120%29.aspx "Official TECHNET Database Engine Service Startup Options Article") in the startup configuration for the SQL Server Service.
- **When specifying a trace flag with the -T option, use an uppercase "T" to pass the trace flag number. A lowercase "t" is accepted by SQL Server, but this sets other internal trace flags that are required only by SQL Server support engineers. (Parameters specified in the Control Panel startup window are not read.)**
- - You can also use the hint [QUERYTRACEON](https://support.microsoft.com/en-us/kb/2801413 "Official QUERYTRACEON KB Article") in your queries: **<querytraceon_hint ::= {QUERYTRACEON trace_flag_number}>**
-
-
-## How do I know what Trace Flags are turned on at the moment?
-You can use the [DBCC TRACESTATUS](https://msdn.microsoft.com/en-us/library/ms187809.aspx "Official MSDN link") command
+ - Alexander Titenko ([gtihub](https://github.com/AlexTitenko))
+ - Albert van der Sel
+ - Amit Banerjee
+ - Erin Stellato ([b](http://www.sqlskills.com/blogs/erin/) | [@erinstellato](https://twitter.com/erinstellato))
+ - Darik Hammer ([b](http://www.sqlhammer.com/) | [@drayhammer](https://twitter.com/drayhammer))
+ - Erik Darling ([b](https://www.brentozar.com/archive/author/erik-darling/))
+ - Joe Obbish ([b](https://orderbyselectnull.com/))
+ - Glenn Berry ([b](https://sqlserverperformance.wordpress.com/) | [t](https://twitter.com/GlennAlanBerry))
+ - Pedro Lopes ([b](https://social.msdn.microsoft.com/profile/Pedro+Lopes+%28PL%29) | [t](https://twitter.com/sqlpto))
+ - Paul White ([b](http://sqlblog.com/blogs/paul_white/) | [t](https://twitter.com/SQL_Kiwi))
+ - Alexey Nagorskiy ([github](https://github.com/fenixfx))
+ - Niko Neugebauer ([b](http://www.nikoport.com/) | [t](https://twitter.com/@NikoNeugebauer))
+ - Solomon Rutzky ([b](https://SqlQuantumLeap.com/) | [t](https://twitter.com/@SqlQuantumLeap))
+ - Jason Brimhall ([b](http://jasonbrimhall.info/) | [t](https://twitter.com/sqlrnnr))
+ - Victor Isakov ([b](https://victorisakov.wordpress.com/))
+ - Scott Caldwell ([b](https://blog.rdx.com/) | [t](https://twitter.com/sqldroid))
+ - Mike Fal ([b](http://www.mikefal.net) | [t](https://twitter.com/Mike_Fal))
+ - Prince Kumar Rastogi ([b](http://www.sqlservergeeks.com/) | [t](https://twitter.com/princerastogi2))
+ - Kendra Little ([b](http://www.littlekendra.com/) | [t](https://twitter.com/Kendra_Little))
+ - Slava Oks ([t](https://twitter.com/slava_oks/))
+ - John Sterrett ([b](https://www.procuresql.com/))
+ - Pavel Málek ([t](https://twitter.com/malekpav))
+
+
+
+## Unknown trace flags
+List of Unknown trace flags enabled on default Azure SQL Server instances, see more details here: [Azure SQL DB Managed Instances: Trace Flags, Ahoy!](https://www.brentozar.com/archive/2018/03/azure-sql-db-managed-instances-trace-flags-ahoy/)
+If you know behavior some of them please open an issue or contact me (taranov.pro).
+
+ - [ ] 2591
+ - [ ] 3447 (but 3448 is there, which is supposed to help fix an issue with hung Mirrored databases)
+ - [ ] 3978
+ - [ ] 4141
+ - [ ] 5521
+ - [ ] 7838
+ - [ ] 8037
+ - [ ] 8054
+ - [ ] 8057
+ - [ ] 8063
+ - [ ] 8065
+ - [ ] 9041
+ - [ ] 9537
+ - [ ] 9570
+ - [ ] 9883
+ - [ ] 9905
+ - [ ] 9934
+ - [ ] 9940
+ - [ ] 9941
+
+
+
+## What are Microsoft SQL Server Trace Flags?
+Trace Flags are settings that in some way or another alters the behavior of various SQL Server functions: [Docs Trace Flags]
+
+
+
+## How do I turn Trace Flags on and off?
+ - You can use the [DBCC TRACEON] and [DBCC TRACEOFF] commands
+ - You can use the [-T option](https://docs.microsoft.com/sql/database-engine/configure-windows/database-engine-service-startup-options "Official Microsoft Docs Database Engine Service Startup Options Article") in the startup configuration for the SQL Server Service.
+ **When specifying a trace flag with the `-T` option, use an uppercase `"T"` to pass the trace flag number. A lowercase `"t"` is accepted by SQL Server, but this sets other internal trace flags that are required only by SQL Server support engineers. (Parameters specified in the Control Panel startup window are not read.)**
+ - You can also use the hint [QUERYTRACEON](https://support.microsoft.com/help/2801413 "Official QUERYTRACEON KB Article") in your queries: **<querytraceon_hint ::= {QUERYTRACEON trace_flag_number}>**
+
+
+
+## How do I know what Trace Flags are turned on at the moment?
+From SSMS 16 every sql plan content information about trace flags in section `Trace flags`
+
+You can use the [DBCC TRACESTATUS](https://docs.microsoft.com/sql/t-sql/database-console-commands/dbcc-tracestatus-transact-sql "Microsoft Docs DBCC TRACESTATUS") command
The following example displays the status of all trace flags that are currently enabled globally:
```sql
@@ -72,23 +143,27 @@ GO
```
-## What Are the Optimizer Rules?
-We all know that every time SQL Server executes a query it builds an execution plan that translates the logical operations like joins and predicates into physical operations that are implemented in the SQL Server source code. That conversion is based on certain rules known as the Optimizer Rules. They define for example how to perform an INNER JOIN. When we write a simple select statement with an inner join, the query optimizer chooses based on statistics, indexes and enabled rules if the join is executed as a Merge Join, Nested Loop or a Hash Join and also if the join can use the commutative property of joins. Mathematically A join B is equal to B join A, but the computational cost generally is not the same.
+
+## What Are the Optimizer Rules?
+We all know that every time SQL Server executes a query it builds an execution plan that translates the logical operations like joins and predicates into physical operations that are implemented in the SQL Server source code.
+That conversion is based on certain rules known as the Optimizer Rules. They define for example how to perform an INNER JOIN.
+When we write a simple select statement with an inner join, the query optimizer chooses based on statistics, indexes and enabled rules if the join is executed as a Merge Join, Nested Loop or a Hash Join and also if the join can use the commutative property of joins. Mathematically A join B is equal to B join A, but the computational cost generally is not the same.
### Getting the List of Available Rules
-To obtain the list of rules of your version of SQL Server we must use the undocumented DBCC commands SHOWONRULES and SHOWOFFRULES. Those commands display the enabled and disabled rules for the whole instance respectively. As you may guess, the number of rules varies amongst versions.
+To obtain the list of rules of your version of SQL Server we must use the undocumented DBCC commands SHOWONRULES and SHOWOFFRULES.
+Those commands display the enabled and disabled rules for the whole instance respectively. As you may guess, the number of rules varies amongst versions.
```sql
-USE master
+USE master;
GO
-DBCC TRACEON(3604)
+DBCC TRACEON(3604);
GO
-DBCC SHOWONRULES
+DBCC SHOWONRULES;
GO
-DBCC SHOWOFFRULES
+DBCC SHOWOFFRULES;
GO
```
@@ -102,1611 +177,4820 @@ GO
| LASJNtoSM | Left Anti Semi Join to Sort Merge |
-**REMEMBER: Be extremely careful with trace flags, test in your test environment first. And consult professionals first if you are the slightest uncertain about the effects of your changes.**
+
+## Recommended Trace Flags
+
+ - [Trace Flag 272](#272) (for SQL Server 2012)
+ - [Trace Flag 460](#460) (for SQL Server 2019, >= 2017 CU12)
+ - [Trace Flag 1118](#1118) (for versions < SQL Server 2016)
+ - [Trace Flag 3023](#3023) (for versions < SQL Server 2014)
+ - [Trace Flag 3226](#3226) (for all versions)
+ - [Trace Flag 3427](#3427) (for SQL Server 2016)
+ - [Trace Flag 3449](#3449) (for versions SQL Server 2012 SP3 CU3 or later or SQL Server 2014 SP1 CU7 or later)
+ - [Trace Flag 6534](#6534) (for versions SQL Server 2012, 2014, 2016) (if use [spatial data types](https://docs.microsoft.com/sql/relational-databases/spatial/spatial-data-sql-server))
+ - [Trace Flag 7412](#7412) (for versions >= SQL Server 2016)
+ - [Trace Flag 7745](#7745) (for versions >= SQL Server 2016)
+ - [Trace Flag 7752](#7752) (for versions >= SQL Server 2016)
+ - [Trace Flag 7806](#7806) (for SQL Server Express Edition)
+
+**Trace Flag 272** prevents identity gap after restarting SQL Server 2012 instance, critical for columns with identity and `tinyint` and `smallint` data types.
+(Demo for repeating this issue [here](https://github.com/ktaranov/sqlserver-kit/Errors/Identity_gap_sql_server_2012.sql))
+
+**Trace Flag 460** Replace error message [8152] with [2628] (`String or binary data would be truncated. The statement has been terminated.`).
+Description for [2628] mesage has useful information - which column had the truncation and which row.
+
+**Trace flag 1118** addresses contention that can exist on a particular type of page in a database, the SGAM page.
+This trace flag typically provides benefit for customers that make heavy use of the tempdb system database.
+In SQL Server 2016, you change this behavior using the `MIXED_PAGE_ALLOCATION` database option, and there is no need for TF 1118.
+
+**Trace flag 3023** is used to enable the CHECKSUM option, by default, for all backups taken on an instance.
+With this option enabled, page checksums are validated during a backup, and a checksum for the entire backup is generated.
+Starting in SQL Server 2014, this option can be set instance-wide through `sp_configure ('backup checksum default')`.
+
+**Trace flag 3226** prevents the writing of successful backup messages to the SQL Server ERRORLOG.
+Information about successful backups is still written to `msdb` and can be queried using T-SQL.
+For servers with multiple databases and regular transaction log backups, enabling this option means the ERRORLOG is no longer bloated with BACKUP DATABASE and Database backed up messages.
+As a DBA, this is a good thing because when I look in my ERRORLOG, I really only want to see errors, I don’t want to scroll through hundreds or thousands of entries about successful backups.
+**Trace flag 3427** Another change in SQL Server 2016 behavior that could impact tempdb-heavy workloads has to do with Common Criteria Compliance (CCC), also known as C2 auditing.
+We introduced functionality to allow for transaction-level auditing in CCC which can cause some additional overhead, particularly in workloads that do heavy inserts and updates in temp tables.
+Unfortunately, this overhead is incurred whether you have CCC enabled or not. In SQL Server 2016 you can enable trace flag 3427 to bypass this overhead starting with SP1 CU2. Starting in SQL Server 2017 CU4, we automatically bypass this code if CCC is disabled.
-## Trace flags list
-Summary: 300 trace flags
+**Trace flag 3449** (and you are on SQL Server 2012 SP3 CU3 or later or SQL Server 2014 SP1 CU7 or later),
+will get much better performance by avoiding a FlushCache call in a number of different common scenarios, such as backup database,
+backup transaction log, create database, add a file to a database, restore a transaction log, recover a database, shrink a database file, and a SQL Server “graceful” shutdown.
-**Trace Flag: -1**
-Function: Sets trace flags for all client connections, rather than for a single client connection. Because trace flags set using the -T command-line option automatically apply to all connections, this trace flag is used only when setting trace flags using DBCC TRACEON and DBCC TRACEOFF.
+**Trace flag 6534** enables performance improvement of query operations with spatial data types in SQL Server 2012, SQL Server 2014 and SQL Server 2016.
+The performance gain will vary, depending on the configuration, the types of queries, and the objects.
+
+**Trace flag 7412** enables the lightweight query execution statistics profiling infrastructure.
+Unless your server is already CPU bound, like you’re running all the time with 95% CPU, unless you are at that point, turn on this trace flag at any server you have.
+This would be my advice here because this enables that lightweight profiling infrastructure there and then you’ll see in a few minutes what it unleashes here.
+So one thing that happens when I enable the lightweight profiling is that the sys.dm_exec_query_profiles DMV, which is something that actually populates the live query stats ability or feature of SSMS, now also is also populated with this lightweight profiling, which means that for all essence, we are now able to run a live query stats on all fashions at any given point in time, and this is extremely useful for let’s say a production DBA that someone calls and says, “Hey, you have a problem.
+To tap into running system and look at what it’s doing.”
+
+**Trace flag 7745** forces Query Store to not flush data to disk on database shutdown.
+Using this trace may cause Query Store data not previously flushed to disk to be lost in case of shutdown.
+For a SQL Server shutdown, the command SHUTDOWN WITH NOWAIT can be used instead of this trace flag to force an immediate shutdown.
+
+**Trace Flag: 7752** enables asynchronous load of Query Store.
+Use this trace flag if SQL Server is experiencing high number of [QDS_LOADDB](https://www.sqlskills.com/help/waits/qds_loaddb/) waits related to Query Store synchronous load (default behavior).
+
+**Trace Flag: 7806** enables a dedicated administrator connection ([DAC]) on SQL Server Express.
+
+
+
+## Trace Flags List
+Summary: **593 trace flags**
+
+
+
+#### Trace Flag: -1
+Function: Sets trace flags for all client connections, rather than for a single client connection.
+Because trace flags set using the -T command-line option automatically apply to all connections, this trace flag is used only when setting trace flags using [DBCC TRACEON] and [DBCC TRACEOFF].
Link: http://www.sql-server-performance.com/2002/traceflags/
-**Trace Flag: 101**
-Function: Verbose Merge Replication logging output for troubleshooting
-Merger repl performance
-Link: http://support.microsoft.com/kb/2892633
+
+#### Trace Flag: 101
+Function: Verbose Merge Replication logging output for troubleshooting Merger repl performance
+Link: https://support.microsoft.com/help/2892633
+Scope: global only
-**Trace Flag: 102**
-Function: Verbose Merge Replication logging to msmerge\_history table
-for troubleshooting Merger repl performance
-Link: http://support.microsoft.com/kb/2892633
+
+#### Trace Flag: 102
+Function: Verbose Merge Replication logging to msmerge\_history table for troubleshooting Merger repl performance
+Link: https://support.microsoft.com/help/2892633
+Scope: global only
-**Trace Flag: 105**
+
+#### Trace Flag: 105
+**Undocumented trace flag**
Function: Join more than 16 tables in SQL server 6.5
-Link: http://www.databasejournal.com/features/mssql/article.php/1443351/SQL-Server-65-Some-Useful-Trace-Flags.htm
+Link: [SQL Server 6.5: Some Useful Trace Flag]
-**Trace Flag: 106**
-Function: This enables you to see the messages that are sent to and from the Publisher, if you are using Web Synchronization
+
+#### Trace Flag: 106
+Function: If you are using Web Synchronization, you can start Replmerg.exe and pass the -T 106 option to use trace flag 106.
+This enables you to see the messages that are sent to and from the Publisher.
+The agent writes the client's input messages to a file that is named ExchangeID(guid).IN.XML, and writes the output messages to a file that is named ExchangeID(guid).OUT.XML.
+(In these file names, guid is the GUID of the Exchange Server session.)
+These files are created in the directory from which Replmerg.exe was invoked.
+For security, you should delete these files after you are finished.
Link: http://technet.microsoft.com/en-us/library/ms151872(v=sql.105).aspx
-**Trace Flag: 107**
+
+#### Trace Flag: 107
+**Undocumented trace flag**
Function: SQL 6.5/7/8 – Interprets numbers with a decimal point as float instead of decimal
-Link: http://support.microsoft.com/kb/203787
-Link: https://support.microsoft.com/en-us/kb/155714
-*Thanks to: http://www.sqlservercentral.com*
+Link: None
-**Trace Flag: 110**
+
+#### Trace Flag: 110
+**Undocumented trace flag**
Function: SQL 6.5 – Turns off ANSI select characteristics
-Link: https://support.microsoft.com/en-us/kb/152032
+Link: None
+
+
+
+#### Trace Flag: 120
+**Undocumented trace flag**
+Function: FIX: Error message when you schedule a Replication Merge Agent job to run after you install SQL Server 2000 Service Pack 4: "The process could not enumerate changes at the 'Subscriber'"
+Link: None
+
+
+
+#### Trace Flag: 139
+Function: Forces correct conversion semantics in the scope of DBCC check commands like [DBCC CHECKDB], [DBCC CHECKTABLE] and [DBCC CHECKCONSTRAINTS], when analyzing the improved precision and conversion logic introduced with compatibility level 130 for specific data types, on a database that has a lower compatibility level.
+**Note: This trace flag applies to SQL Server 2016 RTM CU3, SQL Server 2016 SP1 and higher builds.**
+**WARNING: Trace flag 139 is not meant to be enabled continuously in a production environment, and should be used for the sole purpose of performing database validation checks described in this Microsoft Support article.
+It should be immediately disabled after validation checks are completed.**
+Link: https://support.microsoft.com/help/4010261
+Link: [Docs Trace Flags]
+Scope: global only
-**Trace Flag: 146**
+
+#### Trace Flag: 144
+Function: Force server side bucketization.
+For legacy applications where change to client side code is not an option and
+when the application has queries that are improperly parameterized, this trace flag forces server side bucketization.
+Link: http://blogs.msdn.microsoft.com/sqlprogrammability/2007/01/13/6-0-best-programming-practices
+
+
+
+#### Trace Flag: 146
+**Undocumented trace flag**
Function: Consider using when replaying against SQL 8.0, to avoid an attempt to set an encrypted connection.
Link: None
-**Trace Flag: 168**
-Function: Bugfix in ORDER BY
-Link: http://support.microsoft.com/kb/926292
+
+#### Trace Flag: 166
+**Undocumented trace flag**
+Function: Unclear. Observable effect was to change the identifier for act1008 to act1009 in a query plan.
+Link: [New Undocumented Trace Flags]
+Scope: ?
+
+
+
+#### Trace Flag: 168
+Function: Bugfix in ORDER BY. This hotfix introduces trace flag 168. After you apply this hotfix, you must enable trace flag 168.
+Trace flag 168 must be set before the database is migrated to SQL Server 2005.
+If trace flag 168 is set after the database is migrated, the query result will remain unsorted.
+Link: https://support.microsoft.com/help/926292
+
+
+
+#### Trace Flag: 174
+Function: Increases the SQL Server Database Engine plan cache bucket count from 40,009 to 160,001 on 64-bit systems.
+**Note: Please ensure that you thoroughly test this option, before rolling it into a production environment.**
+Link: https://support.microsoft.com/help/3026083/fix-sos-cachestore-spinlock-contention-on-ad-hoc-sql-server-plan-cache
+Link: [Docs Trace Flags]
+Scope: global only
-**Trace Flag: 204**
+
+#### Trace Flag: 176
+Function: Enables a fix to address errors when rebuilding partitions online for tables that contain a computed partitioning column.
+Link: https://support.microsoft.com/help/3213683/fix-unable-to-rebuild-the-partition-online-for-a-table-that-contains-a
+Link: [Docs Trace Flags]
+Scope: global or session
+
+
+
+#### Trace Flag: 204
Function: SQL 6.5 – Backward compatibility switch that enables non-ansi standard behavior. E.g. previously SQL server ignored trailing blanks in the like statement and allowed queries that contained aggregated functions to have items in the group by clause that were not in the select list.
-Link: None
+Link: https://support.microsoft.com/help/153096/fix-sql-server-6.5-service-pack-1-fixlist
-**Trace Flag: 205**
-Function: Log usage of AutoStat/Auto Update Statistics
-Link: http://support.microsoft.com/kb/195565
+
+#### Trace Flag: 205
+Function: Reports to the error log when a statistics-dependent stored procedure is being recompiled as a result of auto-update statistics.
+Link: https://support.microsoft.com/help/195565
+Link: [Docs Trace Flags]
+Scope: global only
-**Trace Flag: 206**
+
+#### Trace Flag: 206
+**Undocumented trace flag**
Function: SQL 6.5 – Provides backward compatibility for the set user statement. KB 160732
Link: None
-**Trace Flag: 208**
+
+#### Trace Flag: 208
+**Undocumented trace flag**
Function: SET QUOTED IDENTIFIER ON
Link: None
-**Trace Flag: 210**
+
+#### Trace Flag: 210
Function: SQL 9 – Error when you run a query against a view: "An error occurred while executing batch"
-Link: https://support.microsoft.com/en-us/kb/945892
+Link: https://support.microsoft.com/help/945892
-**Trace Flag: 212**
+
+#### Trace Flag: 212
+**Undocumented trace flag**
Function: SQL 9 – Query may run much slower when compared to SQL 8 when you use a cursor to run the query
-Link: https://support.microsoft.com/en-us/kb/951184
+Link: None
+
+
+
+#### Trace Flag: 220
+**Undocumented trace flag**
+Function: “FIX: Error Message: "Insufficient key column information for updating" Occurs in SQL Server 2000 SP3”
+Link: None
+
+
+
+#### Trace Flag: 221
+**Undocumented trace flag**
+Function: “FIX: The query runs slower than you expected when you try to parse a query in SQL Server 2000”
+Link: None
+
+
+
+#### Trace Flag: 222
+**Undocumented trace flag**
+Function: “FIX: Each query takes a long time to compile when you execute a single query or when you execute multiple concurrent queries in SQL Server 2000”
+Link: None
-**Trace Flag: 237**
+
+#### Trace Flag: 237
+**Undocumented trace flag**
Function: Tells SQL Server to use correlated sub-queries in Non-ANSI standard backward compatibility mode
Link: None
-**Trace Flag: 242**
+
+#### Trace Flag: 242
+**Undocumented trace flag**
Function: Provides backward compatibility for correlated subqueries where non-ANSI-standard results are desired
Link: None
-**Trace Flag: 243**
+
+#### Trace Flag: 243
+**Undocumented trace flag**
Function: Provides backward compatibility for nullability behavior. When set, SQL Server has the same nullability violation behavior as that of a ver 4.2: Processing of the entire batch is terminated if the nullability error (inserting NULL into a NOT NULL field) can be detected at compile time; Processing of offending row is skipped, but the command continues if the nullability violation is detected at run time.Behavior of SQL Server is now more consistent because nullability checks are made at run time and a nullability violation results in the command terminating and the batch or transaction process continuing.
Link: None
-**Trace Flag: 244**
+
+#### Trace Flag: 244
+**Undocumented trace flag**
Function: Disables checking for allowed interim constraint violations. By default, SQL Server checks for and allows interim constraint violations. An interim constraint violation is caused by a change that removes the violation such that the constraint is met, all within a single statement and transaction. SQL Server checks for interim constraint violations for self-referencing DELETE statements, INSERT, and multi-row UPDATE statements. This checking requires more work tables. With this trace flag you can disallow interim constraint violations, thus requiring fewer work tables.
Link: None
-**Trace Flag: 246**
+
+#### Trace Flag: 246
+**Undocumented trace flag**
Function: Derived or NULL columns must be explicitly named in a select…INTO or create view statement when not done they raise an error. This flag avoids that.
Link: None
-**Trace Flag: 253**
+
+#### Trace Flag: 253
+**Undocumented trace flag**
Function: Prevents ad-hoc query plans to stay in cache
Link: http://www.sqlservercentral.com/Forums/Topic837613-146-1.aspx
-**Trace Flag: 257**
+
+#### Trace Flag: 257
+**Undocumented trace flag**
Function: Will invoke a print algorithm on the XML output before returning it to make the XML result more readable
Link: None
-**Trace Flag: 260**
-Function: Prints versioning information about extended stored procedure dynamic-link libraries (DLLs). Scope: global or session
-Link: http://msdn.microsoft.com/en-us/library/ms188396.aspx
-Link: http://msdn.microsoft.com/en-us/library/ms164627.aspx
-Scope: global
+
+#### Trace Flag: 260
+Function: Prints versioning information about extended stored procedure dynamic-link libraries (DLLs).
+When SQL Server is started with the trace flag `-T260` or if a user with system administrator privileges runs `DBCC TRACEON (260)`, and if the extended stored procedure DLL does not support `__GetXpVersion()`, a warning message (`Error 8131: Extended stored procedure DLL '%' does not export __GetXpVersion().`) is printed to the error log. (Note that `__GetXpVersion()` begins with **two underscores**.)
+Link: https://docs.microsoft.com/en-us/sql/relational-databases/extended-stored-procedures-programming/creating-extended-stored-procedures
+Link: [Docs Trace Flags]
+Scope: global or session
-**Trace Flag: 262**
+
+#### Trace Flag: 262
+**Undocumented trace flag**
Function: SQL 7 – Trailing spaces are no longer truncated from literal strings in CASE statements
-Link: https://support.microsoft.com/en-us/kb/891116
+Link: None
-**Trace Flag: 272**
-Function: Generates a log record per identity increment. Can be users
-to convert SQL 2012 back to old style Identity behaviour
+
+#### Trace Flag: 272
+
+**Note: Recommended for SQL Server 2012**
+Function: Disabling the identity cache. It prevents identity gap after restarting SQL Server 2012 instance, critical for columns with identity and tinyint and smallint data types.
Link: http://www.big.info/2013/01/how-to-solve-sql-server-2012-identity.html
-Link: https://connect.microsoft.com/SQLServer/feedback/details/739013/failover-or-restart-results-in-reseed-of-identity
+Link: https://web.archive.org/web/20160822054721/https://connect.microsoft.com/SQLServer/feedback/details/739013/failover-or-restart-results-in-reseed-of-identity
+Link: https://dbafromthecold.com/2017/05/24/disabling-the-identity-cache-in-sql-server-2017/
+Link: [Demo](https://github.com/ktaranov/sqlserver-kit/blob/master/Errors/Identity_gap_sql_server_2012.sql)
+Link: https://stackoverflow.com/q/14146148/2298061
+Scope: global only
+
+
+#### Trace Flag: 274
+**Undocumented trace flag**
+Function: “FIX: Error message when you insert a new row into a view in SQL Server 2005: Cannot insert explicit value for identity column in table when IDENTITY_INSERT is set to OFF”
+Link: None
-**Trace Flag: 302**
+
+
+#### Trace Flag: 302
+**Undocumented trace flag**
Function: Output Index Selection info
-Link: http://www.databasejournal.com/features/mssql/article.php/1443351/SQL-Server-65-Some-Useful-Trace-Flags.htm
+Link: [SQL Server 6.5: Some Useful Trace Flag]
-**Trace Flag: 310**
+
+#### Trace Flag: 304
+**Undocumented trace flag**
+Function: Changed the reported CachedPlanSize.
+Link: [New Undocumented Trace Flags]
+Scope: ?
+
+
+
+#### Trace Flag: 310
+**Undocumented trace flag**
Function: Outputs info about actual join order
-Link: http://www.databasejournal.com/features/mssql/article.php/1443351/SQL-Server-65-Some-Useful-Trace-Flags.htm
+Link: [SQL Server 6.5: Some Useful Trace Flag]
-**Trace Flag: 320**
+
+#### Trace Flag: 320
+**Undocumented trace flag**
Function: Disables join-order heuristics used in ANSI joins. To see join-order heuristics use flag 310. SQL Server uses join-order heuristics to reduce of permutations when using the best join order.
Link: None
-**Trace Flag: 323**
+
+#### Trace Flag: 323
Function: Outputs detailed info about updates
-Link: http://www.databasejournal.com/features/mssql/article.php/1443351/SQL-Server-65-Some-Useful-Trace-Flags.htm
+Link: [SQL Server 6.5: Some Useful Trace Flag]
+Link: https://support.microsoft.com/help/153096/fix-sql-server-6.5-service-pack-1-fixlist
-**Trace Flag: 325**
+
+#### Trace Flag: 325
+**Undocumented trace flag**
Function: Prints information about the cost of using a non-clustered index or a sort to process an ORDER BY clause
Link: None
-**Trace Flag: 326**
+
+#### Trace Flag: 326
+**Undocumented trace flag**
Function: Prints information about estimated & actual costs of sorts. Instructs server to use arithmetic averaging when calculating density instead of a geometric weighted average when updating statistics. Useful for building better stats when an index has skew on the leading column. Use only for updating the stats of a table/index with known skewed data.
Link: None
-**Trace Flag: 330**
+
+#### Trace Flag: 330
+**Undocumented trace flag**
Function: Enables full output when using the SET SHOWPLAN_ALL option, which gives detailed information about joins
Link: None
-**Trace Flag: 342**
+
+#### Trace Flag: 342
+**Undocumented trace flag**
Function: Disables the costing of pseudo-merge joins, thus significantly reducing time spent on the parse for certain types of large, multi-table joins. One can also use SET FORCEPLAN ON to disable the costing of pseudo-merge joins because the query is forced to use the order specified in the FROM clause.
Link: None
-**Trace Flag: 345**
+
+#### Trace Flag: 345
+**Undocumented trace flag**
Function: Changes join order selection logic in SQL Server 6.5
-Link: http://www.databasejournal.com/features/mssql/article.php/1443351/SQL-Server-65-Some-Useful-Trace-Flags.htm
+Link: [SQL Server 6.5: Some Useful Trace Flag]
-**Trace Flag: 445**
+
+#### Trace Flag: 445
+**Undocumented trace flag**
Function: Prints ”compile issued” message in the errorlog for each compiled statement, when used together with 3605
Link: None
-**Trace Flag: 506**
+
+#### Trace Flag: 460
+Function: Replace error message [8152] with [2628] (`String or binary data would be truncated. The statement has been terminated.`).
+Description for [2628] mesage has useful information - which column had the truncation and which row.
+Link: [Docs Trace Flags]
+Link: https://www.procuresql.com/blog/2018/09/26/string-or-binary-data-get-truncated/
+Link: https://feedback.azure.com/forums/908035-sql-server/suggestions/32908417-binary-or-string-data-would-be-truncated-error
+Link: https://blogs.msdn.microsoft.com/sql_server_team/string-or-binary-data-would-be-truncated-replacing-the-infamous-error-8152/
+Link: https://support.microsoft.com/help/4468101
+Scope: global or session
+SQL Server Version: 2019, >= 2017 CU12
+Demo: https://github.com/ktaranov/sqlserver-kit/blob/master/Scripts/Trace_Flag/Trace_Flag_460.sql
+
+
+
+#### Trace Flag: 506
+**Undocumented trace flag**
Function: Enforces SQL-92 standards regarding null values for comparisons between variables and parameters. Any comparison of variables and parameters that contain a NULL always results in a NULL.
Link: None
-**Trace Flag: 610**
-Function: Minimally logged inserts to indexed tables
-Link: http://msdn.microsoft.com/en-us/library/dd425070%28v=SQL.100%29.aspx
+
+#### Trace Flag: 610
+Function: Controls minimally logged inserts into indexed tables.
+Link: http://msdn.microsoft.com/en-us/library/dd425070%28v=SQL.100%29.aspx
+Link: https://www.pythian.com/blog/minimally-logged-operations-data-loads/
+Link: https://msdn.microsoft.com/library/dd425070.aspx
+Link: [Docs Trace Flags]
+Link: https://orderbyselectnull.com/2017/07/10/trace-flag-610-and-sql-server-2016/
+Scope: global or session
-**Trace Flag: 611**
-Function: SQL 9 – When turned on, each lock escalation is recorded in the error log along with the SQL Server handle number
+
+#### Trace Flag: 611
+**Undocumented trace flag**
+Function: SQL 9 – When turned on, each lock escalation is recorded in the error log along with the SQL Server handle number.
+Aaron confirmed this still works in SQL 2014. Outputs info of the form: "Escalated locks - Reason: LOCK_THRESHOLD, Mode: S, Granularity: TABLE, Table: 222623836,
+HoBt: 150:256, HoBt Lock Count: 6248, Escalated Lock Count: 6249, Line Number: 1, Start Offset: 0, SQL Statement: select count(*) from dbo.BigTable"
Link: None
-**Trace Flag: 634**
-Function: Disables the background columnstore compression task
-Link: http://msdn.microsoft.com/en-us/library/ms188396.aspx
-Scope: global
-
-
-**Trace Flag: 652**
-Function: Disable page pre-fetching scans
-Link: http://support.microsoft.com/kb/920093
+
+#### Trace Flag: 617
+Function: SQL 9 – When turned on, each lock escalation is recorded in the error log along with the SQL Server handle number.
+As long as there are no SCH_M lock requests waiting in the ‘lock wait list’,
+the ‘lock wait list’ will be bypassed by statements issued in uncommitted read transaction isolation level.
+If there is a SCH_M lock request in the ‘lock wait list’, a query in uncommitted read transaction isolation level
+will not bypass the ‘lock wait list’, but the SCH_S lock request will go into the ‘lock wait list’.
+In order behind the SCH_M lock waiting in the same list. As a result the grant of the SCH_S request for such a query
+is dependent on the grant and release of the SCH_M lock request entering the ‘lock wait list’ earlier.
+Link: https://blogs.msdn.microsoft.com/saponsqlserver/2014/01/17/new-functionality-in-sql-server-2014-part-3-low-priority-wait/
+
+
+
+#### Trace Flag: 634
+Function: Disables the background columnstore compression task. SQL Server periodically runs the Tuple Mover background task that compresses columnstore index rowgroups with uncompressed data, one such rowgroup at a time.
+Columnstore compression improves query performance but also consumes system resources.
+You can control the timing of columnstore compression manually, by disabling the background compression task with trace flag 634, and then explicitly invoking ALTER INDEX REORGANIZE or ALTER INDEX REBUILD at the time of your choice.
+Link: [Niko Neugebauer Columnstore Indexes – part 35]
+Link: [Docs Trace Flags]
+Link: http://www.sqlservergeeks.com/trace-flag-634-disable-background-columnstore-compression/
+Scope: global only
+
+
+
+#### Trace Flag: 646
+Function: Serves for getting detailed information on which Columnstore were eliminated by the Query Optimiser right into the error log.
+Link: [Niko Neugebauer Columnstore Indexes – part 35]
+Link: http://www.sqlskills.com/blogs/joe/exploring-columnstore-index-metadata-segment-distribution-and-elimination-behaviors
+
+
+
+#### Trace Flag: 647
+Function: Avoids a new-in-SQL 2012 data check (done when adding a column to a table) that can cause ALTER TABLE... ADD operations to take a very long time.
+The KB has a useful query for determining the row size for a table.
+Link: https://support.microsoft.com/help/2986423/fix-it-takes-a-long-time-to-add-new-columns-to-a-table-when-the-row-size-exceeds-the-maximum-allowed-size
+
+
+
+#### Trace Flag: 652
+Function: Disable page pre-fetching scans.
+If you turn on trace flag 652, SQL Server no longer brings database pages into the buffer pool before these database pages are consumed by the scans.
+If you turn on trace flag 652, queries that benefit from the page pre-fetching feature exhibit low performance.
+Link: [KB920093]
+Link: [Docs Trace Flags]
+Scope: global or session
-**Trace Flag: 653**
+
+#### Trace Flag: 653
+**Undocumented trace flag**
Function: Disables read ahead for the current connection
Link: None
-**Trace Flag: 661**
-Function: Disable the ghost record removal process
-Link: http://support.microsoft.com/kb/920093
+
+#### Trace Flag: 661
+Function: Disables the ghost record removal process. A ghost record is the result of a delete operation.
+When you delete a record, the deleted record is kept as a ghost record. Later, the deleted record is purged by the ghost record removal process.
+When you disable this process, the deleted record is not purged. Therefore, the space that the deleted record consumes is not freed.
+This behavior affects space consumption and the performance of scan operations.
+Link: [KB920093]
+Link: [Docs Trace Flags]
+Scope: global or session
-**Trace Flag: 662**
-Function: Prints detailed information about the work done by the ghost
-cleanup task when it runs next. Use TF 3605 to see the output in the
-errorlog
+
+#### Trace Flag: 662
+**Undocumented trace flag**
+Function: Prints detailed information about the work done by the ghost cleanup task when it runs next.
+Use TF [3605](#3605) to see the output in the errorlog
Link: http://blogs.msdn.com/b/sqljourney/archive/2012/07/28/an-in-depth-look-at-ghost-records-in-sql-server.aspx
-**Trace Flag: 698**
+
+#### Trace Flag: 669
+Function: “...prevents user queries from queuing requests to the ghost cleanup process”. This flag is a workaround for stack dumps occurring right after SQL Server startup, where user queries (that queue pages for ghost cleanup) were running so quickly after SQL startup that they were queuing pages before the ghost cleanup process had actually initialized.
+Link: https://support.microsoft.com/help/3027860/error-17066-or-17310-during-sql-server-startup
+
+
+
+#### Trace Flag: 683
+**Undocumented trace flag**
+Function: According to the KB, used to workaround a bug in SQL 2000 SP3 by reverting to pre-SP3 parallel-scan behavior in parallel queries. Database-Wiki.com: “Disallow row counter and column mod counters to be partitioned”
+Link: None
+
+
+
+#### Trace Flag: 692
+Function: Disables fast inserts while bulk loading data into heap or clustered index.
+Starting SQL Server 2016, fast inserts is enabled by default leveraging minimal logging when database is in simple or bulk logged recovery model to optimize insert performance for records inserted into new pages.
+With fast inserts, each bulk load batch acquires new extent(s) bypassing the allocation lookup for existing extent with available free space to optimize insert performance.
+With fast inserts, bulk loads with small batch sizes can lead to increased unused space consumed by objects hence it is recommended to use large batch size for each batch to fill the extent completely.
+If increasing batch size is not feasible, this trace flag can help reduce unused space reserved at the expense of performance.
+**Note: This trace flag applies to SQL Server 2016 RTM and higher builds.**
+Link: https://blogs.msdn.microsoft.com/sql_server_team/sql-server-2016-minimal-logging-and-impact-of-the-batchsize-in-bulk-load-operations/
+Scope: global or session
+
+
+
+#### Trace Flag: 698
+**Undocumented trace flag**
Function: SQL 9 – Performance of INSERT operations against a table with an identity column may be slow when compared to SQL 8
-Link: https://support.microsoft.com/en-gb/kb/940545
+Link: None
-**Trace Flag: 699**
+
+#### Trace Flag: 699
+**Undocumented trace flag**
Function: Turn off transaction logging for the entire SQL dataserver
Link: None
-**Trace Flag: 806**
-Function: Turn on Page Audit functionality, to verify page validity
-Link: http://technet.microsoft.com/en-au/library/cc917726.aspx
+#### Trace Flag: 670, 671
+**Undocumented trace flag**
+Function: Disables deferred deallocation. But note Paul White’s comment on the post! The flag # may actuall by 671.
+Link: [Controlling SQL Server memory dumps]
+
+
+
+#### Trace Flag: 715
+Function: Enables table lock for bulk load operations into a heap with no non-clustered indexes.
+When this trace flag is enabled, bulk load operations acquire bulk update (BU) locks when bulk copying data into a table.
+Bulk update (BU) locks allow multiple threads to bulk load data concurrently into the same table, while preventing other processes that are not bulk loading data from accessing the table.
+The behavior is similar to when the user explicitly specifies TABLOCK hint while performing bulk load, or when the sp_tableoption table lock on bulk load is enabled for a given table.
+However, when this trace flag is enabled, this behavior becomes default without any query or database changes.
+Link: [Docs Trace Flags]
+Scope: global or session
+
+
+#### Trace Flag: 806
+Function: enables DBCC audit checks to be performed on pages to test for logical consistency problems.
+These checks try to detect when a read operation from a disk does not experience any errors but the read operation returns data that is not valid.
+Pages will be audited every time that they are read from disk.
+Page auditing can affect performance and should only be used in systems where data stability is in question.
+Link: http://technet.microsoft.com/en-au/library/cc917726.aspx
+Link: http://www.sqlskills.com/blogs/paul/how-to-tell-if-the-io-subsystem-is-causing-corruptions
+Link: [Important Trace Flags That Every DBA Should Know]
+Link: https://technet.microsoft.com/en-au/library/cc917726.aspx
+Scope: ?
-**Trace Flag: 809**
+
+
+#### Trace Flag: 809
+**Undocumented trace flag**
Function: SQL 8 – Limits the amount of Lazy write activity
Link: None
-**Trace Flag: 815**
+
+#### Trace Flag: 815
Function: SQL 8/9 – Enables latch enforcement. SQL Server 8 (with service pack 4) and SQL Server 9 can perform latch enforcement for data pages found in the buffer pool cache. Latch enforcement changes the virtual memory protection state while database page status changes from "clean" to "dirty" ("dirty" means modified through INSERT, UPDATE or DELETE operation). If an attempt is made to modify a data page while latch enforcement is set, it causes an exception and creates a mini-dump in SQL Server installation's LOG directory. Microsoft support can examine the contents of such mini-dump to determine the cause of the exception. In order to modify the data page the connection must first acquire a modification latch. Once the data modification latch is acquired the page protection is changed to read-write. Once the modification latch is released the page protection changes back to read-only.
-Link: None
+Link: https://technet.microsoft.com/en-us/library/cc966500.aspx
+Link: https://blogs.msdn.microsoft.com/psssql/2012/11/12/how-can-reference-counting-be-a-leading-memory-scribbler-cause
-**Trace Flag: 818**
+
+#### Trace Flag: 818
Function: Turn on ringbuffer to store info about IO write operations.
Used to troubleshoot IO problems
-Link: http://support.microsoft.com/kb/826433
+Link: https://support.microsoft.com/help/826433/
+Link: https://technet.microsoft.com/en-us/library/cc966500.aspx
+Link: https://support.microsoft.com/help/828339/
+Link: [Important Trace Flags That Every DBA Should Know]
+Scope: ?
+
+
+
+#### Trace Flag: 822
+**Undocumented trace flag**
+Function: A workaround for SQL 2000 over-committing memory on the machine
+Link: None
+
+
+
+#### Trace Flag: 825
+**Undocumented trace flag**
+Function: In SQL 2000, enables Buffer Pool support for NUMA. TF 888 must be used.
+Link: None
-**Trace Flag: 828**
+
+#### Trace Flag: 828
Function: SQL 8 - When enabled checkpoint ignores the recovery interval target and keeps steady I/O otherwise it uses recovery interval setting as a target for the length of time that checkpoint will take
-Link: https://support.microsoft.com/en-gb/kb/906121
+Link: https://support.microsoft.com/help/906121
+Link: https://blogs.msdn.microsoft.com/psssql/2008/04/11/how-it-works-sql-server-checkpoint-flushcache-outstanding-io-target/
-**Trace Flag: 830**
+
+#### Trace Flag: 830
Function: SQL 9 – Disable the reporting of CPU Drift errors in the SQL Server errorlog like SQL Server has encountered 2 occurrence(s) of I/O requests taking longer than 15 seconds to complete
-Link: None
+Link: https://support.microsoft.com/help/897284
+Link: https://technet.microsoft.com/en-us/library/aa175396(v=SQL.80).aspx
-**Trace Flag: 831**
+
+#### Trace Flag: 831
+**Undocumented trace flag**
Function: Protect unchanged pages in the buffer pool to catch memory corruptions
Link: None
-**Trace Flag: 834**
-Function: Large Page Allocations
-Link: http://www.sqlservice.se/sv/start/blogg/nagra-trace-flags-for-sql-server.aspx
-Link: http://support.microsoft.com/kb/920093
+
+#### Trace Flag: 834
+Function: Uses Microsoft Windows large-page allocations for the buffer pool.
+Trace flag 834 causes SQL Server to use Microsoft Windows large-page allocations for the memory that is allocated for the buffer pool.
+The page size varies depending on the hardware platform, but the page size may be from 2 MB to 16 MB.
+Large pages are allocated at startup and are kept throughout the lifetime of the process.
+Trace flag 834 improves performance by increasing the efficiency of the translation look-aside buffer (TLB) in the CPU.
+**Note: If you are using the Columnstore Index feature of SQL Server 2012 to SQL Server 2016, we do not recommend turning on trace flag 834.**
+Link: [KB920093]
+Link: https://support.microsoft.com/help/3210239
+Link: [Docs Trace Flags]
+Scope: global only
-**Trace Flag: 835**
+
+#### Trace Flag: 835
+**Undocumented trace flag**
Function: SQL 9 / 10 – On 64 bit SQL Server it turns off Lock pages in memory
-Link: None
+Link: None
+Scope: ?
+
+
+#### Trace Flag: 836
+Function: Trace flag 836 causes SQL Server to size the buffer pool at startup based on the value of the max server memory option instead of based on the total physical memory.
+You can use trace flag 836 to reduce the number of buffer descriptors that are allocated at startup in 32-bit Address Windowing Extensions (AWE) mode.
+Trace flag 836 applies only to 32-bit versions of SQL Server that have the AWE allocation enabled. You can turn on trace flag 836 only at startup.
+Link: [KB920093]
+Link: https://blogs.msdn.microsoft.com/psssql/2012/12/11/how-it-works-sql-server-32-bit-paeawe-on-sql-2005-2008-and-2008-r2-not-using-as-much-ram-as-expected/
+Scope: global only
-**Trace Flag: 836**
-Function: Use the max server memory option for the buffer pool
-Link: http://support.microsoft.com/kb/920093
+
+#### Trace Flag: 839
+Function: (Apparently) forces SQL Server to treate all NUMA memory as “flat”, as if it was SMP.
+Link: https://blogs.msdn.microsoft.com/psssql/2010/04/02/how-it-works-soft-numa-io-completion-thread-lazy-writer-workers-and-memory-nodes
-**Trace Flag: 840**
+
+
+#### Trace Flag: 840
Function: SQL 9 – When trace turned on, SQL Server can perform larger I/O extent reads to populate the buffer pool when SQL Server starts this populates the buffer pool faster. Additionally, the larger I/O extent reads improve the initial query compilation and the response time when SQL Server starts.
-Link: https://support.microsoft.com/en-gb/kb/912322
+Link: https://blogs.msdn.microsoft.com/ialonso/2011/12/09/the-read-ahead-that-doesnt-count-as-read-ahead
-**Trace Flag: 842**
+
+#### Trace Flag: 842
+**Undocumented trace flag**
Function: Use sys.dm_os_memory_node_access_stats to verify local vs. foreign memory under NUMA configurations after turning on this flag
Link: None
-**Trace Flag: 845**
+
+#### Trace Flag: 845
Function: Enable Lock pages in Memory on Standard Edition
-Link: http://www.sqlservice.se/sv/start/blogg/sql-server-performance-with-dynamics-axapta.aspx
-Link: https://support.microsoft.com/en-gb/kb/970070
+Link: https://support.microsoft.com/help/970070
+Link: https://support.microsoft.com/help/2708594/fix-locked-page-allocations-are-enabled-without-any-warning-after-you-upgrade-to-sql-server-2012
-**Trace Flag: 902**
-Function: Bypass Upgrade Scripts
-Link: http://www.sqlservice.se/sv/start/blogg/sql-server-2012-cu1-upgrade-step--msdb110_upgrade-sql--encountered-error-547.aspx
-Link: https://support.microsoft.com/en-gb/kb/2163980
+
+**Undocumented trace flag**
+#### Trace Flag: 851
+Function: According to Bob Ward’s PASS 2014 talk on SQL Server IO, “disable[s] BPE even if enabled via ALTER SERVER”
+Link: None
-**Trace Flag: 1106**
-Function: SQL 9 - Used space in tempdb increases continuously when you run a query that creates internal objects in tempdb
-Link: https://support.microsoft.com/en-gb/kb/947204
+
+#### Trace Flag: 861
+**Undocumented trace flag**
+Function: According to the error log this disables buffer pool extension.
+Link: [New Undocumented Trace Flags]
+Scope: ?
+
+
+
+#### Trace Flag: 862
+**Undocumented trace flag**
+Function: According to the error log this enables buffer pool extension. This TF probably doesn’t do anything anymore.
+Link: [New Undocumented Trace Flags]
+Scope: ?
+
+
+
+#### Trace Flag: 876
+**Undocumented trace flag**
+Function: Turns 8k page allocations for Column Store segments into 2MB instead.
+Link: https://twitter.com/slava_oks/status/1044257034361757696
+Link: https://github.com/ktaranov/sqlserver-kit/issues/151
+Scope: ?
+
+
+
+**Undocumented trace flag**
+#### Trace Flag: 888
+Function: Enables support for locked pages for SQL 2000
+Link: None
+
+
+
+#### Trace Flag: 902
+Function: Bypasses execution of database upgrade script when installing a Cumulative Update or Service Pack.
+If you encounter an error during script upgrade mode, it is recommended to contact Microsoft SQL Customer Service and Support (CSS) for further guidance.
+**Warning: This trace flag is meant for troubleshooting of failed updates during script upgrade mode, and it is not supported to run it continuously
+in a production environment. Database upgrade scripts needs to execute successfully for a complete install of Cumulative Updates and Service Packs.
+Not doing so can cause unexpected issues with your SQL Server instance.**
+Link: https://support.microsoft.com/help/2163980
+Link: [Docs Trace Flags]
+Link: https://blogs.msdn.microsoft.com/luti/2017/05/17/sql-server-offline-after-applying-service-pack/
+Scope: global only
-**Trace Flag: 1117**
-Function: Simultaneous Autogrowth in Multiple-file database
-Link: http://www.sqlservice.se/sv/start/blogg/nagra-trace-flags-for-sql-server.aspx
-Link: http://blogs.technet.com/technet_blog_images/b/sql_server_sizing_ha_and_performance_hints/archive/2012/02/09/sql-server-2008-trace-flag-t-1117.aspx
+
+#### Trace Flag: 916
+**Undocumented trace flag**
+Function: The KB article references the flag in the context of seeing a Profiler dump
+Link: None
-**Trace Flag: 1118**
-Function: Force Uniform Extent Allocation
-Link: http://www.sqlservice.se/sv/start/blogg/nagra-trace-flags-for-sql-server.aspx
+
+#### Trace Flag: 1106
+Function: SQL 9 - Used space in tempdb increases continuously when you run a query that creates internal objects in tempdb
+Link: https://support.microsoft.com/help/947204
+Link: https://blogs.msdn.microsoft.com/arvindsh/2014/02/24/tracking-tempdb-internal-object-space-usage-in-sql-2012
+
+
+
+#### Trace Flag: 1117
+Function: When a file in the filegroup meets the autogrow threshold, all files in the filegroup grow.
+**Note: Beginning with SQL Server 2016 this behavior is controlled by the AUTOGROW_SINGLE_FILE and AUTOGROW_ALL_FILES option of ALTER DATABASE, and trace flag 1117 has no affect.
+For more information, see [ALTER DATABASE File and Filegroup Options (Transact-SQL)](https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-database-transact-sql-file-and-filegroup-options).**
+Link: https://www.littlekendra.com/2017/01/03/parallelism-and-tempdb-data-file-usage-in-sql-server/
+Link: [SQL Server 2016 : Getting tempdb a little more right]
+Link: [Docs Trace Flags]
+Link: http://www.sqlskills.com/blogs/paul/tempdb-configuration-survey-results-and-advice
+Link: https://blogs.msdn.microsoft.com/ialonso/2011/12/01/attempt-to-grow-all-files-in-one-filegroup-and-not-just-the-one-next-in-the-autogrowth-chain-using-trace-flag-1117
+Link: http://sql-articles.com/articles/general/day-6trace-flag-1117-auto-grow-equally-in-all-data-file
+Link: http://www.ryanjadams.com/2017/05/trace-flag-1117-growth-contention/
+Link: https://www.sqlskills.com/blogs/paul/misconceptions-around-tf-1118/
+Scope: global only
+
+
+
+#### Trace Flag: 1118
+
+Function: Removes most single page allocations on the server, reducing contention on the SGAM page.
+When a new object is created, by default, the first eight pages are allocated from different extents (mixed extents).
+Afterwards, when more pages are needed, those are allocated from that same extent (uniform extent).
+The SGAM page is used to track these mixed extents, so can quickly become a bottleneck when numerous mixed page allocations are occurring.
+This trace flag allocates all eight pages from the same extent when creating new objects, minimizing the need to scan the SGAM page.
+**Note: Beginning with SQL Server 2016 this behavior is controlled by the SET MIXED_PAGE_ALLOCATION option of ALTER DATABASE, and trace flag 1118 has no affect. For more information, see ALTER DATABASE SET Options (Transact-SQL).**
Link: http://blogs.msdn.com/b/psssql/archive/2008/12/17/sql-server-2005-and-2008-trace-flag-1118-t1118-usage.aspx
-Scope: global
+Link: http://www.sqlskills.com/blogs/paul/misconceptions-around-tf-1118/
+Link: https://support.microsoft.com/help/328551
+Link: [SQL Server 2016 : Getting tempdb a little more right]
+Link: [Docs Trace Flags]
+Link: https://chrisadkin.org/2015/04/14/well-known-and-not-so-well-known-sql-server-tuning-knobs-and-switches
+Scope: global only
-**Trace Flag: 1119**
-Function: Turns of mixed extent allocation (Similar to 1118?)
-Link: http://social.technet.microsoft.com/wiki/contents/articles/13105.trace-flags-in-sql-server.aspx
+
+#### Trace Flag: 1119
+Function: Turns off mixed extent allocation (Similar to 1118?)
+Link: [TECHNET List Of SQL Server Trace Flags]
-**Trace Flag: 1124**
+
+#### Trace Flag: 1124
+**Undocumented trace flag**
Function: Unknown. Has been reportedly found turned on in some SQL Server instances running Dynamics AX. Also rumored to be invalid in public builds of SQL Server
Link: None
-**Trace Flag: 1140**
-Function: Fix for growing tempdb in special cases
-Link: http://support.microsoft.com/kb/2000471
+
+#### Trace Flag: 1140
+**Undocumented trace flag**
+Function: A workaround for a bug in SQL 2005 SP2, SP3, and SQL 2008, where mixed page allocations climb continually, due to a change in the way that mixed-page allocations are done.
+Link: None
+
+
+
+#### Trace Flag: 1165
+**Undocumented trace flag**
+Function: This [presentation](http://www.youtube.com/watch?v=SvseGMobe2w&feature=youtu.be) by Bob Ward says that this TF outputs the recalculated #’s (every 8192 allocations) for the proportional fill algorithm in database allocation when multiple files are present..
+Link: None
-**Trace Flag: 1180**
+
+#### Trace Flag: 1180
+**Undocumented trace flag**
Function: SQL 7 - Forces allocation to use free pages for text or image data and maintain efficiency of storage. Helpful in case when DBCC SHRINKFILE and SHRINKDATABASE commands may not work because of sparsely populated text, ntext, or image columns.
Link: None
-**Trace Flag: 1197**
+
+#### Trace Flag: 1197
+**Undocumented trace flag**
Function: Applies only in the case of SQL 7 – SP3, similar with trace flag 1180
Link: None
-**Trace Flag: 1200**
+
+#### Trace Flag: 1200
Function: Prints detailed lock information as every request for a lock is made (the process ID and type of lock requested)
-Link: http://social.technet.microsoft.com/wiki/contents/articles/13105.trace-flags-in-sql-server.aspx
+Link: [TECHNET List Of SQL Server Trace Flags]
+Link: https://blogs.msdn.microsoft.com/sqlserverstorageengine/2008/03/30/tempdb-table-variable-vs-local-temporary-table
+Link: [KB169960]
+Link: [Important Trace Flags That Every DBA Should Know]
+Scope: ?
-**Trace Flag: 1202**
+
+#### Trace Flag: 1202
+**Undocumented trace flag**
Function: Insert blocked lock requests into syslocks
Link: None
-**Trace Flag: 1204**
-Function: Returns info about deadlocks
-Link: http://msdn.microsoft.com/en-us/library/ms188396.aspx
-Scope: global
+
+#### Trace Flag: 1204
+Function: Returns the resources and types of locks participating in a deadlock and also the current command affected.
+Writes information about deadlocks to the ERRORLOG in a "text format"
+Link: https://support.microsoft.com/help/832524
+Link: [Docs Trace Flags]
+Link: [Important Trace Flags That Every DBA Should Know]
+Scope: global only
-**Trace Flag: 1205**
+
+#### Trace Flag: 1205
Function: More detailed information about the command being executed at the time of a deadlock. Documented in SQL 7 BOL.
-Link: None
+Link: https://support.microsoft.com/help/832524/sql-server-technical-bulletin---how-to-resolve-a-deadlock
-**Trace Flag: 1206**
+
+#### Trace Flag: 1206
Function: Used to complement flag 1204 by displaying other locks held by deadlock parties
-Link: None
+Link: [KB169960]
+
+
+#### Trace Flag: 1208
+Function: KB: “Prints the host name and program name supplied by the client. This can help identify a client involved in a deadlock, assuming the client specifies a unique value for each connection.”
+Link: [KB169960]
-**Trace Flag: 1211**
-Function: Disables Lock escalation caused by memory pressure
-Link: http://msdn.microsoft.com/en-us/library/ms188396.aspx
+
+
+#### Trace Flag: 1211
+Function: Disables lock escalation based on memory pressure, or based on number of locks. The SQL Server Database Engine will not escalate row or page locks to table locks.
+Using this trace flag can generate excessive numbers of locks. This can slow the performance of the Database Engine, or cause 1204 errors (unable to allocate lock resource) because of insufficient memory.
+If both trace flag 1211 and 1224 are set, 1211 takes precedence over 1224.
+However, because trace flag 1211 prevents escalation in every case, even under memory pressure, we recommend that you use 1224.
+This helps avoid "out-of-locks" errors when many locks are being used.
+Link: [Docs Trace Flags]
+Link: http://www.sqlskills.com/blogs/paul/a-sql-server-dba-myth-a-day-2330-lock-escalation
+Link: [Important Trace Flags That Every DBA Should Know]
Scope: global or session
-**Trace Flag: 1216**
-Function: SQL 7 - Disables Health reporting. Lock monitor when detects a (worker thread) resource level blocking scenario. If a SPID that owns a lock is currently queued to the scheduler, because all the assigned worker threads have been created and all the assigned worker threads are in an un-resolvable wait state, the following error message is written to the SQL Server error log: Error 1223: Process ID %d:%d cannot acquire lock "%s" on resource %s because a potential deadlock exists on Scheduler %d for the resource. Process ID %d:% d holds a lock "%h" on this resource.
+
+#### Trace Flag: 1216
+**Undocumented trace flag**
+Function: SQL 7 - Disables Health reporting. Lock monitor when detects a (worker thread) resource level blocking scenario. If a SPID that owns a lock is currently queued to the scheduler, because all the assigned worker threads have been created and all the assigned worker threads are in an un-resolvable wait state, the following error message is written to the SQL Server error log: Error 1223: Process ID %d:%d cannot acquire lock "%s" on resource %s because a potential deadlock exists on Scheduler %d for the resource. Process ID %d:% d holds a lock "%h" on this resource.
Link: None
-**Trace Flag: 1222**
-Function: Returns Deadlock info in XML format
-Link: http://msdn.microsoft.com/en-us/library/ms188396.aspx
-Scope: global
+
+#### Trace Flag: 1217
+**Undocumented trace flag**
+Function: Disables (for 7.0) the “UMS Health” reporting messages described in the KB article.
+Link: None
-**Trace Flag: 1224**
-Function: Disables lock escalation based on number of locks
-Link: http://msdn.microsoft.com/en-us/library/ms188396.aspx
+
+#### Trace Flag: 1222
+Function: Returns the resources and types of locks that are participating in a deadlock and also the current command affected, in an XML format that does not comply with any XSD schema.
+Link: [Docs Trace Flags]
+Link: https://blogs.msdn.microsoft.com/bartd/2006/09/08/deadlock-troubleshooting-part-1/
+Link: https://blog.sqlauthority.com/2017/01/09/sql-server-get-historical-deadlock-information-system-health-extended-events
+Link: [Important Trace Flags That Every DBA Should Know]
+Scope: global only
+
+
+
+#### Trace Flag: 1224
+Function: Disables lock escalation based on the number of locks. However, memory pressure can still activate lock escalation.
+The Database Engine escalates row or page locks to table (or partition) locks if the amount of memory used by lock objects exceeds one of the following conditions:
+ - Forty percent of the memory that is used by Database Engine. This is applicable only when the locks parameter of sp_configure is set to 0.
+ - Forty percent of the lock memory that is configured by using the locks parameter of sp_configure.
+For more information, see [Server Configuration Options (SQL Server)](https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/server-configuration-options-sql-server).
+If both trace flag 1211 and 1224 are set, 1211 takes precedence over 1224.
+However, because trace flag 1211 prevents escalation in every case, even under memory pressure, we recommend that you use 1224.
+This helps avoid "out-of-locks" errors when many locks are being used.
+**Note: Lock escalation to the table- or HoBT-level granularity can also be controlled by using the LOCK_ESCALATION option of the ALTER TABLE statement.**
+Link: [Docs Trace Flags]
+Link: [Important Trace Flags That Every DBA Should Know]
Scope: global or session
-**Trace Flag: 1236**
-Function: Fixes performance problem in scenarios with high lock activity
-in SQL 2012 and SQL 2014
-Link: http://support.microsoft.com/kb/2926217
-
-
-**Trace Flag: 1261**
+
+#### Trace Flag: 1228
+Function: Enable lock partitioning.
+By default, lock partitioning is enabled when a server has 16 or more CPUs. Otherwise, lock partitioning is disabled.
+Trace flag 1228 enables lock partitioning for 2 or more CPUs. Trace flag 1229 disables lock partitioning.
+Trace flag 1229 overrides trace flag 1228 if trace flag 1228 is also set.
+Lock partitioning is useful on multiple-CPU servers where some tables have very high lock rates.
+You can turn on trace flag 1228 and trace flag 1229 only at startup.
+Link: [Trace Flag 1228 and 1229]
+Link: [Microsoft SQL Server 2005 TPC-C Trace Flags]
+
+
+
+#### Trace Flag: 1229
+Function: Enable lock partitioning.
+By default, lock partitioning is enabled when a server has 16 or more CPUs. Otherwise, lock partitioning is disabled.
+Trace flag 1228 enables lock partitioning for 2 or more CPUs. Trace flag 1229 disables lock partitioning.
+Trace flag 1229 overrides trace flag 1228 if trace flag 1228 is also set.
+Lock partitioning is useful on multiple-CPU servers where some tables have very high lock rates.
+You can turn on trace flag 1228 and trace flag 1229 only at startup.
+Link: [Trace Flag 1228 and 1229]
+Link: [Microsoft SQL Server 2005 TPC-C Trace Flags]
+
+
+
+#### Trace Flag: 1236
+Function: Enables database lock partitioning. Fixes performance problem in scenarios with high lock activity in SQL 2012 and SQL 2014.
+**Note: Beginning with SQL Server 2012 SP3 and SQL Server 2014 SP1 this behavior is controlled by the engine and trace flag 1236 has no effect.**
+Link: https://support.microsoft.com/help/2926217
+Link: [Docs Trace Flags]
+Scope: global only
+
+
+
+#### Trace Flag: 1237
+Function: Allows the `ALTER PARTITION FUNCTION` statement to honor the current user-defined session deadlock priority instead of being the likely deadlock victim by default.
+**Note: Starting with SQL Server 2017 and database [compatibility level] 140 this is the default behavior and trace flag 1237 has no effect.**
+Link: https://support.microsoft.com/help/4025261
+Link: [Docs Trace Flags]
+Scope: global or session or query
+
+
+
+#### Trace Flag: 1260
+Function: Disabled mini-dump for non-yield condition.
+Disables mini-dump generation for "any of the 17883, 17884, 17887, or 17888 errors.
+The trace flag can be used in conjunction with trace flag –T1262. For example, you
+could enable –T1262 to get 10- and a 60-second interval reporting and also enable – T1260 to avoid getting mini-dumps."
+Link: [A Topical Collection of SQL Server Flags v6]
+Link: [How To Diagnose and Correct Errors 17883, 17884, 17887, and 17888]
+Link: [Docs Trace Flags]
+Scope: global only
+
+
+
+#### Trace Flag: 1261
+**Undocumented trace flag**
Function: SQL 8 - Disables Health reporting. Lock monitor when detects a (worker thread) resource level blocking scenario. If a SPID that owns a lock is currently queued to the scheduler, because all the assigned worker threads have been created and all the assigned worker threads are in an un-resolvable wait state, the following error message is written to the SQL Server error log: Error 1229: Process ID %d:%d owns resources that are blocking processes on scheduler %d.
Link: None
-**Trace Flag: 1264**
+
+#### Trace Flag: 1262
+Function: The default behavior (for 1788* errors) is for SQL to generate a mini-dump on the first
+occurrence, but never after. 1262 changes the behavior: “When –T1262 is enabled, a
+mini-dump is generated when the non-yielding condition is declared (15 seconds) and
+at subsequent 60-second intervals for the same non-yield occurrence. A new nonDiagCorrect17883etc;
+yielding occurrence causes dump captures to occur again.”
+In SQL 2000 this was a startup-only flag; in 2005+ it can be enabled via TRACEON.
+Note that the flag is also covered in Khen2005, p400, but with no new information.
+Link: [A Topical Collection of SQL Server Flags v6]
+Link: [How To Diagnose and Correct Errors 17883, 17884, 17887, and 17888]
+
+
+
+#### Trace Flag: 1264
Function: Collect process names in non-yielding scenario memory dumps
-Link: http://support.microsoft.com/kb/2630458/en-us
+Link: [A Topical Collection of SQL Server Flags v6]
+Link: https://support.microsoft.com/help/2630458/
-**Trace Flag: 1400**
+
+#### Trace Flag: 1400
Function: SQL 9 RTM – Enables creation of database mirroring endpoint, which is required for setting up and using database mirroring
Link: None
-**Trace Flag: 1448**
-Function: Alters replication log reader functionality
-Link: http://msdn.microsoft.com/en-us/library/ms188396.aspx
+
+#### Trace Flag: 1439
+Function: Trace database restart and failover messages to SQL Errorlog for mirrored databases
+Link: [Trace flags in sql server from trace flag 902 to trace flag 1462]
-**Trace Flag: 1449**
+
+#### Trace Flag: 1448
+Function: Enables the replication log reader to move forward even if the async secondaries have not acknowledged the reception of a change.
+Even with this trace flag enabled the log reader always waits for the sync secondaries. The log reader will not go beyond the min ack of the sync secondaries.
+This trace flag applies to the instance of SQL Server, not just an availability group, an availability database, or a log reader instance.
+Takes effect immediately without a restart. This trace flag can be activated ahead of time or when an async secondary fails.
+Link: [Docs Trace Flags]
+Scope: global only
+
+
+
+#### Trace Flag: 1449
Function: When you use SNAC to connect to an instance of a principal server in a database mirroring session: "The connection attempted to fail over to a server that does not have a failover partner".
-Link: https://support.microsoft.com/en-gb/kb/936179
+Link: https://support.microsoft.com/help/936179
+
+
+
+#### Trace Flag: 1462
+Function: Disables log stream compression for asynchronous availability groups.
+This feature is enabled by default on asynchronous availability groups in order to optimize network bandwidth.
+Link: [Tune compression for availability group]
+Link: [Docs Trace Flags]
+Link: http://www.sqlskills.com/blogs/paul/sql-server-2008-performance-boost-for-database-mirroring
+Link: http://sqlblog.com/blogs/joe_chang/archive/2014/03/13/hekaton-and-benchmarks.aspx
+Scope: global only
-**Trace Flag: 1462**
-Function: Disable Mirroring Log compression
-Link: http://sqlcat.com/sqlcat/b/technicalnotes/archive/2007/09/17/database-mirroring-log-compression-in-sql-server-2008-improves-throughput.aspx
+
+#### Trace Flag: 1482
+Function: Prints information to the Error Log (3605 is not necessary) for a variety of transaction log operations are done, including when the MinLSN value is reset, when a VLF is formatted, etc.
+Link: None
+
+
+#### Trace Flag: 1504
+Function: Dynamic memory grant expansion can also help with parallel index build plans where the distribution of rows across threads is uneven.
+The amount of memory that can be consumed this way is not unlimited, however.
+SQL Server checks each time an expansion is needed to see if the request is reasonable given the resources available at that time.
+Some insight to this process can be obtained by enabling undocumented trace flag 1504, together with 3604 (for message output to the console)
+or 3605 (output to the SQL Server error log). If the index build plan is parallel, only 3605 is effective because parallel workers cannot send trace messages cross-thread to the console.
+Link: [Internals of the Seven SQL Server Sorts – Part 1]
-**Trace Flag: 1603**
+
+
+#### Trace Flag: 1603
Function: Use standard disk I/O (i.e. turn off asynchronous I/O)
Link: None
-**Trace Flag: 1604**
+
+#### Trace Flag: 1604
Function: Once enabled at start up makes SQL Server output information regarding memory allocation requests
Link: None
-**Trace Flag: 1609**
+
+#### Trace Flag: 1609
Function: Turns on the unpacking and checking of RPC information in Open Data Services. Used only when applications depend on the old behavior.
Link: None
-**Trace Flag: 1610**
+
+#### Trace Flag: 1610
Function: Boot the SQL dataserver with TCP_NODELAY enabled
Link: None
-**Trace Flag: 1611**
+
+#### Trace Flag: 1611
Function: If possible, pin shared memory -- check errorlog for success/failure
Link: None
-**Trace Flag: 1613**
+
+#### Trace Flag: 1613
Function: Set affinity of the SQL data server engine's onto particular CPUs -- usually pins engine 0 to processor 0, engine 1 to processor 1...
Link: None
+
+#### Trace Flag: 1615
+Function: Khen2005, page 385 (paraphrased): directs SQL to use threads instead of fiber even if the “lightweight pooling” config option is on. (Apparently, sometimes SQL wouldn’t start successfully when using lightweight pooling, and so this lets you get SQL up and running, so that you can turn the config option off)
+Link: None
+
-**Trace Flag: 1704**
+
+#### Trace Flag: 1704
Function: Prints information when a temporary table is created or dropped
Link: None
-**Trace Flag: 1717**
+
+#### Trace Flag: 1717
Function: MSShipped bit will be set automatically at Create time when creating stored procedures
Link: None
-**Trace Flag: 1802**
-Function: SQL 9 - After detaching a database that resides on network-attached storage, you cannot reattach the SQL Server database
-Link: https://support.microsoft.com/en-us/kb/922804
+
+#### Trace Flag: 1800
+Function: Enables SQL Server optimization when disks of different sector sizes are used for primary and secondary replica log files, in SQL Server AG and Log Shipping environments.
+Link: https://support.microsoft.com/help/3009974
+Link: [Docs Trace Flags]
+Scope: global only
-**Trace Flag: 1806**
-Function: Disable Instant File Initialization
-Link: http://technet.microsoft.com/en-au/library/cc917726.aspx
+
+#### Trace Flag: 1802
+Function: SQL 9 - After detaching a database that resides on network-attached storage, you cannot reattach the SQL Server database
+Link: https://support.microsoft.com/help/922804
-**Trace Flag: 1807**
-Function: Enable option to have database files on SMB share for SQL Server 2008 and 2008R2
-Link: http://blogs.msdn.com/b/varund/archive/2010/09/02/create-a-sql-server-database-on-a-network-shared-drive.aspx
+
+#### Trace Flag: 1806
+Function: Disable Instant File Initialization.
+Used to guarantee the physical data file space acquisition during data file creation or expansion, on a thin provisioned subsystem
+Link: http://technet.microsoft.com/en-au/library/cc917726.aspx
+Link: https://blogs.msdn.microsoft.com/sql_pfe_blog/2009/12/22/how-and-why-to-enable-instant-file-initialization
+Link: http://www.sqlskills.com/blogs/paul/a-sql-server-dba-myth-a-day-330-instant-file-initialization-can-be-controlled-from-within-sql-server
+Link: https://support.microsoft.com/help/2574695/file-initialization-takes-a-long-time-for-sql-server-database-related-operations
+Link: [Important Trace Flags That Every DBA Should Know]
+Scope: ?
-**Trace Flag: 1903**
-Function: SQL 8 - When you capture a SQL Profiler trace in a file and then you try to import the trace files into tables by using the fn_trace_gettable function no rows may be returned
-Link: https://support.microsoft.com/en-us/kb/911678
+
+#### Trace Flag: 1807
+Function: Enable option to have database files on SMB share for SQL Server 2008 and 2008R2
+Link: http://blogs.msdn.com/b/varund/archive/2010/09/02/create-a-sql-server-database-on-a-network-shared-drive.aspx
+Link: https://support.microsoft.com/help/304261/description-of-support-for-network-database-files-in-sql-server
-**Trace Flag: 2301**
-Function: Enable advanced decision support optimizations
-Link: http://support.microsoft.com/kb/920093
+
+#### Trace Flag: 1808
+Function: Directs SQL Server to ignore auto-closing databases even if the Auto-close property is set to ON. Must be set globally. Present in Yukon forward
+Link: https://blogs.msdn.microsoft.com/ialonso/2012/04/11/want-your-sql-server-to-simply-ignore-the-auto_close-setting-for-all-open-databases-for-which-it-has-been-enabled
-**Trace Flag: 2312**
-Function: Forces the query optimizer to use the SQL Server 2014 version
-of the cardinality estimator when creating the query plan when running
-SQL Server 2014 with database compatibility level 110
-Link: http://support.microsoft.com/kb/2801413
+
+#### Trace Flag: 1810
+Function: Prints the file create/open/close timings
+Link: None
-**Trace Flag: 2328**
-Function: SQL 9+ - Makes cardinality estimates upon resulting selectivity. The reasoning for this is that one or more of the constants may be statement parameters, which would change from one execution of the statement to the next.
+
+#### Trace Flag: 1816
+Function: Bob Ward briefly references this flag in his PASS 2014 SQL Server IO talk, saying that it “could provide more details around errors” that occur with IO done to SQL data files in Azure Storage.
Link: None
-**Trace Flag: 2330**
-Function: Query performance decreases when sys.dm_db_index_usage_stats has large number of rows
-Link: https://support.microsoft.com/en-us/kb/2003031
-Link: http://www.brentozar.com/archive/2015/11/trace-flag-2330-who-needs-missing-index-requests/
+
+#### Trace Flag: 1851
+Function: Anecdotally, from a JustDave’s notes on an Amanda Ford talk at SQL Relay Reading 2014: “...disables the automerge functionality for in-memory oltp”
+Link: https://justdaveinfo.wordpress.com/2014/10/16/october-13-microsoft-sql-relay-reading
-**Trace Flag: 2335**
-Function: Generates Query Plans optimized for less memory
-Link: http://support.microsoft.com/kb/2413549
+
+#### Trace Flag: 1903
+Function: SQL 8 - When you capture a SQL Profiler trace in a file and then you try to import the trace files into tables by using the fn_trace_gettable function no rows may be returned
+Link: Note
-**Trace Flag: 2340**
-Function: Disable specific SORT optimization in Query Plan
-Link: http://support.microsoft.com/kb/2009160
+
+#### Trace Flag: 1905
+Function: Unknown
+Link: [Upgrading an expired SQL Server 2016 Evaluation Edition]
-**Trace Flag: 2371**
-Function: Change threshold for auto update stats
-Link: http://www.sqlservice.se/sv/start/blogg/sql-server--auto-update-stats-part-2.aspx
-Link: https://support.microsoft.com/en-us/kb/2754171
+
+#### Trace Flag: 2301
+Function: Trace flag 2301 enables advanced optimizations that are specific to decision support queries.
+This option applies to decision support processing of large data sets.
+Link: [KB920093]
+Link: [Docs Trace Flags]
+Link: http://www.queryprocessor.com/ce_join_base_containment_assumption
+Link: https://connect.microsoft.com/SQLServer/feedback/details/772232/make-optimizer-estimations-more-accurate-by-using-metadata
+Scope: global or session or query
-**Trace Flag: 2372**
-Function: Displays memory utilization during the optimization process
-Link: http://www.benjaminnevarez.com/2012/04/more-undocumented-query-optimizer-trace-flags/
+
+#### Trace Flag: 2309
+Function: In SQL 2014, enables output from a 3rd parameter for [DBCC SHOW_STATISTICS] such that the partial statistics histogram (for just one partition) is shown.
+Link: https://sqlperformance.com/2015/05/sql-statistics/incremental-statistics-are-not-used-by-the-query-optimizer
+Link: http://blog.dbi-services.com/sql-server-2014-new-incremental-statistics
-**Trace Flag: 2373**
-Function: Displays memory utilization during the optimization process
-Link: http://www.benjaminnevarez.com/2012/04/more-undocumented-query-optimizer-trace-flags/
+
+#### Trace Flag: 2312
+Function: Enables you to set the query optimizer cardinality estimation model to the SQL Server 2014 through SQL Server 2016 versions, dependent of the compatibility level of the database.
+Link: [KB2801413]
+Link: [New Features in SQL Server 2016 Service Pack 1]
+Link: [Docs Trace Flags]
+Link: http://www.sqlservergeeks.com/sql-server-2014-trace-flags-2312/
+Scope: global or session or query
-**Trace Flag: 2388**
-Function: Change DBCC SHOW\_STATISTICS output to show stats history and
-lead key type such as known ascending keys
-Link: http://www.benjaminnevarez.com/2013/02/statistics-on-ascending-keys
+
+#### Trace Flag: 2315
+Function: Aaron: I stumbled onto this one. Seems to output memory allocations taken during
+the compilation process (and maybe the plan as well? “PROCHDR”), as well as
+memory broker states & values at the beginning and end of compilation.
+Link: None
-**Trace Flag: 2389**
-Function: Enable auto-quick-statistics update for known ascending keys
-Link: http://www.sqlservice.se/sv/start/blogg/sql-server-statistics--traceflags-2389--2390.aspx
-Link: http://blogs.msdn.com/b/ianjo/archive/2006/04/24/582227.aspx
-Link: http://www.sqlmag.com/article/tsql3/making-the-most-of-automatic-statistics-updating--96767
+
+#### Trace Flag: 2318
+Function: Aaron: stumbled onto this one as well. I’ve only seen one type of output so far: “Optimization Stage: HEURISTICJOINREORDER”. Maybe useful in combo with other compilation trace flags to see the timing of join reordering?
+Link: None
-**Trace Flag: 2390**
-Function: Enable auto-quick-statistics update for all columns
-Link: http://www.sqlservice.se/sv/start/blogg/sql-server-statistics--traceflags-2389--2390.aspx
-Link: http://blogs.msdn.com/b/ianjo/archive/2006/04/24/582227.aspx
-Link: http://www.sqlmag.com/article/tsql3/making-the-most-of-automatic-statistics-updating--96767
+
+#### Trace Flag: 2324
+Function: Disables Implied Predicates
+Link: https://answers.sqlperformance.com/questions/2299/why-not-seek-predicate.html?utm_content=buffer9bed5&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer
-**Trace Flag: 2430**
-Function: Fixes performance problem when using large numbers of locks
-Link: http://support.microsoft.com/kb/2754301/en-us
+
+#### Trace Flag: 2328
+Function: SQL 9+ - Makes cardinality estimates upon resulting selectivity. The reasoning for this is that one or more of the constants may be statement parameters, which would change from one execution of the statement to the next.
+Link: https://blogs.msdn.microsoft.com/ianjo/2006/03/28/disabling-constant-constant-comparison-estimation
+Link: http://www.queryprocessor.ru/isnumeric_ce_bug_eng
-**Trace Flag: 2440**
-Function: SQL 10 - Parallel query execution strategy on partitioned tables. SQL 9 used single thread per partition parallel query execution strategy. In SQL 10, multiple threads can be allocated to a single partition by turning on this flag.
-Link: None
+
+#### Trace Flag: 2329
+Function: Disables “Few Outer Rows” optimization
+Link: http://www.queryprocessor.com/few-outer-rows-optimization
-**Trace Flag: 2453**
-Function: Allow a table variable to trigger recompile when enough number of rows are changed with may allow the query optimizer to choose a more efficient plan.
-Link: http://sqlperformance.com/2014/06/t-sql-queries/table-variable-perf-fix
-Link: http://http//support.microsoft.com/kb/2952444
+
+#### Trace Flag: 2330
+Function: Query performance decreases when sys.dm_db_index_usage_stats has large number of rows
+Link: http://www.brentozar.com/archive/2015/11/trace-flag-2330-who-needs-missing-index-requests/
+Link: https://chrisadkin.org/2015/04/14/well-known-and-not-so-well-known-sql-server-tuning-knobs-and-switches/
-**Trace Flag: 2470**
-Function: Fixes performance problem when using AFTER triggers on partitioned tables
-Link: http://support.microsoft.com/kb/2606883/en-us
+
+#### Trace Flag: 2332
+Function: PWhite: “Force DML Request Sort (CUpdUtil::FDemandRowsSortedForPerformance)”
+Link: http://sqlblog.com/blogs/paul_white/archive/2013/01/26/optimizing-t-sql-queries-that-change-data.aspx
-**Trace Flag: 2505**
-Function: SQL 7 - Prevents DBCC TRACEON 208, SPID 10 errors from appearing in the error log
-Link: https://support.microsoft.com/en-us/kb/243352
+
+#### Trace Flag: 2335
+Function: Causes SQL Server to assume a fixed amount of memory is available during query optimization. It does not limit the memory SQL Server grants to execute the query.
+The memory configured for SQL Server will still be used by data cache, query execution and other consumers.
+**Note: Please ensure that you thoroughly test this option, before rolling it into a production environment.**
+Link: https://www.brentozar.com/archive/2018/08/how-trace-flag-2335-affects-memory-grants/
+Link: https://support.microsoft.com/help/2413549
+Link: [Docs Trace Flags]
+Link: http://dba.stackexchange.com/questions/53726/difference-in-execution-plans-on-uat-and-prod-server
+Scope: global or session or query
-**Trace Flag: 2508**
-Function: Disables parallel non-clustered index checking for DBCC CHECKTABLE
+
+#### Trace Flag: 2336
+Function: Aaron: Another one that I stumbled onto. Appears to tie memory info and cached page likelihoods with costing
Link: None
-**Trace Flag: 2509**
-Function: Used with DBCC CHECKTABLE to see the total count of forward records in a table
-Link: None
-
+
+#### Trace Flag: 2340
+Function: Causes SQL Server not to use a sort operation (batch sort) for optimized nested loop joins when generating a plan.
+Beginning with SQL Server 2016 SP1, to accomplish this at the query level, add the USE HINT query hint instead of using this trace flag.
+**Note: Please ensure that you thoroughly test this option, before rolling it into a production environment.**
+Link: [New Features in SQL Server 2016 Service Pack 1]
+Link: [Docs Trace Flags]
+Link: https://blogs.msdn.microsoft.com/psssql/2010/01/11/high-cpu-after-upgrading-to-sql-server-2005-from-2000-due-to-batch-sort
+Link: http://www.queryprocessor.com/batch-sort-and-nested-loops
+Scope: global or session or query
-**Trace Flag : 2514**
-Function: Verbose Merge Replication logging to msmerge\_history table for troubleshooting Merger repl performance
-Link: http://sqlblog.com/blogs/argenis_fernandez/archive/2012/05/29/ghost-records-backups-and-database-compression-with-a-pinch-of-security-considerations.aspx
+
+#### Trace Flag: 2341
+Function: Enables the use of a hash join for joins to column store indexes even when the join clause would normally be removed “during query normalization”.
+Link: https://support.microsoft.com/help/3146123/query-plan-generation-improvement-for-some-columnstore-queries-in-sql-server-2014-or-2016
-**Trace Flag: 2520**
-Function: Forces DBCC HELP to return syntax of undocumented DBCC statements. If 2520 is not turned on, DBCC HELP will refuse to give you the syntax stating: "No help available for DBCC statement 'undocumented statement'". dbcc help ('?')
-Link: None
+
+#### Trace Flag: 2363
+Function: TF Selectivity
+Link: [Cardinality Estimation Framework 2014 First Look]
+Link: http://www.queryprocessor.com/ce-process
+Link: https://sqlperformance.com/2014/01/sql-plan/cardinality-estimation-for-multiple-predicates
-**Trace Flag: 2521**
-Function: SQL 7 SP2 - Facilitates capturing a Sqlservr.exe user-mode crash dump for postmortem analysis
-Link: None
+
+#### Trace Flag: 2368
+**Undocumented trace flag**
+Function: For one query, this resulted in a parallel plan significantly more expensive than the naturally occurring serial plan. Could be related to trace flag 3651.
+Link: [New Undocumented Trace Flags]
+Scope: ?
-**Trace Flag: 2528**
-Function: Disables parallelism in CHECKDB etc
-Link: http://msdn.microsoft.com/en-us/library/ms188396.aspx
-Scope: global
+
+#### Trace Flag: 2371
+Function: Changes the fixed auto update statistics threshold to dynamic auto update statistics threshold.
+**Note: Beginning with SQL Server 2016 this behavior is controlled by the engine and trace flag 2371 has no effect.**
+Link: https://support.microsoft.com/help/2754171
+Link: http://blogs.msdn.com/b/saponsqlserver/archive/2011/09/07/changes-to-automatic-update-statistics-in-sql-server-traceflag-2371.aspx
+Link: https://blogs.msdn.microsoft.com/axinthefield/sql-server-trace-flag-2371-for-dynamics-ax/
+Link: [Docs Trace Flags]
+Scope: global only
-**Trace Flag: 2529**
-Function: Displays memory usage for DBCC commands when used with TF
-3604S
-Link: None
+
+#### Trace Flag: 2372
+Function: Displays memory utilization during the optimization process. Memory for Phases
+Memory before and after deriving properties and rules (verbose)
+Link: [More Undocumented Query Optimizer Trace Flags]
+Link: [Cardinality Estimation Framework 2014 First Look]
+Link: [Query Optimizer Deep Dive - Part 4]
-**Trace Flag: 2537**
-Function: Allows you to see inactive records in transaction log using
-fn\_dblog
-Link: http://www.sqlsoldier.com/wp/sqlserver/day19of31daysofdisasterrecoveryhowmuchlogcanabackuplog
+
+#### Trace Flag: 2373
+Function: Displays memory utilization during the optimization process. Memory for Deriving Properties.
+Link: [More Undocumented Query Optimizer Trace Flags]
+Link: [Cardinality Estimation Framework 2014 First Look]
-**Trace Flag: 2540**
-Function: Unknown, but related to controlling the contents of a memory dump
-Link: http://support.microsoft.com/kb/917825/en-us
+
+#### Trace Flag: 2374
+**Undocumented trace flag**
+Function: Removes QueryHash and QueryPlanHash information from estimated query plans.
+Link: [New Undocumented Trace Flags]
+Scope: ?
-**Trace Flag: 2541**
-Function: Unknown, but related to controlling the contents of a memory dump
-Link: http://support.microsoft.com/kb/917825/en-us
+
+#### Trace Flag: 2382
+Function: SSC: “SQL 8 -Statistics collected for system tables.”
+Link: None
-**Trace Flag: 2542**
-Function: Unknown, but related to controlling the contents of a memory dump
-Link: http://support.microsoft.com/kb/917825/en-us
+
+#### Trace Flag: 2387
+**Undocumented trace flag**
+Function: There was a small change in CPU and IO costs for some operators. Full effect unknown.
+Link: [New Undocumented Trace Flags]
+Scope: ?
+
+
+
+#### Trace Flag: 2388
+Function: Changes the output of [DBCC SHOW_STATISTICS].
+Instead of the normal Header/Vector/Histogram output, instead we get a single row that gives information related to whether the lead column of the stat object is considered to be ascending or not.
+This TF is primarily helpful in watching the state of a stat object change from “Unknown”, to “Ascending” (and potentially to “Stationary”).
+Also In SQL Server, if you want to see the information of last four statistics update on a statistics object then you can use trace flag 2388.
+In simple words, we can say that this trace flag provide us the historical information about statistics update.
+Link: [SQL Server - estimates outside of the histogram - half-baked draft]
+Link: http://www.sqlservergeeks.com/sql-server-trace-flag-2388/
+Link: [Fun with SQL Server Plan Cache, Trace Flag 8666, and Trace Flag 2388]
+Scope: session only
+
+
+
+#### Trace Flag: 2389
+Function: Enable automatically generated quick statistics for ascending keys (histogram amendment).
+If trace flag 2389 is set, and a leading statistics column is marked as ascending, then the histogram used to estimate cardinality will be adjusted at query compile time.
+Link: [KB2801413]
+Link: http://blogs.msdn.com/b/ianjo/archive/2006/04/24/582227.aspx
+Link: http://www.sqlmag.com/article/tsql3/making-the-most-of-automatic-statistics-updating--96767
+Link: http://sqlperformance.com/2016/07/sql-statistics/trace-flag-2389-new-cardinality-estimator
+Link: https://www.sswug.org/sswugresearch/community/trace-flag-2389-and-the-new-cardinality-estimator/
+Link: [New Features in SQL Server 2016 Service Pack 1]
+Link: [Docs Trace Flags]
+Link: [SQL Server - estimates outside of the histogram - half-baked draft]
+Link: http://www.sqlservergeeks.com/sql-server-trace-flag-2389/
+Scope: global or session or query
+
+
+
+#### Trace Flag: 2390
+Function: Enable automatically generated quick statistics for ascending or unknown keys (histogram amendment).
+If trace flag 2390 is set, and a leading statistics column is marked as ascending or unknown, then the histogram used to estimate cardinality will be adjusted at query compile time
+Link: http://blogs.msdn.com/b/ianjo/archive/2006/04/24/582227.aspx
+Link: [KB2801413]
+Link: http://www.sqlmag.com/article/tsql3/making-the-most-of-automatic-statistics-updating--96767
+Link: [Docs Trace Flags]
+Link: https://blogs.msdn.microsoft.com/ianjo/2006/04/24/ascending-keys-and-auto-quick-corrected-statistics
+Link: [SQL Server - estimates outside of the histogram - half-baked draft]
+Link: http://www.sqlservergeeks.com/sql-server-trace-flag-2390/
+Scope: global or session or query
-**Trace Flag: 2543**
-Function: Unknown, but related to controlling the contents of a memory dump
-Link: http://support.microsoft.com/kb/917825/en-us
+
+#### Trace Flag: 2392
+**Undocumented trace flag**
+Function: Trace Flag 2392 can be used to turn the missing index feature off completely (as a workaround to the issue that is corrected by the hotfix).
+This trace flag has been in the product since SQL Server 2005.
+The problem is, it will not disable/enable missing index stats collection unless it is enabled at startup.
+If you set it as a startup TF and restart SQL Server, then no missing index stats are collected.
+If you then subsequently disable TF 2392 while SQL Server is running, it still won’t collect any missing index stats (despite what you may expect).
+Link: https://www.sqlskills.com/blogs/glenn/sql-server-missing-indexes-feature-and-trace-flag-2392/
+Link: https://support.microsoft.com/help/4042232/fix-access-violation-when-you-cancel-a-pending-query-if-the-missing-in
+Scope: global only
+
+
+
+#### Trace Flag: 2398
+Function: Another one I stumbled upon myself...outputs info about “Smart Seek costing”: e.g.: “Smart seek costing (75.2) :: 1.34078e+154 , 1”
+Link: None
-**Trace Flag: 2544**
-Function: Produces a full memory dump
-Link: http://support.microsoft.com/kb/917825/en-us
+
+#### Trace Flag: 2399
+**Undocumented trace flag**
+Function: Small changes in operator costs were observed for some queries. These were typically less than 0.01 units.
+Link: [New Undocumented Trace Flags]
+Scope: ?
-**Trace Flag: 2545**
-Function: Unknown, but related to controlling the contents of a
-memory dump
-Link: http://support.microsoft.com/kb/917825/en-us
+
+#### Trace Flag: 2418
+**Undocumented trace flag**
+Function: Disables serial Batch mode processing.
+Link: [New Undocumented Trace Flags]
+Scope: ?
-**Trace Flag: 2546**
-Function: Dumps all threads for SQL Server in the dump file
-Link: http://support.microsoft.com/kb/917825/en-us
+
+#### Trace Flag: 2422
+Function: Enables the SQL Server Database Engine to abort a request when the maximum time set by Resource Governor REQUEST_MAX_CPU_TIME_SEC configuration is exceeded.
+**Note: This trace flag applies to SQL Server 2017 CU3 and higher builds.**
+Link: https://support.microsoft.com/help/4038419
+Scope: global only
-**Trace Flag: 2547**
-Function: Unknown, but related to controlling the contents of a
-memory dump
-Link: http://support.microsoft.com/kb/917825/en-us
+
+#### Trace Flag: 2430
+Function: Fixes performance problem when using large numbers of locks
+Link: https://support.microsoft.com/help/2754301
+Link: https://support.microsoft.com/help/2746341/fix-high-cpu-usage-when-you-execute-an-update-statement-that-includes-a-where-current-of-cursor-clause-in-sql-server-2008
-**Trace Flag: 2548**
-Function: Shrink will run faster with this trace flag if there are LOB pages that need conversion and/or compaction, because that actions will be skipped.
-Link: http://blogs.msdn.com/b/psssql/archive/2008/03/28/how-it-works-sql-server-2005-dbcc-shrink-may-take-longer-than-sql-server-2000.aspx
-*Thanks to: Andrzej Kukula*
+
+#### Trace Flag: 2440
+Function: SQL 10 - Parallel query execution strategy on partitioned tables. SQL 9 used single thread per partition parallel query execution strategy. In SQL 10, multiple threads can be allocated to a single partition by turning on this flag.
+Link: https://social.msdn.microsoft.com/Forums/sqlserver/en-US/dc010af9-afa0-4c87-937c-4343b4e1119a/trace-flag-2440
-**Trace Flag: 2549**
-Function: Faster CHECKDB
-Link: http://www.sqlservice.se/sv/start/blogg/faster-dbcc-checkdb-by-using-trace-flag-2562-and-2549.aspx
-Link: http://blogs.msdn.com/b/saponsqlserver/archive/2011/12/22/faster-dbcc-checkdb-released-in-sql-2008-r2-sp1-traceflag-2562-amp-2549.aspx
-Link: http://support.microsoft.com/kb/2634571
-Link: http://support.microsoft.com/kb/2732669/en-us
+
+#### Trace Flag: 2453
+Function: Allow a table variable to trigger recompile when enough number of rows are changed with may allow the query optimizer to choose a more efficient plan.
+**Note: Please ensure that you thoroughly test this option, before rolling it into a production environment.**
+Link: http://sqlperformance.com/2014/06/t-sql-queries/table-variable-perf-fix
+Link: https://support.microsoft.com/help/2952444
+Link: [Docs Trace Flags]
+Link: https://www.brentozar.com/archive/2017/02/using-trace-flag-2453-improve-table-variable-performance
+Link: https://www.brentozar.com/archive/2018/03/table-valued-parameters-unexpected-parameter-sniffing
+Link: [TEMPDB – Files and Trace Flags and Updates]
+Link: http://www.sqlservergeeks.com/the-correct-cardinality-estimation-for-table-variable-using-trace-flag-2543/
+Scope: global or session or query
+
+
+
+#### Trace Flag: 2456
+Function: Relieves RESOURCE_SEMAPHORE_MUTEX contention, which may be primarily due to a bug in SQL 2005.
+Link: None
-**Trace Flag: 2550**
-Function: Unknown, but related to controlling the contents of a
-memory dump
-Link: http://support.microsoft.com/kb/917825/en-us
+
+#### Trace Flag: 2466
+Function: When SQL Server is determining the runtime DOP for a parallel plan, this flag directs it to use logic found in “older versions” (the post doesn’t say which versions) to
+determine which NUMA node to place the parallel plan on. This older logic relies on a polling mechanism (roughly every 1 second), and can result in race conditions where 2
+parallel plans end up on the same node. The newer logic “significantly reduces” the likelihood of this happening.
+Link: https://blogs.msdn.microsoft.com/psssql/2013/09/27/how-it-works-maximizing-max-degree-of-parallelism-maxdop
-**Trace Flag: 2551**
-Function: Produces a filtered memory dump
-Link: http://support.microsoft.com/kb/917825/en-us
+
+#### Trace Flag: 2467
+Function: “If target MAXDOP target is less than a single node can provide and if trace flag 2467 is enabled attempt to locate least loaded node”
+Link: https://blogs.msdn.microsoft.com/psssql/2013/09/27/how-it-works-maximizing-max-degree-of-parallelism-maxdop
+Link: [SQL Server Parallel Query Placement Decision Logic]
-**Trace Flag: 2552**
-Function: Unknown, but related to controlling the contents of a
-memory dump
-Link: http://support.microsoft.com/kb/917825/en-us
+
+#### Trace Flag: 2468
+**Undocumented trace flag**
+Function: “Find the next node that can service the DOP request. Unlike full mode, the global, resource manager keeps track of the last node used.
+Starting from the last position, and moving to the next node, SQL Server checks for query placement opportunities.
+If a node can’t support the request SQL Server continues advancing nodes and searching.”
+Link: [SQL Server Parallel Query Placement Decision Logic]
-**Trace Flag: 2553**
+
+#### Trace Flag: 2470
+**Undocumented trace flag**
+Function: Fixes performance problem when using AFTER triggers on partitioned tables
+Link: https://support.microsoft.com/help/2606883
+
+
+
+#### Trace Flag: 2479
+**Undocumented trace flag**
+Function: When SQL Server is determining the runtime DOP for a parallel plan, this flag directs it to limit the NUMA Node placement for the query to the node that the connection is associated with.
+Link: https://blogs.msdn.microsoft.com/psssql/2013/09/27/how-it-works-maximizing-max-degree-of-parallelism-maxdop
+Link: [SQL Server Parallel Query Placement Decision Logic]
+
+
+
+#### Trace Flag: 2486
+**Undocumented trace flag**
+Function: In SQL 2016 (CTP 3.0 at least), enables output for the “query_trace_column_values” Extended Event, allowing the value of output columns from individual plan iterators to be traced.
+Link: http://www.queryprocessor.com/query-trace-column-values
+
+
+
+**Undocumented trace flag**
+#### Trace Flag: 2505
+Function: SQL 7 - Prevents DBCC TRACEON 208, SPID 10 errors from appearing in the error log (Note: DBCC TRACEON(208) just means “SET QUOTED IDENTIFIER ON”)
+Link: None
+
+
+
+#### Trace Flag: 2508
+**Undocumented trace flag**
+Function: Disables parallel non-clustered index checking for DBCC CHECKTABLE
+Link: None
+
+
+
+#### Trace Flag: 2509
+**Undocumented trace flag**
+Function: Used with `DBCC CHECKTABLE` to see the total count of forward records in a table
+Link: None
+
+
+
+#### Trace Flag: 2514
+**Undocumented trace flag**
+Function: Verbose Merge Replication logging to msmerge\_history table for troubleshooting Merger repl performance
+Link: http://sqlblog.com/blogs/argenis_fernandez/archive/2012/05/29/ghost-records-backups-and-database-compression-with-a-pinch-of-security-considerations.aspx
+
+
+
+#### Trace Flag: 2520
+**Undocumented trace flag**
+Function: For SQL Server prior 2005. Forces DBCC HELP to return syntax of undocumented DBCC statements.
+If 2520/2588 is not turned on, DBCC HELP will refuse to give you the syntax stating: "No help available for DBCC statement 'undocumented statement'".
+Also affects dbcc help ('?')
+Link: http://www.sqlskills.com/blogs/paul/dbcc-writepage/
+Scope: session only
+
+
+
+#### Trace Flag: 2521
+**Undocumented trace flag**
+Function: SQL 7 SP2 - Facilitates capturing a Sqlservr.exe user-mode crash dump for postmortem analysis
+Link: None
+
+
+
+#### Trace Flag: 2469
+Function: Enables alternate exchange for `INSERT INTO ... SELECT` into a partitioned columnstore index.
+Link: [Docs Trace Flags]
+Link: https://support.microsoft.com/help/3204769/
+Scope: global or session or query
+
+
+
+#### Trace Flag: 2528
+Function: Disables parallel checking of objects by `DBCC CHECKDB`, `DBCC CHECKFILEGROUP`, and `DBCC CHECKTABLE`.
+By default, the degree of parallelism is automatically determined by the query processor.
+The maximum degree of parallelism is configured just like that of parallel queries.
+For more information, see [Configure the max degree of parallelism Server Configuration Option](https://msdn.microsoft.com/en-us/library/ms189094.aspx).
+Parallel `DBCC` should typically be left enabled.
+For `DBCC CHECKDB`, the query processor reevaluates and automatically adjusts parallelism with each table or batch of tables checked.
+Sometimes, checking may start when the server is almost idle.
+An administrator who knows that the load will increase before checking is complete may want to manually decrease or disable parallelism.
+Disabling parallel checking of DBCC can cause `DBCC` to take much longer to complete and if `DBCC` is run with the `TABLOCK` feature enabled and parallelism set off, tables may be locked for longer periods of time.
+Link: [Docs Trace Flags]
+Link: https://technet.microsoft.com/en-us/library/ms189094.aspx
+Link: http://www.sqlskills.com/blogs/paul/checkdb-from-every-angle-how-long-will-checkdb-take-to-run
+Link: [Important Trace Flags That Every DBA Should Know]
+Scope: global or session
+
+
+
+#### Trace Flag: 2529
+**Undocumented trace flag**
+Function: Displays memory usage for DBCC commands when used with TF 3604
+Link: None
+
+
+
+#### Trace Flag: 2536
+**Undocumented trace flag**
+Function: Allows you to see inactive records in transaction log using fn\_dblog.
+Similar to trace flag 2537 for older version than SQL Server 2008.
+Link: http://www.sqlsoldier.com/wp/sqlserver/day19of31daysofdisasterrecoveryhowmuchlogcanabackuplog
+
+
+
+#### Trace Flag: 2537
+**Undocumented trace flag**
+Function: Allows you to see inactive records in transaction log using fn\_dblog
+Link: http://www.sqlsoldier.com/wp/sqlserver/day19of31daysofdisasterrecoveryhowmuchlogcanabackuplog
+Link: http://www.sqlskills.com/blogs/paul/finding-out-who-dropped-a-table-using-the-transaction-log
+Link: http://sqlserverandme.blogspot.ru/2014/03/how-to-view-transaction-log.html
+Scope: session only
+
+
+
+#### Trace Flag: 2540
+Function: Unknown, but related to controlling the contents of a memory dump
+Link: [KB917825]
+
+
+
+#### Trace Flag: 2541
+Function: Unknown, but related to controlling the contents of a memory dump
+Link: [KB917825]
+
+
+
+#### Trace Flag: 2542
+Function: Unknown, but related to controlling the contents of a memory dump
+Link: [KB917825]
+Link: [Controlling SQL Server memory dumps]
+
+
+
+#### Trace Flag: 2543
+Function: Unknown, but related to controlling the contents of a memory dump
+Link: [KB917825]
+
+
+
+#### Trace Flag: 2544
+Function: Produces a full memory dump
+Link: [KB917825]
+Link: https://blogs.msdn.microsoft.com/askjay/2010/02/05/how-can-i-create-a-dump-of-sql-server
+Link: https://social.msdn.microsoft.com/Forums/sqlserver/en-US/13ce4292-b8a7-41fa-a173-645693957d70/sqldumper?forum=sqldisasterrecovery&forum=sqldisasterrecovery
+
+
+
+#### Trace Flag: 2545
+Function: Unknown, but related to controlling the contents of a memory dump
+Link: [KB917825]
+
+
+
+#### Trace Flag: 2546
+Function: Dumps all threads for SQL Server in the dump file
+Link: [KB917825]
+Link: https://blogs.msdn.microsoft.com/askjay/2010/02/05/how-can-i-create-a-dump-of-sql-server
+Link: https://social.msdn.microsoft.com/Forums/sqlserver/en-US/13ce4292-b8a7-41fa-a173-645693957d70/sqldumper?forum=sqldisasterrecovery&forum=sqldisasterrecovery
+Link: https://blogs.msdn.microsoft.com/psssql/2008/09/12/sql-server-2000-2005-2008-recoveryrollback-taking-longer-than-expected
+
+
+
+#### Trace Flag: 2547
Function: Unknown, but related to controlling the contents of a
memory dump
-Link: http://support.microsoft.com/kb/917825/en-us
+Link: [KB917825]
+
+
+
+#### Trace Flag: 2548
+Function: Shrink will run faster with this trace flag if there are LOB pages that need conversion and/or compaction, because that actions will be skipped.
+Link: http://blogs.msdn.com/b/psssql/archive/2008/03/28/how-it-works-sql-server-2005-dbcc-shrink-may-take-longer-than-sql-server-2000.aspx
+
+*Thanks to: Andrzej Kukula*
+
+
+
+#### Trace Flag: 2549
+Function: Runs the DBCC CHECKDB command assuming each database file is on a unique disk drive.
+DBCC CHECKDB command builds an internal list of pages to read per unique disk drive across all database files.
+This logic determines unique disk drives based on the drive letter of the physical file name of each file.
+**Note: Do not use this trace flag unless you know that each file is based on a unique physical disk.
+Although this trace flag improve the performance of the DBCC CHECKDB commands which target usage of the PHYSICAL_ONLY option, some users may not see any improvement in performance.
+While this trace flag improves disk I/O resources usage, the underlying performance of disk resources may limit the overall performance of the DBCC CHECKDB command.**
+Link: http://blogs.msdn.com/b/saponsqlserver/archive/2011/12/22/faster-dbcc-checkdb-released-in-sql-2008-r2-sp1-traceflag-2562-amp-2549.aspx
+Link: https://support.microsoft.com/help/2634571
+Link: https://support.microsoft.com/help/2732669
+Link: [Docs Trace Flags]
+Scope: global only
-**Trace Flag: 2554**
+
+#### Trace Flag: 2550
Function: Unknown, but related to controlling the contents of a
memory dump
-Link: http://support.microsoft.com/kb/917825/en-us
+Link: [KB917825]
-**Trace Flag: 2555**
+
+#### Trace Flag: 2551
+Function: Produces a filtered memory dump
+Link: [KB917825]
+Link: https://connect.microsoft.com/SQLServer/feedback/details/477863/sql-server-is-terminating-because-of-fatal-exception-c0150014
+
+
+
+#### Trace Flag: 2552
Function: Unknown, but related to controlling the contents of a
memory dump
-Link: http://support.microsoft.com/kb/917825/en-us
+Link: [KB917825]
-**Trace Flag: 2556**
+
+#### Trace Flag: 2553
Function: Unknown, but related to controlling the contents of a
memory dump
-Link: http://support.microsoft.com/kb/917825/en-us
+Link: [KB917825]
-**Trace Flag: 2557**
+
+#### Trace Flag: 2554
Function: Unknown, but related to controlling the contents of a
memory dump
-Link: http://support.microsoft.com/kb/917825/en-us
+Link: [KB917825]
-**Trace Flag: 2558**
+
+#### Trace Flag: 2555
Function: Unknown, but related to controlling the contents of a
memory dump
-Link: http://support.microsoft.com/kb/917825/en-us
+Link: [KB917825]
-**Trace Flag: 2559**
+
+#### Trace Flag: 2556
Function: Unknown, but related to controlling the contents of a
memory dump
-Link: http://support.microsoft.com/kb/917825/en-us
+Link: [KB917825]
-**Trace Flag: 2562**
-Function: Faster CHECKDB
-Link: http://www.sqlservice.se/sv/start/blogg/faster-dbcc-checkdb-by-using-trace-flag-2562-and-2549.aspx
-Link: http://blogs.msdn.com/b/saponsqlserver/archive/2011/12/22/faster-dbcc-checkdb-released-in-sql-2008-r2-sp1-traceflag-2562-amp-2549.aspx
-Link: http://support.microsoft.com/kb/2634571
-Link: http://support.microsoft.com/kb/2732669/en-us
+
+#### Trace Flag: 2557
+Function: Unknown, but related to controlling the contents of a
+memory dump
+Link: [KB917825]
-**Trace Flag: 2588**
-Function: Get more information about undocumented DBCC commands
-Link: http://www.sqlservice.se/sv/start/blogg/trace-flag--undocumented-commands.aspx
+
+#### Trace Flag: 2558
+Function: Disables integration between CHECKDB and Watson
+Link: [KB917825]
+Link: [Controlling SQL Server memory dumps]
-**Trace Flag: 2701**
+
+#### Trace Flag: 2559
+Function: Unknown, but related to controlling the contents of a
+memory dump
+Link: [KB917825]
+
+
+
+#### Trace Flag: 2562
+Function: Runs the DBCC CHECKDB command in a single "batch" regardless of the number of indexes in the database.
+By default, the DBCC CHECKDB command tries to minimize tempdb resources by limiting the number of indexes or "facts" that it generates by using a "batches" concept.
+This trace flag forces all processing into one batch.
+One effect of using this trace flag is that the space requirements for tempdb may increase.
+Tempdb may grow to as much as 5% or more of the user database that is being processed by the DBCC CHECKDB command.
+**Note: Although this trace flag improve the performance of the DBCC CHECKDB commands which target usage of the PHYSICAL_ONLY option, some users may not see any improvement in performance.
+While this trace flag improves disk I/O resources usage, the underlying performance of disk resources may limit the overall performance of the DBCC CHECKDB command.**
+Link: http://blogs.msdn.com/b/saponsqlserver/archive/2011/12/22/faster-dbcc-checkdb-released-in-sql-2008-r2-sp1-traceflag-2562-amp-2549.aspx
+Link: https://support.microsoft.com/help/2634571
+Link: https://support.microsoft.com/help/2732669
+Link: [Docs Trace Flags]
+Scope: global only
+
+
+
+#### Trace Flag: 2566
+Function: Runs the DBCC CHECKDB command without data purity check unless DATA_PURITY option is specified.
+**Note: Column-value integrity checks are enabled by default and do not require the DATA_PURITY option.
+For databases upgraded from earlier versions of SQL Server, column-value checks are not enabled by default until DBCC CHECKDB WITH DATA_PURITY has been run error free on the database at least once.
+After this, DBCC CHECKDB checks column-value integrity by default.**
+Link: [Docs Trace Flags]
+Link: https://sqlperformance.com/2012/11/io-subsystem/minimize-impact-of-checkdb
+Link: https://support.microsoft.com/help/2888996/fix-data-purity-corruption-in-sys.sysbinobjs-table-in-master-database-when-you-log-on-to-sql-server-by-using-the-sa-account-and-then-run-dbcc-checkdb
+Scope: global only
+
+
+
+#### Trace Flag: 2588
+Function: For SQL Server since 2005. Forces DBCC HELP to return syntax of undocumented DBCC statements.
+If 2520/2588 is not turned on, DBCC HELP will refuse to give you the syntax stating: "No help available for DBCC statement 'undocumented statement'".
+Also affects dbcc help ('?')
+Link: http://www.sqlskills.com/blogs/paul/dbcc-writepage/
+Scope: session only
+
+
+
+#### Trace Flag: 2701
Function: SQL 6.5 - Sets the @@ERROR system function to 50000 for RAISERROR messages with severity levels of 10 or less. When disabled, sets the @@ERROR system function to 0 for RAISERROR messages with severity levels of 10 or less
Link: None
-**Trace Flag: 2861**
+
+#### Trace Flag: 2861
Function: Keep zero cost plans in cache. Tip: Avoid Using Trace Flag 2861 to Cache Zero-Cost Query Plan
-Link: http://support.microsoft.com/kb/325607
+Link: None
-**Trace Flag: 3001**
-Function: Stops sending backup entries into MSDB
+#### Trace Flag: 2880, 2881
+Function: Both 2880 and 2881 are related to a SQL 2000 hotfix introduced to solve problems where ad-hoc queries would cause the procedure cache to get too big
Link: None
-**Trace Flag: 3004**
-Function: Returns more info about Instant File Initialization. Shows information about backups and file creations use with 3605 to direct to error log.
-Link: https://blogs.msdn.microsoft.com/psssql/2008/01/23/how-it-works-what-is-restorebackup-doing/
-Link: http://victorisakov.files.wordpress.com/2011/10/sql_pass_summit_2011-important_trace_flags_that_every_dba_should_know-victor_isakov.pdf
+
+#### Trace Flag: 3001
+Function: Stops sending backup entries into MSDB
+Link: https://bytes.com/topic/sql-server/answers/162385-how-do-i-prevent-sql-2000-posting-message-event-viewer-application-log
-**Trace Flag: 3014**
-Function: Returns more info about backups to the errorlog
-Link: http://victorisakov.files.wordpress.com/2011/10/sql_pass_summit_2011-important_trace_flags_that_every_dba_should_know-victor_isakov.pdf
+
+#### Trace Flag: 3004
+Function: Returns more info about Instant File Initialization. Shows information about backups and file creations use with [3605](#3605) to direct to error log.
+Can be used to ensure that SQL Server has been configured to take advantage of IFI correctly.
+Link: https://blogs.msdn.microsoft.com/psssql/2008/01/23/how-it-works-what-is-restorebackup-doing/
+Link: [Important Trace Flags That Every DBA Should Know]
+Link: https://blogs.msdn.microsoft.com/sql_pfe_blog/2009/12/22/how-and-why-to-enable-instant-file-initialization/
+Link: [Undocumented Trace Flags: Inside the Restore Process]
+Scope: session only
+
+
+
+#### Trace Flag: 3014
+Function: Returns more info about backups to the errorlog: Backup activity, Restore activity , File creation.
+Link: [Important Trace Flags That Every DBA Should Know]
+Link: https://blogs.msdn.microsoft.com/psssql/2008/02/06/how-it-works-how-does-sql-server-backup-and-restore-select-transfer-sizes
+Link: [Undocumented Trace Flags: Inside the Restore Process]
+Link: [What’s CHECKDB doing in my database restore?]
+Scope: session only
+
+
+
+#### Trace Flag: 3023
+
+Function: Enables CHECKSUM option as default for BACKUP command
+**Note: Beginning with SQL Server 2014 this behavior is controlled by setting the backup checksum default configuration option.
+For more information, see [Server Configuration Options (SQL Server)](https://msdn.microsoft.com/en-us/library/ms189631.aspx)**.
+Link: https://support.microsoft.com/help/2656988
+Link: [Docs Trace Flags]
+Scope: global or session
-**Trace Flag: 3023**
-Function: How to enable the CHECKSUM option if backup utilities do not expose the option
-Link: https://support.microsoft.com/kb/2656988
+
+#### Trace Flag: 3028
+Function: Enables a hotfix for a problem encountered when backing up to tape with specific backup options
+Link: None
-**Trace Flag: 3031**
+
+#### Trace Flag: 3031
Function: SQL 9 - Will turn the NO_LOG and TRUNCATE_ONLY options into checkpoints in all recovery modes
-Link: None
+Link: http://www.sqlskills.com/blogs/paul/backup-log-with-no_log-use-abuse-and-undocumented-trace-flags-to-stop-it
+
+
+
+#### Trace Flag: 3034
+Function: Overrides the server default, and thus always forces backup compression unless the backup command had the no_compression clause explicitly present.
+Link: https://blogs.msdn.microsoft.com/ialonso/2012/02/24/vdi-backups-and-backup-compression-default
+
+
+
+#### Trace Flag: 3035
+Function: Overrides the server default to always avoid compression, unless the backup command explicitly uses the compression clause. If both 3034 and 3035 are enabled, 3035 takes precedence
+Link: https://blogs.msdn.microsoft.com/ialonso/2012/02/24/vdi-backups-and-backup-compression-default
+
+
+
+#### Trace Flag: 3039
+Function: As long as the SQL edition supports backup compression, this will allow VDI backups to be affected by the default compression setting just as non-VDI BACKUP commands are affected.
+Link: https://blogs.msdn.microsoft.com/ialonso/2012/02/24/vdi-backups-and-backup-compression-default
+
+
+#### Trace Flag: 3042
+Function: Bypasses the default backup compression pre-allocation algorithm to allow the backup file to grow only as needed to reach its final size. This trace flag is useful if you need to save on space by allocating only the actual size required for the compressed backup. Using this trace flag might cause a slight performance penalty (a possible increase in the duration of the backup operation).
+For more information about the pre-allocation algorithm, see [Backup Compression (SQL Server)](https://msdn.microsoft.com/en-us/library/bb964719.aspx).
+Link: [Docs Trace Flags]
+Link: https://support.microsoft.com/help/2001026/inf-space-requirements-for-backup-devices-in-sql-server
+Link: https://blogs.msdn.microsoft.com/psssql/2011/08/11/how-compressed-is-your-backup/
+Link: https://docs.microsoft.com/en-us/sql/relational-databases/backup-restore/backup-compression-sql-server
+Link: https://sqlstudies.com/2017/03/16/compressed-backup-errors-and-tf-3042/
+Scope: global only
-**Trace Flag: 3042**
-Function: Alters backup compression functionality
-Link: http://msdn.microsoft.com/en-us/library/ms188396.aspx
+
+#### Trace Flag: 3051
+Function: Enables SQL Server Backup to URL logging to a specific error log file.
+Link: [Docs Trace Flags]
+Link: https://msdn.microsoft.com/en-us/library/jj919149.aspx
+Scope: global only
-**Trace Flag: 3101**
+
+
+#### Trace Flag: 3057
+Function: Enables functionality after a hotfix that allows a log backup that was taken on a t-logfile hosted on a drive with “Bytes per physical sector”=512 to be restored onto a log file/drive that has “Bytes per physical sector”=4096
+Link: https://support.microsoft.com/help/2987585/restore-log-with-standby-mode-on-an-advanced-format-disk-may-cause-a-9004-error-in-sql-server-2008-r2-or-sql-server-2012
+
+
+
+#### Trace Flag: 3101
Function: Fix performance problems when restoring database with CDC
-Link: http://support.microsoft.com/kb/2567366/
+Link: https://support.microsoft.com/help/2567366/
-**Trace Flag: 3104**
+
+#### Trace Flag: 3104
Function: Causes SQL Server to bypass checking for free space
-Link: None
+Link: http://sqlblogcasts.com/blogs/martinbell/archive/2011/07/06/Mount-point-Permission-Issues.aspx
+Link: http://www.databasejournal.com/features/mssql/article.php/1547551/Troubleshooting-SQL-Server-BackupRestore-Problems.htm
-**Trace Flag: 3106**
+
+#### Trace Flag: 3106
Function: Required to move sys databases
Link: None
-**Trace Flag: 3111**
-Function: Cause LogMgr::ValidateBackedupBlock to be skipped during backup and restore operation
+
+#### Trace Flag: 3111
+Function: “FIX: Backup or Restore Using Large Transaction Logs May Return Error 3241” Causes LogMgr::ValidateBackedupBlock to be skipped during backup and restore operations, allowing backups of very large T-logs to succeed.
Link: None
-**Trace Flag: 3117**
+
+#### Trace Flag: 3117
Function: QL 9 - SQL Server 2005 tries to restore the log files and the data files in a single step which some third-party snapshot backup utilities do not support. Turing on 3117 does things the SQL 8 way multiple-step restore process.
-Link: https://support.microsoft.com/en-us/kb/915385
+Link: None
-**Trace Flag: 3205**
+
+#### Trace Flag: 3205
Function: Disable HW compression for backup to tape drives
-Link: http://msdn.microsoft.com/en-us/library/ms188396.aspx
-Scope: global
+Link: [Docs Trace Flags]
+Scope: global only
-**Trace Flag: 3213**
-Function: Output buffer info for backups to ERRORLOG
-Link: http://sqlcat.com/sqlcat/b/technicalnotes/archive/2008/04/21/tuning-the-performance-of-backup-compression-in-sql-server-2008.aspx
+
+#### Trace Flag: 3207
+Function: Fixes SQL 6.5 so that tape drives work correctly with DUMP and LOAD statements
+Link: None
-**Trace Flag: 3226**
-Function: Turns off ”Backup Successful” messages in errorlog
-Link: http://msdn.microsoft.com/en-us/library/ms188396.aspx
-Scope: global
+
+#### Trace Flag: 3210
+Function: According to Bob Ward’s PASS 2014 talk on SQL Server IO, prints information about “collisions and wait times” that occur between the various “Asynchronous Disk Pool” threads during BACKUP (what about RESTORE?) operations.
+Link: None
-*Thanks to: @lwiederstein (https://twitter.com/lwiederstein)*
+
+#### Trace Flag: 3212
+Function: Prints “Backup stats” to the SQL log
+Link: https://blogs.msdn.microsoft.com/ialonso/2012/10/24/why-does-restoring-a-database-needs-tempdb
-**Trace Flag: 3422**
-Function: Log record auditing
-Link: http://technet.microsoft.com/en-au/library/cc917726.aspx
+
+
+#### Trace Flag: 3213
+Function: Output buffer info for backups to ERRORLOG
+Link: https://blogs.msdn.microsoft.com/psssql/2008/02/06/how-it-works-how-does-sql-server-backup-and-restore-select-transfer-sizes
+Link: https://blogs.msdn.microsoft.com/psssql/2008/01/28/how-it-works-sql-server-backup-buffer-exchange-a-vdi-focus/
+Link: http://www.sqlservergeeks.com/sql-server-trace-flag-3213/
+Scope: global or session
-**Trace Flag: 3231**
-Function: SQL 8/9 - Will turn the NO_LOG and TRUNCATE_ONLY options into no-ops in FULL/BULK_LOGGED recovery mode, and will clear the log in SIMPLE recovery mode. When set, BACKUP LOG with TRUNCATE_ONLY and BACKUP LOG with NO_LOG do not allow a log backup to run if the database's recovery model is FULL or BULK_LOGGED.
-Link: None
+
+#### Trace Flag: 3216
+Function: Prints quite a lot of info about RESTORE internals. Only seems to print to the error log (TF 3605 is required).
+Link: http://jamessql.blogspot.ru/2013/07/trace-flag-for-backup-and-restore.html
-**Trace Flag: 3282**
-Function: SQL 6.5 - Used after backup restoration fails
-Link: https://support.microsoft.com/en-us/kb/215458
+
+#### Trace Flag: 3222
+Function: Disables the read ahead that is used by the recovery operation during roll forward operations
+Link: [TECHNET List Of SQL Server Trace Flags]
-**Trace Flag: 3422**
-Function: Cause auditing of transaction log records as they're read (during transaction rollback or log recovery). This is useful because there is no equivalent to page checksums for transaction log records and so no way to detect whether log records are being corrupted e careful with these trace flags - I don't recommend using them unless you are experiencing corruptions that you can't diagnose. Turning them on will cause a big CPU hit because of the extra auditing that's happening.
-Link: https://support.microsoft.com/en-us/kb/215458
+
+#### Trace Flag: 3226
+Function: By default, every successful backup operation adds an entry in the SQL Server error log and in the system event log.
+If you create very frequent log backups, these success messages accumulate quickly, resulting in huge error logs in which finding other messages is problematic.
+With this trace flag, you can suppress these log entries. This is useful if you are running frequent log backups and if none of your scripts depend on those entries.
+Link: [Docs Trace Flags]
+Link: http://www.sqlskills.com/blogs/paul/fed-up-with-backup-success-messages-bloating-your-error-logs
+Link: https://blogs.msdn.microsoft.com/sqlserverstorageengine/2007/10/30/when-is-too-much-success-a-bad-thing
+Link: [Important Trace Flags That Every DBA Should Know]
+Scope: global only
-**Trace Flag: 3502**
-Function: Writes info about checkpoints to teh errorlog
-Link: http://victorisakov.files.wordpress.com/2011/10/sql_pass_summit_2011-important_trace_flags_that_every_dba_should_know-victor_isakov.pdf
+
+#### Trace Flag: 3231
+Function: SQL 8/9 - Will turn the NO_LOG and TRUNCATE_ONLY options into no-ops in FULL/BULK_LOGGED recovery mode, and will clear the log in SIMPLE recovery mode. When set, BACKUP LOG with TRUNCATE_ONLY and BACKUP LOG with NO_LOG do not allow a log backup to run if the database's recovery model is FULL or BULK_LOGGED.
+Link: http://www.sqlskills.com/blogs/paul/backup-log-with-no_log-use-abuse-and-undocumented-trace-flags-to-stop-it
+Link: http://www.sqlskills.com/blogs/kimberly/understanding-backups-and-log-related-trace-flags-in-sql-server-20002005-and-2008
+Scope: ?
-**Trace Flag: 3503**
-Function: Indicates whether the checkpoint at the end of automatic recovery was skipped for a database (this applies only to read-only databases)
-Link: http://www.sql-server-performance.com/2002/traceflags/
+
+#### Trace Flag: 3282
+**Undocumented trace flag**
+Function: SQL 6.5 - Used after backup restoration fails
+Scope: ?
-**Trace Flag: 3504**
-Function: For internal testing. Will raise a bogus log-out-of-space condition from checkpoint
-Link: None
+
+#### Trace Flag: 3400
+Function: Prints the recovery timings
+Link: https://connect.microsoft.com/SQLServer/feedback/details/392158/recovery-portion-of-sql-2008-restore-takes-much-longer-than-normal-when-restoring-from-sql-2005-backup
-**Trace Flag: 3505**
-Function: Disables automatic checkpointing
-Link: http://support.microsoft.com/kb/815436
+
+#### Trace Flag: 3408
+Function: This forces SQL Server startup to use a single thread when recovering all DBs at SQL Server startup, instead of running through its algorithm for determining how many threads to allocate to DB recovery
+Link: https://blogs.msdn.microsoft.com/ialonso/2012/10/08/how-much-is-crash-recovery-parallelized-in-which-order-are-databases-recovered/
-**Trace Flag: 3601**
-Function: Stack trace when error raised. Also see 3603.
+
+#### Trace Flag: 3412
+**Undocumented trace flag**
+Function: The KB article refers to SQL 6.5, but it is possible that the TF still prints out info to the SQL error log, so leaving it here for now. KB: “...reports when each transaction
+is rolled forward or back [examine the error log for progress]. However, you will not see any progress if SQL Server is rolling a large transaction forward or back. Additionally, this trace flag duplicates
+the sp_configure setting Recovery flags..."
Link: None
-**Trace Flag: 3602**
-Function: Records all error and warning messages sent to the client
+
+#### Trace Flag: 3422
+Function: Cause auditing of transaction log records as they're read (during transaction rollback or log recovery).
+This is useful because there is no equivalent to page checksums for transaction log records and so no way to detect whether log records are being corrupted e careful with these trace flags - I don't recommend using them unless you are experiencing corruptions that you can't diagnose.
+Turning them on will cause a big CPU hit because of the extra auditing that's happening.
+Link: https://support.microsoft.com/help/215458
+Link: http://www.sqlskills.com/blogs/paul/how-to-tell-if-the-io-subsystem-is-causing-corruptions
+Link: http://technet.microsoft.com/en-au/library/cc917726.aspx
+Link: [Important Trace Flags That Every DBA Should Know]
+Scope: ?
+
+
+
+#### Trace Flag: 3427
+Function: Enables fix for issue when many consecutive transactions inserting data into temp table in SQL Server 2016 consume more CPU than in SQL Server 2014. Another change in SQL Server 2016 behavior that could impact tempdb-heavy workloads has to do with Common Criteria Compliance (CCC), also known as C2 auditing. We introduced functionality to allow for transaction-level auditing in CCC which can cause some additional overhead, particularly in workloads that do heavy inserts and updates in temp tables. Unfortunately, this overhead is incurred whether you have CCC enabled or not. In SQL Server 2016 you can enable trace flag 3427 to bypass this overhead starting with SP1 CU2. Starting in SQL Server 2017 CU4, we automatically bypass this code if CCC is disabled.
+Link: [Docs Trace Flags]
+Link: https://support.microsoft.com/help/3216543
+Link: [TEMPDB – Files and Trace Flags and Updates]
+Scope: global only
+
+
+
+#### Trace Flag: 3448
+Function: Introduced in the KB to fix a race condition leading to a hung database in mirroring failover situations. “ This trace flag forces new connections to keep checking for
+database state every two seconds instead of waiting for a lock for infinite time. It helps ending the connection tasks faster as the mirroring reac
+hes the start of the recovery phase and releasing more worker threads to be used by database mirroring.”
+Link: https://support.microsoft.com/help/2970421/
+
+
+
+#### Trace Flag: 3449
+Function: If you enable global TF 3449 (and you are on SQL Server 2012 SP3 CU3 or later or SQL Server 2014 SP1 CU7 or later),
+you will get much better performance by avoiding a FlushCache call in a number of different common scenarios, such as backup database,
+backup transaction log, create database, add a file to a database, restore a transaction log, recover a database, shrink a database file, and a SQL Server “graceful” shutdown.
+Link: https://support.microsoft.com/help/3158396/
+Link: https://blogs.msdn.microsoft.com/psssql/2017/06/29/sql-server-large-ram-and-db-checkpointing/
+Link: [Hidden Performance & Manageability Improvements in SQL Server 2012 / 2014]
+Scope: global only
+
+
+
+#### Trace Flag: 3459
+Function: Disables parallel redo.
+Assume that you use an Always On availability group (AG) that contains heap tables.
+Starting in SQL Server 2016, parallel thread for redo operations is used in secondary replicas.
+In this case, heap tables redo operation may generate a runtime assert dump or the SQL Server may crash with an access violation error in some cases.
+**Note: This trace flag applies to SQL Server 2016 (13.x) and SQL Server 2017 (14.x).**
+Link: [Docs Trace Flags]
+Link: https://support.microsoft.com/help/3200975/
+Link: https://support.microsoft.com/help/4101554/
+Link: https://support.microsoft.com/help/4339858/
+Scope: global only
+
+
+
+#### Trace Flag: 3468
+Function: Disables [indirect checkpoints](https://docs.microsoft.com/en-us/sql/relational-databases/logs/database-checkpoints-sql-server?view=sql-server-2017#IndirectChkpt) on `tempdb`.
+**Note: This trace flag applies to SQL Server 2016 (13.x) SP1 CU5, SQL Server 2017 (14.x) CU1 and higher builds.**
+Link: [Docs Trace Flags]
+Scope: global only
+
+
+
+#### Trace Flag: 3499
+**Undocumented trace flag**
+Function: Provides a workaround for doing a rolling upgrade from SQL 2005 to SQL 2008 with a DB that has a full-text index
Link: None
-**Trace Flag: 3603**
-Function: SQL Server fails to install on tricore, Bypass SMT check is enabled, flags are added via registry. Also see 3601.
-Link: None
+
+#### Trace Flag: 3502
+Function: Writes info about checkpoints to error log.
+Link: [Important Trace Flags That Every DBA Should Know]
+Link: https://blogs.msdn.microsoft.com/joaol/2008/11/20/sql-server-checkpoint-problems/
+Link: http://www.sqlskills.com/blogs/paul/a-sql-server-dba-myth-a-day-1530-checkpoint-only-writes-pages-from-committed-transactions/
+Scope: session only
-**Trace Flag: 3604**
-Function: Redirect DBCC command output to query window
-Link: http://blogs.msdn.com/b/askjay/archive/2011/01/21/why-do-we-need-trace-flag-3604-for-dbcc-statements.aspx
-Link: http://www.sqlservice.se/sv/start/blogg/querytraceon.aspx
+
+#### Trace Flag: 3503
+Function: Indicates whether the checkpoint at the end of automatic recovery was skipped for a database (this applies only to read-only databases)
+Link: http://www.sql-server-performance.com/2002/traceflags/
-**Trace Flag: 3605**
-Function: Directs the output of some Trace Flags to the Errorlog
-Link: http://sqlcat.com/sqlcat/b/technicalnotes/archive/2008/04/21/tuning-the-performance-of-backup-compression-in-sql-server-2008.aspx
+
+#### Trace Flag: 3504
+Function: For internal testing. Will raise a bogus log-out-of-space condition from checkpoint
+Link: https://blogs.msdn.microsoft.com/joaol/2008/11/20/sql-server-checkpoint-problems/
+Link: http://www.sqlskills.com/blogs/paul/a-sql-server-dba-myth-a-day-1530-checkpoint-only-writes-pages-from-committed-transactions/
-**Trace Flag: 3607**
-Function: Skip recovery on startup
-Link: http://sqlkbs.blogspot.se/2008/01/trace-flag.html
+
+#### Trace Flag: 3505
+Function: Disables automatic checkpoints.
+Setting trace flag 3505 may increase recovery time and can prevent log space reuse until the next checkpoint is issued.
+Make sure to issue manual checkpoints on all read/write databases at appropriate time intervals.
+"For high availability systems, such as clusters, Microsoft recommends that you do not change the recovery interval because it may affect data safety and availability."
+Link: http://www.sqlskills.com/blogs/paul/benchmarking-1-tb-table-population-part-2-optimizing-log-block-io-size-and-how-log-io-works/
+Link: [Important Trace Flags That Every DBA Should Know]
+Scope: ?
-**Trace Flag: 3608**
-Function: Recover only Master db at startup
-Link: http://msdn.microsoft.com/en-us/library/ms188396.aspx
+
+#### Trace Flag: 3601
+Function: Appears to disable CPU instruction prefetching. The Blog post to the right uses it, in concert with 3603, to enable SQL 2000 to run on a machine with a # of processors that is *not* a power of 2
+Link: https://blogs.msdn.microsoft.com/sqlserverfaq/2009/05/27/info-sql-2000-msde-installation-will-fail-if-you-have-number-of-cpus-on-a-box-which-is-not-in-power-of-2
-**Trace Flag: 3609**
-Function: Do not create tempdb at startup
-Link: http://basitaalishan.com/2012/02/20/essential-trace-flags-for-recovery-debugging/
+
+#### Trace Flag: 3602
+Function: Records all error and warning messages sent to the client
+Link: https://support.microsoft.com/help/199037/
+
+
+
+#### Trace Flag: 3603
+Function: Disables “Simultaneous Multithreading Processor check”. Used in concern with TF 3601 in the blog post to the right to enable SQL 2000 to run on a machine with a # of processors that is *not* a power of 2
+Link: https://blogs.msdn.microsoft.com/sqlserverfaq/2009/05/27/info-sql-2000-msde-installation-will-fail-if-you-have-number-of-cpus-on-a-box-which-is-not-in-power-of-2
-**Trace Flag: 3610**
+
+#### Trace Flag: 3604
+Function: Enables the output from a large number of trace flags and DBCC commands to be sent back to the client.
+The Connect issue notes that problems can occur when using 3604 with a query that executes across a linked server.
+[This CSS page](https://blogs.msdn.microsoft.com/psssql/2009/05/11/how-do-i-determine-which-dump-triggers-are-enabled/) points out that 3604 is necessary for DBCC DumpTrigger(‘display’)
+Link: http://blogs.msdn.com/b/askjay/archive/2011/01/21/why-do-we-need-trace-flag-3604-for-dbcc-statements.aspx
+Link: [Internals of the Seven SQL Server Sorts – Part 1]
+Link: https://connect.microsoft.com/SQLServer/feedback/details/306380/trace-flag-issue-7300-3604
+Link: [How to Find the Statistics Used to Compile an Execution Plan]
+Link: [A Row Goal Riddle]
+Link: [Undocumented Trace Flags: Inside the Restore Process]
+Link: [What’s CHECKDB doing in my database restore?]
+Scope: session only
+
+
+
+#### Trace Flag: 3605
+Function: Sends a variety of types of information to the SQL Server error log instead of to the user console.
+Often referenced in KB and blog articles in the context of other trace flags (e.g. 3604).
+Link: https://blogs.msdn.microsoft.com/askjay/2011/01/21/why-do-we-need-trace-flag-3604-for-dbcc-statements/
+Link: [Undocumented Trace Flags: Inside the Restore Process]
+Link: [What’s CHECKDB doing in my database restore?]
+Scope: session only
+
+
+
+#### Trace Flag: 3607
+Function: Skip recovery on startup
+Link: http://sqlkbs.blogspot.se/2008/01/trace-flag.html
+Link: https://blogs.msdn.microsoft.com/ialonso/2012/10/24/why-does-restoring-a-database-needs-tempdb/
+
+
+
+#### Trace Flag: 3608
+Function: Prevents SQL Server from automatically starting and recovering any database except the master database.
+If activities that require tempdb are initiated, then model is recovered and tempdb is created. Other databases will be started and recovered when accessed.
+Some features, such as snapshot isolation and read committed snapshot, might not work.
+Use for Move System Databases and Move User Databases.
+**Note: Do not use during normal operation.**
+Link: [Docs Trace Flags]
+Link: [Importance of Performing DBCC CHECKDB on all SQL Server Databases]
+Link: https://blogs.msdn.microsoft.com/ialonso/2012/10/24/why-does-restoring-a-database-needs-tempdb
+Link: http://www.sqlservergeeks.com/sql-server-trace-flag-3608/
+Scope: global only
+
+
+
+#### Trace Flag: 3609
+Function: Recovering all databases, but not clearing tempdb
+Link: http://basitaalishan.com/2012/02/20/essential-trace-flags-for-recovery-debugging/
+Link: [Importance of Performing DBCC CHECKDB on all SQL Server Databases]
+Link: https://blogs.msdn.microsoft.com/ialonso/2012/10/24/why-does-restoring-a-database-needs-tempdb
+Scope: global only
+
+
+
+#### Trace Flag: 3610
Function: SQL 9 - Divide by zero to result in NULL instead of error
Link: None
-**Trace Flag: 3625**
-Function: Masks some error messages
-Link: http://msdn.microsoft.com/en-us/library/ms188396.aspx
-Scope: global
+
+#### Trace Flag: 3614
+Function: Modifies the order of startup operations so that SQL Server can successfully start up even if many user connections are being attempted during SQL startup
+Link: None
-**Trace Flag: 3626**
+
+#### Trace Flag: 3625
+Function: Limits the amount of information returned to users who are not members of the sysadmin fixed server role, by masking the parameters of some error messages using '******'.
+This can help prevent disclosure of sensitive information.
+Link: [Docs Trace Flags]
+Scope: global only
+
+
+
+#### Trace Flag: 3626
Function: Turns on tracking of the CPU data for the sysprocesses table.
Link: None
-**Trace Flag: 3635**
-Function: Print diagnostic information. Trace Flag 3635 Diagnostics are written to the console that started it. There are not written to the errorlog, even if 3605 is turned on.
+
+#### Trace Flag: 3628
+Function: CSS’s mysterious description: “Includes ‘other errors’ in the dump based on a severity.”
+Link: [Controlling SQL Server memory dumps]
+
+
+
+#### Trace Flag: 3629
+Function: CSS: A memory dump will “include messages marked to include with this trace flag enabled.”
+Link: [Controlling SQL Server memory dumps]
+
+
+
+#### Trace Flag: 3635
+Function: Print diagnostic information. Trace Flag 3635 Diagnostics are written to the console that started it.
+There are not written to the errorlog, even if 3605 is turned on.
Link: None
-**Trace Flag: 3640**
+
+#### Trace Flag: 3640
Function: Eliminates sending DONE_IN_PROC messages to client for each statement in stored procedure. This is similar to the session setting of SET NOCOUNT ON, but when set as a trace flag, every client session is handled this way.
-Link: None
+Link: https://blogs.msdn.microsoft.com/selvar/2010/07/13/delete-operation-from-a-reporting-service-2005-report-manager-fails-with-internalcatalogexception-and-throws-watson-mini-dump
-**Trace Flag: 3654**
-Function:Allocations to stack
-Link: None
+
+#### Trace Flag: 3651
+**Undocumented trace flag**
+Function: Can cause stack dumps. For one query, this resulted in a parallel plan significantly more expensive than the naturally occurring serial plan.
+Link: [New Undocumented Trace Flags]
+Scope: ?
+
+
+#### Trace Flag: 3654
+Function: Apparently increases info found in the sys.dm_os_memory_allocations DMV (which appears to have replaced the DBCC MEMOBJLIST command) Bob Ward also discusses it in his PASS 2013 session, saying that it turns on tracing for all memory allocations done by “Memory Objects” (a specific SQLOS memory term). This flag will have a significant impact on system performance.
+Link: https://blogs.msdn.microsoft.com/psssql/2012/11/12/how-can-reference-counting-be-a-leading-memory-scribbler-cause
+Link: https://blogs.msdn.microsoft.com/slavao/2005/08/30/talking-points-around-memory-manager-in-sql-server-2005
+Link: https://support.microsoft.com/help/2888658/
-**Trace Flag: 3656**
+
+
+#### Trace Flag: 3656
Function: Enables resolve of all call stacks in extended events
-Link: http://sqlcat.com/sqlcat/b/msdnmirror/archive/2010/05/11/resolving-dtc-related-waits-and-tuning-scalability-of-dtc.aspx
+Link: http://sqlcat.com/sqlcat/b/msdnmirror/archive/2010/05/11/resolving-dtc-related-waits-and-tuning-scalability-of-dtc.aspx
+Link: [Controlling SQL Server memory dumps]
+Link: http://www.sqlskills.com/blogs/paul/determine-causes-particular-wait-type
-**Trace Flag: 3659**
+
+#### Trace Flag: 3659
Function: Enables logging all errors to error log during server startup
-Link: http://spaghettidba.com/2011/05/20/trace-flag-3659/
+Link: http://spaghettidba.com/2011/05/20/trace-flag-3659/
+Link: [Change SQL Server Collation – Back to Basics]
+Scope: global only
+
+
+#### Trace Flag: 3660
+Function: W/o this flag, for DBs that have Auto_Close=true and for DBs on Express Edition, DB recovery is normally deferred until first user access when SQL starts up. This TF forces
+DB recovery to always run (well, only for DBs that actually need recovery done) at SQL Server startup.
+Link: https://blogs.msdn.microsoft.com/ialonso/2012/10/08/how-much-is-crash-recovery-parallelized-in-which-order-are-databases-recovered
-**Trace Flag: 3688**
+
+
+#### Trace Flag: 3663
+Function: CSS: “By default [SQL Server] allows system cache involvement [with writing to the SQL Error log] to avoid some of the performance issues you might be suspecting, but you can force it to use FILE_FLAG_WRITE_THROUGH” with TF 3663
+Link: http://blogs.msdn.com/b/psssql/archive/2011/01/07/discussion-about-sql-server-i-o.aspx
+
+
+
+#### Trace Flag: 3688
Function: Removes messages to error log about traces started and stopped
-Link: http://support.microsoft.com/kb/922578/en-us
+Link: https://support.microsoft.com/help/922578
-**Trace Flag: 3689**
+
+#### Trace Flag: 3689
Function: Logs extended errors to errorlog when network disconnect occurs, turned off by default. Will dump out the socket error code this can sometimes give you a clue as to the root cause.
-Link: http://support.microsoft.com/kb/922578/en-us
+Link: https://support.microsoft.com/help/922578
+
+
+#### Trace Flag: 3701
+Function: Unknown
+Link: [Upgrading an expired SQL Server 2016 Evaluation Edition]
-**Trace Flag: 3801**
+
+
+#### Trace Flag: 3801
Function: Prohibits use of USE DB statement
Link: None
-**Trace Flag: 3913**
+
+#### Trace Flag: 3861
+Function: This flag allows the SQL Server DB startup code to move system tables to the primary filegroup. Introduced due to behavior in the SQL 2014 upgrade process, where system tables could be created in a secondary filegroup (if that FG was the default).
+Link: https://support.microsoft.com/help/3003760/
+
+
+
+#### Trace Flag: 3913
Function: SQL 7/8 - SQL Server does not update the rowcnt column of the sysindexes system table until the transaction is committed. When turned on the optimizer gets row count information from in-memory metadata that is saved to sysindexes system table when the transaction commits.
Link: None
-**Trace Flag: 3923**
+
+#### Trace Flag: 3917
+Function: According to Bob Ward’s PASS 2014 SQL Server IO talk, enables trace output (3605 is required) for the Eager Write functionality that is used with bulk logged operations (such as SELECT INTO)
+Link: None
+
+
+
+#### Trace Flag: 3923
Function: Let SQL Server throw an exception to the application when the 3303 warning message is raised
-Link: https://support.microsoft.com/kb/3014867/en-us
+Link: https://support.microsoft.com/help/3014867
-**Trace Flag: 4001**
-Function: Very verbose logging of each login attempt to the error log. Includes tons of information
+
+#### Trace Flag: 3924
+Function: Enables a fix where “XA” transactions started within a JDBC-connected Java app are not closed properly and stay open indefinitely.
+Link: https://support.microsoft.com/help/3145492/
+
+
+
+#### Trace Flag: 3940
+Function: According to Bob Ward’s PASS 2014 SQL Server IO talk, forces the Eager Write functionality to throttle at 1024 outstanding eager writes.
Link: None
-**Trace Flag: 4010**
-Function: Allows only shared memory connections to the SQL Server. Meaning, you will only be able to connect from the server machine itself. Client connections over TCP/IP or named pipes will not happen.
+
+#### Trace Flag: 4001
+Function: Very verbose logging of each login attempt to the error log. Includes tons of information
Link: None
-**Trace Flag: 4013**
-Function: Log each new connection the error log
-Link: http://sqlkbs.blogspot.se/2008/01/trace-flag.html
+
+#### Trace Flag: 4010
+Function: Allows only shared memory connections to the SQL Server. Meaning, you will only be able to connect from the server machine itself.
+Client connections over TCP/IP or named pipes will not happen.
+Link: https://blogs.msdn.microsoft.com/sqlserverfaq/2011/05/11/inf-hey-my-sql-server-service-is-not-starting-what-do-i-do
+Link: https://blogs.msdn.microsoft.com/psssql/2008/09/05/sql-server-2005-setup-fails-in-wow-x86-on-computer-with-more-than-32-cpus
+Link: [Upgrading an expired SQL Server 2016 Evaluation Edition]
+
+
+
+#### Trace Flag: 4013
+Function: Trace flag 4013 write entries in error log whenever a new connection established.
+These entries contain login name and SPID also.
+Link: http://sqlkbs.blogspot.se/2008/01/trace-flag.html
+Link: http://www.sqlservergeeks.com/sql-server-trace-flag-4013/
+Scope: global or session
-**Trace Flag: 4020**
+
+#### Trace Flag: 4020
Function: Boot without recover
Link: None
-**Trace Flag: 4022**
-Function: Bypass Startup procedures
-Link: http://www.sqlservice.se/sv/start/blogg/sql-server-2012-cu1-upgrade-step--msdb110_upgrade-sql--encountered-error-547.aspx
+
+#### Trace Flag: 4022
+Function: Directs the SQL instance to ignore stored procedures that have been configured as “auto-start” procedures. Their auto-start configuration is not affected, so the next time the instance is started w/o this flag they will return to their normal behavior.
+Link: https://blogs.msdn.microsoft.com/sqlserverfaq/2011/05/11/inf-hey-my-sql-server-service-is-not-starting-what-do-i-do/
+Link: [Upgrading an expired SQL Server 2016 Evaluation Edition]
+Link: [Change SQL Server Collation – Back to Basics]
+Scope: global only
-**Trace Flag: 4029**
-Function: Logs extended errors to errorlog when network disconnect occurs, turned off by default. Will dump out the socket error code this can sometimes give you a clue as to the root cause.
-Link: None
+
+#### Trace Flag: 4029
+Function: Logs extended errors to errorlog when network disconnect occurs, turned off by default.
+Will dump out the socket error code this can sometimes give you a clue as to the root cause.
+Link: https://blogs.msdn.microsoft.com/sql_protocols/2005/12/19/vss-sql-server-does-not-exist-or-access-denied
-**Trace Flag: 4030**
-Function: Prints both a byte and ASCII representation of the receive buffer. Used when you want to see what queries a client is sending to SQL Server. You can use this trace flag if you experience a protection violation and want to determine which statement caused it. Typically, you can set this flag globally or use SQL Server Enterprise Manager. You can also use DBCC INPUTBUFFER.
-Link: None
+
+#### Trace Flag: 4030
+Function: Prints both a byte and ASCII representation of the receive buffer.
+Used when you want to see what queries a client is sending to SQL Server.
+You can use this trace flag if you experience a protection violation and want to determine which statement caused it.
+Typically, you can set this flag globally or use SQL Server Enterprise Manager.
+You can also use [DBCC INPUTBUFFER](https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-inputbuffer-transact-sql).
+Link: http://www.sqlservergeeks.com/sql-server-trace-flag-4030/
+Scope: global only
-**Trace Flag: 4031**
-Function: Prints both a byte and ASCII representation of the send buffers (what SQL Server sends back to the client). You can also use DBCC OUTPUTBUFFER.
-Link: None
+
+#### Trace Flag: 4031
+Function: Prints both a byte and ASCII representation of the send buffers (what SQL Server sends back to the client).
+You can also use [DBCC OUTPUTBUFFER](https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-outputbuffer-transact-sql).
+Link: http://www.sqlservergeeks.com/sql-server-trace-flag-4031/
+Scope: global only
-**Trace Flag: 4032**
+
+#### Trace Flag: 4032
Function: Traces the SQL commands coming in from the client. When enabled with 3605 it will direct those all to the error log.
-Link: None
+Link: https://support.microsoft.com/help/199037/
+Link: http://www.sqlservergeeks.com/sql-server-trace-flag-4032/
+Scope: global only
-**Trace Flag: 4044**
+
+#### Trace Flag: 4044
Function: SA account can be unlocked by rebooting server with trace flag. If sa (or sso_role) password is lost, add this to your RUN_serverfile. This will generate new password when server started.
Link: None
-**Trace Flag: 4052**
+
+#### Trace Flag: 4052
Function: SQL 9+ Prints TDS packets sent to the client (output) to console. Startup only.
Link: None
-**Trace Flag: 4055**
+
+#### Trace Flag: 4055
Function: SQL 9+ Prints TDS packets received from the client to console. Startup only.
Link: None
-**Trace Flag: 4102**
+
+#### Trace Flag: 4101
+Function: “FIX: Reorder outer joins with filter criteria before non-selective joins and outer joins” Enabling this flag may increase the chance that selective filter criteria on an OUTER
+JOIN will influence the OJ earlier in the plan, rather than the more typical behavior of INNER JOINs being prioritized before OJs. Note that 4101 is also required to enable KB942444.
+Link: https://support.microsoft.com/help/318530/
+
+
+
+#### Trace Flag: 4102
Function: SQL 9 - Query performance is slow if the execution plan of the query contains semi join operators Typically, semi join operators are generated when the query contains the IN keyword or the EXISTS keyword. Enable flag 4102 and 4118 to overcome this.
-Link: https://support.microsoft.com/en-us/kb/940128
+Link: https://support.microsoft.com/help/946020/
-**Trace Flag: 4104**
-Function: SQL 9 - Overestimating cardinality of JOIN operator. When additional join predicates are involved, this problem may increase the estimated cost of the JOIN operator to the point where the query optimizer chooses a different join order. When the query optimizer chooses a different join order, SQL 9 system performance may be slow.
-Link: https://support.microsoft.com/en-us/kb/920346
+
+#### Trace Flag: 4103
+Function: “FIX: A query may take longer to run in SQL Server 2005 SP1 than it takes to run in the original release version of SQL Server 2005 or in SQL
+Server 2000” Applies particularly to queries that contain subqueries with “many column joins”.
+Link: None
-**Trace Flag: 4107**
-Function: SQL 9 - When you run a query that references a partitioned table, query performance may decrease
-Link: https://support.microsoft.com/en-us/kb/923849
+
+#### Trace Flag: 4104
+Function: SQL 9 - Overestimating cardinality of JOIN operator. When additional join predicates are involved, this problem may increase the estimated cost of the JOIN operator to the point where the query optimizer chooses a different join order. When the query optimizer chooses a different join order, SQL 9 system performance may be slow.
+Link: None
-**Trace Flag: 4116**
-Function: SQL 9 - Query runs slowly when using joins between a local and a remote table
-Link: https://support.microsoft.com/en-us/kb/950880
+
+#### Trace Flag: 4105
+Function: “FIX: The SQL Server 2005 query optimizer may incorrectly estimate the cardinality for a query that has a predicate that contains an index union alternative”
+Link: None
-**Trace Flag: 4121**
-Function: SQL 9 - Query that involves an outer join operation runs very slowly. However, if you use the FORCE ORDER query hint in the query, the query runs much faster. Additionally, the execution plan of the query contains the following text in the Warnings column: NO JOIN PREDICATE.
+
+#### Trace Flag: 4106
+Function: “FIX: A query may take a long time to compile when the query contains several JOIN clauses against a SQL Server 2005 database”
Link: None
-**Trace Flag: 4123**
-Function: Query that has many outer joins takes a long time to compile in SQL Server 2005
-Link: https://support.microsoft.com/en-us/kb/943060
+
+#### Trace Flag: 4107
+Function: SQL 9 - When you run a query that references a partitioned table, query performance may decrease
+Link: None
-**Trace Flag: 4125**
-Function: SQL 9 - Query may take more time to finish if using an inner join to join a derived table that uses DISTINCT keyword
-Link: https://support.microsoft.com/en-us/kb/949854
+
+#### Trace Flag: 4108
+Function: “FIX: The query performance is very slow when you use a fast forward-only cursor to run a query in SQL Server 2005”
+Link: None
-**Trace Flag: 4127**
-Function: SQL 9 - Compilation time of some queries is very long in an x64-based version. Basically its more than execution time because more memory allocations are necessary in the compilation process.
-Link: https://support.microsoft.com/en-us/kb/953569
+
+#### Trace Flag: 4109
+Function: “FIX: Error message when you run a query that uses a fast forward-only cursor in SQL Server 2005: "Query processor could not produce a query plan because of the hints defined in this query”
+Link: https://support.microsoft.com/help/926773/
-**Trace Flag: 4130**
-Function: XML performance fix
-Link: http://support.microsoft.com/kb/957205
+
+#### Trace Flag: 4110
+Function: “FIX: The query performance is slow when you run a query that uses a user-defined scalar function against an instance of SQL Server 2005”
+Link: None
-**Trace Flag: 4134**
-Function: Bugfix for error: parallel query returning different results every time
-Link: http://support.microsoft.com/kb/2546901
-Link: http://sql-sasquatch.blogspot.se/2014/04/whaddayaknow-bout-sqlserver-trace-flag.html
+
+#### Trace Flag: 4111
+Function: Fixes a cardinality estimate issue with an unnamed builtin function. The KB article title shows that the issue was initially hit due to timeouts with the Replication Merge agent, but the problem was ultimately a poor query plan.
+Link: None
-**Trace Flag: 4135**
-Function: Bugfix for error inserting to temp table
-Link: http://support.microsoft.com/kb/960770
+
+#### Trace Flag: 4112
+Function: Enables a fix for a problem that occurs when a linked server from 2005 or 2008 targets SQL 2000: “This problem occurs because SQL Server 2005 generates an
+execution plan that has a remote query. SQL Server 2005 must execute the remote query against SQL Server 2000 to retrieve the required data. SQL Server 2000 cannot
+handle the remote query. Therefore, error 107 occurs in SQL Server 2000. Then, error 107 is propagated back to SQL Server 2005. Therefore, error 107 occurs in SQL Server
+2005, and error 8180 occurs in SQL Server 2005.”
+Link: https://support.microsoft.com/help/936223/
-**Trace Flag: 4136**
-Function: Parameter Sniffing behaviour alteration
-Link: http://blogs.msdn.com/b/axinthefield/archive/2010/11/04/sql-server-trace-flags-for-dynamics-ax.aspx
-Link: http://www.sqlservice.se/sv/start/blogg/nagra-trace-flags-for-sql-server.aspx
+
+#### Trace Flag: 4115
+Function: “FIX: A query that you run by using a FORWARD_ONLY cursor takes alonger time to run in Microsoft SQL Server 2005 than in SQL Server 2000 ”The fix apparently increases the likelihood that a certain type of cursor will use an index seek (as it did in SQL 2000) rather than regressing to a scan for each Fetch. The notes also contain some interesting info about sp_cursoropen
+Link: None
-**Trace Flag: 4137**
-Function: Fix for bad performance in queries with several AND criteria
-Link: http://support.microsoft.com/kb/2658214
+
+#### Trace Flag: 4116
+Function: SQL 9 - Query runs slowly when using joins between a local and a remote table
+Link: None
-**Trace Flag: 4138**
-Function: Fixes performance problems with certain queries that use TOP
-statement
-Link: http://support.microsoft.com/kb/2667211
+
+#### Trace Flag: 4117
+Function: “FIX: A blocking issue occurs when you update rows in a table in SQL Server 2005...[A] problem occurs because the positioned update in a transaction performs a table scan on all involved tables. This behavior causes many update locks to be generated on many rows in the table. Additionally, SQL Server tries to add an update lock on the ow that has already been granted an exclusive lock by another transaction. Therefore, a blocking issue occurs.”
+Link: None
-**Trace Flag: 4199**
-Function: Turn on all optimizations
-Link: http://www.sqlservice.se/sv/start/blogg/one-trace-flag-to-rule-them-all.aspx
-Link: https://msdn.microsoft.com/en-us/library/bb510411.aspx#TraceFlag
-Scope: global or session
+
+#### Trace Flag: 4119
+Function: “FIX: The query performance is slower when you run the query in SQL Server 2005 than when you run the query in SQL Server 2000” The example given in the KB article indicates that selective LIKE predicates may not be considered fully when less-selective “comparison” (e.g. =, >, etc) predicates are done on the same parameter (or variable?) value as the LIKE predicate.
+Link: None
-**Trace Flag: 4606**
-Function: Over comes SA password by startup. Disables password policy check during server startup.
-Link: https://support.microsoft.com/en-us/kb/936892
+
+#### Trace Flag: 4120
+Function: “FIX: Error message when you perform an update operation by using a cursor in SQL Server 2005: Transaction (Process ID ) was deadlocked on lock resources with another process and has been chosen as the deadlock victim” This issue is apparently due to deadlock issues related to upgrading a U lock to an X lock.
+Link: https://support.microsoft.com/help/953948/
-**Trace Flag: 4610**
-Function: When you use trace flag 4618 together with trace flag 4610, the number of entries in the cache store is limited to 8,192. When the limit is reached, SQL 2005 removes some entries from the TokenAndPermUserStore cache store.
-Link: https://support.microsoft.com/en-us/kb/959823
+
+#### Trace Flag: 4121
+Function: SQL 9 - Query that involves an outer join operation runs very slowly. However, if you use the FORCE ORDER query hint in the query, the query runs much faster. Additionally, the execution plan of the query contains the following text in the Warnings column: NO JOIN PREDICATE.
+Link: None
-**Trace Flag: 4612**
-Function: Disable the ring buffer logging - no new entries will be made into the ring buffer
+
+#### Trace Flag: 4123
+Function: Query that has many outer joins takes a long time to compile in SQL Server 2005
Link: None
-**Trace Flag: 4613**
-Function: Generate a minidump file whenever an entry is logged into the ring buffer
+
+#### Trace Flag: 4124
+Function: “FIX: A query performance issue occurs when you run a query against a column of the bigint data type in SQL Server 2005... If the All Density column [of SHOW_STATISTICS] displays incorrect values of 1, you are encountering this problem”
Link: None
-**Trace Flag: 4614**
-Function: Enables SQL Server authenticated logins that use Windows domain password policy enforcement to log on to the instance even though the SQL Server service account is locked out or disabled on the Windows domain controller.
-Link: https://support.microsoft.com/en-us/kb/925744
+
+#### Trace Flag: 4125
+Function: SQL 9 - Query may take more time to finish if using an inner join to join a derived table that uses DISTINCT keyword
+Link: None
-**Trace Flag: 4616**
-Function: Makes server-level metadata visible to application roles. In SQL Server, an application role cannot access metadata outside its own database because application roles are not associated with a server-level principal. This is a change of behavior from earlier versions of SQL Server. Setting this global flag disables the new restrictions, and allows for application roles to access server-level metadata.
-Link: http://msdn.microsoft.com/en-us/library/ms188396.aspx
-Scope: global
+
+#### Trace Flag: 4126
+Function: “FIX: The synchronization process is slow, and the CPU usage is high on the computer that is configured as the Distributor in SQL Server 2005” The problem manifested as a replication performance issue, but the following phrase found in the KB article indicates that it is a query processor issue: “the query that performs poorly shows that a join predicate is not pushed down to a Clustered Index Seek operator.”
+Link: https://support.microsoft.com/help/959013/
-**Trace Flag: 4618**
-Function: Limits number of entries per user cache store to 1024. It may incur a small CPU overhead as when removing old cache entries when new entries are inserted. It performs this action to limit the size of the cache store growth. However, the CPU overhead is spread over time.
-Link: https://support.microsoft.com/en-us/kb/933564
+
+#### Trace Flag: 4127
+Function: SQL 9 - Compilation time of some queries is very long in an x64-based version.
+Basically its more than execution time because more memory allocations are necessary in the compilation process.
+Link: Note
-**Trace Flag: 4621**
-Function: SQL 9 – After 4610 & 4618 you can still customize the quota for TokenAndPermUserStore cache store that is based on the current workload
-Link: https://support.microsoft.com/en-us/kb/959823
+
+#### Trace Flag: 4128
+Function: “FIX: When you update rows by using a cursor in SQL Server 2005, the update may take a long time to finish”
+Link: https://support.microsoft.com/help/957872/
-**Trace Flag: 5101**
-Function: Forces all I/O requests to go through engine 0. This removes the contention between processors but could create a bottleneck if engine 0 becomes busy with non-I/O tasks.
+
+#### Trace Flag: 4129
+Function: “FIX: The values of the datetime column are not same for the rows that are copied when you copy data to a table by using the GETDATE() function in Microsoft SQL Server 2005”
Link: None
-**Trace Flag: 5102**
-Function: Prevents engine 0 from running any non-affinitied tasks.
+
+#### Trace Flag: 4130
+Function: XML performance fix
Link: None
-**Trace Flag: 5302**
-Function: Alters default behavior of select…INTO (and other processes) that lock system tables for the duration of the transaction. This trace flag disables such locking during an implicit transaction.
+
+#### Trace Flag: 4131
+Function: “FIX: When you run a query that contains a JOIN operation in SQL Server 2005 or SQL Server 2008, and the ON clause of the JOIN operator contains a LIKE predicate, the query runs slower than in SQL Server 2000”
Link: None
-**Trace Flag: 6527**
-Function: Disables generation of a memory dump on the first occurrence of an out-of-memory exception in CLR integration. By default, SQL Server generates a small memory dump on the first occurrence of an out-of-memory exception in the CLR. The behaviour of the trace flag is as follows: If this is used as a startup trace flag, a memory dump is never generated. However, a memory dump may be generated if other trace flags are used. If this trace flag is enabled on a running server, a memory dump will not be automatically generated from that point on. However, if a memory dump has already been generated due to an out-of-memory exception in the CLR, this trace flag will have no effect.
-Link: http://msdn.microsoft.com/en-us/library/ms188396.aspx
-Scope: global
+
+#### Trace Flag: 4133
+Function: “FIX: The size of the SQL Server 2005 error log file or of the SQL Server 2008 error log file grows very quickly when query notifications are created and destroyed in a high ratio” & “FIX: The restore operation takes a long time when you restore a database that has query notification enabled in SQL Server 2005 or in SQL Server 2008”
+Link: https://support.microsoft.com/help/958006/
-**Trace Flag: 7103**
-Function: Disable table lock promotion for text columns
-Link: https://support.microsoft.com/en-us/kb/230044
+
+#### Trace Flag: 4134
+Function: Bugfix for error: parallel query returning different results every time
+ The trace flag disables an optimization in the query optimizer.
+The optimization caused the issue described in the KB article when you try to insert into a table by selecting from the table itself.
+As turning on the trace flag could result in a perf degradation, you only should use it if you run into the issue described in the KB article.
+Link: https://support.microsoft.com/help/2546901
+Link: http://sql-sasquatch.blogspot.se/2014/04/whaddayaknow-bout-sqlserver-trace-flag.html
+Link: https://social.msdn.microsoft.com/Forums/sqlserver/en-US/9ea718c2-e0e0-40cf-b12b-3269130448b7/trace-flag-4135-sql-server-2008?forum=sqldatabaseengine
-**Trace Flag: 7300**
-Function: Outputs extra info about linked server errors
-Link: http://support.microsoft.com/kb/314530
+
+#### Trace Flag: 4135
+Function: Bugfix for error inserting to temp table
+Link: https://support.microsoft.com/help/960770
+Link: https://connect.microsoft.com/SQLServer/feedback/details/541352/tempdb-errors-during-statistics-auto-update
-**Trace Flag: 7502**
-Function: Disable cursor plan caching for extended stored procedures
-Link: http://basitaalishan.com/2012/02/20/essential-trace-flags-for-recovery-debugging/
+
+#### Trace Flag: 4136
+Function: Disables parameter sniffing unless OPTION(RECOMPILE), WITH RECOMPILE or OPTIMIZE FOR value is used.
+To accomplish this at the database level, see [ALTER DATABASE SCOPED CONFIGURATION (Transact-SQL)].
+To accomplish this at the query level, add the OPTIMIZE FOR UNKNOWN query hint.
+Beginning with SQL Server 2016 SP1, to accomplish this at the query level, add the USE HINT query hint instead of using this trace flag.
+**Note: Please ensure that you thoroughly test this option, before rolling it into a production environment.**
+Link: http://blogs.msdn.com/b/axinthefield/archive/2010/11/04/sql-server-trace-flags-for-dynamics-ax.aspx
+Link: [New Features in SQL Server 2016 Service Pack 1]
+Link: [Docs Trace Flags]
+Link: http://kejser.org/trace-flag-4136-2/
+Link: http://www.sqlservergeeks.com/sql-server-trace-flag-4136/
+Link: http://www.sqlservergeeks.com/sql-server-did-you-know-about-trace-flag-4136/
+Scope: global or session or query
+
+
+
+#### Trace Flag: 4137
+Function: Causes SQL Server to generate a plan using minimum selectivity when estimating AND predicates for filters to account for correlation, under the query optimizer cardinality estimation model of SQL Server 2012 and earlier versions
+Beginning with SQL Server 2016 SP1, to accomplish this at the query level, add the USE HINT query hint instead of using this trace flag.
+**Note: Please ensure that you thoroughly test this option, before rolling it into a production environment.**
+Link: https://support.microsoft.com/help/2658214
+Link: [New Features in SQL Server 2016 Service Pack 1]
+Link: [Docs Trace Flags]
+Scope: global or session or query
+
+
+
+#### Trace Flag: 4138
+Function: Causes SQL Server to generate a plan that does not use row goal adjustments with queries that contain TOP, OPTION (FAST N), IN, or EXISTS keywords
+Beginning with SQL Server 2016 SP1, to accomplish this at the query level, add the USE HINT query hint instead of using this trace flag.
+**Note: Please ensure that you thoroughly test this option, before rolling it into a production environment.**
+Link: https://support.microsoft.com/help/2667211
+Link: [New Features in SQL Server 2016 Service Pack 1]
+Link: [Docs Trace Flags]
+Link: https://answers.sqlperformance.com/questions/1609/trying-to-figure-out-how-to-resolve-the-data-skew.html
+Link: http://dba.stackexchange.com/questions/55198/huge-slowdown-to-sql-server-query-on-adding-wildcard-or-top
+Scope: global or session or query
+
+
+
+#### Trace Flag: 4139
+Function: Enable automatically generated quick statistics (histogram amendment) regardless of key column status.
+If trace flag 4139 is set, regardless of the leading statistics column status (ascending, descending, or stationary), the histogram used to estimate cardinality will be adjusted at query compile time
+Beginning with SQL Server 2016 SP1, to accomplish this at the query level, add the USE HINT query hint instead of using this trace flag.
+**Note: Please ensure that you thoroughly test this option, before rolling it into a production environment.**
+Link: https://support.microsoft.com/help/2952101
+Link: [Docs Trace Flags]
+Link: [SQL Server - estimates outside of the histogram - half-baked draft]
+Link: [Parallelism in Hekaton (In-Memory OLTP)]
+Link: [Important Trace Flags That Every DBA Should Know]
+Link: https://support.microsoft.com/help/974006
+Scope: global or session or query
+
+
+
+#### Trace Flag: 4199
+Function: Enables query optimizer (QO) changes released in SQL Server Cumulative Updates and Service Packs.
+QO changes that are made to previous releases of SQL Server are enabled by default under the latest database compatibility level in a given product release, without trace flag 4199 enabled.
+The following table summarizes the behavior when using specific database compatibility levels and trace flag 4199:
+
+| Database compatibility level | TF 4199 | QO changes from previous database compatibility levels | QO changes for current version post-RTM |
+|------------------------------|-------------|--------------------------------------------------------|-----------------------------------------|
+| 100 to 120 | Off On | Disabled Enabled | Disabled Enabled |
+| 130 | Off On | Enabled Enabled | Disabled Enabled |
+| 140 | Off On | Enabled Enabled | Disabled Enabled |
+
+To enable this at the database level, see [ALTER DATABASE SCOPED CONFIGURATION (Transact-SQL)].
+**Note: Starting with SQL Server 2016 SP1, to accomplish this at the query level, add the USE HINT [query hint](https://docs.microsoft.com/en-us/sql/t-sql/queries/hints-transact-sql-query) instead of using this trace flag.**
+Link: https://support.microsoft.com/help/974006
+Link: [New Features in SQL Server 2016 Service Pack 1]
+Link: [Docs Trace Flags]
+Link: https://support.microsoft.com/help/974006/
+Link: https://sqlworkbooks.com/2017/04/selectively-enabletrace-flag-4199-and-query_optimizer_hotfixes-in-sql-server-2016/
+Link: https://sqlworkbooks.com/2017/04/trace-flag-4199-no-per-session-override-if-you-enable-it-globally/
+Link: http://www.sqlservergeeks.com/sql-server-2016-database-scoped-configuration-and-trace-flag-4199/
+Scope: global or session or query
+
+
+
+#### Trace Flag: 4606
+Function: Over comes SA password by startup. Disables password policy check during server startup.
+Link: https://blogs.msdn.microsoft.com/sqlserverfaq/2011/05/11/inf-hey-my-sql-server-service-is-not-starting-what-do-i-do
+Link: https://blogs.msdn.microsoft.com/sqlserverfaq/2008/07/31/upgrade-of-sql-server-2000-instance-to-sql-server-2005-fails-with-error-similar-to-enforce-password-policy
-**Trace Flag: 7505**
-Function: Enables version 6.x handling of return codes when calling dbcursorfetchex and the resulting cursor position follows the end of the cursor result set
-Link: None
+
+#### Trace Flag: 4610
+Function: When you use trace flag 4618 together with trace flag 4610, the number of entries in the cache store is limited to 8,192. When the limit is reached, SQL 2005 removes some entries from the TokenAndPermUserStore cache store.
+Link: https://support.microsoft.com/help/959823
+Link: [Docs Trace Flags]
+Link: https://blogs.msdn.microsoft.com/psssql/2008/06/16/query-performance-issues-associated-with-a-large-sized-security-cache/
+Scope: global only
-**Trace Flag: 7525**
-Function: SQL 8 - Reverts to ver 7 behavior of closing nonstatic cursors regardless of the SET CURSOR_CLOSE_ON_COMMIT state
-Link: None
+
+#### Trace Flag: 4612
+Function: Disable the ring buffer logging - no new entries will be made into the ring buffer
+Link: http://blogs.msdn.com/b/lcris/archive/2007/02/19/sql-server-2005-some-new-security-features-in-sp2.aspx
-**Trace Flag: 7601**
-Function: Helps in gathering more information in full text search by turning on full text tracing which gathers information on indexing process using the error log. Also 7603, 7604, 7605 trace flags.
-Link: None
+
+#### Trace Flag: 4613
+Function: Generate a minidump file whenever an entry is logged into the ring buffer
+Link: http://blogs.msdn.com/b/lcris/archive/2007/02/19/sql-server-2005-some-new-security-features-in-sp2.aspx
-**Trace Flag: 7608**
-Function: Performance fix for slow full text population with a composite clustered index
-Link: https://support.microsoft.com/en-us/kb/938672
+
+#### Trace Flag: 4614
+Function: Enables SQL Server authenticated logins that use Windows domain password policy enforcement to log on to the instance even though the SQL Server service account is locked out or disabled on the Windows domain controller.
+Link: https://support.microsoft.com/help/925744
-**Trace Flag: 7613**
-Function: SQL 9 - Search results are missing when performing a full-text search operation on Win SharePoint Services 2.0 site after upgrading
-Link: https://support.microsoft.com/en-us/kb/927643
+
+#### Trace Flag: 4616
+Function: Makes server-level metadata visible to application roles.
+In SQL Server, an application role cannot access metadata outside its own database because application roles are not associated with a server-level principal.
+This is a change of behavior from earlier versions of SQL Server.
+Setting this global flag disables the new restrictions, and allows for application roles to access server-level metadata.
+Link: [Docs Trace Flags]
+Link: https://support.microsoft.com/help/906549/
+Scope: global only
-**Trace Flag: 7614**
-Function: SQL 9 - Full-text index population for the indexed view is very slow
-Link: https://support.microsoft.com/en-us/kb/928537
+
+#### Trace Flag: 4618
+Function: Limits number of entries per user cache store to 1024.
+It may incur a small CPU overhead as when removing old cache entries when new entries are inserted.
+It performs this action to limit the size of the cache store growth. However, the CPU overhead is spread over time.
+When used together with trace flag 4610 increases the number of entries in the TokenAndPermUserStore cache store to 8192
+Link: [Docs Trace Flags]
+Link: https://support.microsoft.com/help/933564
+Link: https://support.microsoft.com/help/959823/
+Scope: global only
-**Trace Flag: 7646**
-Function: SQL 10 - Avoids blocking when using full text indexing. An issue we experienced that full text can be slow when there is a high number of updates to the index and is caused by blocking on the docidfilter internal table.
-Link: None
+
+#### Trace Flag: 4620
+Function: According to the Connect item, causes permission checking to be done on a global cache instead of the per-user caches that were introduced in SQL 2008. The thread
+includes some interesting information on the cache stores, especially as they relate to TokenPermAndUserStore.
+Link: https://connect.microsoft.com/SQLServer/feedback/details/467661/sql-server-2008-has-incorrect-cache-names-in-sys-dm-os-memory-cache-counters
-**Trace Flag: 7806**
-Function: SQL 9 - Enables a dedicated administrator connection on SQL Express, DAC resources are not reserved by default
-Link: http://msdn.microsoft.com/en-us/library/ms188396.aspx
-Scope: global
+
+#### Trace Flag: 4621
+Function: SQL 9 – After 4610 & 4618 you can still customize the quota for TokenAndPermUserStore cache store that is based on the current workload
+Link: https://support.microsoft.com/help/959823
-**Trace Flag: 7826**
-Function: Disable Connectivity ring buffer
-Link: http://blogs.msdn.com/b/sql_protocols/archive/2008/05/20/connectivity-troubleshooting-in-sql-server-2008-with-the-connectivity-ring-buffer.aspx
+
+#### Trace Flag: 5004
+Function: Pauses TDE encryption scan and causes encryption scan worker to exit without doing any work.
+The database will continue to be in encrypting state (encryption in progress).
+To resume re-encryption scan, disable trace flag 5004 and run ALTER DATABASE SET ENCRYPTION ON.
+Link: [Docs Trace Flags]
+Scope: global only
-**Trace Flag: 7827**
-Function: Record connection closure info in ring buffer
-Link: http://blogs.msdn.com/b/sql_protocols/archive/2008/05/20/connectivity-troubleshooting-in-sql-server-2008-with-the-connectivity-ring-buffer.aspx
-Link: https://connect.microsoft.com/SQLServer/feedback/details/518158/-packet-error-a-fatal-error-occurred-while-reading-the-input-stream-from-the-network
+
+#### Trace Flag: 5101
+Function: Forces all I/O requests to go through engine 0.
+This removes the contention between processors but could create a bottleneck if engine 0 becomes busy with non-I/O tasks.
+Link: http://dba.fyicenter.com/Interview-Questions/SYBASE/What_is_Trace_Flag_Definitions_in_Sybase.html#1.3.4#1.3.4
-**Trace Flag: 8002**
-Function: Changes CPU Affinity behaviour
-Link: http://support.microsoft.com/kb/818769
+
+#### Trace Flag: 5102
+Function: Prevents engine 0 from running any non-affinitied tasks.
+Link: http://dba.fyicenter.com/Interview-Questions/SYBASE/What_is_Trace_Flag_Definitions_in_Sybase.html#1.3.4#1.3.4
+
+
+
+#### Trace Flag: 5302
+Function: Alters default behavior of select…INTO (and other processes) that lock system tables for the duration of the transaction.
+This trace flag disables such locking during an implicit transaction.
+Link: https://support.microsoft.com/help/153096/
+
+
+
+#### Trace Flag: 6498
+Function: Enables more than one large query compilation to gain access to the big gateway when there is sufficient memory available.
+It is based on the 80 percentage of SQL Server Target Memory, and it allows for one large query compilation per 25 gigabytes (GB) of memory.
+**Note: Beginning with SQL Server 2014 SP2 and SQL Server 2016 this behavior is controlled by the engine and trace flag 6498 has no effect.**
+Link: https://support.microsoft.com/help/3024815
+Link: [Docs Trace Flags]
+Link: http://blogs.msdn.com/b/sql_server_team/archive/2015/10/09/query-compile-big-gateway-policy-changes-in-sql-server.aspx
+Scope: global only
+
+
+
+#### Trace Flag: 6527
+Function: Disables generation of a memory dump on the first occurrence of an out-of-memory exception in CLR integration.
+By default, SQL Server generates a small memory dump on the first occurrence of an out-of-memory exception in the CLR.
+The behaviour of the trace flag is as follows: If this is used as a startup trace flag, a memory dump is never generated.
+However, a memory dump may be generated if other trace flags are used.
+If this trace flag is enabled on a running server, a memory dump will not be automatically generated from that point on.
+However, if a memory dump has already been generated due to an out-of-memory exception in the CLR, this trace flag will have no effect.
+Link: [Docs Trace Flags]
+Scope: global only
+
+
+
+#### Trace Flag: 6530
+Function: Enables a hotfix for “
+FIX: Slow performance in SQL Server 2012 or SQL Server 2014 when you build an index on a spatial data type of a large table”
+Link: https://blogs.msdn.microsoft.com/psssql/2013/11/19/spatial-indexing-from-4-days-to-4-hours
+Link: https://support.microsoft.com/help/2896720/
+
+
+#### Trace Flag: 6531
+Function: Enables adjustment in the SQLOS scheduling layer to handle queries that issue many short-duration calls to spatial data (which is implemented via CLR functions): “
+This fix introduces the trace flag 6531 to indicate to the SQLOS hosting layer that the spatial data type should avoid preemptive protections. This can reduce the CPU consumption
+and improve the overall performance for spatial activities. Only use this trace flag if the individual, spatial method invocations (per row and column) take less than ~4ms.
+Longer invocations without preemptive protection could lead to scheduler concurrency issues and SQLCLR punishment messages logged to the error log.”
+Link: https://support.microsoft.com/help/3005300/
+
+
+
+#### Trace Flag: 6532
+Function: Enables performance improvement of query operations with spatial data types in SQL Server 2012 and SQL Server 2014.
+The performance gain will vary, depending on the configuration, the types of queries, and the objects.
+Link: [KB3107399]
+Link: [Docs Trace Flags]
+Scope: global or session
-**Trace Flag: 8004**
-Function: SQL server to create a mini-dump once you enable 2551 and a out of memory condition is hit
-Link: None
+
+#### Trace Flag: 6533
+Function: Enables performance improvement of query operations with spatial data types in SQL Server 2012 and SQL Server 2014.
+The performance gain will vary, depending on the configuration, the types of queries, and the objects.
+Link: [KB3107399]
+Link: [Docs Trace Flags]
+Scope: global or session
+
+
+#### Trace Flag: 6534
+Function: Enables performance improvement of query operations with spatial data types in SQL Server 2012, SQL Server 2014 and SQL Server 2016.
+The performance gain will vary, depending on the configuration, the types of queries, and the objects.
+Link: https://support.microsoft.com/help/3054180
+Link: [KB3107399]
+Link: https://blogs.msdn.microsoft.com/bobsql/2016/06/03/sql-2016-it-just-runs-faster-native-spatial-implementations/
+Link: [Docs Trace Flags]
+Scope: global or session
-**Trace Flag: 8010**
-Function: Fixes problem that SQL Server services can not be stopped
-Link: http://support.microsoft.com/kb/2633271/en-us
+
+#### Trace Flag: 6545
+Function: Enables "CLR strict security" behavior (introduced in SQL Server 2017) in SQL Server 2012, SQL Server 2014, and SQL Server 2016.
+When enabled, this option will require that _all_ assemblies, regardless of `PERMISSION_SET`, be signed, have an associated signature-based Login, and that the associated Login be granted the `UNSAFE ASSEMBLY` permission.
+Please note:
+1. This TF can only be specified as a startup parameter!
+1. This TF is only available in instances that have been updated / patched with a Service Pack (SP), Cumulative Update (CU), or GDR that was released on or after 2017-08-08.
-**Trace Flag: 8011**
-Function: Disable the ring buffer for Resource Monitor
-Link: http://support.microsoft.com/kb/920093
+Link: [SQLCLR vs. SQL Server 2012 & 2014 & 2016, Part 7: “CLR strict security” – The Problem Continues … in the Past (Wait, What?!?)][TF6545-b]
+Link: [Update adds the "CLR strict security" feature to SQL Server 2016][TF6545-a] ( KB4018930 )
Scope: global
-**Trace Flag: 8012**
-Function: Disable the ring buffer for schedulers
-Link: http://support.microsoft.com/kb/920093
-
+
+#### Trace Flag: 7103
+**Undocumented trace flag**
+Function: Disable table lock promotion for text columns
+Link: None
+
-**Trace Flag: 8015**
-Function: Ignore NUMA functionality
-Link: https://support.microsoft.com/en-us/kb/948450
-Link: http://sql-sasquatch.blogspot.se/2013/04/startup-trace-flags-i-love.html
+
+#### Trace Flag: 7300
+Function: Outputs extra info about linked server errors
+Link: https://support.microsoft.com/help/314530
+Link: https://support.microsoft.com/help/280106/
+Link: https://support.microsoft.com/help/280102/
+Link: https://connect.microsoft.com/SQLServer/feedback/details/306380/trace-flag-issue-7300-3604
-*Thanks to: @sql\_handle (https://twitter.com/sql_handle)*
+
+#### Trace Flag: 7301
+Function: Fixes a problem in SQL 6.5 where SELECT INTO queries with text/image types were not bulk-logged.
+Link: None
+
+
+
+#### Trace Flag: 7311
+Function: Offers a new alternative to handling the tricky problem of converting Oracle NUMBER types (across OLEDB linked server queries) with unknown precision/scale to a valid SQL Server data type, by treating all such types as NUMERIC(38,10).
+Link: https://support.microsoft.com/help/3051993/
+
+
+
+#### Trace Flag: 7314
+Function: Forces NUMBER values with unknown precision/scale to be treated as double values with OLE DB provider
+Link: [Docs Trace Flags]
+Link: https://support.microsoft.com/help/3051993
+Scope: global or session
+
+
+
+#### Trace Flag: 7352
+Function: Show the optimizer output and the post-optimization rewrite in action (After Post Optimization Rewrite)
+Link: [Internals of the Seven SQL Server Sorts – Part 1]
+Link: http://sqlblog.com/blogs/paul_white/archive/2013/08/31/sql-server-internals-nested-loops-prefetching.aspx
+Link: http://www.queryprocessor.com/batch-sort-and-nested-loops
+Link: [Query Optimizer Deep Dive - Part 4]
+Link: [Few Outer Rows Optimization]
+Related to [8607](#8607) trace flag
+Scope: session only
-**Trace Flag: 8017**
-Function: Upgrade version conflict
-Link: http://social.msdn.microsoft.com/Forums/eu/sqlexpress/thread/dd6fdc16-9d8d-4186-9549-85ba4c322d10
-Link: http://connect.microsoft.com/SQLServer/feedback/details/407692/indicateur-de-trace-8017-reported-while-upgrading-from-ssee2005-to-ssee2008
+
+#### Trace Flag: 7356
+**Undocumented trace flag**
+Function: Added a probe residual to an adaptive join. Full effect unknown.
+Link: [New Undocumented Trace Flags]
+Scope: ?
+
+
+
+#### Trace Flag: 7357
+Function: Outputs info re: hashing operators, including role reversal, recursion levels, whether the Unique Hash optimization could be used, info about the hash-related bitmap, etc. Dima’s article is a must-read. For parallel query plans, 7357 does NOT send output to the console window. However, output to the SQL Server error log can be enabled by enabling 3605.
+Link: http://www.queryprocessor.com/hash-join-execution-internals
+Link: [Query Optimizer Deep Dive - Part 4]
+
+
+
+#### Trace Flag: 7359
+Function: Disables the bitmap associated with hash matching. This bitmap is used for “bit-vector filtering” and can reduce the amount of data written to TempDB during hash spills.
+Link: www.queryprocessor.com/hash-join-execution-internals
+
+
+
+#### Trace Flag: 7398
+**Undocumented trace flag**
+Function: Changed a nested loop join to have ordered prefetch.
+Link: [New Undocumented Trace Flags]
+Scope: ?
-**Trace Flag: 8018**
-Function: Disable the exception ring buffer
-Link: http://support.microsoft.com/kb/920093
+
+#### Trace Flag: 7470
+Function: Fixes a problem where under certain (unknown) conditions, a sort spill occurs for large sorts
+Link: https://support.microsoft.com/help/3088480/
-**Trace Flag: 8019**
-Function: Disable stack collection for the exception ring buffer
-Link: http://support.microsoft.com/kb/920093
+
+#### Trace Flag: 7412
+Function: Enables the lightweight query execution statistics profiling infrastructure.
+unless your server is already CPU bound, like you’re running all the time with 95% CPU, unless you are at that point, turn on this trace flag at any server you have.
+This would be my advice here because this enables that lightweight profiling infrastructure there and then you’ll see in a few minutes what it unleashes here.
+So one thing that happens when I enable the lightweight profiling is that the sys.dm_exec_query_profiles DMV, which is something that actually populates the live query stats ability or feature of SSMS, now also is also populated with this lightweight profiling, which means that for all essence, we are now able to run a live query stats on all fashions at any given point in time, and this is extremely useful for let’s say a production DBA that someone calls and says, “Hey, you have a problem. To tap into running system and look at what it’s doing.”
+Link: [Docs Trace Flags]
+Link: https://support.microsoft.com/help/3170113
+Link: https://www.brentozar.com/archive/2017/10/get-live-query-plans-sp_blitzwho/
+Link: https://groupby.org/conference-session-abstracts/enhancements-that-will-make-your-sql-database-engine-roar-2016-sp1-edition/
+Link: https://www.scarydba.com/2018/06/11/plan-metrics-without-the-plan-trace-flag-7412/
+Scope: global only
-**Trace Flag: 8020**
-Function: Disable working set monitoring
-Link: http://support.microsoft.com/kb/920093
+
+#### Trace Flag: 7470
+Function: Fix for sort operator spills to tempdb in SQL Server 2012 or SQL Server 2014 when estimated number of rows and row size are correct
+Link: https://support.microsoft.com/help/3088480
-**Trace Flag: 8026**
-Function: SQL Server will clear a dump trigger after generating the dump
-once
-Link: http://support.microsoft.com/kb/917825/en-us
+
+#### Trace Flag: 7471
+Function: Running multiple UPDATE STATISTICS for different statistics on a single table concurrently
+Link: https://support.microsoft.com/help/3156157
+Link: http://sqlperformance.com/2016/05/sql-performance/parallel-rebuilds
+
+
+
+#### Trace Flag: 7497
+Function: Behavior and intended purpose unknown, but in this post Paul White uses it in concert with 7498 to disable “optimized bitmaps”.
+Link: https://sqlperformance.com/2015/11/sql-plan/hash-joins-on-nullable-columns
+
+
+
+#### Trace Flag: 7498
+Function: Behavior and intended purpose unknown, but in this post Paul White uses it in concert with 7497 to disable “optimized bitmaps”.
+Link: https://sqlperformance.com/2015/11/sql-plan/hash-joins-on-nullable-columns
+
+
+
+#### Trace Flag: 7501
+Function: Dynamic cursors are used by default on forward-only cursors.
+Dynamic cursors are faster than in earlier versions and no longer require unique indexes.
+This flag disables the dynamic cursor enhancements and reverts to version 6.0 behavior.
+Link: None
-**Trace Flag: 8030**
+
+
+#### Trace Flag: 7502
+Function: Disable cursor plan caching for extended stored procedures
+Link: http://basitaalishan.com/2012/02/20/essential-trace-flags-for-recovery-debugging/
+
+
+
+#### Trace Flag: 7505
+Function: Enables version 6.x handling of return codes when calling dbcursorfetchex and the resulting cursor position follows the end of the cursor result set
+Link: None
+
+
+
+#### Trace Flag: 7525
+Function: SQL 8 - Reverts to ver 7 behavior of closing nonstatic cursors regardless of the SET CURSOR_CLOSE_ON_COMMIT state
+Link: None
+
+
+#### Trace Flag: 7601, 7603, 7604, 7605
+Function: Helps in gathering more information in full text search by turning on full text tracing which gathers information on indexing process using the error log. Also 7603, 7604, 7605 trace flags.
+Link: https://connect.microsoft.com/SQLServer/feedback/details/526343/looking-for-documentation-on-trace-flags-7601-7603-7604-and-7605
+
+
+
+#### Trace Flag: 7608
+Function: Performance fix for slow full text population with a composite clustered index
+Link: None
+
+
+
+#### Trace Flag: 7613
+Function: SQL 9 - Search results are missing when performing a full-text search operation on Win SharePoint Services 2.0 site after upgrading
+Link: None
+
+
+
+#### Trace Flag: 7614
+Function: SQL 9 - Full-text index population for the indexed view is very slow
+Link: None
+
+
+
+#### Trace Flag: 7646
+Function: SQL 10 - Avoids blocking when using full text indexing.
+An issue we experienced that full text can be slow when there is a high number of updates to the index and is caused by blocking on the docidfilter internal table.
+Link: None
+
+
+
+#### Trace Flag: 7745
+Function: Forces Query Store to not flush data to disk on database shutdown.
+Note: Using this trace may cause Query Store data not previously flushed to disk to be lost in case of shutdown.
+For a SQL Server shutdown, the command SHUTDOWN WITH NOWAIT can be used instead of this trace flag to force an immediate shutdown.
+Link: [Docs Trace Flags]
+Link: [Query Store Trace Flags]
+Scope: global only
+
+
+
+#### Trace Flag: 7752
+Function: Enables asynchronous load of Query Store.
+Note: Use this trace flag if SQL Server is experiencing high number of QDS_LOADDB waits related to Query Store synchronous load (default behavior).
+Link: [Docs Trace Flags]
+Link: [Query Store Trace Flags]
+Scope: global only
+
+
+
+#### Trace Flag: 7806
+Function: Enables a dedicated administrator connection ([DAC]) on SQL Server Express.
+By default, no [DAC] resources are reserved on SQL Server Express.
+Link: [Docs Trace Flags]
+Link: https://msdn.microsoft.com/en-us/library/ms189595.aspx
+Link: https://sqlperformance.com/2012/08/sql-memory/test-your-dac-connection
+Link: http://www.sqlservergeeks.com/sql-server-trace-flag-7806/
+Scope: global only
+
+
+
+#### Trace Flag: 7826
+Function: Disable Connectivity ring buffer
+Link: http://blogs.msdn.com/b/sql_protocols/archive/2008/05/20/connectivity-troubleshooting-in-sql-server-2008-with-the-connectivity-ring-buffer.aspx
+
+
+
+#### Trace Flag: 7827
+Function: Record connection closure info in ring buffer
+Link: http://blogs.msdn.com/b/sql_protocols/archive/2008/05/20/connectivity-troubleshooting-in-sql-server-2008-with-the-connectivity-ring-buffer.aspx
+Link: https://connect.microsoft.com/SQLServer/feedback/details/518158/-packet-error-a-fatal-error-occurred-while-reading-the-input-stream-from-the-network
+
+
+
+#### Trace Flag: 7833
+Function: SQL 2012 SP2 CU8 introduced a fix for a “silent error” condition in the sqlcmd tool. The CU also included this flag to allow customers to revert to pre-CU fix behavior.
+Link: https://support.microsoft.com/help/3082877/
+
+
+
+#### Trace Flag: 8001
+Function: Khen2005, p2: “For SQL Server 2005, the SQL Server product team opted not to include some wait types that fall under one of the following three categories:
+- Wait types that are never used in SQL Server 2005; note that some wait types not excluded are also never used.
+- Wait types that can occur only at times when they do not affect user activity, such as during initial server startup and shutdown, and are not visible to users.
+- Wait types that are innocuous but have caused concern among users because of their high occurrence or duration
+The complete list of wait types is available by enabling trace flag 8001. The only effect of this trace flag is to force sys.dm_os_wait_stats to display all wait types.”
+Link: None
+
+
+
+#### Trace Flag: 8002
+Function: Changes CPU Affinity behaviour
+Link: https://blogs.msdn.microsoft.com/psssql/2011/11/11/sql-server-clarifying-the-numa-configuration-information
+
+
+
+#### Trace Flag: 8004
+Function: SQL server to create a mini-dump once you enable 2551 and a out of memory condition is hit
+Link: https://connect.microsoft.com/SQLServer/feedback/details/342691/not-enough-memory-was-available-for-trace-error-when-attempting-to-profile-sql-2008
+
+
+
+#### Trace Flag: 8008
+**Undocumented trace flag**
+Function: Force the scheduler hint to be ignored.
+Always assign to the scheduler with the least load (pool based on SQL 2012 EE SKU or Load Factor for previous versions and SKUs.)
+Link: [How It Works: SQL Server 2012 Database Engine Task Scheduling]
+Link: https://blogs.msdn.microsoft.com/psssql/2013/08/13/how-it-works-sql-server-2012-database-engine-task-scheduling
+Link: http://www.stillhq.com/sqldownunder/archives/msg05089.html
+
+
+
+#### Trace Flag: 8009
+**Undocumented trace flag**
+Function: Enables the “idle state behavior” (see IO Basics, Chapter 2 document) that a SQL instance can enter under certain conditions.
+Link: https://technet.microsoft.com/en-us/library/cc917726.aspx
+
+
+
+#### Trace Flag: 8010
+Function: Disables the “idle state” behavior that a SQL instance can enter (see TF 8009). Fixes problem that SQL Server services can not be stopped
+Link: https://support.microsoft.com/help/2633271
+Link: https://technet.microsoft.com/en-us/library/cc917726.aspx
+
+
+
+#### Trace Flag: 8011
+Function: Trace flag 8011 disables the collection of additional diagnostic information for Resource Monitor.
+You can use the information in this ring buffer to diagnose out-of-memory conditions.
+Trace flag 8011 always applies across the server and has global scope. You can turn on trace flag 8011 at startup or in a user session.
+Link: [KB920093]
+Link: [Docs Trace Flags]
+Link: http://www.sqlservergeeks.com/sql-server-ring-buffer-trace-flag-8011/
+Scope: global only
+
+
+
+#### Trace Flag: 8012
+Function: Disable the ring buffer for schedulers.
+SQL Server records an event in the schedule ring buffer every time that one of the following events occurs:
+a scheduler switches context to another worker, a worker is suspended, a worker is resumed, a worker enters the preemptive mode or the non-preemptive mode.
+You can use the diagnostic information in this ring buffer to analyze scheduling problems.
+For example, you can use the information in this ring buffer to troubleshoot problems when SQL Server stops responding.
+Trace flag 8012 disables recording of events for schedulers. You can turn on trace flag 8012 only at startup.
+The exception ring buffer records the last 256 exceptions that are raised on a node.
+Each record contains some information about the error and contains a stack trace. A record is added to the ring buffer when an exception is raised.
+Link: [KB920093]
+Link: [Docs Trace Flags]
+Link: http://www.sqlservergeeks.com/sql-server-ring-buffer-trace-flag-8012/
+Scope: global only
+
+
+
+#### Trace Flag: 8015
+Function: Disable auto-detection and NUMA setup
+Link: [Docs Trace Flags]
+Link: http://sql-sasquatch.blogspot.se/2013/04/startup-trace-flags-i-love.html
+Link: [Upgrading an expired SQL Server 2016 Evaluation Edition]
+Scope: global only
+
+
+
+#### Trace Flag: 8016
+**Undocumented trace flag**
+Function: Force load balancing to be ignored. Always assign to the preferred scheduler.
+Link: [How It Works: SQL Server 2012 Database Engine Task Scheduling]
+
+
+
+#### Trace Flag: 8017
+Function: Upgrade version conflict
+Link: http://social.msdn.microsoft.com/Forums/eu/sqlexpress/thread/dd6fdc16-9d8d-4186-9549-85ba4c322d10
+Link: http://connect.microsoft.com/SQLServer/feedback/details/407692/indicateur-de-trace-8017-reported-while-upgrading-from-ssee2005-to-ssee2008
+Link: http://dba.stackexchange.com/questions/48580/trace-flag-and-which-need-to-be-turned-off-and-why
+
+
+
+#### Trace Flag: 8018
+Function: Disables the creation of the ring buffer, and no exception information is recorded.
+Disabling the exception ring buffer makes it more difficult to diagnose problems that are related to internal server errors.
+Link: [KB920093]
+Link: [Docs Trace Flags]
+Link: http://www.sqlservergeeks.com/sql-server-ring-buffer-trace-flag-8018/
+Link: http://www.sqlservergeeks.com/sql-server-ring-buffer-trace-flag-8019/
+Scope: global only
+
+
+
+#### Trace Flag: 8019
+Function: Disable stack collection for the exception ring buffer
+Disables stack collection during the record creation.
+Trace flag 8019 has no effect if trace flag [8018](#8018) is turned on.
+Link: [KB920093]
+Link: [Docs Trace Flags]
+Link: http://www.sqlservergeeks.com/sql-server-ring-buffer-trace-flag-8019/
+Scope: global only
+
+
+
+#### Trace Flag: 8020
+Function: Disable working set monitoring.
+SQL Server uses the size of the working set when SQL Server interprets the global memory state signals from the operating system.
+Trace flag 8020 removes the size of the working set from consideration when SQL Server interprets the global memory state signals.
+If you use this trace flag incorrectly, heavy paging occurs, and the performance is poor.
+Therefore, contact Microsoft Support before you turn on trace flag 8020.
+Link: [KB920093]
+Link: [Docs Trace Flags]
+Scope: global only
+
+
+
+#### Trace Flag: 8021
+Function: On some lower end hardware we used to get reported that each CPU has its own NUMA node.
+This was usually incorrect and when we detected only a single CPU per NODE we would assume NO NUMA.
+Trace flag 8021 disables this override.
+Link: https://blogs.msdn.microsoft.com/psssql/2011/11/11/sql-server-clarifying-the-numa-configuration-information/
+
+
+
+#### Trace Flag: 8022
+Function: This flag gives more information about the conditions when a non-yielding scheduler/situation was encountered.
+The whitepaper linked to on the right gives example output for this flag
+Link: None
+
+
+
+#### Trace Flag: 8024
+Function: When this TF is on, it affects the mini-dump generation logic for the 1788* errors:
+"To capture a mini-dump, one of the following checks must also be met.
+1. The non-yielding workers CPU utilization must be > 40 percent.
+2. The SQL Server process is not starved for overall CPU resource utilization.
+Additional check #1 is targeted at runaway CPU users. Additional check #2 is targeted
+at workers with lower utilizations that are probably stuck in an API call or similar activity."
+Link: [How To Diagnose and Correct Errors 17883, 17884, 17887, and 17888]
+
+
+
+#### Trace Flag: 8025
+Function: SQL on NUMA normally does most of its allocation on Node 1, because usually Windows and other programs will allocate from Node 0. However, if
+you want SQL to do its resource allocation on the default node (node 0), turn on this flag.
+Link: https://blogs.msdn.microsoft.com/psssql/2011/11/11/sql-server-clarifying-the-numa-configuration-information
+
+
+
+#### Trace Flag: 8026
+Function: SQL Server will clear a dump trigger after generating the dump once
+Link: [KB917825]
+Link: [Controlling SQL Server memory dumps]
+
+
+
+#### Trace Flag: 8030
Function: Fix for performance bug
-Link: http://support.microsoft.com/kb/917035
-Link: http://www.sqlservice.se/sv/start/blogg/sql-server-2005-slowing-down-after-a-while.aspx
+Link: https://support.microsoft.com/help/917035
-**Trace Flag: 8032**
+
+#### Trace Flag: 8032
Function: Alters cache limit settings
-Warning: Trace flag 8032 can cause poor performance if large caches make less memory available for other memory consumers, such as the buffer pool.
-Link: http://msdn.microsoft.com/en-us/library/ms188396.aspx
+**Warning: Trace flag 8032 can cause poor performance if large caches make less memory available for other memory consumers, such as the buffer pool.**
+Link: [Docs Trace Flags]
+Scope: global only
-**Trace Flag: 8033**
-Function: Alters cache limit settings
-Warning: SQL 9 - Disable the reporting of CPU Drift errors in the SQL Server error log like time stamp counter of CPU on scheduler id 1 is not synchronized with other CPUs.
-Link: None
+
+#### Trace Flag: 8033
+Function: Suppresses messages of the form “The time stamp counter of CPU on scheduler id 1 is not synchronized with other CPUs” from being placed in the SQL Error log when CPU drift is noticed
+**Warning: SQL 9 - Disable the reporting of CPU Drift errors in the SQL Server error log like time stamp counter of CPU on scheduler id 1 is not synchronized with other CPUs.**
+Link: https://support.microsoft.com/help/931279/
+Link: https://blogs.msdn.microsoft.com/psssql/2007/08/19/sql-server-2005-rdtsc-truths-and-myths-discussed
-**Trace Flag: 8038**
+
+#### Trace Flag: 8038
Function: Will drastically reduce the number of context switches when running SQL 2005 or 2008
-Link: https://support.microsoft.com/en-us/kb/972767
+Link: [KB972767]
Link: http://forum.proxmox.com/threads/15844-Win7-x64-guest-with-SQLServer-2012-High-CPU-usage
-Link: http://social.technet.microsoft.com/wiki/contents/articles/13105.trace-flags-in-sql-server.aspx
+Link: [TECHNET List Of SQL Server Trace Flags]
-**Trace Flag: 8040**
+
+#### Trace Flag: 8040
Function: Disables Resource Governor
Link: http://www.sqlservergeeks.com/blogs/AmitBansal/sql-server-bi/64/sql-server-disabling-resource-governor-permanently-somewhat
-**Trace Flag: 8048**
-Function: NUMA CPU based partitioning
+
+#### Trace Flag: 8048
+**Note: Beginning with SQL Server 2014 SP2 and SQL Server 2016 this behavior is controlled by the engine and trace flag 8048 has no effect.**
+Function: Converts NUMA partitioned memory objects into CPU partitioned
Link: http://sql-sasquatch.blogspot.se/2013/04/startup-trace-flags-i-love.html
+Link: https://support.microsoft.com/help/2809338
Link: http://blogs.msdn.com/b/psssql/archive/2012/12/20/how-it-works-cmemthread-and-debugging-them.aspx
-Link: http://blogs.msdn.com/b/psssql/archive/2011/09/01/sql-server-2008-2008-r2-on-newer-machines-with-more-than-8-cpus-presented-per-numa-node-may-need-trace-flag-8048.aspx
+Link: [Docs Trace Flags]
+Link: http://blogs.msdn.com/b/psssql/archive/2011/09/01/sql-server-2008-2008-r2-on-newer-machines-with-more-than-8-cpus-presented-per-numa-node-may-need-trace-flag-8048.aspx
+Link: [Hidden Performance & Manageability Improvements in SQL Server 2012 / 2014]
+Related to: [8015](#8015), [9024](#9024)
+Scope: global only
-*Thanks to: @sql\_handle (https://twitter.com/sql_handle)*
-Related to: 8015, 9024
-
-**Trace Flag: 8049**
+
+#### Trace Flag: 8049
Function: SQL 9+ Startup only – Allows use of 1ms times even when patched. Check 8038 for details.
-Link: https://support.microsoft.com/en-us/kb/972767
-
-
-**Trace Flag: 8202**
-Function: Used to replicate UPDATE as DELETE/INSERT pair at the publisher. i.e. UPDATE commands at the publisher can be run as an "on-page DELETE/INSERT" or a "full DELETE/INSERT". If the UPDATE command is run as an "on-page DELETE/INSERT," the Logreader send UDPATE command to the subscriber, If the UPDATE command is run as a "full DELETE/INSERT," the Logreader send UPDATE as DELETE/INSERT Pair. If you turn on trace flag 8202, then UPDATE commands at the publisher will be always send to the subscriber as DELETE/INSERT pair.
+Link: [KB972767]
+Link: https://blogs.msdn.microsoft.com/psssql/2010/08/18/how-it-works-timer-outputs-in-sql-server-2008-r2-invariant-tsc
+
+
+
+#### Trace Flag: 8050
+Function: Causes "optional" wait types (see the CSS article) to be excluded when querying sys.dm_os_wait_stats
+Link: https://blogs.msdn.microsoft.com/psssql/2009/11/02/the-sql-server-wait-type-repository/
+
+
+
+#### Trace Flag: 8075
+Function: Enables a fix (after applying the appropriate CU) for x64 VAS exhaustion.
+Link: https://support.microsoft.com/help/3074434/
+
+
+
+#### Trace Flag: 8079
+Function: Allows SQL Server 2014 SP2 to interrogate the hardware layout and automatically configure Soft-NUMA on systems reporting 8 or more CPUs per NUMA node.
+The automatic Soft-NUMA behavior is Hyperthread (HT/logical processor) aware.
+The partitioning and creation of additional nodes scales background processing by increasing the number of listeners, scaling and network and encryption capabilities.
+When Trace Flag 8079 is enabled during startup, SQL Server 2012 SP4 will interrogate the hardware layout and automatically configure Soft NUMA on systems reporting 8 or more CPUs per NUMA node.
+It is recommended to first test the performance of workload with Auto-Soft NUMA before it is turned ON in production.
+**Note: This trace flag applies to SQL Server 2014 SP2 and SQL Server 2012 SP4. Beginning with SQL Server 2016 this behavior is controlled by the engine and trace flag 8048 has no effect.**
+Link: [KB972767]
+Link: [Docs Trace Flags]
+Link: https://blogs.msdn.microsoft.com/sqlreleaseservices/sql-server-2012-service-pack-4-sp4-released/
+Link: [Hidden Performance & Manageability Improvements in SQL Server 2012 / 2014]
+Scope: global only
+
+
+
+#### Trace Flag: 8202
+Function: Used to replicate UPDATE as DELETE/INSERT pair at the publisher. i.e.
+UPDATE commands at the publisher can be run as an "on-page DELETE/INSERT" or a "full DELETE/INSERT".
+If the UPDATE command is run as an "on-page DELETE/INSERT," the Logreader send UDPATE command to the subscriber,
+If the UPDATE command is run as a "full DELETE/INSERT," the Logreader send UPDATE as DELETE/INSERT Pair.
+If you turn on trace flag 8202, then UPDATE commands at the publisher will be always send to the subscriber as DELETE/INSERT pair.
Link: None
-**Trace Flag: 8203**
+
+#### Trace Flag: 8203
Function: Display statement and transaction locks on a deadlock error
Link: None
-**Trace Flag: 8206**
+
+#### Trace Flag: 8206
Function: SQL 8 - Supports stored procedure execution with a user specified owner name for SQL Server subscribers or without owner qualification for heterogeneous subscribers
Link: None
-**Trace Flag: 8207**
-Function: Alters Transactional Replication behaviour of UPDATE statement
-Link: https://support.microsoft.com/en-us/kb/302341
-Link: http://msdn.microsoft.com/en-us/library/ms188396.aspx
+
+#### Trace Flag: 8207
+Function: Enables singleton updates for Transactional Replication. Updates to subscribers can be replicated as a DELETE and INSERT pair.
+This might not meet business rules, such as firing an UPDATE trigger. With trace flag 8207 an update to a unique column that affects only one row (a singleton update) is replicated as an UPDATE and not as a DELETE or INSERT pair.
+If the update affects a column on which has a unique constraint or if the update affects multiple rows, the update is still replicated as a DELETE or INSERT pair.
+Link: https://blogs.msdn.microsoft.com/psssql/2009/11/02/the-sql-server-wait-type-repository/
+Link: [Docs Trace Flags]
+Scope: global only
-**Trace Flag: 8209**
+
+#### Trace Flag: 8209
Function: Output extra information to error log regarding replication of schema changes in SQL Server Replication
-Link: http://support.microsoft.com/kb/916706/en-us
+Link: None
+
+
+
+#### Trace Flag: 8218
+Function: Determine whether trace flag to bypass proc generation has been set.
+Referenced in the system procedure `[master].[sys].[sp_cdc_vupgrade]`
+Link: None
-**Trace Flag: 8446**
+
+#### Trace Flag: 8295
+Function: Creates a secondary index on the identifying columns on the change tracking side table at enable time
+Link: https://social.msdn.microsoft.com/forums/sqlserver/en-US/00250311-7991-47b0-b788-7fae2e102254/trace-flag-8295
+Link: https://support.microsoft.com/help/2476322/
+Link: https://www.brentozar.com/archive/2014/06/performance-tuning-sql-server-change-tracking
+Link: https://blogs.technet.microsoft.com/smartinez/2013/03/06/sql-server-for-configmgr-2012-ebook-and-top-10-database-issues
+Thanks to: Wilfred van Dijk
+
+
+
+#### Trace Flag: 8446
Function: Databases in SQL 8 do not have a Service Broker ID. If you restore these databases on SQL 9 by using the WITH NORECOVERY option, these databases will not be upgraded causing mirroring & log-shipping configurations to fail.
-Link: https://support.microsoft.com/en-us/kb/959008
+Link: https://support.microsoft.com/help/959008
-**Trace Flag: 8501**
+
+#### Trace Flag: 8501
Function: Writes detailed information about Ms-DTC context & state changes to the log
Link: None
-**Trace Flag: 8599**
+
+#### Trace Flag: 8599
Function: Allows you to use a save-point within a distributed transaction
Link: None
-**Trace Flag: 8602**
-Function: Disable Query Hints
-Link: http://www.sqlservice.se/sv/start/blogg/sql-server-trace-flag-8602.aspx
+
+#### Trace Flag: 8602
+Function: This trace flag is used to ignore all the index hints specified in query or stored procedure.
+We can use this trace flag to troubleshooting the query performance without changing index hints.
+Link: http://download.microsoft.com/download/6/e/5/6e52bf39-0519-42b7-b806-c32905f4a066/eim_perf_flowchart_final.pdf
+Link: http://sqlblog.com/blogs/kalen_delaney/archive/2008/02/26/lost-without-a-trace.aspx
+Link: http://www.sqlservergeeks.com/sql-server-trace-flag-8602/
+Scope: global only
+Demo: https://github.com/ktaranov/sqlserver-kit/blob/master/Scripts/Trace_Flag/Trace_Flag_8602.sql
+
+
+
+#### Trace Flag: 8605
+**Undocumented trace flag**
+Function: Displays logical and physical trees used during the optimization process
+Link: [More Undocumented Query Optimizer Trace Flags]
+Link: [Yet another X-Ray for the QP]
+Link: [Query Optimizer Deep Dive - Part 4]
+
+
+
+#### Trace Flag: 8606
+**Undocumented trace flag**
+Function: Show LogOp Trees
+Link: [Cardinality Estimation Framework 2014 First Look]
+Link: [Yet another X-Ray for the QP]
+Link: [Query Optimizer Deep Dive - Part 4]
+
+
+
+#### Trace Flag: 8607
+Function: Displays the optimization output tree during the optimization process (Before Post Optimization Rewrite).
+Link: [Internals of the Seven SQL Server Sorts – Part 1]
+Link: [More Undocumented Query Optimizer Trace Flags]
+Link: [Yet another X-Ray for the QP]
+Link: [Query Optimizer Deep Dive - Part 4]
+Link: [Few Outer Rows Optimization]
+Scope: session only
+
+
+
+#### Trace Flag: 8608
+Function: Shows the initial Memo structure
+Link: http://www.queryprocessor.ru/optimizer-part-3-full-optimiztion-optimization-search0
+Link: http://www.benjaminnevarez.com/2012/04/inside-the-query-optimizer-memo-structure
+Link: http://sqlblog.com/blogs/paul_white/archive/2012/04/29/query-optimizer-deep-dive-part-3.aspx
+Link: [Query Optimizer Deep Dive - Part 4]
+
+
+
+#### Trace Flag: 8609
+Function: PWhite: “Task and operation type counts”.
+Link: [Query Optimizer Deep Dive - Part 4]
+Link: http://www.queryprocessor.ru/good-enough-plan
+Scope: session only
+
+
+#### Trace Flag: 8612
+Function: Add Extra Info to the Trees Output
+Link: [Cardinality Estimation Framework 2014 First Look]
+Link: http://sqlblog.com/blogs/paul_white/archive/2013/06/11/hello-operator-my-switch-is-bored.aspx
-**Trace Flag: 8605**
-Function: Displays logical and physical trees used during the
-optimization process
-Link: http://www.benjaminnevarez.com/2012/04/more-undocumented-query-optimizer-trace-flags/
+
+
+#### Trace Flag: 8615
+**Undocumented trace flag**
+Function: Display the final memo structure
+Link: http://www.benjaminnevarez.com/2012/04/inside-the-query-optimizer-memo-structure/
+Link: http://www.somewheresomehow.ru/optimizer-part-3-full-optimiztion-optimization-search0/
+Link: [A Row Goal Riddle]
+Scope: session only
+
+
+
+#### Trace Flag: 8619
+**Undocumented trace flag**
+Function: Show Applied Transformation Rules
+Link: http://sqlblog.com/blogs/paul_white/archive/2013/02/06/incorrect-results-with-indexed-views.aspx
+Link: [Cardinality Estimation Framework 2014 First Look]
+Link: [Yet another X-Ray for the QP]
+Link: [A Row Goal Riddle]
+Scope: session only
+
+
+
+#### Trace Flag: 8620
+**Undocumented trace flag**
+Function: Add memo arguments to trace flag 8619
+Link: [Query Optimizer Deep Dive - Part 4]
+Link: [Yet another X-Ray for the QP]
+Link: [A Row Goal Riddle]
+Scope: session only
+
+
+
+#### Trace Flag: 8621
+**Undocumented trace flag**
+Function: Rule with resulting tree
+Link: [Query Optimizer Deep Dive - Part 4]
+Link: [Yet another X-Ray for the QP]
+Link: [A Row Goal Riddle]
+Scope: session only
+
+
+
+#### Trace Flag: 8628
+**Undocumented trace flag**
+Function: When used with TF [8666](#8666), causes extra information about the transformation rules applied to be put into the XML showplan.
+Link: [Yet another X-Ray for the QP]
-**Trace Flag: 8607**
-Function: Displays the optimization output tree during the optimization
-process
-Link: http://www.benjaminnevarez.com/2012/04/more-undocumented-query-optimizer-trace-flags/
+
+#### Trace Flag: 8633
+Function: PWhite: “Enable prefetch (CUpdUtil::FPrefetchAllowedForDML and CPhyOp_StreamUpdate::FDoNotPrefetch)”
+Link: http://sqlblog.com/blogs/paul_white/archive/2013/01/26/optimizing-t-sql-queries-that-change-data.aspx
-**Trace Flag: 8649**
+
+#### Trace Flag: 8649
Function: Set Cost Threshold for parallelism from 1 to 0
-Link: http://www.sqlservice.se/sv/start/blogg/enable-parallellism-for-specific-query.aspx
+Link: http://sqlblog.com/blogs/paul_white/archive/2011/12/23/forcing-a-parallel-query-execution-plan.aspx
+Link: http://sqlblog.com/blogs/adam_machanic/archive/2013/07/11/next-level-parallel-plan-porcing.aspx
+Link: [What You Need to Know about the Batch Mode Window Aggregate Operator in SQL Server 2016: Part 1]
+Link: [Few Outer Rows Optimization]
+Link: [Next-Level Parallel Plan Forcing: An Alternative to 8649]
+Scope: session only
-**Trace Flag: 8675**
+
+#### Trace Flag: 8665
+**Undocumented trace flag**
+Function: Disables local/global aggregation.
+Link: [New Undocumented Trace Flags]
+Scope: ?
+
+
+
+#### Trace Flag: 8666
+**Undocumented trace flag**
+Function: Included in execution plans are the names of the stats it used to come up with the plan.
+Using a bit o' XML magic and over time, it allows you to clearly identify which stats are actually in use so that you can delete unused stats.
+CQScanPartitionSortNew is one of only two sort classes that sets the Soft Sort property exposed when Sort operator execution plan properties are generated with undocumented trace flag 8666 enabled
+Link: [Internals of the Seven SQL Server Sorts – Part 1]
+Link: [Yet another X-Ray for the QP]
+Link: https://blogfabiano.com/2012/07/03/statistics-used-in-a-cached-query-plan
+Link: http://dataidol.com/davebally/2014/04/12/reasons-why-your-plans-suck-no-56536
+Link: https://www.mssqltips.com/sqlservertip/4269/how-to-identify-useful-sql-server-table-statistics/
+Link: http://sql-sasquatch.blogspot.com/2018/06/harvesting-sql-server-trace-flag-8666.html
+Link: [Fun with SQL Server Plan Cache, Trace Flag 8666, and Trace Flag 2388]
+Scope: global or session
+
+
+
+#### Trace Flag: 8671
+**Undocumented trace flag**
+Function: According to Dimitriy Pilugin, disables the logic that prunes the memo and prevents the optimization process from stopping due to “Good Enough Plan found”.
+Can significantly increase the amount of time, CPU, and memory used in the compilation process
+Link: http://www.queryprocessor.ru/optimizer_unleashed_2
+
+
+
+#### Trace Flag: 8675
Function: Displays the query optimization phases for a specific optimization
-Link: http://www.benjaminnevarez.com/2012/04/more-undocumented-query-optimizer-trace-flags/
+Link: [More Undocumented Query Optimizer Trace Flags]
+Link: http://sqlblog.com/blogs/paul_white/archive/2012/04/29/query-optimizer-deep-dive-part-3.aspx
+Link: https://sqlperformance.com/2013/06/sql-indexes/recognizing-missed-optimizations
-**Trace Flag: 8679**
+
+#### Trace Flag: 8677
+**Undocumented trace flag**
+Function: Skips “Search 1” phase of query optimization, and only Search 0 and Search 2 execute.
+Link: https://sqlbits.com/Sessions/Event12/Query_Optimizer_Internals_Traceflag_fun
+
+
+
+#### Trace Flag: 8678
+**Undocumented trace flag**
+Function: For one query this changed a bushy plan to a left deep one. There was no change in cost. Full effect unknown.
+Link: [New Undocumented Trace Flags]
+Scope: ?
+
+
+
+#### Trace Flag: 8679
+**Undocumented trace flag**
Function: Prevents the SQL Server optimizer from using a Hash Match Team operator
Link: None
-**Trace Flag: 8687**
+
+#### Trace Flag: 8687
+**Undocumented trace flag**
Function: Prevents the SQL Server optimizer from using a Hash Match Team operator
Link: None
-**Trace Flag: 8690**
+
+#### Trace Flag: 8688
**Undocumented trace flag**
-Function: Disable the spool on the inner side of nested loop.
-Spools improve performance in majority of the cases. But it’s based on estimates. Sometimes, this can be incorrect due to unevenly distributed or skewed data, causing slow performance. But in vast majority of situations, you don’t need to manually disable spool with this trace flag.
-Link: https://blogs.msdn.microsoft.com/psssql/2015/12/15/spool-operator-and-trace-flag-8690/
-Link: http://dba.stackexchange.com/questions/52552/index-not-making-execution-faster-and-in-some-cases-is-slowing-down-the-query
+Function: Disables parallel scans.
+Link: [New Undocumented Trace Flags]
+Scope: ?
-**Trace Flag: 8721**
-Function: Dumps information into the error log when AutoStat has been run
-Link: None
+
+#### Trace Flag: 8690
+**Undocumented trace flag**
+Function: Disable the spool on the inner side of nested loop.
+Spools improve performance in majority of the cases. But it’s based on estimates.
+Sometimes, this can be incorrect due to unevenly distributed or skewed data, causing slow performance.
+But in vast majority of situations, you don’t need to manually disable spool with this trace flag.
+Link: https://blogs.msdn.microsoft.com/psssql/2015/12/15/spool-operator-and-trace-flag-8690/
+Link: http://dba.stackexchange.com/questions/52552/index-not-making-execution-faster-and-in-some-cases-is-slowing-down-the-query
+Link: http://connect.microsoft.com/SQL/feedback/ViewFeedback.aspx?FeedbackID=453982
+
+
+
+#### Trace Flag: 8691
+**Undocumented trace flag**
+Function: 'performance spool' optimization to the RegEx execution, reduces the number of executions of the RegEx function.
+Link: [Splitting Strings Based on Patterns]
+Scope: ?
+
+
+
+#### Trace Flag: 8692
+Function: Force optimizer to use an Eager Spool for Halloween Protection
+Link: http://www.sqlperformance.com/2013/02/sql-plan/halloween-problem-part-4
+Link: https://sqlperformance.com/2016/03/sql-plan/changes-to-a-writable-partition-may-fail
+
+
+
+#### Trace Flag: 8719
+Function: In SQL 2000, apparently would show IO prefetch on loop joins and bookmarks. I (Aaron) was unable to replicate the query plan behavior on SQL 2012 using the same test, so this flag may be obsolete.
+Link: http://www.hanlincrest.com/SQLServerLockEscalation.htm
+
+
+
+#### Trace Flag: 8720
+Function: In SQL 2000, apparently would have the same effect as OPTION(KEEPFIXED PLAN)
+Link: http://www.hanlincrest.com/SQLserverStoredProcRecompiles.htm
-**Trace Flag: 8722**
+
+#### Trace Flag: 8721
+Function: Reports to the error log when auto-update statistics executes
+Link: https://support.microsoft.com/help/195565
+Link: [Docs Trace Flags]
+Link: http://www.sqlservergeeks.com/sql-server-trace-flag-8721/
+Scope: global only
+
+
+
+#### Trace Flag: 8722
Function: Disable all hints except locking hints
Link: http://sqlmag.com/sql-server/investigating-trace-flags
-**Trace Flag: 8744**
-Function: Disable pre-fetching for ranges
-Link: http://support.microsoft.com/kb/920093
+
+#### Trace Flag: 8738
+Function: (Apparently) disables an optimization where rows are sorted before a Key Lookup operator. (The optimization is meant to promote Sequential IO rather than the random nature of IO from Key Lookups).
+Note that the context in which this flag is described means that the above description may not be very precise, or even the only use of this flag.
+Link: https://answers.sqlperformance.com/questions/603/why-is-the-sort-operator-needed-in-this-plan.html
+
+
+
+#### Trace Flag: 8739
+Function: Group Optimization Information
+Link: http://www.queryprocessor.ru/good-enough-plan
+
+
+
+#### Trace Flag: 8741
+**Undocumented trace flag**
+Function: Resulted in a different join order for some queries with a higher estimated cost. Perhaps this disables Transitive Predicates? Full effect unknown.
+Link: [New Undocumented Trace Flags]
+Scope: ?
+
+
+
+#### Trace Flag: 8742
+**Undocumented trace flag**
+Function: Resulted in a different join order for some queries. Full effect unknown.
+Link: [New Undocumented Trace Flags]
+Scope: ?
+
+
+
+#### Trace Flag: 8743
+**Undocumented trace flag**
+Function: Disable SM join.
+Link: [New Undocumented Trace Flags]
+Scope: ?
+
+
+
+#### Trace Flag: 8744
+Function: Disable pre-fetching for the Nested Loop operator.
+Incorrect use of this trace flag may cause additional physical reads when SQL Server executes plans that contain the Nested Loops operator.
+Link: [KB920093]
+Link: [Docs Trace Flags]
+Link: http://sqlblog.com/blogs/paul_white/archive/2013/03/08/execution-plan-analysis-the-mystery-work-table.aspx
+Link: https://connect.microsoft.com/SQLServer/feedback/details/780194/make-dbcc-trace-flags-available-as-option-querytraceon
+Scope: global or session
+
+
+#### Trace Flag: 8746
+Function: Whatever else it does, one effect is to disable the “rowset sharing” optimization described in the 2 PWhite posts.
+Link: https://sqlperformance.com/2016/03/sql-plan/changes-to-a-writable-partition-may-fail
-**Trace Flag: 8755**
+
+
+#### Trace Flag: 8750
+**Undocumented trace flag**
+Function: Skips search 0 optimization phase and moves to search 1.
+Link: [New Undocumented Trace Flags]
+Scope: ?
+
+
+
+#### Trace Flag: 8755
Function: Disable all locking hints
Link: http://sqlmag.com/sql-server/investigating-trace-flags
-**Trace Flag: 8757**
+
+#### Trace Flag: 8757
Function: Skip trivial plan optimization and force a full optimization
-Link: http://www.benjaminnevarez.com/2012/04/more-undocumented-query-optimizer-trace-flags/
+Link: [More Undocumented Query Optimizer Trace Flags]
+Link: http://sqlblog.com/blogs/paul_white/archive/2012/04/28/query-optimizer-deep-dive-part-1.aspx
+
+
+
+#### Trace Flag: 8758
+Function: “A [workaround to the MERGE bug described] is to apply Trace Flag 8758 –unfortunately this disables a number of optimisations, not just the one
+above, so it’s not really recommended for long term use.” “Disable rewrite to a single operator plan (CPhyOp_StreamUpdate::PqteConvert)”
+Link: http://sqlblog.com/blogs/paul_white/archive/2010/08/04/another-interesting-merge-bug.aspx
+Link: http://sqlblog.com/blogs/paul_white/archive/2013/01/26/optimizing-t-sql-queries-that-change-data.aspx
+
+
+
+#### Trace Flag: 8759
+**Undocumented trace flag**
+Function: Detect and write part of the query to the error log when it has been autoparameterized.
+Link: https://github.com/ktaranov/sqlserver-kit/issues/146#issue-358855110
+Scope: ?
-**Trace Flag: 8765**
+
+#### Trace Flag: 8765
Function: Allows use of variable length data, from ODBC driver; fixes the issue of a field returning the wrong data length
-Link: None
+Link: http://jacob.steelsmith.org/content/sql-server-and-ole-db
+Scope: global or session
-**Trace Flag: 8780**
+
+#### Trace Flag: 8780
Function: Give the optimizer more time to find a better plan
-Link: http://www.sqlservice.se/sv/start/blogg/sql-server-trace-flag--8780.aspx
+Link: http://www.queryprocessor.ru/optimizer_unleashed_1
+Link: http://www.sqlservice.se/sql-server-trace-flag-8780/
+Scope: global or session
-**Trace Flag: 8783**
+
+#### Trace Flag: 8783
Function: Allows DELETE, INSERT, and UPDATE statements to honor the SET ROWCOUNT ON setting when enabled
Link: None
-**Trace Flag: 8816**
+
+#### Trace Flag: 8790
+Function: PWhite: “Undocumented trace flag 8790 forces a wide update plan for any data-changing query (remember that a wide update plan is always possible)”
+Link: https://support.microsoft.com/help/956718/
+Link: http://sqlblog.com/blogs/paul_white/archive/2012/12/10/merge-bug-with-filtered-indexes.aspx
+Link: https://sqlperformance.com/2014/06/sql-plan/filtered-index-side-effect
+
+
+
+#### Trace Flag: 8795
+Function: PWhite: “Disable DML Request Sort (CUpdUtil::FDemandRowsSortedForPerformance)”
+Link: http://sqlblog.com/blogs/paul_white/archive/2013/01/26/optimizing-t-sql-queries-that-change-data.aspx
+Link: https://sqlperformance.com/2014/10/t-sql-queries/performance-tuning-whole-plan
+
+
+
+#### Trace Flag: 8799
+**Undocumented trace flag**
+Function: Forces unordered scans.
+Link: [New Undocumented Trace Flags]
+Scope: ?
+
+
+
+#### Trace Flag: 8809
+Function: Extended Page Heap Activities.
+Referenced in passing in the CSS article in relation to debugging memory scribbler problems.
+Link: https://blogs.msdn.microsoft.com/psssql/2012/11/12/how-can-reference-counting-be-a-leading-memory-scribbler-cause/
+
+
+
+#### Trace Flag: 8816
Function: Logs every two-digit year conversion to a four-digit year
Link: None
-**Trace Flag: 9024**
-Function: Performance fix for AlwaysON log replication
-Link: http://support.microsoft.com/kb/2809338/en-us
-Related to: 8048
+
+#### Trace Flag: 8901
+Function: Enables new (in 7.0) code to correct a problem with the SHRINK command and empty text or image extents
+Link: None
+
+
+
+#### Trace Flag: 8903
+Function: Allows SQL Server to use a specific API (SetFileIoOverlappedRange) when Locked Pages in Memory is enabled.
+Link: https://blogs.msdn.microsoft.com/psssql/2012/03/20/setfileiooverlappedrange-can-lead-to-unexpected-behavior-for-sql-server-2008-r2-or-sql-server-2012-denali
+Link: https://support.microsoft.com/help/2679255/
+Link: https://blogs.msdn.microsoft.com/psssql/2013/10/16/every-time-i-attach-database-sql-logs-error-1314-for-setfileiooverlappedrange
+
+
+
+#### Trace Flag: 9024
+Function: Converts a global log pool memory object into NUMA node partitioned memory object
+**Note: Beginning with SQL Server 2012 SP3 and SQL Server 2014 SP1 this behavior is controlled by the engine and trace flag 9024 has no effect.**
+Link: https://support.microsoft.com/help/2809338
+Link: [Docs Trace Flags]
+Scope: global only
+Related to: [8048](#8048)
+
+
+
+#### Trace Flag: 9050
+Function: “FIX: The compile time for a query that uses at least one outer join may be greater for SQL Server post-SP3 builds”
+Link: None
-**Trace Flag: 9059**
+
+#### Trace Flag: 9052
+Function: “FIX: Queries that join a view may run slowly if the view contains outer joins”
+Link: None
+
+
+
+#### Trace Flag: 9054
+Function: “FIX: SQL Server 2000 Service Pack 1 (SP1) and later builds may not generate an execution plan for a query, and you receive error message 8623”
+Link: None
+
+
+
+#### Trace Flag: 9055
+Function: “FIX: The performance of a DML operation that fires a trigger may decrease when the trigger execution plan recompiles repeatedly”
+Link: None
+
+
+
+#### Trace Flag: 9056
+Function: “FIX: A user-defined function returns results that are not correct for a query”
+Link: None
+
+
+
+#### Trace Flag: 9059
Function: SQL 8 - Turns back behavior to SP3 after a SP4 installation, this allows to choose an index seek when comparing numeric columns or numeric constants that are of different precision or scale; else would have to change schema/code.
Link: None
-**Trace Flag: 9082**
+
+#### Trace Flag: 9061
+Function: “FIX: Build 8.00.0837: A query that contains a correlated subquery runs slowly”
+Link: None
+
+
+
+#### Trace Flag: 9062
+Function: “FIX: Some complex queries are slower after you install SQL Server 2000 Service Pack 2 or SQL Server 2000 Service Pack 3”
+Link: None
+
+
+
+#### Trace Flag: 9063
+Function: “FIX: Query performance may be slower if the query contains both a GROUP BY clause and a DISTINCT keyword on the same column”
+Link: None
+
+
+
+#### Trace Flag: 9065
+Function: “FIX: The query plan may take longer than expected to compile, and you may receive error message 701, error message 8623, or error message 8651 in SQL Server 2000”
+Link: None
+
+
+
+#### Trace Flag: 9068
+Function: “FIX: A query may run more slowly against SQL Server 2000 post-SP3 hotfix build 8.00.0988 than a query that you run against SQL Server 2000 post-SP3 hotfix builds that are earlier than build 8.00.0988”
+Link: None
+
+
+
+#### Trace Flag: 9079
+Function: “FIX: The query performance may be slow when you query data from a view in SQL Server 2000”
+Link: None
+
+
+
+#### Trace Flag: 9082
Function: SQL 9 - Stored procedure using views, perform slow compared to ver 8 if views use JOIN operator and contain sub queries
-Link: https://support.microsoft.com/en-us/kb/942906
+Link: None
+
+
+#### Trace Flag: 9109
+Function: Used to workaround a problem with query notifications and restoring a DB with the NEW_BROKER option enabled.
+Link: https://support.microsoft.com/help/2483090/
+
+
+
+#### Trace Flag: 9114
+**Undocumented trace flag**
+Function: Implemented a (SELECT 1) = 1 predicate as a join instead of optimizing it away.
+Link: [New Undocumented Trace Flags]
+Scope: ?
+
+
+#### Trace Flag: 9115
+Function: PWhite: “Disable prefetch (CUpdUtil::FPrefetchAllowedForDML)” Dima: “Disables both [NLoop Implicit Batch Sort {TF 2340} and NL Prefetching {TF 8744}], and not only on the Post Optimization, but the explicit Sort also”
+Link: http://sqlblog.com/blogs/paul_white/archive/2013/01/26/optimizing-t-sql-queries-that-change-data.aspx
+Link: http://www.hanlincrest.com/SQLServerLockEscalation.htm
+Link: http://www.queryprocessor.com/batch-sort-and-nested-loops
-**Trace Flag: 9134**
+
+
+#### Trace Flag: 9130
+Function: Disables the particular copy out stage rewrite from Filter + (Scan or Seek) to (Scan or Seek) + Residual Predicate.
+Enabling this flag retains the Filter in the final execution plan, resulting in a SQL Server 2008+ plan that mirrors the 2005 version.
+Link: http://sqlblog.com/blogs/paul_white/archive/2012/10/15/cardinality-estimation-bug-with-lookups-in-sql-server-2008-onward.aspx
+Link: http://sqlblogcasts.com/blogs/sqlandthelike/archive/2012/12/06/my-new-favourite-traceflag.aspx
+Link: http://sqlblog.com/blogs/paul_white/archive/2013/06/11/hello-operator-my-switch-is-bored.aspx
+Link: https://connect.microsoft.com/SQLServer/feedback/details/767395/cardinality-estimation-error-with-pushed-predicate-on-a-lookup
+Link: http://www.theboreddba.com/Categories/FunWithFlags/Revealing-Predicates-in-Execution-Plans-(TF-9130).aspx
+
+
+
+#### Trace Flag: 9134
Function: SQL 8 - Does additional reads to test if the page is allocated & linked correctly this checks IAM & PFS. Fixes error 601 for queries under Isolation level read uncommitted. In case performance is affected (because of a bug) apply SP4.
+Link: https://support.microsoft.com/help/815008/
+
+
+
+#### Trace Flag: 9136
+Function: “PRB: You receive error message 8623 when you try to run a query that joins multiple tables”
Link: None
-**Trace Flag: 9185**
+
+#### Trace Flag: 9164
+**Undocumented trace flag**
+Function: Disables HM (hash joins).
+Link: [New Undocumented Trace Flags]
+Scope: ?
+
+
+
+#### Trace Flag: 9165
+**Undocumented trace flag**
+Function: Disable NL join and remove an index recommendation from a plan.
+Link: [New Undocumented Trace Flags]
+Scope: ?
+
+
+
+#### Trace Flag: 9182
+**Undocumented trace flag**
+Function: Resulted in a very strange cost change to a clustered index delete.
+Link: [New Undocumented Trace Flags]
+Scope: ?
+
+
+
+#### Trace Flag: 9183
+**Undocumented trace flag**
+Function: Resulted in a very strange cost change to a clustered index delete.
+Link: [New Undocumented Trace Flags]
+Scope: ?
+
+
+
+#### Trace Flag: 9185
Function: Cardinality estimates for literals that are outside the
histogram range are very low
-Link: https://support.microsoft.com/en-us/kb/kbview/833406
-Related to: 9205
+Link: None
+Related to: [9205](#9205)
-**Trace Flag: 9204**
+
+#### Trace Flag: 9204
Function: Output Statistics used by Query Optimizer. When enabled and a plan is compiled or recompiled there is a listing of statistics which is being fully loaded & used to produce cardinality and distribution estimates for some plan alternative or other.
-Link: http://sqlblog.com/blogs/paul_white/archive/2011/09/21/how-to-find-the-statistics-used-to-compile-an-execution-plan.aspx
-Related to: 9292
+Link: [How to Find the Statistics Used to Compile an Execution Plan]
+Link: http://www.sqlservergeeks.com/sql-server-trace-flag-9204/
+Scope: global only
+Related to: [9292](#9292)
-**Trace Flag: 9205**
+
+#### Trace Flag: 9205
Function: Cardinality estimates for literals that are outside the histogram range are very low for tables that have parent-child relationships
-Link: https://support.microsoft.com/en-us/kb/kbview/833406
-Related to: 9185
+Link: None
+Related to: [9185](#9185)
-**Trace Flag: 9207**
-Function: Fixes that SQL Server underestimates the cardinality of a
-query expression and query performance may be slow
-Link: https://support.microsoft.com/en-us/kb/831302
+
+#### Trace Flag: 9207
+Function: Fixes that SQL Server underestimates the cardinality of a query expression and query performance may be slow
+Link: None
-**Trace flag: 9259**
-Function: SQL 9/10 - An access violation occurs on running a query marked by the following message and a dump in the log folder: KB 970279 / 971490. Msg 0, Level 11, State 0, Line 0 - A severe error occurred on the current command. The results, if any, should be discarded.
+
+#### Trace Flag: 9209
+Function: “FIX: Some queries that have a left outer join and an IS NULL filter run slower after you install SQL Server 2000 post-SP3 hotfix”
Link: None
-**Trace flag: 9268**
+
+#### Trace Flag: 9210
+Function: “FIX: A query filter condition that has a LEFT OUTER JOIN clause may cause an incorrect row count estimate in the query execution plan”
+Link: None
+
+
+
+#### Trace Flag: 9236
+**Undocumented trace flag**
+Function: Resulted in a different join order for some queries. Full effect unknown.
+Link: [New Undocumented Trace Flags]
+Scope: ?
+
+
+
+#### Trace Flag: 9251
+**Undocumented trace flag**
+Function: Change in cardinality estimates for some queries. It might only work with the legacy CE. Full effect unknown.
+Link: [New Undocumented Trace Flags]
+Scope: ?
+
+
+
+#### Trace Flag: 9259
+Function: Disables Project Normalization step
+**Note: Please, don’t use TF 9259 that disables Project Normalization step in a real production system, besides it is undocumented and unsupported, it may hurt your performance.**
+Link: http://www.queryprocessor.com/sudf-ce/
+
+
+
+#### Trace Flag: 9260
+**Undocumented trace flag**
+Function: Adds an explicit sort before creation of an index spool. Almost doesn’t change the total estimated cost. Might be identical plans with just more detail shown at that step.
+Link: [New Undocumented Trace Flags]
+Scope: ?
+
+
+
+#### Trace Flag: 9268
Function: SQL 8 - When SQL Server runs a parameterized query that contains several IN clauses, each with a large number of values, SQL Server may return the following error message after a minute or more of high CPU utilization: KB 325658. Server: Msg 8623, Level 16, State 1. Internal Query Processor Error: The query processor could not produce a query plan. Contact your primary support provider for more information.
Link: None
-**Trace Flag: 9292**
+
+#### Trace Flag: 9275
+Function: “FIX: A DML Operation on a Large Table Can Cause Performance Problems” Enables SQL 2000 optimizations that sort data in DML statements before the changes are applied to a clustered index
+Link: None
+
+
+
+#### Trace Flag: 9284
+**Undocumented trace flag**
+Function: Changed the order of a scalar operator comparison in a single join for certain queries. Full effect unknown.
+Link: [New Undocumented Trace Flags]
+Scope: ?
+
+
+
+#### Trace Flag: 9287
+**Undocumented trace flag**
+Function: Appears to disable partial aggreation.
+Link: [New Undocumented Trace Flags]
+Scope: ?
+
+
+
+#### Trace Flag: 9288
+**Undocumented trace flag**
+Function: Effects around local and global aggregates - choose coerce partial and global aggregation over scalar aggregation.
+Link: https://github.com/ktaranov/sqlserver-kit/issues/93
+Scope: local only
+
+
+
+#### Trace Flag: 9292
Function: Output Statistics considered to be used by Query Optimizer
-Link: http://sqlblog.com/blogs/paul_white/archive/2011/09/21/how-to-find-the-statistics-used-to-compile-an-execution-plan.aspx
-Related to: 9204
+Link: [How to Find the Statistics Used to Compile an Execution Plan]
+Link: http://www.sqlservergeeks.com/sql-server-trace-flag-9292/
+Scope: session only
+Related to: [9204](#9204)
+
+
+
+#### Trace Flag: 9341
+**Undocumented trace flag**
+Function: Resulted in a rather odd plan for a COUNT(DISTINCT) query against a CCI.
+Link: [New Undocumented Trace Flags]
+Scope: ?
+
+
+
+#### Trace Flag: 9346
+**Undocumented trace flag**
+Function: Appears to disable batch mode window aggregates.
+Link: [New Undocumented Trace Flags]
+Scope: ?
+
+
+
+#### Trace Flag: 9347
+Function: Disables batch mode for sort operator. SQL Server 2016 introduces a new batch mode sort operator that boosts performance for many analytical queries.
+Link: https://support.microsoft.com/help/3172787
+Link: [Docs Trace Flags]
+Link: [Niko Neugebauer Columnstore Indexes – part 86]
+Scope: global only
+
+
+
+#### Trace Flag: 9348
+Function: Sets a row limit (based on cardinality estimates) that controls whether a bulk insert is attempted or not (assuming conditions are met for a bulk insert). Introduced as a workaround for memory errors encountered with bulk insert.
+Link: https://support.microsoft.com/help/2998301/
+
+
+
+#### Trace Flag: 9349
+Function: Disables batch mode for top N sort operator. SQL Server 2016 introduces a new batch mode top sort operator that boosts performance for many analytical queries.
+Link: [Docs Trace Flags]
+Link: [Niko Neugebauer Columnstore Indexes – part 86]
+Link: https://support.microsoft.com/help/3172787
+Scope: global or session or query
+
+
+
+#### Trace Flag: 9354
+**Undocumented trace flag**
+Function: Disable [aggregate pushdown](http://www.nikoport.com/2015/07/11/columnstore-indexes-part-59-aggregate-pushdown/) operations for columnstore indexes.
+The number of rows aggregated at the level of the scan is displayed in the new property plan [Actual Number Of Locally Aggregated Rows](http://www.nikoport.com/2016/03/21/clustered-columnstore-indexes-part-80-local-aggregation/).
+TF 9354 can be used to disable the push of aggregation, the difference can be observed by the runtime, according to the number of rows in the plan Actual Number Of Locally Aggregated Rows and number Actual Number Of Rows output from the scan operator.
+Example:
+
+```sql
+use AdventureworksDW2016CTP3;
+set nocount on;
+go
+-- Undocumented TF 9354 disables this optimization, run to see Aggregation Pushdown Performance Gain
+set statistics xml, time on;
+select count_big(*) from dbo.FactResellerSalesXL_CCI;
+select count_big(*) from dbo.FactResellerSalesXL_CCI option(querytraceon 9354); -- undocumented/unsupported TF 9354 to disable aggregate pushdown
+set statistics xml, time off;
+```
+
+
+
+#### Trace Flag: 9358
+Function: Disable batch mode sort operations in a complex parallel query. For example, this flag could apply if the query contains merge join operations.
+Link: [Niko Neugebauer Columnstore Indexes – part 86]
+Link: https://support.microsoft.com/help/3171555
+
+
+
+#### Trace Flag: 9384
+**Undocumented trace flag**
+Function: Very slightly changed the memory grant of a query with a batch mode window aggregate.
+Link: [New Undocumented Trace Flags]
+Scope: ?
+
+
+
+#### Trace Flag: 9389
+Function: Enables dynamic memory grant for batch mode operators. If a query does not get all the memory it needs, it spills data to tempdb, incurring additional I/O and potentially impacting query performance.
+If the dynamic memory grant trace flag is enabled, a batch mode operator may ask for additional memory and avoid spilling to tempdb if additional memory is available.
+Link: [Niko Neugebauer Columnstore Indexes – part 86]
+Link: [Docs Trace Flags]
+Scope: global or session
+
+
+
+#### Trace Flag: 9390
+**Undocumented trace flag**
+Function: Resulted in plan changes including parallelism for queries that shouldn’t have been eligible for parallelism based on CTFP. Full effect unknown.
+Link: [New Undocumented Trace Flags]
+Scope: ?
+
+
+
+#### Trace Flag: 9394
+Function: Apparently enables a fix for an access violation when a table with Japanese characters has an indexed changed.
+Link: https://support.microsoft.com/help/3142595/
+Link: https://support.microsoft.com/help/3138659/
+
+
+
+#### Trace Flag: 9398
+**Undocumented trace flag**
+Function: Disable adaptive join.
+Link: [SQL Server 2017: Adaptive Join Internals]
+Scope: ?
+
+
+
+#### Trace Flag: 9399
+**Undocumented trace flag**
+Function: Optimization adaptive threshold rows. The adaptive threshold to the minimum estimate.
+Link: [SQL Server 2017: Adaptive Join Internals]
+Scope: ?
+
+
+
+#### Trace Flag: 9410
+**Undocumented trace flag**
+Function: Fix slowly query runs when SQL Server uses hash aggregate in the query plan.
+Link: https://support.microsoft.com/help/3167159/
+Scope: ?
+
+
+
+#### Trace Flag: 9412
+**Undocumented trace flag**
+Function: Removes the new OptimizerStatsUsage information from estimated query plans.
+Link: [New Undocumented Trace Flags]
+Scope: ?
+
+
+
+#### Trace Flag: 9415
+**Undocumented trace flag**
+Function: Optimization adaptive join internals.
+Link: [SQL Server 2017: Adaptive Join Internals]
+Scope: ?
+
+
+
+#### Trace Flag: 9447
+**Undocumented trace flag**
+Function: Forces query plans to use the new referential integrity operator when validating UPDATE and DELETE queries against foreign key parent tables.
+Link: [New Undocumented Trace Flags]
+Scope: ?
+
+
+
+#### Trace Flag: 9448
+**Undocumented trace flag**
+Function: Disables the referential integrity operator.
+Link: https://orderbyselectnull.com/2017/12/05/the-referential-integrity-operator/
+
+
+
+#### Trace Flag: 9453
+Function: Disables Batch Mode in Parallel Columnstore query plans.
+(Note that a plan using batch mode appears to require a recompile before the TF takes effect)
+Sunil Agarwal also used this trace flag in demo scripts for a PASS 2014 session on column store indexing
+Link: [Niko Neugebauer Columnstore Indexes – part 35]
+Link: [What You Need to Know about the Batch Mode Window Aggregate Operator in SQL Server 2016: Part 1]
+
+
+
+#### Trace Flag: 9471
+Function: Causes SQL Server to generate a plan using minimum selectivity for single-table filters, under the query optimizer cardinality estimation model of SQL Server 2014 through SQL Server 2016 versions.
+Beginning with SQL Server 2016 SP1, to accomplish this at the query level, add the USE HINT query hint instead of using this trace flag.
+**Note: Please ensure that you thoroughly test this option, before rolling it into a production environment.**
+Link: [New Features in SQL Server 2016 Service Pack 1]
+Link: [Docs Trace Flags]
+Scope: global or session or query
+
+
+
+#### Trace Flag: 9472
+Function: Assumes independence for multiple WHERE predicates in the SQL 2014 cardinality estimation model. Predicate independence was the default for versions prior to SQL Server 2014, and thus this flag can be used to more closely emulate pre-SQL 2014 cardinality estimate behavior in a more specific fashion than TF 9481.
+Link: https://sqlperformance.com/2014/01/sql-plan/cardinality-estimation-for-multiple-predicates
+Link: https://connect.microsoft.com/SQLServer/feedback/details/801908/sql-server-2014-cardinality-estimation-regression
+
+
+
+#### Trace Flag: 9473
+**Undocumented trace flag**
+Function: Allowing the outer join to keep a zero-row inner-side estimate (instead of raising to one row) (so all outer rows qualify) gives a 'bug-free' join estimation with either calculator.
+If you're interested in exploring this, the undocumented trace flag is 9473 (alone).
+Link: https://dba.stackexchange.com/a/141533/107045
+Scope: ?
+
+
+
+#### Trace Flag: 9474
+**Undocumented trace flag**
+Function: Change in cardinality estimates for some joins in certain queries. Full effect unknown.
+Link: [New Undocumented Trace Flags]
+Scope: ?
+
+
+
+#### Trace Flag: 9476
+Function: Causes SQL Server to generate a plan using the Simple Containment assumption instead of the default Base Containment assumption, under the query optimizer cardinality estimation model of SQL Server 2014 through SQL Server 2016 versions.
+Beginning with SQL Server 2016 SP1, to accomplish this at the query level, add the USE HINT query hint instead of using this trace flag.
+**Note: Please ensure that you thoroughly test this option, before rolling it into a production environment.**
+Link: https://support.microsoft.com/help/3189675
+Link: [New Features in SQL Server 2016 Service Pack 1]
+Link: [Docs Trace Flags]
+Scope: global or session or query
+
+
+
+#### Trace Flag: 9477
+**Undocumented trace flag**
+Function: Slight change in ratio of EstimateRebinds and EstimateRewinds was observed. Full effect unknown.
+Link: [New Undocumented Trace Flags]
+Scope: ?
+
+
+
+#### Trace Flag: 9478
+**Undocumented trace flag**
+Function: Change in cardinality estimates for some joins in certain queries. Full effect unknown.
+Link: [New Undocumented Trace Flags]
+Scope: ?
+
+
+
+#### Trace Flag: 9479
+**Undocumented trace flag**
+Function: Forces the optimizer to use Simple Join [estimation] even if a histogram is available.
+Will force optimizer to use a simple join estimation algorithm, it may be CSelCalcSimpleJoinWithDistinctCounts, CSelCalcSimpleJoin or CSelCalcSimpleJoinWithUpperBound, depending on the compatibility level and predicate comparison type.
+Link: [Statistics and Cardinality Estimation]
+Scope: ?
+
+
+
+#### Trace Flag: 9480
+**Undocumented trace flag**
+Function: Reduced the selectivity of a bitmap filter from 0.001 to 0.000001. Full effect unknown.
+Link: [New Undocumented Trace Flags]
+Scope: ?
+
+
+
+#### Trace Flag: 9481
+Function: Enables you to set the query optimizer cardinality estimation model to the SQL Server 2012 and earlier version independent of the compatibility level of the database.
+To accomplish this at the database level, see [ALTER DATABASE SCOPED CONFIGURATION (Transact-SQL)].
+To accomplish this at the query level, add the QUERYTRACEON query hint
+Link: [New Features in SQL Server 2016 Service Pack 1]
+Link: https://sqlserverscotsman.wordpress.com/2016/11/28/a-guide-on-forcing-the-legacy-ce/
+Link: [Docs Trace Flags]
+Link: [KB2801413]
+Link: http://www.sqlservergeeks.com/sql-server-2014-trace-flags-9481/
+Link: https://sqlperformance.com/2019/01/sql-performance/compatibility-levels-and-cardinality-estimation-primer
+Scope: global or session or query
+
+
+
+#### Trace Flag: 9482
+**Undocumented trace flag**
+Function: Implements a “model variation” in the SQL 2014 cardinality estimator. The flag turns off the “overpopulated primary key” adjustment that the optimizer might use when determining that a “dimension” table (the schema could be OLTP as well) has many
+more distinct values than the “fact” table. (The seminal example is where a Date dimension is populated out into the future, but the fact table only has rows up to the current date). Since join cardinality estimation occurs based on the contents of the
+histograms of the joined columns, an “overpopulated primary key” can result in higher selectivity estimates, causing rowcount estimates to be too low.
+Link: http://www.queryprocessor.com/ce_opk
+
+
+
+#### Trace Flag: 9483
+**Undocumented trace flag**
+Function: Implements a “model variation” in the SQL 2014 cardinality estimator. The flag will force the optimizer to create (if possible) a filtered statistics object based on a predicate in
+the query. This filtered stat object is not persisted and thus would be extremely resource intensive for frequent compilations. In Dima’s example, the filtered stat object
+is actually created on the join column...i.e. “CREATE STATISTICS [filtered stat obj] ON [table] (Join column) WHERE (predicate column = ‘literal’)”
+Link: http://www.queryprocessor.com/ce_filteredstats
-**Trace Flag: 9481**
-Function: Forces the query optimizer to use the SQL Server 2012 version
-of the cardinality estimator when creating the query plan when running
-SQL Server 2014 with the default database compatibility level 120
-Link: http://support.microsoft.com/kb/2801413
+
+#### Trace Flag: 9484
+**Undocumented trace flag**
+Function: Slight change in estimated number of rewinds. Full effect unknown.
+Link: [New Undocumented Trace Flags]
+Scope: ?
-**Trace Flag: 9485**
+
+#### Trace Flag: 9485
Function: Disables SELECT permission for DBCC SHOW\_STATISTICS
-Link: https://support.microsoft.com/en-us/kb/2683304
-Link: http://msdn.microsoft.com/en-us/library/ms188396.aspx
+Link: https://support.microsoft.com/help/2683304
+Link: [Docs Trace Flags]
+Link: http://www.benjaminnevarez.com/2013/02/dbcc-show_statistics-works-with-select-permission
+Scope: global only
+
+
+
+#### Trace Flag: 9488
+**Undocumented trace flag**
+Function: Implements a “model variation” in the SQL 2014 cardinality estimator. This flag reverts the estimation behavior for multi-statement TVFs back to 1 row (instead of the 100-row estimate behavior that was adopted in SQL 2014).
+Link: http://www.queryprocessor.com/ce_mtvf
+
+
+
+#### Trace Flag: 9489
+**Undocumented trace flag**
+Function: Implements a “model variation” in the SQL 2014 cardinality estimator and turns off the new logic that handles ascending keys.
+Link: http://www.queryprocessor.com/ce_asckey
+
+
+
+#### Trace Flag: 9490
+**Undocumented trace flag**
+Function: Change in cardinality estimate. Full effect unknown.
+Link: [New Undocumented Trace Flags]
+Scope: ?
-**Trace Flag: 9532**
+
+#### Trace Flag: 9494
+**Undocumented trace flag**
+Function: The behaviour of the join cardinality estimation with CSelCalcExpressionComparedToExpression can also be modified to not account for ``bId` with another undocumented variation flag (9494)
+Link: https://dba.stackexchange.com/a/141533/107045
+Scope: ?
+
+
+
+#### Trace Flag: 9495
+Function: Disables parallelism during insertion for INSERT...SELECT operations and it applies to both user and temporary tables
+Link: https://support.microsoft.com/help/3180087
+Link: [Docs Trace Flags]
+Scope: global or session
+
+
+
+#### Trace Flag: 9532
Function: SQL 11 CTP3 - to get more than 1 availability group replica in CTP3 Scope Startup
Link: http://connect.microsoft.com/SQLServer/feedback/details/682581/denali-hadron-read-only-routing-url-is-not-yet-implemente
-**Trace Flag: 9806**
+
+#### Trace Flag: 9559
+**Undocumented trace flag**
+Function: For AGs, “when enabled on the secondary ignores the redo target provided from the primary progress message and always set the redo target at the Max LSN value.”
+Link: https://blogs.msdn.microsoft.com/alwaysonpro/2013/12/04/recovery-on-secondary-lagging-shared-redo-target
+
+
+
+#### Trace Flag: 9567
+Function: Enables compression of the data stream for availability groups during automatic seeding.
+Compression can significantly reduce the transfer time during automatic seeding and will increase the load on the processor.
+Link: [Docs Trace Flags]
+Link: https://www.mssqltips.com/sqlservertip/4537/sql-server-2016-availability-group-automatic-seeding/
+Link: https://msdn.microsoft.com/en-us/library/mt735149.aspx
+Link: [Tune compression for availability group]
+Scope: global or session
+
+
+
+#### Trace Flag: 9576
+Function: Revert to the original (SQL Server 2016) implementation of database level health detection using TF 9576 as either a startup parameter or enabled using DBCC TRACEON command.
+This new implementation is currently only available for SQL Server running on Windows and will be ported to SQL Server 2017 on Linux in an upcoming cumulative update.
+Link: https://blogs.msdn.microsoft.com/sql_server_team/sql-server-availability-groups-enhanced-database-level-failover/
+Scope: global only
+
+
+
+#### Trace Flag: 9591
+Function: Disables log block compression in Always On Availability Groups.
+Log block compression is the default behavior used with both synchronous and asynchronous replicas in SQL Server 2012 and SQL Server 2014.
+In SQL Server 2016, compression is only used with asynchronous replica.
+Link: [Docs Trace Flags]
+Scope: global or session
+
+
+
+#### Trace Flag: 9592
+Function: Enables log stream compression for synchronous availability groups.
+This feature is disabled by default on synchronous availability groups because compression adds latency.
+Link: [Docs Trace Flags]
+Link: [Tune compression for availability group]
+Scope: global or session
+
+
+
+#### Trace Flag: 9706
+**Undocumented trace flag**
+Function: Software Usage Metrics is disabled.
+Link: [Bad Idea Jeans: Finding Undocumented Trace Flags]
+
+
+
+#### Trace Flag: 9806
+**Undocumented trace flag**
Function: Unknown. Is turned on on SQL Server 2014 CTP1 standard installation in Windows Azure VM
Link: None
-**Trace Flag: 9807**
+
+#### Trace Flag: 9807
+**Undocumented trace flag**
Function: Unknown. Is turned on on SQL Server 2014 CTP1 standard installation in Windows Azure VM
Link: None
-**Trace Flag: 9808**
+
+#### Trace Flag: 9808
+**Undocumented trace flag**
Function: Unknown. Is turned on on SQL Server 2014 CTP1 standard installation in Windows Azure VM
Link: None
-**Trace Flag: 9830**
+
+#### Trace Flag: 9830
+**Undocumented trace flag**
+Function: Activate the trace flag before creating a natively compiled procedure.
+If you now open up the SQL Server error log you should see the compilation process for the natively compiled procedure.
+This is an undocumented trace flag so please don’t use this on a production system.
+Link: https://web.archive.org/web/20160327221828/http://speedysql.com/2015/10/28/new-trace-flag-for-in-memory-oltp-hekaton/
+
+
+
+#### Trace Flag: 9837
+**Undocumented trace flag**
+Function: According to Bob Ward’s PASS 2014 talk on SQL Server IO, enables “extra tracing but massive output” for Hekaton checkpoint files.
+Link: None
+
+
+
+#### Trace Flag: 9850
+**Undocumented trace flag**
+Function: Dumps more diagnostic stuff in the log.
+Link: [Bad Idea Jeans: Finding Undocumented Trace Flags]
+
+
+
+#### Trace Flag: 9851
+**Undocumented trace flag**
+Function: For testing purposes, you might want to turn off automatic merging of files, so that you can more readily
+explore this metadata. You can do that by turning on the undocumented trace flag 9851. And of course,
+be sure to turn off the trace flag when done testing.
+Link: http://gsl.azurewebsites.net/Portals/0/Users/dewitt/talks/HekatonWhitePaper.pdf
+
+
+
+#### Trace Flag: 9929
+Function: Enables an update that reduces the “disk footprint [of In-Memory OLTP] by reducing the In-Memory checkpoint files to 1 MB (megabytes) each.”
+Link: https://support.microsoft.com/help/3147012/
+
+
+
+#### Trace Flag: 9939
+Function: Disables merge/recompress during columnstore index reorganization.
+In SQL Server 2016, when a columnstore index is reorganized, there is new functionality to automatically merge any small compressed rowgroups into larger compressed rowgroups, as well as recompressing any rowgroups that have a large number of deleted rows.
+**Note: Trace flag 10204 does not apply to columnstore indexes which are created on memory-optimized tables.**
+Link: [Docs Trace Flags]
+Link: [Parallelism in Hekaton (In-Memory OLTP)]
+Scope: global or session
+
+
+
+#### Trace Flag: 9989
+Function: In CTP2, enabled functionality for reading in-memory tables on a readable secondary
+Link: https://connect.microsoft.com/SQLServer/feedback/details/795360/secondary-db-gets-suspect-when-i-add-in-memory-table-to-db-which-is-part-of-alwayson-availability-group
+
+
+
+#### Trace Flag: 10202
+**Undocumented trace flag**
+Function: According to demo scripts from a Sunil Agarwal session at PASS 2014, enables a new DMV named sys.dm_db_column_store_row_group_physical_stats.
+This DMV is not in SQL 2014 RTM and Sunil did not perform this demo during the session, so this DMV appears to be in a future (or internal) version of SQL Server.
+Link: None
+
+
+
+#### Trace Flag: 10204
+Function: Disables merge/recompress during columnstore index reorganization.
+In SQL Server 2016, when a columnstore index is reorganized, there is new functionality to automatically merge any small compressed rowgroups
+into larger compressed rowgroups, as well as recompressing any rowgroups that have a large number of deleted rows.
+**Note: Trace flag 10204 does not apply to column store indexes which are created on memory-optimized tables.**
+Link: [Docs Trace Flags]
+Scope: global or session
+
+
+
+#### Trace Flag: 10207
+Function: When a Clustered Columnstore index has corrupted segments, turning on this flag suppresses errors 5288 and 5289 and allows a scan of a clustered columns store to skip corrupt segments and complete (though with results that do not include the corrupted segment(s)). This flag is helpful when attempting to copy-out data in a corrupt CCI.
+Link: https://support.microsoft.com/help/3067257/
+Link: https://blogs.msdn.microsoft.com/sqlreleaseservices/partial-results-in-a-query-of-a-clustered-columnstore-index-in-sql-server-2014
+
+
+
+#### Trace Flag: 10213
+**Undocumented trace flag**
+Function: Enables the option to configure compression delay in columnstore indexes in SQL Server 2016
+Link: http://www.nikoport.com/2016/02/04/columnstore-indexes-part-76-compression-delay/
+Scope: session only
+
+
+
+#### Trace Flag: 10264
+**Undocumented trace flag**
+Function: Polybase mode enabled for SqlComposable.
+Link: [Bad Idea Jeans: Finding Undocumented Trace Flags]
+
+
+
+#### Trace Flag: 10316
+Function: Enables creation of additional indexes on internal memory-optimized staging temporal table, beside the default one.
+If you have specific query pattern that includes columns which are not covered by the default index you may consider adding additional ones.
+**Note: System-versioned temporal tables for Memory-Optimized Tables are designed to provide high transactional throughput.
+Please be aware that creating additional indexes may introduce overhead for DML operations that update or delete rows in the current table.
+With the additional indexes you should aim to find the right balance between performance of temporal queries and additional DML overhead.**
+Link: [Docs Trace Flags]
+Link: https://support.microsoft.com/help/3198846
+Link: https://blogs.msdn.microsoft.com/sqlcat/2016/12/08/improve-query-performance-on-memory-optimized-tables-with-temporal-using-new-index-creation-enhancement-in-sp1/
+Scope: global or session
+
+
+
+#### Trace Flag: 10809
+**Undocumented trace flag**
+Function: Force stream Aggregates for scalar aggregation in batch mode.
+Link: [New Undocumented Trace Flags]
+Scope: ?
+
+
+
+#### Trace Flag: 11001
+**Undocumented trace flag**
+Function: Results in a different join order for some queries. Full effect unknown.
+Link: [New Undocumented Trace Flags]
+Scope: ?
+
+
+
+#### Trace Flag: 11023
+Function: Disables the use of the last persisted sample rate, for all subsequent statistics update where a sample rate is not specified explicitly as part of the [UPDATE STATISTICS](https://docs.microsoft.com/en-us/sql/t-sql/statements/update-statistics-transact-sql) statement.
+Link: https://support.microsoft.com/help/4039284
+Link: [Docs Trace Flags]
+Scope: global or session
+
+
+
+#### Trace Flag: 11024
+Function: In Microsoft SQL Server 2017, when incremental statistics are built on the top of partitioned tables, the sum of modification counts of all partitions is stored as the modification count of the root node.
+When the modification count of the root node exceeds a threshold, the auto update of statistics is triggered.
+However, if the modification count of any single partition does not exceed the local threshold, the statistics are not updated.
+Additionally, the modification count of the root node is reset to zero. This may cause delay in the auto update of incremental statistics.
+When trace flag 11024 is enabled, the modification count of the root node is kept as the sum of modification counts of all partitions.
+**Note: This trace flag applies to SQL Server 2017 CU3 and higher builds.**
+Link: https://support.microsoft.com/help/4041811
+Scope: global or session
+
+
+
+#### Trace Flag: 11029
**Undocumented trace flag**
-Function: Activate the trace flag before creating a natively compiled procedure. If you now open up the SQL Server error log you should see the compilation process for the natively compiled procedure. This is an undocumented trace flag so please don’t use this on a production system.
-Link: http://speedysql.com/2015/10/28/new-trace-flag-for-in-memory-oltp-hekaton/#more-1216
+Function: Prevents new information about row goals from getting logged to the plan cache.
+Link: [New Undocumented Trace Flags]
+Scope: ?
+
+
+[Docs Trace Flags]:https://docs.microsoft.com/sql/t-sql/database-console-commands/dbcc-traceon-trace-flags-transact-sql
+[Query Store Trace Flags]: https://www.sqlskills.com/blogs/erin/query-store-trace-flags/
+[DBCC TRACEON]:https://docs.microsoft.com/sql/t-sql/database-console-commands/dbcc-traceon-transact-sql
+[DBCC TRACEOFF]:https://docs.microsoft.com/sql/t-sql/database-console-commands/dbcc-traceoff-transact-sql
+[DBCC CHECKDB]: https://docs.microsoft.com/sql/t-sql/database-console-commands/dbcc-checkdb-transact-sql
+[DBCC CHECKTABLE]: https://docs.microsoft.com/sql/t-sql/database-console-commands/dbcc-checktable-transact-sql
+[DBCC CHECKCONSTRAINTS]: https://docs.microsoft.com/sql/t-sql/database-console-commands/dbcc-checkconstraints-transact-sql
+[Niko Neugebauer Columnstore Indexes – part 86]: http://www.nikoport.com/2016/07/29/columnstore-indexes-part-86-new-trace-flags-in-sql-server-2016/
+[Niko Neugebauer Columnstore Indexes – part 35]: http://www.nikoport.com/2014/07/24/clustered-columnstore-indexes-part-35-trace-flags-query-optimiser-rules/
+[Microsoft SQL Server 2005 TPC-C Trace Flags]: http://webcache.googleusercontent.com/search?q=cache:Nttlt2Dp8egJ:blogs.msmvps.com/gladchenko/2009/08/21/sql_trace_flags_tpc-c/+&cd=6&hl=en&ct=clnk&gl=ru
+[Trace Flag 1228 and 1229]: http://www.sqlservercentral.com/Forums/Topic741825-146-1.aspx
+[A Topical Collection of SQL Server Flags v6]: https://sqlcrossjoin.files.wordpress.com/2016/04/sqlcrossjoin_traceflagrepository_v6.pdf
+[How To Diagnose and Correct Errors 17883, 17884, 17887, and 17888]: https://msdn.microsoft.com/library/cc917684.aspx
+[Trace flags in sql server from trace flag 902 to trace flag 1462]: http://www.sqlserverf1.com/tag/sql-server-trace-flag-1448/
+[TECHNET List Of SQL Server Trace Flags]: http://social.technet.microsoft.com/wiki/contents/articles/13105.trace-flags-in-sql-server.aspx
+[Cardinality Estimation Framework 2014 First Look]: http://www.somewheresomehow.ru/cardinality-estimation-framework-2014-first-look/
+[Query Optimizer Deep Dive - Part 4]: http://sqlblog.com/blogs/paul_white/archive/2012/05/01/query-optimizer-deep-dive-part-4.aspx
+[KB920093]: https://support.microsoft.com/help/920093
+[KB972767]: https://support.microsoft.com/help/972767
+[Tune compression for availability group]: https://docs.microsoft.com/sql/database-engine/availability-groups/windows/tune-compression-for-availability-group
+[More Undocumented Query Optimizer Trace Flags]: http://www.benjaminnevarez.com/2012/04/more-undocumented-query-optimizer-trace-flags/
+[KB3107399]: https://support.microsoft.com/help/3107399
+[KB2801413]: https://support.microsoft.com/help/2801413
+[New Features in SQL Server 2016 Service Pack 1]: https://www.mssqltips.com/sqlservertip/4574/new-features-in-sql-server-2016-service-pack-1/
+[Internals of the Seven SQL Server Sorts – Part 1]: https://sqlperformance.com/2015/04/sql-plan/internals-of-the-seven-sql-server-sorts-part-1
+[Yet another X-Ray for the QP]: http://www.queryprocessor.com/tf_8628/
+[How It Works: SQL Server 2012 Database Engine Task Scheduling]: https://blogs.msdn.microsoft.com/psssql/2013/08/13/how-it-works-sql-server-2012-database-engine-task-scheduling/
+[What You Need to Know about the Batch Mode Window Aggregate Operator in SQL Server 2016: Part 1]: http://sqlmag.com/sql-server/what-you-need-know-about-batch-mode-window-aggregate-operator-sql-server-2016-part-1
+[SQL Server 2016 : Getting tempdb a little more right]: https://blogs.sentryone.com/aaronbertrand/sql-server-2016-tempdb-fixes/
+[Importance of Performing DBCC CHECKDB on all SQL Server Databases]: https://www.mssqltips.com/sqlservertip/4581/importance-of-performing-dbcc-checkdb-on-all-sql-server-databases/
+[SQL Server Parallel Query Placement Decision Logic]: https://blogs.msdn.microsoft.com/psssql/2016/03/04/sql-server-parallel-query-placement-decision-logic/
+[compatibility level]: https://docs.microsoft.com/sql/t-sql/statements/alter-database-transact-sql-compatibility-level
+[Bad Idea Jeans: Finding Undocumented Trace Flags]: https://www.brentozar.com/archive/2017/10/bad-idea-jeans-finding-undocumented-trace-flags/
+[SQL Server - estimates outside of the histogram - half-baked draft]: http://sql-sasquatch.blogspot.ru/2017/09/sql-server-estimates-outside-of.html
+[Upgrading an expired SQL Server 2016 Evaluation Edition]: https://www.codykonior.com/2017/11/30/upgrading-an-expired-sql-server-2016-evaluation-edition/
+[How to Find the Statistics Used to Compile an Execution Plan]: http://sqlblog.com/blogs/paul_white/archive/2011/09/21/how-to-find-the-statistics-used-to-compile-an-paul_white
+[New Undocumented Trace Flags]: https://orderbyselectnull.com/2018/01/09/45-new-trace-flags/
+[Statistics and Cardinality Estimation]: http://topicaltraceflags.readthedocs.io/en/latest/cat/qry_StatsAndEst.html
+[Splitting Strings Based on Patterns]: https://www.sqlservercentral.com/Forums/Topic1390297-3122-5.aspx
+[SQL Server 2017: Adaptive Join Internals]: http://www.queryprocessor.com/adaptive-join-internals/
+[Parallelism in Hekaton (In-Memory OLTP)]: http://www.nikoport.com/2018/01/20/parallelism-in-hekaton-in-memory-oltp/
+[Hidden Performance & Manageability Improvements in SQL Server 2012 / 2014]: https://sqlperformance.com/2018/01/sql-performance/hidden-performance-manageability-improvements-sql-server-2012-2014
+[KB917825]: https://support.microsoft.com/help/917825/
+[TF6545-a]: https://support.microsoft.com/help/4018930/
+[TF6545-b]: https://SqlQuantumLeap.com/2018/02/23/sqlclr-vs-sql-server-2012-2014-2016-part-7-clr-strict-security-the-problem-continues-in-the-past-wait-what/
+[Controlling SQL Server memory dumps]: https://blogs.msdn.microsoft.com/psssql/2009/11/17/how-it-works-controlling-sql-server-memory-dumps
+[Change SQL Server Collation – Back to Basics]:http://jasonbrimhall.info/2018/04/12/change-sql-server-collation/
+[Important Trace Flags That Every DBA Should Know]:http://victorisakov.files.wordpress.com/2011/10/sql_pass_summit_2011-important_trace_flags_that_every_dba_should_know-victor_isakov.pdf
+[A Row Goal Riddle]:https://orderbyselectnull.com/2018/03/30/a-row-goal-riddle/
+[Undocumented Trace Flags: Inside the Restore Process]:https://blog.rdx.com/undocumented-trace-flags-inside-the-restore-process/
+[What’s CHECKDB doing in my database restore?]:http://www.mikefal.net/2018/04/10/whats-checkdb-doing-in-my-database-restore/
+[Few Outer Rows Optimization]:https://www.sqlshack.com/few-outer-rows-optimization/
+[TEMPDB – Files and Trace Flags and Updates]:https://blogs.msdn.microsoft.com/sql_server_team/tempdb-files-and-trace-flags-and-updates-oh-my/
+[Next-Level Parallel Plan Forcing: An Alternative to 8649]:http://dataeducation.com/next-level-parallel-plan-forcing-an-alternative-to-8649/
+[SQL Server 6.5: Some Useful Trace Flag]:http://www.databasejournal.com/features/mssql/article.php/1443351/SQL-Server-65-Some-Useful-Trace-Flags.htm
+[DAC]:https://docs.microsoft.com/sql/database-engine/configure-windows/diagnostic-connection-for-database-administrators
+[DBCC SHOW_STATISTICS]:https://docs.microsoft.com/sql/t-sql/database-console-commands/dbcc-show-statistics-transact-sql
+[ALTER DATABASE SCOPED CONFIGURATION (Transact-SQL)]:https://docs.microsoft.com/sql/t-sql/statements/alter-database-scoped-configuration-transact-sql
+[KB169960]:https://web.archive.org/web/20150111103047/http://support.microsoft.com:80/kb/169960
+[2628]:https://docs.microsoft.com/en-us/sql/relational-databases/errors-events/database-engine-events-and-errors?view=sql-server-2017#errors-2000-to-2999
+[8152]:https://docs.microsoft.com/en-us/sql/relational-databases/errors-events/database-engine-events-and-errors?view=sql-server-2017#errors-8000-to-8999
+[Fun with SQL Server Plan Cache, Trace Flag 8666, and Trace Flag 2388]:http://sql-sasquatch.blogspot.com/2018/12/fun-with-sql-server-plan-cache-trace_6.html
diff --git a/SQL Server Version.md b/SQL Server Version.md
index ad41ee43..9431c609 100644
--- a/SQL Server Version.md
+++ b/SQL Server Version.md
@@ -6,8 +6,12 @@ Headers:
- [SQL Server Patching Shortcut](#sql-server-patching-shortcut)
- [What are the most recent updates for SQL Server?](#what-are-the-most-recent-updates-for-sql-server)
- [Microsoft SQL Server installation files info](#microsoft-sql-server-installation-files-info)
+ - [SQL Server Developer Edition Info](#sql-server-developer-edition-info)
+ - [SQL Server Express direct download links](#sql-server-express-direct-download-links)
- [Internal Database Version and Compatibility Level](#internal-database-version-and-compatibility-level)
- [Quick summary for SQL Server Service Packs](#quick-summary-for-sql-server-service-packs)
+ - [Microsoft SQL Server 2019 Builds](#microsoft-sql-server-2019-builds)
+ - [Microsoft SQL Server 2017 Builds](#microsoft-sql-server-2017-builds)
- [Microsoft SQL Server 2016 Builds](#microsoft-sql-server-2016-builds)
- [Microsoft SQL Server 2014 Builds](#microsoft-sql-server-2014-builds)
- [Microsoft SQL Server 2012 Builds](#microsoft-sql-server-2012-builds)
@@ -19,18 +23,28 @@ Headers:
- [Microsoft SQL Server 6.5 Builds](#microsoft-sql-server-65-builds)
- [Microsoft SQL Server 6.0 Builds](#microsoft-sql-server-60-builds)
-Source link:
- - **Awesome official Microsoft article** - How to determine the version, edition and update level of SQL Server and its components: [KB321185](https://support.microsoft.com/en-us/kb/321185)
- - Naming schema for Microsoft SQL Server software update packages: [KB822499](https://support.microsoft.com/en-us/kb/822499)
- - Description of the standard terminology that is used to describe Microsoft software updates: [KB824684](https://support.microsoft.com/en-us/kb/824684)
- - An Incremental Servicing Model is available from the SQL Server team to deliver hotfixes for reported problems: [KB935897](https://support.microsoft.com/en-us/kb/935897)
- - Recommended updates and configuration options for SQL Server 2012 and SQL Server 2014 with high-performance workloads: [KB2964518](https://support.microsoft.com/en-us/kb/2964518)
+Useful links:
+ - [KB321185 How to determine the version, edition and update level of SQL Server and its components](https://support.microsoft.com/help/321185)
+ - [KB822499 Naming schema for Microsoft SQL Server software update packages](https://support.microsoft.com/help/822499)
+ - [Microsoft SQL Server Support Lifecycle](https://support.microsoft.com/en-us/lifecycle?x=5&y=11&c2=1044)
+ - [Microsoft Update Catalog](http://www.catalog.update.microsoft.com)
+ - [SQL Server packages for Linux](https://packages.microsoft.com/)
+ - [Release notes for SQL Server 2017 on Linux](https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-release-notes?view=sql-server-linux-2017)
+ - [KB824684 Description of the standard terminology that is used to describe Microsoft software updates](https://support.microsoft.com/help/824684)
+ - [KB935897 An Incremental Servicing Model is available from the SQL Server team to deliver hotfixes for reported problems](https://support.microsoft.com/help/935897)
+ - [KB2964518 Recommended updates and configuration options for SQL Server 2012 and SQL Server 2014 with high-performance workloads](https://support.microsoft.com/help/2964518)
+ - [Azure SQL Server Updates](https://azure.microsoft.com/en-us/updates/?product=sql-database&update-type=general-availability)
+ - [Most Recent KBs for Microsoft SQL Server RSS](https://support.microsoft.com/en-us/rss?rssid=1044)
- [Testing and Developing Supportability Roadmaps for ISV Applications (PDF)](http://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-85-48-files/0827.testing-and-developing-supportability-roadmaps-for-isv-applications.pdf)
- [SQL Server Updates by Brent Ozar team](http://sqlserverupdates.com/)
+ - [Which Version of SQL Server Should You Use?](https://www.brentozar.com/archive/2019/01/which-version-of-sql-server-should-you-use/)
- [SQL Server Builds by SQLSentry](http://blogs.sqlsentry.com/category/sql-server-builds/)
+ - [SQL Server Release Services](https://blogs.msdn.microsoft.com/sqlreleaseservices/)
- [Why I have high hopes for the quality of SQL Server 2016 release by Remus Rusanu](https://medium.com/@rusanu/why-i-have-high-hopes-for-the-quality-of-sql-server-2016-release-6173bc1fbc82#.44kg2ktmg)
- [Unofficial SQL Server build chart lists](http://sqlserverbuilds.blogspot.ru/)
- - [Wikipedia Microsoft_SQL_Server](https://en.wikipedia.org/wiki/Microsoft_SQL_Server)
+ - [Unofficial SQL Server build chart lists in table representation](http://sqlbuilds.ekelmans.com/)
+ - [Hardware and Software Requirements for Installing SQL Server](https://msdn.microsoft.com/en-us//library/ms143506.aspx)
+ - [Wikipedia Microsoft SQL Server](https://en.wikipedia.org/wiki/Microsoft_SQL_Server)
- [SQL Server 2005 Downloads](https://msdn.microsoft.com/en-us/sqlserver/bb671254.aspx)
- [SQL Server 2000 Downloads](https://msdn.microsoft.com/en-us/sqlserver/bb895925)
- [SQL Server 7.0 Downloads](https://msdn.microsoft.com/en-us/sqlserver/bb671066)
@@ -38,30 +52,29 @@ Source link:
Useful articles:
- [How to identify your SQL Server version and edition](http://support.microsoft.com/kb/321185/en-us)
- [SQL Server Internal Database Versions](http://sqlserverbuilds.blogspot.ru/2014/01/sql-server-internal-database-versions.html)
- - [Microsoft SQL Server Support Lifecycle](http://support2.microsoft.com/lifecycle/?LN=en-us&c2=1044)
+ - [Microsoft SQL Server Support Lifecycle](https://support.microsoft.com/en-us/lifecycle/)
- [Microsoft SQL Server Home](http://www.microsoft.com/sql)
- [Microsoft SQL Server Developer Center](http://msdn.microsoft.com/sqlserver)
- [Microsoft TechNet: Microsoft SQL Server](http://technet.microsoft.com/en-us/sqlserver)
- - [Microsoft Knowledge Base](http://kbupdate.info/)
- - [Sqlservr.exe versions](http://www.mskbfiles.com/sqlservr.exe.php)
- [SQL Server Patching Shortcut](http://www.sqlservercentral.com/articles/SQL+Server+patching/138693/)
-**All SQL Server service packs are cumulative, meaning that each new service pack contains all the fixes that are included with previous service packs and any new fixes.**
+**All SQL Server service packs and Cumulative Updates are cumulative, meaning that each new service pack and cumulative update contains all the fixes that are included with previous service packs and any new fixes.**
-## Frequently used terms and acronyms
+## Frequently used terms and acronyms
+
**Great thanks to Aaron Bertrand for awesome article**: [Definitions of SQL Server release acronyms](http://blogs.sqlsentry.com/aaronbertrand/back-to-basics-release-acronyms/)
- **COD** *Critical On-Demand*: This is a fix for an issue that is deemed "critical" because of the severity of the issue, the number of customers it affects,
or the lack of a feasible workaround (usually a combination of two or all three).
The fix is released out-of-band from the usual Cumulative Update / Service Pack release cycle, and then rolled into the next Cumulative Update (or, depending on timing, the one after that).
A COD can sometimes contain more than one QFE (defined below).
- - **CU** *Cumulative Update*: This is a roll-up of multiple fixes that occurs between Service Packs, usually on a 60-day cycle (though that is subject to change).
+ - **CU** *Cumulative Update*: This is a roll-up of multiple fixes that occurs between Service Packs, usually on a 60-day cycle (though that is subject to change).
It used to require an e-mail and password to download and extract the files, because they were "less tested" than service packs, but [this is no longer the case](https://blogs.msdn.microsoft.com/sqlreleaseservices/announcing-updates-to-the-sql-server-incremental-servicing-model-ism/).
Functionality can also be added in Cumulative Updates (previously, this would only happen in Service Packs, and before that, only in major releases).
Kendra Little just published [a fantastic blog post about this](http://www.littlekendra.com/2016/04/28/required-testing-for-installing-sql-server-cumulative-updates-and-service-packs/).
You should feel comfortable applying Cumulative Updates as quickly as your regression and other test processes allow.
- - **CTP** *Community Technology Preview*: This is a build of the "next" version of SQL Server (or sometimes a Service Pack) that can be used for testing new features and reporting bugs.
+ - **CTP** *Community Technology Preview*: This is a build of the "next" version of SQL Server (or sometimes a Service Pack) that can be used for testing new features and reporting bugs.
With few exceptions, CTPs cannot be used in a production scenario, and they are usually limited to Express / Evaluation Editions.
- **GA** *General Availability*: For the traditional SQL Server product, this usually means that you can download the ISO from the usual sources (MSDN downloads, the TechNet Evaluation Center, or your volume licensing servers).
For Azure SQL Database, this usually means that you can go and turn on the functionality without first agreeing to a waiver about preview functionality.
@@ -76,12 +89,12 @@ These are almost always a subset of TAP, and are almost always running the new v
- **RTM** *Released To Manufacturing*: This means that the release is ready. Back when Microsoft shipped software on CDs and later DVDs, this represented the point in time when the discs could be printed.
Not to be confused with launch (which is a marketing thing only) or General Availability (which means you can actually get the code).
The delay between RTM and GA is much shorter now that software is generally distributed online instead of on physical media.
- - **RTW** *Release to Web*: It indicates a package that was released to the web and made available to customers for downloading.
+ - **RTW** *Release to Web*: It indicates a package that was released to the web and made available to customers for downloading.
- **TAP** *Technology Adoption Program*: This describes a set of customers that help Microsoft shape and test specific features for a new release (or help shape and test new features individually).
- **SP** *Service Pack*: A Service Pack is, now, essentially a Cumulative Update with slightly different labeling.
It is a roll-up of updates (including bug fixes and security updates) and sometimes contains new features.
Like Cumulative Updates, Service Packs are cumulative. If you are applying SP3, you do not need to first deploy SP1 and SP2.
- - **SU**: Security update.
+ - **SU** or **CVE**: Security update.
- **Hotfix**: A single, cumulative package that includes one or more files that are used to address a problem in a product and are cumulative at the binary and file level. A hotfix addresses a specific customer situation and may not be distributed outside the customers organization.
### References
@@ -94,52 +107,62 @@ Like Cumulative Updates, Service Packs are cumulative. If you are applying SP3,
- [What is Microsoft TAP and RDP?](http://www.jamesserra.com/archive/2011/10/what-is-microsoft-tap-and-rdp/)
-## SQL Server Patching Shortcut
+## SQL Server Patching Shortcut
+
Step 1. After the CU file has been downloaded, open a DOS prompt and launch it with the /extract option with a path of your choice appended to this option. For example:
```bat
-SQLServer2014-KB3130926-x64.exe /extract C:\CU5
+SQLServer2017-KB4052574-x64.exe /extract C:\SQL2017CU2
```
After a few moments you should see the progress bar dialog pop up. The target directory will be created if it does not exist, so this is also a great option for automating patch installs.
-That's all there is to it. No step 2 required. The patch has been extracted to a location of your choice, which means there's one less thing to worry about when it's time to carry out the actual patching.
+No step 2 required. The patch has been extracted to a location of your choice, which means there's one less thing to worry about when it's time to carry out the actual patching.
Profits:
- This saves time as the install files can be extracted in advance, and if you have to patch a lot of servers this saving is multiplied as the files are extracted once, instead of every time on every server.
- - This time saving also serves to reduces risk as it is one less thing that could go wrong during patching. The last thing you want to be doing during a patching window is scrambling around on a server clearing space in temp folders because there was not enough space free on e.g. the C: drive for the patch to extract itself. We've all been there.
+ - This time saving also serves to reduces risk as it is one less thing that could go wrong during patching. The last thing you want to be doing during a patching window is scrambling around on a server clearing space in temp folders because there was not enough space free on e.g. the C: drive for the patch to extract itself.
- This is also a great way of retrieving just an individual msi file (e.g. sqlncli.msi)
-## What are the most recent updates for SQL Server?
-
-| Version | Latest Update | Build Number | Release Date | Support Ends | Other Updates |
-|---------|--------------------------------------------------------------------|------------------------------------------------|------------------------------------------|--------------|-------------------------------------------------------------------|
-| 2016 | [Download RC3 2016] | 13.0.1400.371 | 2016-04-15 | ? | [Other SQL 2016 Updates](#microsoft-sql-server-2016-builds) |
-| 2014 | [Download 2014 SP1] then [CU6 KB3144524] | 12.0.4100.1 12.0.4449.0 | 2015-05-15 2016-04-18 | 2024-07-09 | [Other SQL 2014 Updates](#microsoft-sql-server-2014-builds) |
-| 2012 | [Download 2012] then [SP3 2012] then [CU3 KB3152635] | 11.0.2100.60 11.0.6020.0 11.0.6537.0 | 2012-02-14 2015-11-21 2016-05-16 | 2022-07-12 | [Other SQL 2012 Updates](#microsoft-sql-server-2012-builds) |
-| 2008 R2 | [Download 2008 R2] then [SP3 2008 R2] then [SU KB3045311] | 6.1.7601.17514 10.50.6000 10.50.6220.0 | 2010-11-21 2014-09-30 2015-07-14 | 2019-07-09 | [Other SQL 2008 R2 Updates](#microsoft-sql-server-2008-r2-builds) |
-| 2008 | [Download 2008] then [SP4 2008] then [SU KB3045316] | 6.0.6001.18000 10.00.6000 10.0.6241.0 | 2008-01-19 2014-09-30 2015-07-14 | 2019-07-09 | [Other SQL 2008 Updates](#microsoft-sql-server-2008-builds) |
-| 2005 | [Download SP4 2005] then [CU3 KB2507769] | 9.00.5000.00 9.00.5266 | 2010-12-17 2011-03-17 | 2016-04-12 | [Other SQL 2005 Updates](#microsoft-sql-server-2005-builds) |
-
-[Download RC3 2016]:https://www.microsoft.com/en-in/evalcenter/evaluate-sql-server-2016
-[Download 2014 SP1]:https://www.microsoft.com/en-us/evalcenter/evaluate-sql-server-2014
-[CU6 KB3144524]:https://support.microsoft.com/en-us/kb/3144524
-[Download 2012]:https://www.microsoft.com/en-us/evalcenter/evaluate-sql-server-2012
-[SP3 2012]:http://www.microsoft.com/en-us/download/details.aspx?id=49996
-[CU3 KB3152635]:https://support.microsoft.com/en-us/kb/3152635
+## What are the most recent updates for SQL Server?
+
+
+| Version | Latest Update | Build Number | Release Date | Lifecycle Start | Mainstream Support | Extended Support | Other Updates |
+|---------|-----------------------------------------------------------------------|----------------------------------------------|------------------------------------------|-----------------|--------------------|------------------|-------------------------------------------------------------------|
+| 2019 | [Install 2019 CTP 2.2] | 15.0.1200.24 | 2018-12-11 | ? | ? | ? | [Other SQL 2019 Updates](#microsoft-sql-server-2019-builds) |
+| 2017 | [Install 2017 RTM] then [CU13 KB4483666] | 14.0.1000.169 14.0.3049.1 | 2017-10-02 2019-01-08 | 2017-08-28 | 2022-11-10 | 2027-12-10 | [Other SQL 2017 Updates](#microsoft-sql-server-2017-builds) |
+| 2016 | [Install 2016 SP2] then [CU5 KB4475776] | 13.0.5026.0 13.0.5264.1 | 2018-04-24 2019-01-23 | 2016-11-16 | 2021-07-13 | 2026-07-14 | [Other SQL 2016 Updates](#microsoft-sql-server-2016-builds) |
+| 2014 | [Install 2014 SP2] then [SP3 KB4022619] then [CU1 KB4470220] | 12.0.5000.0 12.0.6024.0 12.0.6205.1 | 2016-07-11 2018-10-30 2018-12-12 | 2016-07-14 | 2019-07-09 | 2024-07-09 | [Other SQL 2014 Updates](#microsoft-sql-server-2014-builds) |
+| 2012 | [Install 2012] then [SP4 2012] then [ADV180002 (GDR)] | 11.0.2100.60 11.0.7001.0 11.0.7462.6 | 2012-02-14 2017-10-05 2018-01-12 | 2015-12-01 | 2017-07-11 | 2022-07-12 | [Other SQL 2012 Updates](#microsoft-sql-server-2012-builds) |
+| 2008 R2 | [Install 2008 R2] then [SP3 2008 R2] then [SU KB3045311] | 10.50.1600 10.50.6000 10.50.6220.0 | 2010-11-21 2014-09-30 2015-07-14 | Review Note | 2014-07-08 | 2019-07-09 | [Other SQL 2008 R2 Updates](#microsoft-sql-server-2008-r2-builds) |
+| 2008 | [Install 2008] then [SP4 2008] then [SU KB3045316] | 10.0.1600.0 10.0.6000 10.0.6241.0 | 2008-01-19 2014-09-30 2015-07-14 | 2014-07-07 | 2014-07-08 | 2019-07-09 | [Other SQL 2008 Updates](#microsoft-sql-server-2008-builds) |
+
+**For downloading distributive for SQL Server 2008 R2 and SQL Server 2008 you must have MSDN subscription, see [Install 2008 R2] and [Install 2008] links.**
+
+[Install 2019 CTP 2.2]:https://www.microsoft.com/en-us/sql-server/sql-server-2019#Install
+[Install 2017 RTM]:https://www.microsoft.com/en-us/sql-server/sql-server-downloads
+[CU13 KB4483666]:https://support.microsoft.com/help/4483666
+[Install 2016 SP2]:https://go.microsoft.com/fwlink/?LinkID=799011
+[CU5 KB4475776]:https://support.microsoft.com/help/4475776
+[Install 2014 SP2]:https://www.microsoft.com/evalcenter/evaluate-sql-server-2014-sp2
+[SP3 KB4022619]:https://support.microsoft.com/help/4022619
+[CU1 KB4470220]:https://support.microsoft.com/help/4470220
+[Install 2012]:https://www.microsoft.com/en-us/evalcenter/evaluate-sql-server-2012
+[SP4 2012]:https://support.microsoft.com/en-us/help/4018073
+[ADV180002 (GDR)]:https://support.microsoft.com/en-us/help/4057116
[CU9 KB3098512]:https://support.microsoft.com/en-us/kb/3098512
-[Download 2008 R2]:https://www.microsoft.com/en-us/download/details.aspx?id=11093
+[Install 2008 R2]:https://msdn.microsoft.com/subscriptions/securedownloads/#searchTerm=sql%20server%202008%20r2&ProductFamilyId=0&Languages=en&FileExtensions=.iso&PageSize=10&PageIndex=0&FileId=0
[SP3 2008 R2]:http://www.microsoft.com/en-us/download/details.aspx?id=44271
[SU KB3045311]:https://www.microsoft.com/downloads/details.aspx?familyid=7af16cb8-c944-41cb-a897-c6fc373869cd
-[Download 2008]:https://www.microsoft.com/en-us/download/details.aspx?id=5023
+[Install 2008]:https://msdn.microsoft.com/subscriptions/securedownloads/#searchTerm=sql%20server%202008&ProductFamilyId=0&Languages=en&FileExtensions=.iso&PageSize=10&PageIndex=0&FileId=0
[SP4 2008]:http://www.microsoft.com/en-us/download/details.aspx?id=44278
-[SU KB3045316]:https://www.microsoft.com/downloads/details.aspx?familyid=40328565-3067-4e36-96ba-26ade333d715
-[Download SP4 2005]:http://www.microsoft.com/downloads/en/details.aspx?FamilyID=b953e84f-9307-405e-bceb-47bd345baece
-[CU3 KB2507769]:http://support.microsoft.com/kb/2507769
+[SU KB3045316]:https://support.microsoft.com/help/3045311
+[Developer Free]:https://www.microsoft.com/en-us/cloud-platform/sql-server-editions-developers
-## Microsoft SQL Server installation files info
-SHA1 hash you can easy get with default Windows utility [certutil](https://technet.microsoft.com/en-us/library/cc732443.aspx 'certutil TECHNET description').
+## Microsoft SQL Server installation files info
+
+SHA1 hash you can easy get with default Windows utility [certutil](https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/certutil 'certutil Microsoft docs').
For example, for single file:
```bat
@@ -148,31 +171,46 @@ certUtil -hashfile "d:\SQL Server\SQLServer2014SP1-KB3058865-x64-ENU.exe" sha1
Or for all files with .exe extensions in folder:
```bat
-FOR /R "d:\YaDsik\Backup\Distrib\SQL Server" %I IN (*.exe) DO certUtil -hashfile "%I" sha1
+FOR /R "d:\SQL Server" %I IN (*.exe) DO certUtil -hashfile "%I" sha1
```
-| Direct x64 Download Link | File Name | Release Date | Build Number | Size, MB | SHA1 |
-|--------------------------|----------------------------------------------------------------------|--------------| --------------:|---------:|-------------------------------------------------------------|
-| [SQL Server 2016 RC3] | SQLServer2016RC3-x64-ENU.iso | 2016-04-15 | 13.0.1400.371 | 2114 MB | 10 f3 5f 9d 34 2a fd 27 b9 1a bf 19 97 9c b2 12 16 b9 f6 ba |
-| [SQL Server 2014 SP1] | SQLServer2014SP1-FullSlipstream-x64-ENU.iso | 2015-05-15 | 12.0.4100.1 | 3035 MB | 9e d2 f6 40 d7 3b 78 ed 51 20 f6 9a ba b4 9b ec ff 5b 00 60 |
-| [SQL Server 2014 CU6] | SQLServer2014-KB3144524-x64.exe | 2016-04-18 | 12.0.4449.0 | 579 MB | ce f2 d9 6c 25 da b1 cb 2e 8c ee c7 ac c6 7b 0b c8 3b 0a 9a |
-| [SQL Server 2012] | SQLFULL_ENU.iso | 2012-02-14 | 11.0.2100.60 | 4300 MB | be 00 94 2c c5 6d 03 3e 2c 9d ce 8a 17 a6 f2 65 4f 51 84 a3 |
-| [SQL Server 2012 SP3] | SQLServer2012SP3-KB3072779-x64-ENU.exe | 2015-11-21 | 11.0.6020.0 | 1017 MB | db f0 1b 6d c6 d6 0c 2b 04 5c 92 d9 18 62 e6 08 7a d7 2a 0a |
-| [SQL Server 2012 CU3] | SQLServer2012-KB3152635-x64.exe | 2016-05-16 | 11.0.6537.0 | 580 MB | 95 ae a9 84 29 08 d9 cd 83 d1 d6 f9 e0 42 7e 80 66 9d 52 8f |
-| [SQL Server 2008 R2] | 7601.17514.101119-1850_x64fre_server_eval_en-us-GRMSXEVAL_EN_DVD.iso | 2010-11-21 | 6.1.7601.17514 | 3020 MB | e1 f1 12 e3 b0 b3 03 a0 67 6f 70 dc 35 85 4b d7 6c d2 54 50 |
-| [SQL Server 2008 R2 SP3] | SQLServer2008R2SP3-KB2979597-x64-ENU.exe | 2014-09-30 | 10.50.6220.0 | 358 MB | 19 4c d7 40 d5 81 2b 12 63 9b 47 88 6e bd e0 d0 47 74 b4 ec |
-| [SQL Server 2008 R2 SU] | SQLServer2008R2-KB3045316-x64.exe | 2015-07-14 | 10.50.6000 | 58 MB | 3a a4 d8 20 55 3b 1e 5d 96 73 55 41 cb b5 5d 97 32 2c 28 6e |
-| [SQL Server 2008] | 6001.18000.080118-1840_amd64fre_Server_en-us-KRMSXFRE_EN_DVD.exe | 2008-01-19 | 6.0.6001.18000 | 2269 MB | e4 d6 29 00 0f c2 3d a9 f9 e0 77 4b 79 69 80 ff 7f 71 f7 48 |
-| [SQL Server 2008 SP4] | SQLServer2008SP4-KB2979596-x64-ENU.exe | 2014-09-30 | 10.0.6241.0 | 378 MB | 13 61 0d 6c b3 9e 37 fc d4 a3 33 82 44 a3 ca 2a 8a 40 4c d8 |
-| [SQL Server 2008 SU] | SQLServer2008-KB3045311-x64.exe | 2015-07-14 | 10.00.6000 | 61 MB | 37 a1 97 c6 09 90 d2 e8 3e 98 d1 09 01 09 a4 ab 3f 2a be 4b |
-
-[SQL Server 2016 RC3]:http://care.dlservice.microsoft.com/dl/download/E/0/0/E0088C51-F792-4772-B0BF-107DD472E245/SQLServer2016RC2-x64-ENU.iso
-[SQL Server 2014 SP1]:http://care.dlservice.microsoft.com/dl/download/2/F/8/2F8F7165-BB21-4D1E-B5D8-3BD3CE73C77D/SQLServer2014SP1-FullSlipstream-x64-ENU.iso
-[SQL Server 2014 CU6]:https://download.microsoft.com/download/9/5/3/953C5CEC-69F1-4B43-8226-44504C55199D/SQL14SP1CU6/x64/SQLServer2014-KB3144524-x64.exe
+Alternative download link for all English x64 distributives: https://rebrand.ly/sql-server-distribs
+
+| Direct x64 Download Link | File Name | Release Date | Build Number | Size, MB | SHA1 |
+|---------------------------------------|-------------------------------------------------------------------|--------------|--------------:|---------:|------------------------------------------|
+| [SQL Server 2019] | SQLServer-2019-CTP-2.2-x64-ENU.iso | 2018-12-11 | 15.0.1200.24 | 1302 | 5b54d0ef478d422766b19fe2e1f99ee7d9bdf6e2 |
+| [SQL Server 2017] | SQLServer2017-x64-ENU-Dev.iso | 2017-10-02 | 14.0.1000.169 | 1476 | 0280ff6c1447d287a6bd3b86b81e459fe252d17a |
+| [SQL Server 2017 CU13 Hotfix] | SQLServer2017-KB4483666-x64 | 2019-01-08 | 14.0.3049.1 | 488 | 6f2de49e491048ab4cb17160d4efc653c3a29bf1 |
+| [SQL Server 2016 SP2] | SQLServer2016SP1-KB3182545-x64-ENU.exe | 2018-04-24 | 13.0.5026.0 | 2832 | 6309d729a0f063d11c0bb7f840f1069483406755 |
+| [SQL Server 2016 SP2 CU5] | SQLServer2016-KB4475776-x64.exe | 2019-01-23 | 13.0.5264.1 | 712 | 68af970cf5ffea7e549216b20dfa9fab4e2e6e8f |
+| [SQL Server 2014 SP2] | SQLServer2014SP2-FullSlipstream-x64-ENU.iso | 2016-07-11 | 12.0.5000.0 | 3010 | 16f1934dc1f47994cd924439f884a05c6ad4d173 |
+| [SQL Server 2014 SP3 KB4022619] | SQLServer2014SP3-KB4022619-x64-ENU.exe | 2018-10-30 | 12.0.6024.0 | 791 | a0959d84f72fd9f8a8832ca691efc420050df9de |
+| [SQL Server 2014 SP3 CU1 KB4470220] | SQLServer2014-KB4470220-x64.exe | 2018-12-12 | 12.0.6205.1 | 601 | 727d462ffcb618400c813ae6bf06e3a9cc8418f2 |
+| [SQL Server 2012] | SQLFULL_ENU.iso | 2012-02-14 | 11.0.2100.60 | 4300 | be00942cc56d033e2c9dce8a17a6f2654f5184a3 |
+| [SQL Server 2012 SP4] | SQLServer2012SP4-KB4018073-x64-ENU.exe | 2017-10-05 | 11.0.7001.0 | 1024 | 95127ee2e8dfef180752e531a83cd948c24a3a87 |
+| [SQL Server 2012 SP4 ADV180002 (GDR)] | SQLServer2012-KB4057116-x64.exe | 2018-01-12 | 11.0.7462.6 | 672 | c0c2e0e6519363a5bb3d3ca78d55ef664a8c8995 |
+| SQL Server 2008 R2 RTM | SW_DVD9_SQL_Svr_Enterprise_Edtn_2008_R2_English_MLF_X16-29540.ISO | 2010-04-21 | 10.50.1600.1 | 4177 | 18105db70f0f0b23418f5005a6ce4b25317c6d03 |
+| [SQL Server 2008 R2 SP3] | SQLServer2008R2SP3-KB2979597-x64-ENU.exe | 2014-09-30 | 10.50.6220.0 | 358 | 194cd740d5812b12639b47886ebde0d04774b4ec |
+| [SQL Server 2008 R2 SU] | SQLServer2008R2-KB3045316-x64.exe | 2015-07-14 | 10.50.6000 | 58 | 3aa4d820553b1e5d96735541cbb55d97322c286e |
+| [SQL Server 2008] | ? | 2008-01-19 | 10.0.1600.0 | ? | ? |
+| [SQL Server 2008 SP4] | SQLServer2008SP4-KB2979596-x64-ENU.exe | 2014-09-30 | 10.0.6241.0 | 378 | 13610d6cb39e37fcd4a3338244a3ca2a8a404cd8 |
+| [SQL Server 2008 SU] | SQLServer2008-KB3045311-x64.exe | 2015-07-14 | 10.00.6000 | 61 | 37a197c60990d2e83e98d1090109a4ab3f2abe4b |
+
+**For downloading distributive for SQL Server 2008 R2 and SQL Server 2008 you must have MSDN subscription, see [Install 2008 R2] and [Install 2008] links.**
+
+[SQL Server 2019]:https://go.microsoft.com/fwlink/?linkid=866664
+[SQL Server 2017]:https://go.microsoft.com/fwlink/?linkid=853016
+[SQL Server 2017 CU13 Hotfix]:http://download.microsoft.com/download/4/3/9/439277DD-1041-48F8-A5E5-FA6493E44BC5/SQLServer2017-KB4483666-x64.exe
+[SQL Server 2016]:http://care.dlservice.microsoft.com/dl/download/F/E/9/FE9397FA-BFAB-4ADD-8B97-91234BC774B2/SQLServer2016-x64-ENU.iso
+[SQL Server 2016 SP2]:https://go.microsoft.com/fwlink/?LinkID=799011
+[SQL Server 2016 SP2 CU5]:https://download.microsoft.com/download/6/0/6/606B3A2E-0EAE-4DCD-930D-178686370921/SQLServer2016-KB4475776-x64.exe
+[SQL Server 2014 SP2]:http://care.dlservice.microsoft.com/dl/download/6/D/9/6D90C751-6FA3-4A78-A78E-D11E1C254700/SQLServer2014SP2-FullSlipstream-x64-ENU.iso
+[SQL Server 2014 SP3 KB4022619]:https://download.microsoft.com/download/7/9/F/79F4584A-A957-436B-8534-3397F33790A6/SQLServer2014SP3-KB4022619-x64-ENU.exe
+[SQL Server 2014 SP3 CU1 KB4470220]:https://download.microsoft.com/download/A/5/A/A5AACC94-29A5-4890-90BD-847320EE0E93/SQLServer2014-KB4470220-x64.exe
[SQL Server 2012]:https://download.microsoft.com/download/4/C/7/4C7D40B9-BCF8-4F8A-9E76-06E9B92FE5AE/ENU/SQLFULL_ENU.iso
-[SQL Server 2012 SP3]:https://download.microsoft.com/download/B/1/7/B17F8608-FA44-462D-A43B-00F94591540A/ENU/x64/SQLServer2012SP3-KB3072779-x64-ENU.exe
-[SQL Server 2012 CU3]:https://download.microsoft.com/download/3/0/D/30D98783-31D6-4123-9F87-5058BA9FC977/SQL2012SP3CU3/amd64/SQLServer2012-KB3152635-x64.exe
-[SQL Server 2008 R2]:https://download.microsoft.com/download/7/5/E/75EC4E54-5B02-42D6-8879-D8D3A25FBEF7/7601.17514.101119-1850_x64fre_server_eval_en-us-GRMSXEVAL_EN_DVD.iso
+[SQL Server 2012 SP4]:https://download.microsoft.com/download/E/A/B/EABF1E75-54F0-42BB-B0EE-58E837B7A17F/SQLServer2012SP4-KB4018073-x64-ENU.exe
+[SQL Server 2012 SP4 ADV180002 (GDR)]:https://download.microsoft.com/download/F/6/1/F618E667-BA6E-4428-A36A-8B4F5190FCC8/SQLServer2012-KB4057116-x64.exe
+[SQL Server 2008 R2]:https://msdn.microsoft.com/subscriptions/securedownloads/#searchTerm=sql%20server%202008%20r2&ProductFamilyId=0&Languages=en&FileExtensions=.iso&PageSize=10&PageIndex=0&FileId=0
[SQL Server 2008 R2 SP3]:https://download.microsoft.com/download/D/7/A/D7A28B6C-FCFE-4F70-A902-B109388E01E9/ENU/SQLServer2008R2SP3-KB2979597-x64-ENU.exe
[SQL Server 2008 R2 SU]:https://download.microsoft.com/download/4/D/A/4DAE6F9E-960E-4A59-BDE7-1D92DA508315/SQLServer2008R2-KB3045316-x64.exe
[SQL Server 2008]:https://download.microsoft.com/download/D/D/B/DDB17DC1-A879-44DD-BD11-C0991D292AD7/6001.18000.080118-1840_amd64fre_Server_en-us-KRMSXFRE_EN_DVD.exe
@@ -180,46 +218,214 @@ FOR /R "d:\YaDsik\Backup\Distrib\SQL Server" %I IN (*.exe) DO certUtil -hashfile
[SQL Server 2008 SU]:https://download.microsoft.com/download/E/C/0/EC0A7C15-9A6D-4F41-9B9F-BCA10CC3937C/SQLServer2008-KB3045311-x64.exe
-## Internal Database Version and Compatibility Level
-
-| SQL Server Version | Code Name | Release Year | Internal Database Version | Database Compatibility Level |
-|:---------------------------------------------|:------------|-------------:|--------------------------:|-----------------------------:|
-| SQL Server 2016 | ? | 2016 | 782 | 120 |
-| SQL Server 2014 | SQL14 | 2014 | 782 | 120 |
-| SQL Server 2012 | Denali | 2012 | 706 | 110 |
-| SQL Server 2012 CTP1 | Denali | 2010 | 684 | 110 |
-| SQL Server 2008 R2 | Kilimanjaro | 2010 | 660 / 661 | 100 |
-| Azure SQL DB | CloudDB | 2010 | ? | ? |
-| SQL Server 2008 | Katmai | 2008 | 655 | 100 |
-| SQL Server 2005 SP2+ with VarDecimal enabled | Yukon | 2005 | 612 | 90 |
-| SQL Server 2005 | Yukon | 2005 | 611 | 90 |
-| SQL Server 2000 | Shiloh | 2000 | 539 | 80 |
-| SQL Server 7.0 | Sphinx | 1998 | 515 | 70 |
-| SQL Server 6.5 | Hydra | 1996 | 408 | 65 |
-| SQL Server 6.0 | SQL95 | 1995 | ? | 60 |
-| SQL Server 4.21 | SQLNT | 1993 | ? | 60 |
-| SQL Server 1.1 (16 bit) | ? | 1991 | ? | 60 |
-| SQL Server 1.0 (16 bit) | Ashton-Tate | 1989 | ? | 60 |
-
-
-## Quick summary for SQL Server Service Packs
-
-| Version | Codename | RTM (no SP) | SP1 | SP2 | SP3 | SP4 |
-|:-------------------|:------------|:-------------|:--------------------------------|:--------------------------------|:----------------------------------|:--------------------------------|
-| SQL Server 2016 | ? | [RC3] | | | | |
-| SQL Server 2014 | SQL14 | 12.0.2000.8 | [12.0.4100.1] 12.1.4100.1 | | | |
-| SQL Server 2012 | Denali | 11.0.2100.60 | [11.0.3000.0] 11.1.3000.0 | [11.0.5058.0] | [11.0.6020.0] | |
-| SQL Server 2008 R2 | Kilimanjaro | 10.50.1600.1 | [10.50.2500.0] 10.51.2500.0 | [10.50.4000.0] 10.52.4000.0 | [10.50.6000.34] 10.53.6000.34 | |
-| SQL Server 2008 | Katmai | 10.0.1600.22 | [10.0.2531.0] 10.1.2531.0 | [10.0.4000.0] 10.2.4000.0 | [10.0.5500.0] 10.3.5500.0 | [10.0.6000.29] 10.4.6000.29 |
-| SQL Server 2005 | Yukon | 9.0.1399.06 | [9.0.2047] | [9.0.3042] | [9.0.4035] | [9.0.5000] |
-| SQL Server 2000 | Shiloh | 8.0.194 | [8.0.384] | [8.0.532] | [8.0.760] | [8.0.2039] |
-| SQL Server 7.0 | Sphinx | 7.0.623 | 7.0.699 | 7.0.842 | 7.0.961 | [7.0.1063] |
-
-[RC3]:https://www.microsoft.com/en-in/evalcenter/evaluate-sql-server-2016
+## SQL Server Developer Edition Info
+
+**Now it is free!!!** [SQL Server Developer Edition Download page](https://my.visualstudio.com/downloads?q=sql%20server%20developer)
+
+For downloading your copy SQL Server Developer Edition you just need to join the [Visual Studio Dev Essentials program](https://www.visualstudio.com/en-us/products/visual-studio-dev-essentials-vs.aspx)
+
+| Edition\Direct Download Link | Release Date | File name | Size, Mb | SHA1 |
+|-----------------------------------------------------------------------------|--------------|------------------------------------------------------------------------------|---------:|------------------------------------------|
+| SQL Server 2017 Developer (x64) - DVD (English) | 2017-10-02 | en_sql_server_2017_developer_x64_dvd_11296168.iso | 1475 | 0280FF6C1447D287A6BD3B86B81E459FE252D17A |
+| SQL Server 2016 Developer with Service Pack 2 (x64) - DVD (English) | 2018-05-22 | en_sql_server_2016_developer_with_service_pack_2_x64_dvd_12194995.iso | 2800 | 74279286C2ABFBA9E9FF6DBEE60B71669BD234D2 |
+| SQL Server 2016 Developer (x64) - DVD (English) | 2016-06-01 | en_sql_server_2016_developer_x64_dvd_8777069.iso | 2100 | 1B23982FE56DF3BFE0456BDF0702612EB72ABF75 |
+| SQL Server 2014 Developer Edition with Service Pack 1 (x64) - DVD (English) | 2015-05-21 | en_sql_server_2014_developer_edition_with_service_pack_1_x64_dvd_6668542.iso | 3025 | BFEE1F300C39638DA0D2CD594636698C6207C852 |
+| SQL Server 2014 Developer Edition with Service Pack 1 (x86) - DVD (English) | 2015-05-21 | en_sql_server_2014_developer_edition_with_service_pack_1_x86_dvd_6668541.iso | 2462 | ED3C70507A73BCC63D67CFA272CD849B9418A18E |
+| SQL Server 2014 Developer Edition (x64) - DVD (English) | 2014-04-01 | en_sql_server_2014_developer_edition_x64_dvd_3940406.iso | 2486 | F73F430F55A71DA219FC7257A3A28E8FC142530F |
+| SQL Server 2014 Developer Edition (x86) - DVD (English) | 2014-04-01 | en_sql_server_2014_developer_edition_x86_dvd_3938200.iso | 2039 | 395B35FD80AA959B02B0C399DA1BB0C020DB6310 |
+
+
+## SQL Server Express direct download links
+
+Original post written by Scott Hanselman: http://www.hanselman.com/blog/DownloadSQLServerExpress.aspx
+Official Microsoft SQL Server Express page: https://www.microsoft.com/en-us/server-cloud/products/sql-server-editions/sql-server-express.aspx
+
+
+### [Download SQL Server 2017 Express](https://www.microsoft.com/en-us/download/details.aspx?id=55994)
+
+### [Download SQL Server 2016 Express](https://www.microsoft.com/en-us/download/details.aspx?id=52679)
+
+
+### [Download SQL Server 2014 Express](http://www.microsoft.com/en-us/download/details.aspx?id=42299)
+[Download Microsoft SQL Server 2014 Service Pack 1 (SP1) Express ](https://www.microsoft.com/en-us/download/details.aspx?id=46697)
+You likely just want SQL Server 2014 Express with Tools. This download includes SQL Management Studio:
+ - [SQL Server 2014 Express x64](http://download.microsoft.com/download/E/A/E/EAE6F7FC-767A-4038-A954-49B8B05D04EB/ExpressAndTools%2064BIT/SQLEXPRWT_x64_ENU.exe)
+ - [SQL Server 2014 Express x86](http://download.microsoft.com/download/E/A/E/EAE6F7FC-767A-4038-A954-49B8B05D04EB/ExpressAndTools%2032BIT/SQLEXPRWT_x86_ENU.exe)
+
+Here's just SQL Server 2014 Management Studio:
+ - [SQL Management Studio x64](http://download.microsoft.com/download/E/A/E/EAE6F7FC-767A-4038-A954-49B8B05D04EB/MgmtStudio%2064BIT/SQLManagementStudio_x64_ENU.exe)
+ - [SQL Management Studio x86](http://download.microsoft.com/download/E/A/E/EAE6F7FC-767A-4038-A954-49B8B05D04EB/MgmtStudio%2032BIT/SQLManagementStudio_x86_ENU.exe)
+
+SQL Server 2014 Express with Advanced Services:
+ - [Advanced Services x64](http://download.microsoft.com/download/E/A/E/EAE6F7FC-767A-4038-A954-49B8B05D04EB/ExpressAdv%2064BIT/SQLEXPRADV_x64_ENU.exe)
+ - [Advanced Services x86](http://download.microsoft.com/download/E/A/E/EAE6F7FC-767A-4038-A954-49B8B05D04EB/ExpressAdv%2032BIT/SQLEXPRADV_x86_ENU.exe)
+
+
+### [Download SQL Server 2012 Express](http://www.microsoft.com/en-us/download/details.aspx?id=29062)
+[Download Microsoft SQL Server 2012 Service Pack 1 (SP1) Express ](https://www.microsoft.com/en-us/download/details.aspx?id=35579)
+You likely just want SQL Server 2012 Express with Tools. This download includes SQL Management Studio:
+ - [SQL Server 2012 Express x64](http://download.microsoft.com/download/8/D/D/8DD7BDBA-CEF7-4D8E-8C16-D9F69527F909/ENU/x64/SQLEXPRWT_x64_ENU.exe)
+
+Here's just SQL Server 2012 Management Studio:
+ - [SQL Management Studio x64](http://download.microsoft.com/download/8/D/D/8DD7BDBA-CEF7-4D8E-8C16-D9F69527F909/ENU/x64/SQLManagementStudio_x64_ENU.exe)
+ - [SQL Management Studio x86](http://download.microsoft.com/download/8/D/D/8DD7BDBA-CEF7-4D8E-8C16-D9F69527F909/ENU/x86/SQLManagementStudio_x86_ENU.exe)
+
+
+### [Download SQL Server 2008 Express R2 SP2](http://www.microsoft.com/en-us/download/details.aspx?id=30438)
+You likely just want SQL Server 2008 Express with Tools. This download includes SQL Management Studio:
+ - [SQL Server 2008 Express x64](http://download.microsoft.com/download/0/4/B/04BE03CD-EAF3-4797-9D8D-2E08E316C998/SQLEXPRWT_x64_ENU.exe)
+ - [SQL Server 2008 Express x86](http://download.microsoft.com/download/0/4/B/04BE03CD-EAF3-4797-9D8D-2E08E316C998/SQLEXPRWT_x86_ENU.exe)
+
+Here's just SQL Server 2008 Management Studio:
+ - [SQL Management Studio x64](http://download.microsoft.com/download/0/4/B/04BE03CD-EAF3-4797-9D8D-2E08E316C998/SQLManagementStudio_x64_ENU.exe)
+ - [SQL Management Studio x86](http://download.microsoft.com/download/0/4/B/04BE03CD-EAF3-4797-9D8D-2E08E316C998/SQLManagementStudio_x86_ENU.exe)
+
+
+### [Download SQL Server 2005 Express](https://www.microsoft.com/en-us/download/details.aspx?id=21844)
+
+
+## Internal Database Version and Compatibility Level
+
+
+### Database Compatibility Level
+The compatibility level of a database dictates how certain language elements of the database function as it relates to an earlier version of SQL Server.
+In a nutshell, this offers up partial “backward compatibility” to an earlier version.
+This functionality is not all encompassing as only certain aspects (i.e. certain syntax) of the database would pertain to this setting.
+
+You can see what compatibility level a database is at by using the SSMS or via code.
+
+Via SSMS:
+ 1. After connecting to the appropriate instance of the SQL Server Database Engine, in Object Explorer, click the server name.
+ 2. Expand **Databases**, and, depending on the database, either select a user database or expand **System Databases** and select a system database.
+ 3. Right-click the database, and then click **Properties**. The **Database Properties** dialog box opens.
+ 4. In the **Select a page** pane, click **Options**. The current compatibility level is displayed in the **Compatibility level** list box.
+ 5. To change the compatibility level, select a different option from the list. The choices are **SQL Server 2008 (100)**, **SQL Server 2012 (110)** or **SQL Server 2014 (120)**.
+
+Via T-SQL:
+```sql
+-- For SQL Server 2005 and newer
+SELECT name, compatibility_level FROM sys.databases WHERE name = 'DatabaseNameHere';
+
+-- For SQL Server 2000
+SELECT name, cmptlevel FROM sysdatabases WHERE name = 'DatabaseNameHere';
+```
+
+To ALTER DATABASE Compatibility Level use simple command:
+```sql
+ALTER DATABASE database_name SET COMPATIBILITY_LEVEL = { 150 | 140 | 130 | 120 | 110 | 100 | 90 }
+```
+
+### Internal Database Version and Compatibility level
+[The Importance of Database Compatibility Level in SQL Server](https://www.sqlskills.com/blogs/glenn/the-importance-of-database-compatibility-level-in-sql-server/)
+
+The database version is a number stamped in the boot page of a database that indicates the SQL Server version of the most recent SQL Server instance the database was attached to.
+**The database version number does not equal the SQL Server version and does not equal the compatibility level should be considered as a completely different attribute of the database.**
+
+The database version is an internal versioning system that defines what version of SQL Server the database was a recent resident of.
+If you migrate a database from an older version to a newer version, the database version value will be increased to reflect the version number of the new server’s model database.
+
+When you create a database, the database version is "stamped" with the same version as the **Model** database.
+It is worth noting that if the **Model** database was originally created on a different server edition and then subsequently upgraded, you potentially could end up
+with slightly different numbers than what you might expect.
+As you upgrade the database to new SQL Server edition (you can not go backward) the version of the database increases.
+This is done automatically regardless of what method you use to upgrade the database to the new version of SQL Server.
+
+```sql
+-- 1 using DBCC PAGE to look at the boot page (9) of the database
+DBCC TRACEON(3604);
+DBCC PAGE('DatabaseName', 1, 9, 3);
+DBCC TRACEOFF(3604);
+GO
+
+-- 2 using DBCC DBINFO
+DBCC TRACEON(3604);
+DBCC DBINFO;
+DBCC TRACEOFF(3604);
+GO
+
+-- 3 using database property
+SELECT DatabaseProperty('DatabaseNameHere','version');
+GO
+
+-- 4 using RESTORE HEADERONLY for backup files, field DatabaseVersion
+RESTORE HEADERONLY FROM DISK=N'd:\DatabseBackupFile.bak' WITH NOUNLOAD;
+GO
+```
+
+You will note that for each DBCC command we have to turn on [trace flag 3604](https://rebrand.ly/gh-sqlserver-trace-flags#3604) so that the output of the DBCC command is sent to the SSMS window rather than the default location, the SQL Server log.
+
+If you are still on SQL Serever 2000, you can see this information with a simple query:
+```sql
+SELECT name, version FROM master.dbo.sysdatabases;
+```
+
+Execute the following query to determine the version of the Database Engine that you are connected to:
+```sql
+SELECT SERVERPROPERTY('ProductVersion');
+```
+
+| SQL Server Version | Database Engine | Code Name | Release Year | Internal Database Version | Compatibility Level Designation | Supported Compatibility Level |
+|:---------------------------------------------|----------------:|:-------------|-------------:|--------------------------:|--------------------------------:|------------------------------:|
+| SQL Server 2019 | 15 | 2019 | 2018 | 895 | 150 | 150, 140, 130, 120, 110 |
+| SQL Server 2017 | 14 | 2017 | 2017 | 869 | 140 | 140, 130, 120, 110, 100 |
+| SQL Server 2016 | 13 | 2016 | 2016 | 852 | 130 | 130, 120, 110, 100 |
+| Azure SQL Database | 14 | CloudDB | 2010 (2018) | 862 | 140 | 140, 130, 120, 110, 100 |
+| SQL Server 2014 | 12 | SQL14 | 2014 | 782 | 120 | 120, 110, 100 |
+| SQL Server 2012 | 11 | Denali | 2012 | 706 | 110 | 110, 100, 90 |
+| SQL Server 2012 CTP1 | 11 | Denali | 2010 | 684 | 110 | 110, 100, 90 |
+| SQL Server 2008 R2 | 10.5 | Kilimanjaro | 2010 | 660 / 661 | 100 | 100, 90, 80 |
+| SQL Server 2008 | 10 | Katmai | 2008 | 655 | 100 | 100, 90, 80 |
+| SQL Server 2005 SP2+ with VarDecimal enabled | 9 | Yukon | 2005 | 612 | 90 | 90, 80 |
+| SQL Server 2005 | 9 | Yukon | 2005 | 611 | 90 | 90, 80 |
+| SQL Server 2000 | 8 | Shiloh | 2000 | 539 | 80 | 80 |
+| SQL Server 7.0 | ? | Sphinx | 1998 | 515 | 70 | 70 |
+| SQL Server 6.5 | ? | Hydra | 1996 | 408 | 65 | 65 |
+| SQL Server 6.0 | ? | SQL95 | 1995 | ? | 60 | ? |
+| SQL Server 4.21 | ? | SQLNT | 1993 | ? | 60 | ? |
+| SQL Server 1.1 (16 bit) | ? | ? | 1991 | ? | 60 | ? |
+| SQL Server 1.0 (16 bit) | ? | Ashton-Tate | 1989 | ? | 60 | ? |
+
+**Azure SQL Database V12** was released in December 2014. One aspect of that release was that newly created databases had their compatibility level set to 120. In 2015 SQL Database began support for level 130, although the default remained 120.
+
+Starting in mid-June 2016, in Azure SQL Database, the default compatibility level will be 130 instead of 120 for newly created databases. Existing databases created before mid-June 2016 will not be affected, and will maintain their current compatibility level (100, 110, or 120).
+
+If you want level 130 for your database generally, but you have reason to prefer the level 110 cardinality estimation algorithm, see [ALTER DATABASE SCOPED CONFIGURATION (Transact-SQL)](https://msdn.microsoft.com/en-us/library/mt629158.aspx), and in particular its keyword LEGACY_CARDINALITY_ESTIMATION =ON.
+
+For details about how to assess the performance differences of your most important queries, between two compatibility levels on Azure SQL Database, see [Improved Query Performance with Compatibility Level 130 in Azure SQL Database](http://azure.microsoft.com/documentation/articles/sql-database-compatibility-level-query-performance-130/).
+
+### References
+ - [Compatibility Level vs Database Version](http://sqlrus.com/2014/10/compatibility-level-vs-database-version/) (by John Morehouse)
+ - [What’s the difference between database version and database compatibility level?](https://blogs.msdn.microsoft.com/sqlserverstorageengine/2007/04/26/whats-the-difference-between-database-version-and-database-compatibility-level/) (by Paul Randal)
+ - [ALTER DATABASE Compatibility Level (Transact-SQL)](https://msdn.microsoft.com/library/bb510680(SQL.130).aspx)
+ - [View or Change the Compatibility Level of a Database](https://msdn.microsoft.com/library/bb933794.aspx)
+ - [Database Version vs Database Compatibility Level](http://sqlblog.com/blogs/jonathan_kehayias/archive/2009/07/28/database-version-vs-database-compatibility-level.aspx) (by Jonathan Kehayias)
+
+
+## Quick summary for SQL Server Service Packs
+
+
+| Version | Codename | RTM (no SP) | SP1 | SP2 | SP3 | SP4 |
+|:-------------------|:------------|:----------------|:---------------|:--------------------------------|:----------------------------------|:--------------------------------|
+| SQL Server 2017 | 2017 | [14.0.1000.169] | | | | |
+| SQL Server 2016 | 2016 | [13.0.1601.5] | [13.0.4001.0] | [13.5026.0] | | |
+| SQL Server 2014 | SQL14 | 12.0.2000.8 | [12.0.4100.1] | [12.0.5000.0] | | |
+| SQL Server 2012 | Denali | 11.0.2100.60 | [11.0.3000.0] | [11.0.5058.0] | [11.0.6020.0] | [11.0.7001.0] |
+| SQL Server 2008 R2 | Kilimanjaro | 10.50.1600.1 | [10.50.2500.0] | [10.50.4000.0] 10.52.4000.0 | [10.50.6000.34] 10.53.6000.34 | |
+| SQL Server 2008 | Katmai | 10.0.1600.22 | [10.0.2531.0] | [10.0.4000.0] 10.2.4000.0 | [10.0.5500.0] 10.3.5500.0 | [10.0.6000.29] 10.4.6000.29 |
+| SQL Server 2005 | Yukon | 9.0.1399.06 | [9.0.2047] | [9.0.3042] | [9.0.4035] | [9.0.5000] |
+| SQL Server 2000 | Shiloh | 8.0.194 | [8.0.384] | [8.0.532] | [8.0.760] | [8.0.2039] |
+| SQL Server 7.0 | Sphinx | 7.0.623 | 7.0.699 | 7.0.842 | 7.0.961 | [7.0.1063] |
+
+[14.0.1000.169]:https://www.microsoft.com/en-us/sql-server/sql-server-downloads
+[13.5026.0]:https://go.microsoft.com/fwlink/?LinkID=799011
+[13.0.1601.5]:https://www.microsoft.com/en-in/evalcenter/evaluate-sql-server-2016
+[13.0.4001.0]:https://support.microsoft.com/en-us/kb/3182545
+[12.0.5000.0]:https://support.microsoft.com/en-us/kb/3171021
[12.0.4100.1]:http://www.microsoft.com/en-us/download/details.aspx?id=46694
[11.0.3000.0]:http://www.microsoft.com/en-us/download/details.aspx?id=35575
[11.0.5058.0]:http://www.microsoft.com/en-us/download/details.aspx?id=43340
[11.0.6020.0]:http://www.microsoft.com/en-us/download/details.aspx?id=49996
+[11.0.7001.0]:https://www.microsoft.com/en-us/download/details.aspx?id=56040
[10.50.2500.0]:http://www.microsoft.com/en-us/download/details.aspx?id=26727
[10.50.4000.0]:http://www.microsoft.com/en-us/download/details.aspx?id=30437
[10.50.6000.34]:http://www.microsoft.com/en-us/download/details.aspx?id=44271
@@ -238,100 +444,399 @@ FOR /R "d:\YaDsik\Backup\Distrib\SQL Server" %I IN (*.exe) DO certUtil -hashfile
[7.0.1063]:https://www.microsoft.com/en-us/download/details.aspx?id=7959
-## Microsoft SQL Server 2016 Builds
-Here is the latest output from `SELECT @@VERSION`:
+## Microsoft SQL Server 2019 Builds
+
+More additional information about latest vNext SQL Server release you can find in this articles:
+ - [What's new in SQL Server 2019](https://docs.microsoft.com/en-us/sql/sql-server/what-s-new-in-sql-server-ver15?view=sql-server-ver15#utf-8-support)
+ - [What's New in the First Public CTP of SQL Server 2019](https://www.mssqltips.com/sqlservertip/5710/whats-new-in-the-first-public-ctp-of-sql-server-2019/)
+ - [Froid: How SQL Server vNext Might Fix the Scalar Functions Problem](https://www.brentozar.com/archive/2018/01/froid-sql-server-vnext-might-fix-scalar-functions-problem/)
+ - [What’s New in SQL Server 2019 System Tables](https://www.brentozar.com/archive/2018/09/whats-new-in-sql-server-2019-system-tables/)
+ - [What’s New in SQL Server 2019’s sys.messages: More Unannounced Features](https://www.brentozar.com/archive/2018/09/whats-new-in-sql-server-2019s-sys-messages-more-unannounced-features/)
+ - [What’s New in SQL Server 2019: Faster Table Variables (And New Parameter Sniffing Issues)](https://www.brentozar.com/archive/2018/09/sql-server-2019-faster-table-variables-and-new-parameter-sniffing-issues/)
+ - [What’s New in SQL Server 2019: Adaptive Memory Grants](https://www.brentozar.com/archive/2018/09/whats-new-in-sql-server-2019-adaptive-memory-grants/)
+ - [Leaked: SQL Server 2019 Big Data Clusters Introduction Video](https://www.brentozar.com/archive/2018/09/leaked-sql-server-2019-big-data-clusters-introduction-video/)
+ - [Native UTF-8 Support in SQL Server 2019: Savior, False Prophet, or Both?](https://sqlquantumleap.com/2018/09/28/native-utf-8-support-in-sql-server-2019-savior-false-prophet-or-both/)
+
+Here is the latest output from `SELECT @@VERSION` for SQL Server 2019 CTP Developer Edition:
+
+```
+Microsoft SQL Server 2019 (CTP2.1) - 15.0.1100.94 (X64)
+ Nov 1 2018 14:35:49
+ Copyright (C) 2018 Microsoft Corporation
+ Developer Edition (64-bit) on…
+```
+
+| Build | File version | Branch | Type | KB / Description | Release Date | Build Date | Fixes | Public | Size, Mb |
+|---------------|-------------------|--------|------|----------------------------------- |--------------|------------|------:|-------:|---------:|
+| 15.0.1200.24 | 2018.150.1200.24 | CTP | CTP | [Microsoft SQL Server 2019 CTP2.2] | 2018-12-11 | 2018-11-02 | | | 1302 |
+| 15.0.1100.94 | 2018.150.1100.34 | CTP | CTP | Microsoft SQL Server 2019 CTP2.1 | 2018-11-06 | 2018-11-02 | | | 1299 |
+| 15.0.1000.34 | 2018.150.1000.34 | CTP | CTP | Microsoft SQL Server 2019 CTP2.0 | 2018-09-24 | 2018-09-18 | | | 1532 |
+
+[Microsoft SQL Server 2019 CTP2.2]:https://www.microsoft.com/en-us/sql-server/sql-server-2019#Install
+
+
+## Microsoft SQL Server 2017 Builds
+
+
+All SQL Server 2017 CU downloads: [Catalog Update Microsoft SQL Server 2017](http://www.catalog.update.microsoft.com/Search.aspx?q=sql%20server%202017)
+
+Here is the latest output from `SELECT @@VERSION` for SQL Server 2017 Developer Edition:
+
+```
+Microsoft SQL Server 2017 (RTM-CU13-OD) (KB4483666) - 14.0.3049.1 (X64)
+ Dec 15 2018 11:16:42
+ Copyright (C) 2017 Microsoft Corporation
+ Developer Edition (64-bit) on …
+```
+
+Useful articles:
+ - [Release notes for SQL Server 2017 on Linux](https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-release-notes)
+ - [How I spot not-yet-documented features in SQL Server CTPs](https://blogs.sentryone.com/aaronbertrand/fishing-for-features-in-ctps/)
+ - [More ways to discover changes in new versions of SQL Server](https://blogs.sentryone.com/aaronbertrand/more-changes-sql-server/)
+
+| Build | File version | Branch | Type | KB / Description | Release Date | Build Date | Fixes | Public | Size, Mb |
+|---------------|-------------------|--------|------|----------------------------------------------------------------------------------------------------------|--------------|------------|------:|-------:|---------:|
+| 14.0.3049.1 | 2017.140.3049.1 | RTM | COD | [4483666 On-demand hotfix update package for SQL Server 2017 CU13] | 2018-01-09 | 2018-12-15 | 3 | 3 | 488 |
+| 14.0.3048.4 | 2017.140.3048.4 | RTM | CU | **Withdrawn** [4466404 Microsoft SQL Server 2017 CU13] | 2018-12-18 | 2018-12-01 | 62 | 50 | 488 |
+| 14.0.3045.24 | 2017.140.3045.24 | RTM | CU | [4464082 Microsoft SQL Server 2017 CU12] | 2018-10-24 | 2018-10-19 | 22 | 18 | 488 |
+| 14.0.3038.14 | 2017.140.3038.14 | RTM | CU | [4462262 Microsoft SQL Server 2017 CU11] | 2018-09-20 | 2018-09-14 | 21 | 14 | 487 |
+| 14.0.3037.1 | 2017.140.3037.1 | RTM | CU | [4342123 Microsoft SQL Server 2017 CU10] | 2018-08-27 | 2018-07-27 | 30 | 22 | 486 |
+| 14.0.3035.2 | 2017.140.3035.2 | RTM | COD | [4293805 Security update for SQL Server 2017 CU: August 14, 2018] **CVE-2018-8273** | 2018-08-14 | 2018-07-07 | 1 | 1 | 486 |
+| 14.0.3030.27 | 2017.140.3030.27 | RTM | CU | [4341265 Microsoft SQL Server 2017 CU9] | 2018-07-18 | 2018-06-30 | 27 | 18 | 486 |
+| 14.0.3029.16 | 2017.140.3029.16 | RTM | CU | [4338363 Microsoft SQL Server 2017 CU8] | 2018-06-21 | 2018-06-13 | 60 | 31 | 475 |
+| 14.0.3026.27 | 2017.140.3026.27 | RTM | CU | [4229789 Microsoft SQL Server 2017 CU7] | 2018-05-24 | 2018-05-10 | 47 | 28 | 473 |
+| 14.0.3025.34 | 2017.140.3025.34 | RTM | CU | [4101464 Microsoft SQL Server 2017 CU6] | 2018-04-19 | 2018-03-03 | 39 | 39 | 473 |
+| 14.0.3023.8 | 2017.140.3023.8 | RTM | CU | [4092643 Microsoft SQL Server 2017 CU5] | 2018-03-20 | 2018-03-03 | 22 | 13 | 472 |
+| 14.0.3022.28 | 2017.140.3022.28 | RTM | CU | [4056498 Microsoft SQL Server 2017 CU4] | 2018-02-20 | 2018-02-10 | 81 | 55 | 472 |
+| 14.0.3015.40 | 2017.140.3015.40 | RTM | CU | [4052987 Microsoft SQL Server 2017 CU3] | 2017-01-03 | 2017-12-23 | 14 | 13 | 459 |
+| 14.0.3008.27 | 2017.140.3008.27 | RTM | CU | [4052574 Microsoft SQL Server 2017 CU2] | 2017-11-28 | 2017-11-16 | 56 | 33 | 276 |
+| 14.0.3006.16 | 2017.140.3006.16 | RTM | CU | [4038634 Microsoft SQL Server 2017 CU1] | 2017-10-24 | 2017-10-19 | 72 | 68 | 250 |
+| 14.0.2002.14 | 2017.140.2002.14 | RTM | COD | [4293803 Security update for SQL Server 2017 GDR: August 14, 2018] **CVE-2018-8273** | 2018-08-14 | 2018-07-21 | 1 | 1 | 433 |
+| 14.0.2000.63 | 2017.140.2000.63 | RTM | COD | [4057122 Security update for SQL Server 2017 GDR: January 3, 2018] **CVE-2017-5715,2017-5753,2017-5754** | 2018-01-03 | 2017-12-23 | 1 | 1 | 431 |
+| 14.0.1000.169 | 2017.140.1000.169 | RTM | RTM | [Microsoft SQL Server 2017 RTM] | 2017-10-02 | 2017-08-23 | | | 1475 |
+| 14.0.900.75 | 2017.140.900.75 | RC | RC | Microsoft SQL Server 2017 Release Candidate 2 | 2017-08-02 | 2017-07-27 | | | 1473 |
+| 14.0.800.90 | 2017.140.800.90 | RC | RC | Microsoft SQL Server 2017 Release Candidate 1 | 2017-07-17 | 2017-07-11 | | | 1473 |
+| 14.0.600.250 | 2017.140.600.250 | CTP | CTP | Microsoft SQL Server 2017 Community Technology Preview 2.1 (CTP2.1) | 2017-05-17 | 2017-05-10 | | | 1606 |
+| 14.0.500.272 | 2017.140.500.272 | CTP | CTP | Microsoft SQL Server vNext Community Technology Preview 2.0 (CTP2.0) | 2017-04-19 | 2017-04-13 | | | 1721 |
+| 14.0.405.198 | 2017.140.405.198 | CTP | CTP | Microsoft SQL Server vNext Community Technology Preview 1.4 (CTP1.4) | 2017-03-17 | 2017-03-11 | | | 2001 |
+| 14.0.304.138 | 2016.140.304.138 | CTP | CTP | Microsoft SQL Server vNext Community Technology Preview 1.3 (CTP1.3) | 2017-02-17 | 2017-02-14 | | | 1978 |
+| 14.0.200.24 | 2016.140.200.24 | CTP | CTP | Microsoft SQL Server vNext Community Technology Preview 1.2 (CTP1.2) | 2017-01-18 | 2017-01-11 | | | 1975 |
+| 14.0.100.187 | 2016.140.100.187 | CTP | CTP | Microsoft SQL Server vNext Community Technology Preview 1.1 (CTP1.1) | 2016-12-16 | 2016-12-11 | | | 1975 |
+| 14.0.1.246 | 2016.140.1.246 | CTP | CTP | Microsoft SQL Server vNext Community Technology Preview 1 (CTP1) | 2016-11-16 | 2016-11-02 | | | 1983 |
+
+[4483666 On-demand hotfix update package for SQL Server 2017 CU13]:https://support.microsoft.com/help/4483666
+[4466404 Microsoft SQL Server 2017 CU13]:https://support.microsoft.com/help/4466404
+[4464082 Microsoft SQL Server 2017 CU12]:https://support.microsoft.com/help/4464082
+[4462262 Microsoft SQL Server 2017 CU11]:https://support.microsoft.com/help/4462262
+[4342123 Microsoft SQL Server 2017 CU10]:https://support.microsoft.com/help/4342123
+[4293805 Security update for SQL Server 2017 CU: August 14, 2018]:https://support.microsoft.com/help/4293805
+[4341265 Microsoft SQL Server 2017 CU9]:https://support.microsoft.com/help/4341265
+[4338363 Microsoft SQL Server 2017 CU8]:https://support.microsoft.com/help/4338363
+[4229789 Microsoft SQL Server 2017 CU7]:https://support.microsoft.com/help/4229789
+[4101464 Microsoft SQL Server 2017 CU6]:https://support.microsoft.com/help/4101464
+[4092643 Microsoft SQL Server 2017 CU5]:https://support.microsoft.com/help/4092643
+[4056498 Microsoft SQL Server 2017 CU4]:https://support.microsoft.com/help/4056498
+[4052987 Microsoft SQL Server 2017 CU3]:https://support.microsoft.com/help/4052987
+[4052574 Microsoft SQL Server 2017 CU2]:https://support.microsoft.com/help/4052574
+[4038634 Microsoft SQL Server 2017 CU1]:https://support.microsoft.com/help/4038634
+[4293803 Security update for SQL Server 2017 GDR: August 14, 2018]:https://support.microsoft.com/help/4293803
+[4057122 Security update for SQL Server 2017 GDR: January 3, 2018]:https://support.microsoft.com/help/4057122
+[Microsoft SQL Server 2017 RTM]:https://www.microsoft.com/sql-server/sql-server-downloads
+
+
+
+## Microsoft SQL Server 2016 Builds
+
+All SQL Server 2016 CU downloads: [Catalog Update Microsoft SQL Server 2016](http://www.catalog.update.microsoft.com/Search.aspx?q=sql%20server%202016)
+
+Here is the latest output from `SELECT @@VERSION` for SQL Server 2016 Developer Edition on Windows:
+```
+Microsoft SQL Server 2016 (SP2-CU5) (KB4475776) - 13.0.5264.1 (X64)
+ Jan 10 2019 18:51:38
+ Copyright (c) Microsoft Corporation
+ Developer Edition (64-bit) on …
```
-Microsoft SQL Server 2016 (RC3) - 13.0.1400.361 (X64)
- Apr 9 2016 01:59:22
- Copyright (c) Microsoft Corporation
- Developer Edition (64-bit) on ...
+
+| Build | File version | Branch | Type | KB / Description | Release Date | Build Date | Fixes | Public | Size, Mb |
+|---------------|-------------------|--------|------|--------------------------------------------------------------------------------------------------------------------------------|--------------|------------|------:|-------:|---------:|
+| 13.0.5264.1 | 2015.130.5264.1 | SP2 | CU | [4475776 Cumulative Update 5 for SQL Server 2016 SP2] | 2019-01-23 | 2019-01-11 | 52 | 43 | 712 |
+| 13.0.5239.0 | 2015.130.5239.0 | SP2 | COD | [4482972 On-demand hotfix update package 2 for SQL Server 2016 SP2 CU4] | 2018-12-20 | 2018-12-03 | 3 | 3 | 690 |
+| 13.0.5233.0 | 2015.130.5233.0 | SP2 | CU | [4464106 Cumulative Update 4 for SQL Server 2016 SP2] | 2018-11-13 | 2018-11-03 | 42 | 36 | 690 |
+| 13.0.5216.0 | 2015.130.5216.0 | SP2 | CU | [4458871 Cumulative Update 3 for SQL Server 2016 SP2] | 2018-09-21 | 2018-09-14 | 41 | 27 | 688 |
+| 13.0.5201.2 | 2015.131.5201.2 | SP2 | CU | [4458621 Security update for SQL Server 2016 SP2 CU: August 19, 2018] **CVE-2018-8273** | 2018-08-19 | 2018-08-18 | 1 | 0 | 672 |
+| 13.0.5161.0 | 2015.131.5161.0 | SP2 | CU | **Withdrawn** [4293807 Security update for SQL Server 2016 SP2 (CU): August 14, 2018] **CVE-2018-8273** | 2018-08-14 | 2018-07-18 | 1 | 0 | 672 |
+| 13.0.5153.0 | 2015.130.5153.0 | SP2 | CU | [4340355 Cumulative Update 2 for SQL Server 2016 SP2] | 2018-07-16 | 2018-06-29 | 29 | 21 | 671 |
+| 13.0.5149.0 | 2015.130.5149.0 | SP2 | CU | [4135048 Cumulative Update 1 for SQL Server 2016 SP2] | 2018-05-30 | 2018-05-19 | 45 | 28 | 549 |
+| 13.0.5081.1 | 2015.131.5081.1 | SP2 | COD | [4293802 Security update for SQL Server 2016 SP2 GDR: August 14, 2018] **CVE-2018-8273** | 2018-05-30 | 2018-05-19 | 1 | 0 | 492 |
+| 13.0.5026.0 | 2015.130.5026.0 | SP2 | SP | [4052908 SQL Server 2016 Service Pack 2 release information] | 2018-04-24 | 2018-03-18 | 50 | 50 | 774 |
+| 13.0.4550.1 | 2015.130.4550.1 | SP1 | CU | [4475775 Cumulative Update 13 for SQL Server 2016 SP1] | 2019-01-23 | 2019-01-11 | 12 | 9 | 761 |
+| 13.0.4541.0 | 2015.130.4541.0 | SP1 | CU | [4464343 Cumulative Update 12 for SQL Server 2016 SP1] | 2018-11-13 | 2018-10-27 | 21 | 16 | 761 |
+| 13.0.4531.0 | 2015.130.4531.0 | SP1 | COD | [4465443 FIX: The "modification_counter" in DMV sys.dm_db_stats_properties shows incorrect value when partitions are merged] | 2018-09-27 | 2018-09-22 | 1 | 1 | 759 |
+| 13.0.4528.0 | 2015.130.4528.0 | SP1 | CU | [4459676 Cumulative Update 11 for SQL Server 2016 SP1] | 2018-09-18 | 2018-08-31 | 14 | 8 | 762 |
+| 13.0.4522.0 | 2015.130.4522.0 | SP1 | CU | **Withdrawn** [4293808 Security update for SQL Server 2016 SP1 (CU): August 14, 2018] **CVE-2018-8273** | 2018-08-14 | 2018-07-18 | 1 | 0 | 774 |
+| 13.0.4514.0 | 2015.130.4514.0 | SP1 | CU | [4341569 Cumulative Update 10 for SQL Server 2016 SP1] | 2018-07-16 | 2018-06-23 | 26 | 21 | 761 |
+| 13.0.4502.0 | 2015.130.4502.0 | SP1 | CU | [4100997 Cumulative Update 9 for SQL Server 2016 SP1] | 2018-05-30 | 2018-05-15 | 39 | 25 | 761 |
+| 13.0.4474.0 | 2015.130.4474.0 | SP1 | CU | [4077064 Cumulative Update 8 for SQL Server 2016 SP1] | 2018-03-19 | 2018-02-24 | 57 | 37 | 760 |
+| 13.0.4466.4 | 2015.130.4466.4 | SP1 | CU | [4057119 Cumulative Update 7 for SQL Server 2016 SP1] | 2018-01-03 | 2017-11-09 | 15 | 14 | 758 |
+| 13.0.4457.0 | 2015.130.4457.0 | SP1 | CU | [4037354 Cumulative Update 6 for SQL Server 2016 SP1] | 2017-11-21 | 2017-11-09 | 55 | 41 | 689 |
+| 13.0.4451.0 | 2015.130.4451.0 | SP1 | CU | [4040714 Cumulative Update 5 for SQL Server 2016 SP1] | 2017-09-18 | 2017-09-06 | 49 | 44 | 689 |
+| 13.0.4446.0 | 2015.130.4446.0 | SP1 | CU | [4024305 Cumulative Update 4 for SQL Server 2016 SP1] | 2017-08-08 | 2017-07-16 | 63 | 49 | 534 |
+| 13.0.4435.0 | 2015.130.4435.0 | SP1 | CU | [4019916 Cumulative Update 3 for SQL Server 2016 SP1] | 2017-05-15 | 2017-04-27 | 70 | 57 | 534 |
+| 13.0.4422.0 | 2015.130.4422.0 | SP1 | CU | [4013106 Cumulative Update 2 for SQL Server 2016 SP1] | 2017-03-20 | 2017-03-06 | 117 | 100 | 415 |
+| 13.0.4411.0 | 2015.130.4411.0 | SP1 | CU | [3208177 Cumulative update 1 for SQL Server 2016 Service Pack 1] | 2017-01-18 | 2017-01-06 | 63 | 55 | 439 |
+| 13.0.4224.16 | 2015.130.4224.16 | SP1 | CU | [4458842 Security update for SQL Server 2016 SP1 GDR: August 22, 2018] **CVE-2018-8273** | 2018-08-22 | | 1 | 0 | 700 |
+| 13.0.4223.10 | 2015.130.4223.10 | SP1 | CU | **Withdrawn** [4293801 Security update for SQL Server 2016 SP1 GDR: August 14, 2018] **CVE-2018-8273** | 2018-08-14 | | 1 | 0 | |
+| 13.0.4210.6 | 2015.130.4210.6 | SP1 | CU | [4057118 Description of the security update for SQL Server 2016 SP1 GDR: January 3, 2018] **CVE-2017-5715,2017-5753,2017-5754**|2018-01-03 | | 1 | 0 | 696 |
+| 13.0.4206.0 | 2015.130.4206.0 | SP1 | COD | [4019089 Description of the security update for SQL Server 2016 Service Pack 1 GDR: August 8, 2017] | 2017-07-16 | | 1 | 1 | 364 |
+| 13.0.4202.0 | 2015.130.4202.0 | SP1 | COD | [3210089 GDR update package for SQL Server 2016 SP1] | 2016-12-16 | 2016-12-13 | 3 | 3 | 378 |
+| 13.0.4199.0 | 2015.130.4199.0 | SP1 | COD | [3207512 Important update for SQL Server 2016 SP1 Reporting Services] | 2016-11-23 | 2016-11-18 | 2 | 2 | 521 |
+| 13.0.4001.0 | 2015.130.4001.0 | SP1 | SP | [3182545 SQL Server 2016 Service Pack 1 release information] | 2016-11-16 | 2016-10-29 | 33 | 33 | 552 |
+| 13.0.2218.0 | 2015.130.2218.0 | RTM | COD | [4058559 Security update for SQL Server 2016 CU: January 6, 2018] **CVE-2017-5715,2017-5753,2017-5754** | 2018-01-06 | | | | 918 |
+| 13.0.2216.0 | 2015.130.2216.0 | RTM | CU | [4037357 Cumulative Update 9 for SQL Server 2016] | 2017-11-21 | 2017-11-09 | 26 | 21 | 865 |
+| 13.0.2213.0 | 2015.130.2213.0 | RTM | CU | [4040713 Cumulative Update 8 for SQL Server 2016] | 2017-09-18 | 2017-09-06 | 19 | 17 | 864 |
+| 13.0.2210.0 | 2015.130.2210.0 | RTM | CU | [4024304 Cumulative Update 7 for SQL Server 2016] | 2017-08-08 | 2017-07-16 | 33 | 30 | 815 |
+| 13.0.2204.0 | 2015.130.2204.0 | RTM | CU | [4019914 Cumulative Update 6 for SQL Server 2016] | 2017-05-15 | 2017-04-20 | 28 | 22 | 814 |
+| 13.0.2197.0 | 2015.130.2197.0 | RTM | CU | [4013105 Cumulative Update 5 for SQL Server 2016] | 2017-03-20 | 2017-02-25 | 56 | 47 | 700 |
+| 13.0.2193.0 | 2015.130.2193.0 | RTM | CU | [3205052 Cumulative update 4 for SQL Server 2016] | 2017-01-18 | 2017-01-06 | 65 | 57 | 699 |
+| 13.0.2190.2 | 2015.130.2190.2 | RTM | COD | [3210110 On-demand hotfix update package for SQL Server 2016 CU3] | 2016-12-16 | 2016-12-13 | 3 | 3 | 691 |
+| 13.0.2186.6 | 2015.130.2186.6 | RTM | CU | [3194717 MS16-136: Description of the security update for SQL Server 2016 CU] | 2016-11-08 | 2016-10-31 | 31 | 31 | 691 |
+| 13.0.2186.6 | 2015.130.2186.6 | RTM | CU | [3205413 Cumulative update 3 for SQL Server 2016] **Duplicate KB3194717** | 2016-11-08 | 2016-10-31 | | | 691 |
+| 13.0.2170.0 | 2015.130.2170.0 | RTM | COD | [3199171 On-demand hotfix update package for SQL Server 2016 CU2] | 2016-11-01 | 2016-10-11 | 4 | 4 | 689 |
+| 13.0.2169.0 | 2015.130.2169.0 | RTM | COD | [3195813 On-demand hotfix update package for SQL Server 2016 CU2] | 2016-10-26 | 2016-10-05 | 4 | 4 | 689 |
+| 13.0.2164.0 | 2015.130.2164.0 | RTM | CU | [3182270 Cumulative Update 2 for SQL Server 2016] | 2016-09-22 | 2016-09-09 | 68 | 64 | 689 |
+| 13.0.2149.0 | 2015.130.2149.0 | RTM | CU | [3164674 Cumulative Update 1 for SQL Server 2016] | 2016-07-25 | 2016-07-11 | 192 | 146 | 665 |
+| 13.0.1745.2 | 2015.130.1745.2 | RTM | COD | [4058560 Description of the security update for SQL Server 2016 GDR: January 6, 2018] **CVE-2017-5715,2017-5753,2017-5754** | 2018-01-06 | | | | 687 |
+| 13.0.1742.0 | 2015.130.1742.0 | RTM | COD | [4019088 Security update for SQL Server 2016 RTM GDR: August 8, 2017] **CVE-2017-8516** | 2017-08-08 | | | | 451 |
+| 13.0.1728.2 | 2015.130.1728.2 | RTM | COD | [3210111 GDR update package for SQL Server 2016 RTM] | 2016-12-16 | | | | 339 |
+| 13.0.1722.0 | 2015.130.1722.0 | RTM | COD | [3194716 MS16-136: Description of the security update for SQL Server 2016 GDR] | 2016-11-08 | 2016-10-31 | 3 | 3 | 342 |
+| 13.0.1711.0 | 2015.130.1711.0 | RTM | COD | [3179258 Processing a partition causes data loss on other partitions after the database is restored in SQL Server 2016 (1200)] | 2016-08-17 | 2016-07-30 | | | 282 |
+| 13.0.1708.0 | 2015.130.1708.0 | RTM | COD | [3164398 Critical update for SQL Server 2016 MSVCRT prerequisites] | 2016-06-04 | 2016-06-02 | | | 265 |
+| 13.0.1601.5 | 2015.130.1601.5 | RTM | RTM | [Microsoft SQL Server 2016 RTM] | 2016-06-01 | 2016-04-29 | | | 2050 |
+| 13.0.1400.361 | 2015.130.1400.361 | RC | RC | Microsoft SQL Server 2016 Community Technology Release Candidate 3 (RC3) | 2016-04-15 | 2016-04-09 | | | 2114 |
+| 13.0.1300.275 | 2015.130.1300.275 | RC | RC | Microsoft SQL Server 2016 Community Technology Release Candidate 2 (RC2) | 2016-04-01 | 2016-03-26 | | | 2101 |
+| 13.0.1200.242 | 2015.130.1200.242 | RC | RC | Microsoft SQL Server 2016 Community Technology Release Candidate 1 (RC1) | 2016-03-18 | 2016-03-10 | | | 2083 |
+| 13.0.1100.288 | 2015.130.1100.288 | RC | RC | Microsoft SQL Server 2016 Community Technology Release Candidate 0 (RC0) | 2016-03-07 | 2016-02-29 | | | |
+| 13.0.1000.281 | 2015.130.1000.281 | CTP | CTP | Microsoft SQL Server 2016 Community Technology Preview 3.3 (CTP3.3) | 2016-02-03 | 2016-01-28 | | | |
+| 13.0.900.73 | 2015.130.900.73 | CTP | CTP | Microsoft SQL Server 2016 Community Technology Preview 3.2 (CTP3.2) | 2015-12-17 | 2015-12-10 | | | |
+| 13.0.801.12 | 2015.130.801.12 | CTP | CTP | Microsoft SQL Server 2016 Community Technology Preview 3.1 (CTP3.1 refresh) | 2015-12-05 | 2015-12-01 | | | |
+| 13.0.801.111 | 2015.130.801.111 | CTP | CTP | Microsoft SQL Server 2016 Community Technology Preview 3.1 (CTP3.1) | 2015-11-30 | 2015-11-21 | | | |
+| 13.0.700.242 | 2015.130.700.242 | CTP | CTP | Microsoft SQL Server 2016 Community Technology Preview 3.0 (CTP3.0) | 2015-10-29 | 2015-10-26 | | | |
+| 13.0.600.65 | 2015.130.600.65 | CTP | CTP | Microsoft SQL Server 2016 Community Technology Preview 2.4 (CTP2.4) | 2015-09-30 | 2015-09-20 | | | |
+| 13.0.500.53 | 2015.130.500.53 | CTP | CTP | Microsoft SQL Server 2016 Community Technology Preview 2.3 (CTP2.3) | 2015-08-28 | 2015-08-24 | | | |
+| 13.0.407.1 | 2015.130.407.1 | CTP | CTP | Microsoft SQL Server 2016 Community Technology Preview 2.2 (CTP2.2) | 2015-07-29 | 2015-07-22 | | | |
+| 13.0.400.91 | 2015.130.400.91 | CTP | CTP | Microsoft SQL Server 2016 Community Technology Preview 2.2 (CTP2.2) (withdrawn) | 2015-07-22 | 2015-07-16 | | | |
+| 13.0.300.44 | 2015.130.300.444 | CTP | CTP | Microsoft SQL Server 2016 Community Technology Preview 2.1 (CTP2.1) | 2015-06-14 | 2015-06-12 | | | |
+| 13.0.200.172 | 2015.130.200.172 | CTP | CTP | Microsoft SQL Server 2016 Community Technology Preview 2 (CTP2) | 2015-05-26 | 2015-05-21 | | | |
+
+[4475776 Cumulative Update 5 for SQL Server 2016 SP2]:https://support.microsoft.com/help/4475776
+[4482972 On-demand hotfix update package 2 for SQL Server 2016 SP2 CU4]:https://support.microsoft.com/help/4482972
+[4464106 Cumulative Update 4 for SQL Server 2016 SP2]:https://support.microsoft.com/help/4464106
+[4458871 Cumulative Update 3 for SQL Server 2016 SP2]:https://support.microsoft.com/help/4458871
+[4458621 Security update for SQL Server 2016 SP2 CU: August 19, 2018]:https://support.microsoft.com/help/4458621
+[4293807 Security update for SQL Server 2016 SP2 (CU): August 14, 2018]:https://support.microsoft.com/help/4293807/
+[4340355 Cumulative Update 2 for SQL Server 2016 SP2]:https://support.microsoft.com/help/4340355
+[4135048 Cumulative Update 1 for SQL Server 2016 SP2]:https://support.microsoft.com/help/4135048
+[4293802 Security update for SQL Server 2016 SP2 GDR: August 14, 2018]:https://support.microsoft.com/help/4293802
+[4464343 Cumulative Update 12 for SQL Server 2016 SP1]:https://support.microsoft.com/help/4464343
+[4465443 FIX: The "modification_counter" in DMV sys.dm_db_stats_properties shows incorrect value when partitions are merged]:https://support.microsoft.com/help/4465443/
+[4052908 SQL Server 2016 Service Pack 2 release information]:https://support.microsoft.com/help/4052908
+[4475775 Cumulative Update 13 for SQL Server 2016 SP1]:https://support.microsoft.com/help/4475775
+[4459676 Cumulative Update 11 for SQL Server 2016 SP1]:https://support.microsoft.com/help/4459676
+[4293808 Security update for SQL Server 2016 SP1 (CU): August 14, 2018]:https://support.microsoft.com/help/4293808
+[4341569 Cumulative Update 10 for SQL Server 2016 SP1]:https://support.microsoft.com/help/4341569
+[4100997 Cumulative Update 9 for SQL Server 2016 SP1]:https://support.microsoft.com/help/4100997
+[4077064 Cumulative Update 8 for SQL Server 2016 SP1]:https://support.microsoft.com/help/4077064
+[4057119 Cumulative Update 7 for SQL Server 2016 SP1]:https://support.microsoft.com/help/4057119
+[4037354 Cumulative Update 6 for SQL Server 2016 SP1]:https://support.microsoft.com/help/4037354
+[4040714 Cumulative Update 5 for SQL Server 2016 SP1]:https://support.microsoft.com/help/4040714
+[4024305 Cumulative Update 4 for SQL Server 2016 SP1]:https://support.microsoft.com/help/4024305
+[4019916 Cumulative Update 3 for SQL Server 2016 SP1]:https://support.microsoft.com/help/4019916
+[4013106 Cumulative Update 2 for SQL Server 2016 SP1]:https://support.microsoft.com/help/4013106
+[3208177 Cumulative update 1 for SQL Server 2016 Service Pack 1]:https://support.microsoft.com/help/3208177
+[4458842 Security update for SQL Server 2016 SP1 GDR: August 22, 2018]:https://support.microsoft.com/help/4458842
+[4293801 Security update for SQL Server 2016 SP1 GDR: August 14, 2018]:https://support.microsoft.com/help/4293801
+[4057118 Description of the security update for SQL Server 2016 SP1 GDR: January 3, 2018]:https://support.microsoft.com/help/4057118
+[4019089 Description of the security update for SQL Server 2016 Service Pack 1 GDR: August 8, 2017]:https://support.microsoft.com/help/4019089
+[3210089 GDR update package for SQL Server 2016 SP1]:https://support.microsoft.com/help/3210089
+[3207512 Important update for SQL Server 2016 SP1 Reporting Services]:https://support.microsoft.com/help/3207512
+[3182545 SQL Server 2016 Service Pack 1 release information]:https://support.microsoft.com/help/3182545
+[4058559 Security update for SQL Server 2016 CU: January 6, 2018]:https://support.microsoft.com/help/4058559
+[4037357 Cumulative Update 9 for SQL Server 2016]:https://support.microsoft.com/help/4037357
+[4040713 Cumulative Update 8 for SQL Server 2016]:https://support.microsoft.com/help/4040713
+[4024304 Cumulative Update 7 for SQL Server 2016]:https://support.microsoft.com/help/4024304
+[4019914 Cumulative Update 6 for SQL Server 2016]:https://support.microsoft.com/help/4019914
+[4013105 Cumulative Update 5 for SQL Server 2016]:https://support.microsoft.com/help/4013105
+[3205052 Cumulative update 4 for SQL Server 2016]:https://support.microsoft.com/help/3205052
+[4058560 Description of the security update for SQL Server 2016 GDR: January 6, 2018]:https://support.microsoft.com/help/4058560
+[4019088 Security update for SQL Server 2016 RTM GDR: August 8, 2017]:https://support.microsoft.com/help/4019088
+[3210111 GDR update package for SQL Server 2016 RTM]:https://support.microsoft.com/help/3210111
+[3210110 On-demand hotfix update package for SQL Server 2016 CU3]:https://support.microsoft.com/help/3210110
+[3194717 MS16-136: Description of the security update for SQL Server 2016 CU]:https://support.microsoft.com/help/3194717
+[3205413 Cumulative update 3 for SQL Server 2016]:https://support.microsoft.com/help/3205413
+[3199171 On-demand hotfix update package for SQL Server 2016 CU2]:https://support.microsoft.com/help/3199171
+[3195813 On-demand hotfix update package for SQL Server 2016 CU2]:https://support.microsoft.com/help/3195813
+[3182270 Cumulative Update 2 for SQL Server 2016]:https://support.microsoft.com/help/3182270
+[3164674 Cumulative Update 1 for SQL Server 2016]:https://support.microsoft.com/help/3164674
+[3194716 MS16-136: Description of the security update for SQL Server 2016 GDR]:https://support.microsoft.com/help/3194716
+[3179258 Processing a partition causes data loss on other partitions after the database is restored in SQL Server 2016 (1200)]:http://support.microsoft.com/help/3179258
+[3164398 Critical update for SQL Server 2016 MSVCRT prerequisites]:https://support.microsoft.com/help/3164398
+[Microsoft SQL Server 2016 RTM]:https://www.microsoft.com/evalcenter/evaluate-sql-server-2016
+
+
+
+## Microsoft SQL Server 2014 Builds
+
+All SQL Server 2014 CU downloads: [Catalog Update Microsoft SQL Server 2014](http://www.catalog.update.microsoft.com/Search.aspx?q=sql%20server%202014)
+
+Here is the latest output from `SELECT @@VERSION` for SQL Server 2014 Developer Edition on Windows:
+
+```
+Microsoft SQL Server 2014 (SP3-CU1) (KB4470220) - 12.0.6205.1 (X64)
+ Nov 30 2018 02:59:03
+ Copyright (c) Microsoft Corporation
+ Developer Edition (64-bit) on …
```
-| Build | File version | KB / Description | Release Date | Build Date |
-|---------------|-------------------|---------------------------------------------------------------------------------|--------------|------------|
-| 13.0.1400.361 | 2015.130.1400.361 | [Microsoft SQL Server 2016 Community Technology Release Candidate 3 (RC3)] | 2016-04-15 | 2016-04-09 |
-| 13.0.1300.275 | 2015.130.1300.275 | Microsoft SQL Server 2016 Community Technology Release Candidate 2 (RC2) | 2016-04-01 | 2016-03-26 |
-| 13.0.1200.242 | 2015.130.1200.242 | Microsoft SQL Server 2016 Community Technology Release Candidate 1 (RC1) | 2016-03-18 | 2016-03-10 |
-| 13.0.1100.288 | 2015.130.1100.288 | Microsoft SQL Server 2016 Community Technology Release Candidate 0 (RC0) | 2016-03-07 | 2016-02-29 |
-| 13.0.1000.281 | 2015.130.1000.281 | Microsoft SQL Server 2016 Community Technology Preview 3.3 (CTP3.3) | 2016-02-03 | 2016-01-28 |
-| 13.0.900.73 | 2015.130.900.73 | Microsoft SQL Server 2016 Community Technology Preview 3.2 (CTP3.2) | 2015-12-17 | 2015-12-10 |
-| 13.0.801.12 | 2015.130.801.12 | Microsoft SQL Server 2016 Community Technology Preview 3.1 (CTP3.1 refresh) | 2015-12-05 | 2015-12-01 |
-| 13.0.801.111 | 2015.130.801.111 | Microsoft SQL Server 2016 Community Technology Preview 3.1 (CTP3.1) | 2015-11-30 | 2015-11-21 |
-| 13.0.700.242 | 2015.130.700.242 | Microsoft SQL Server 2016 Community Technology Preview 3.0 (CTP3.0) | 2015-10-29 | 2015-10-26 |
-| 13.0.600.65 | 2015.130.600.65 | Microsoft SQL Server 2016 Community Technology Preview 2.4 (CTP2.4) | 2015-09-30 | 2015-09-20 |
-| 13.0.500.53 | 2015.130.500.53 | Microsoft SQL Server 2016 Community Technology Preview 2.3 (CTP2.3) | 2015-08-28 | 2015-08-24 |
-| 13.0.407.1 | 2015.130.407.1 | Microsoft SQL Server 2016 Community Technology Preview 2.2 (CTP2.2) | 2015-07-29 | 2015-07-22 |
-| 13.0.400.91 | 2015.130.400.91 | Microsoft SQL Server 2016 Community Technology Preview 2.2 (CTP2.2) [withdrawn] | 2015-07-22 | 2015-07-16 |
-| 13.0.300.44 | 2015.130.300.444 | Microsoft SQL Server 2016 Community Technology Preview 2.1 (CTP2.1) | 2015-06-14 | 2015-06-12 |
-| 13.0.200.172 | 2015.130.200.172 | Microsoft SQL Server 2016 Community Technology Preview 2 (CTP2) | 2015-05-26 | 2015-05-21 |
-
-[Microsoft SQL Server 2016 Community Technology Release Candidate 3 (RC3)]:https://www.microsoft.com/en-us/evalcenter/evaluate-sql-server-2016
-
-
-## Microsoft SQL Server 2014 Builds
-The official knowledge base article for Service Pack 1 has been moved to [KB3058865](https://support.microsoft.com/en-us/kb/3058865), and you can download it [here](https://www.microsoft.com/en-us/download/details.aspx?id=46694). The original blog posts are [here](http://blogs.msdn.com/b/sqlreleaseservices/archive/2015/04/16/sql-server-2014-service-pack-1-has-released.aspx) and [here](http://blogs.technet.com/b/dataplatforminsider/archive/2015/05/15/sql-server-2014-service-pack-1-now-available-for-download.aspx); the new one is [here](http://blogs.technet.com/b/dataplatforminsider/archive/2015/05/15/sql-server-2014-service-pack-1-now-available-for-download.aspx).
-
-Service Pack 1 includes a number of enhancements; these were the most interesting to us:
-
- - The behavior of trace flags 1236 (see [KB2926217](https://support.microsoft.com/en-us/kb/2926217)) and 9024 (see [KB2809338](http://support.microsoft.com/kb/2809338)) will now be enabled by default.
- - Several fixes for buffer pool extensions, including the ability to use instant file initialization.
- - Improvements in columnstore performance and new extended event coverage for columnstore inserts.
-
-
-| Build | File version | KB / Description | Release Date |
-|--------------|------------------|------------------------------------------------------------------------------------------------------------------------------------|--------------|
-| 12.0.4449.0 | 2014.120.4449.0 | [3144524 Cumulative Update 6 for SQL Server 2014 Service Pack 1] | 2016-04-18 |
-| 12.0.4439.1 | 2014.120.4439.1 | [3130926 Cumulative Update 5 (CU5) for SQL Server 2014 Service Pack 1] | 2016-02-22 |
-| 12.0.4436.0 | 2014.120.4436.0 | [3106660 Cumulative update package 4 (CU4) for SQL Server 2014 Service Pack 1] | 2015-12-21 |
-| 12.0.4427.24 | 2014.120.4427.24 | [3094221 Cumulative update package 3 (CU3) for SQL Server 2014 Service Pack 1] | 2015-10-21 |
-| 12.0.4422.0 | 2014.120.4422.0 | [3075950 Cumulative update package 2 (CU2) for SQL Server 2014 Service Pack 1] | 2015-08-17 |
-| 12.0.4416.0 | 2014.120.4416.0 | [3067839 Cumulative update package 1 (CU1) for SQL Server 2014 Service Pack 1] | 2015-06-22 |
-| 12.0.4213.0 | 2014.120.4213.0 | [MS15-058: Description of the nonsecurity update for SQL Server 2014 Service Pack 1 GDR: July 14, 2015] | 2015-07-14 |
-| 12.0.4100.1 | 2014.120.4100.1 | [SQL Server 2014 Service Pack 1 (SP1)] | 2015-05-14 |
-| 12.0.4050.0 | 2014.120.4050.0 | SQL Server 2014 Service Pack 1 (SP1) [withdrawn] | 2015-04-15 |
-| 12.0.2560.0 | 2014.120.2550.0 | [3106659 Cumulative update package 11 (CU11) for SQL Server 2014] | 2015-12-21 |
-| 12.0.2556.4 | 2014.120.2556.4 | [3094220 Cumulative update package 10 (CU10) for SQL Server 2014] | 2015-10-20 |
-| 12.0.2553 | 2014.120.2553.0 | [3075949 Cumulative update package 9 (CU9) for SQL Server 2014] | 2015-08-17 |
-| 12.0.2548 | 2014.120.2548.0 | [MS15-058: Description of the security update for SQL Server 2014 QFE: July 14, 2015] | 2015-07-14 |
-| 12.0.2546 | 2014.120.2546.0 | [3067836 Cumulative update package 8 (CU8) for SQL Server 2014] | 2015-06-22 |
-| 12.0.2506 | 2014.120.2506.0 | [3063054 Update enables Premium Storage support for Data files on Azure Storage and resolves backup failures] | 2015-05-19 |
-| 12.0.2505 | 2014.120.2505.0 | [3052167 FIX: Error 1205 when you execute parallel query that contains outer join operators in SQL Server 2014] | 2015-05-19 |
-| 12.0.2504 | 2014.120.2504.0 | [2999809 FIX: Poor performance when a query contains table joins in SQL Server 2014] | 2015-05-05 |
-| 12.0.2504 | 2014.120.2504.0 | [3058512 FIX: Unpivot Transformation task changes null to zero or empty strings in SSIS 2014] | 2015-05-05 |
-| 12.0.2495 | 2014.120.2495.0 | [3046038 Cumulative update package 7 (CU7) for SQL Server 2014] | 2015-04-23 |
-| 12.0.2488 | 2014.120.2488.0 | [3048751 FIX: Deadlock cannot be resolved automatically when you run a SELECT query that can result in a parallel batch-mode scan] | 2015-04-01 |
-| 12.0.2485 | 2014.120.2485.0 | [3043788 An on-demand hotfix update package is available for SQL Server 2014] | 2015-03-16 |
-| 12.0.2480 | 2014.120.2480.0 | [3031047 Cumulative update package 6 (CU6) for SQL Server 2014] | 2015-02-16 |
-| 12.0.2474 | 2014.120.2474.0 | [3034679 FIX: AlwaysOn availability groups are reported as NOT SYNCHRONIZING] | 2015-05-15 |
-| 12.0.2472 | 2014.120.2472.0 | [3032087 FIX: Cannot show requested dialog after you connect to the latest SQL Database Update V12 (preview) with SQL Server 2014] | 2015-01-28 |
-| 12.0.2464 | 2014.120.2464.0 | [3024815 Large query compilation waits on RESOURCE_SEMAPHORE_QUERY_COMPILE in SQL Server 2014] | 2015-01-05 |
-| 12.0.2456 | 2014.120.2456.0 | [3011055 Cumulative update package 5 (CU5) for SQL Server 2014] | 2014-12-18 |
-| 12.0.2436 | 2014.120.2436.0 | [3014867 FIX: "Remote hardening failure" exception cannot be caught and a potential data loss when you use SQL Server 2014] | 2014-11-27 |
-| 12.0.2430 | 2014.120.2430.0 | [2999197 Cumulative update package 4 (CU4) for SQL Server 2014] | 2014-10-21 |
-| 12.0.2423 | 2014.120.2423.0 | [3007050 FIX: RTDATA_LIST waits when you run natively stored procedures that encounter expected failures in SQL Server 2014] | 2014-10-22 |
-| 12.0.2405 | 2014.120.2405.0 | [2999809 FIX: Poor performance when a query contains table joins in SQL Server 2014] | 2014-09-25 |
-| 12.0.2402 | 2014.120.2402.0 | [2984923 Cumulative update package 3 (CU3) for SQL Server 2014] | 2014-08-18 |
-| 12.0.2381 | 2014.120.2381.0 | [2977316 MS14-044: Description of the security update for SQL Server 2014 (QFE)] | 2014-08-12 |
-| 12.0.2370 | 2014.120.2370.0 | [2967546 Cumulative update package 2 (CU2) for SQL Server 2014] | 2014-06-27 |
-| 12.0.2342 | 2014.120.2342.0 | [2931693 Cumulative update package 1 (CU1) for SQL Server 2014] | 2014-04-21 |
-| 12.0.2269 | 2014.120.2269.0 | [3045324 MS15-058: Description of the security update for SQL Server 2014 GDR: July 14, 2015] | 2015-07-14 |
-| 12.0.2254 | 2014.120.2254.0 | [2977315 MS14-044: Description of the security update for SQL Server 2014 (GDR)] | 2014-08-12 |
-| 12.0.2000 | 2014.120.2000.8 | SQL Server 2014 RTM | 2014-04-01 |
-| 12.0.1524 | 2014.120.1524.0 | Microsoft SQL Server 2014 Community Technology Preview 2 (CTP2) | 2013-10-15 |
-| 11.0.9120 | 2013.110.9120.0 | Microsoft SQL Server 2014 Community Technology Preview 1 (CTP1) | 2013-06-25 |
-
-[3144524 Cumulative Update 6 for SQL Server 2014 Service Pack 1]:https://support.microsoft.com/en-us/kb/3144524
+| Build | File version | Branch | Type | KB / Description | Release Date | Fixes | Public | Size, Mb |
+|--------------|------------------|--------|------|------------------------------------------------------------------------------------------------------------------------------------|--------------|------:|-------:|---------:|
+| 12.0.6205.1 | 2014.120.6205.1 | SP3 | CU | [4470220 Cumulative Update 1 for SQL Server 2014 SP3] | 2018-12-12 | 16 | 13 | 601 |
+| 12.0.6024.0 | 2014.120.6024.0 | SP3 | SP | [4022619 SQL Server 2014 Service Pack 3 release information] | 2018-10-30 | 31 | 6 | 791 |
+| 12.0.5605.1 | 2014.120.5605.1 | SP2 | SP | [4469137 Cumulative Update 15 for SQL Server 2014 SP2] | 2018-12-12 | 8 | 7 | 679 |
+| 12.0.5600.1 | 2014.120.5600.1 | SP2 | CU | [4459860 Cumulative Update 14 for SQL Server 2014 SP2] | 2018-10-15 | 8 | 6 | 678 |
+| 12.0.5590.1 | 2014.120.5590.1 | SP2 | CU | [4456287 Cumulative Update 13 for SQL Server 2014 SP2] | 2018-08-27 | 4 | 4 | 679 |
+| 12.0.5589.7 | 2014.120.5589.7 | SP2 | CU | [4130489 Cumulative Update 12 for SQL Server 2014 SP2] | 2018-06-18 | 27 | 16 | 678 |
+| 12.0.5579.0 | 2014.120.5579.0 | SP2 | CU | [4077063 Cumulative Update 11 for SQL Server 2014 SP2] | 2018-03-19 | 12 | 10 | 677 |
+| 12.0.5571.0 | 2014.120.5571.0 | SP2 | CU | [4052725 Cumulative Update 10 for SQL Server 2014 SP2] | 2018-01-16 | 5 | 4 | 676 |
+| 12.0.5563.0 | 2014.120.5563.0 | SP2 | CU | [4055557 Cumulative Update 9 for SQL Server 2014 SP2] | 2017-12-18 | 8 | 7 | 540 |
+| 12.0.5557.0 | 2014.120.5557.0 | SP2 | CU | [4037356 Cumulative Update 8 for SQL Server 2014 SP2] | 2017-10-17 | 15 | 8 | 539 |
+| 12.0.5556.0 | 2014.120.5556.0 | SP2 | CU | [4032541 Cumulative Update 7 for SQL Server 2014 SP2] | 2017-08-28 | 15 | 8 | 539 |
+| 12.0.5553.0 | 2014.120.5553.0 | SP2 | CU | [4019094 Cumulative Update 6 for SQL Server 2014 SP2] | 2017-08-08 | 29 | 29 | 539 |
+| 12.0.5546.0 | 2014.120.5546.0 | SP2 | CU | [4013098 Cumulative Update 5 for SQL Server 2014 SP2] | 2017-04-18 | 24 | 21 | 557 |
+| 12.0.5540.0 | 2014.120.5540.0 | SP2 | CU | [4010394 Cumulative Update 4 for SQL Server 2014 SP2] | 2017-02-21 | 30 | 27 | 555 |
+| 12.0.5538.0 | 2014.120.5538.0 | SP2 | CU | [3204388 Cumulative update 3 for SQL Server 2014 SP2] | 2016-12-28 | 44 | 39 | 555 |
+| 12.0.5532.0 | 2014.120.5532.0 | SP2 | CU | [3194718 MS16-136: Description of the security update for SQL Server 2014 Service Pack 2 CU: November 8, 2016] | 2016-11-08 | 1 | 1 | 551 |
+| 12.0.5522.0 | 2014.120.5522.0 | SP2 | CU | [3188778 Cumulative update 2 for SQL Server 2014 SP2] | 2016-10-18 | 18 | 18 | 550 |
+| 12.0.5511.0 | 2014.120.5511.0 | SP2 | CU | [3178925 Cumulative update 1 for SQL Server 2014 SP2] | 2016-08-24 | 45 | 36 | 556 |
+| 12.0.5214.6 | 2014.120.5214.6 | SP2 | GDR | [4057120 Security update for SQL Server 2014 Service Pack 2 GDR: January 16, 2018] **CVE-2017-5715,2017-5753,2017-5754** | 2018-01-16 | | | 960 |
+| 12.0.5207.0 | 2014.120.5207.0 | SP2 | GDR | [4019093 Description of the security update for SQL Server 2014 Service Pack 2 GDR: August 8, 2017] | 2017-08-08 | 1 | 1 | 413 |
+| 12.0.5203.0 | 2014.120.5203.0 | SP2 | GDR | [3194714 MS16-136: Description of the security update for SQL Server 2014 Service Pack 2 GDR: November 8, 2016] | 2016-11-08 | 1 | 1 | 463 |
+| 12.0.5000.0 | 2014.120.5000.0 | SP2 | SP | [3171021 SQL Server 2014 Service Pack 2 release information] | 2016-07-11 | 133 | 55 | 681 |
+| 12.0.4522.0 | 2014.120.4522.0 | SP1 | CU | [4019099 Cumulative Update 13 for SQL Server 2014 SP1] **Last CU for 2014 SP1** | 2017-08-08 | 11 | 11 | 577 |
+| 12.0.4511.0 | 2014.120.4511.0 | SP1 | CU | [4017793 Cumulative Update 12 for SQL Server 2014 SP1] | 2017-04-17 | 12 | 11 | 573 |
+| 12.0.4502.0 | 2014.120.4502.0 | SP1 | CU | [4010392 Cumulative Update 11 for SQL Server 2014 SP1] | 2017-02-21 | 15 | 15 | 571 |
+| 12.0.4491.0 | 2014.120.4491.0 | SP1 | CU | [3204399 Cumulative update package 10 for SQL Server 2014 Service Pack 1] | 2016-12-28 | 33 | 27 | 571 |
+| 12.0.4487.0 | 2014.120.4487.0 | SP1 | CU | [3194722 MS16-136: Description of the security update for SQL Server 2014 Service Pack 1 CU: November 8, 2016] | 2016-11-08 | 1 | 1 | 569 |
+| 12.0.4474.0 | 2014.120.4474.0 | SP1 | CU | [3186964 Cumulative update 9 for SQL Server 2014 SP1] | 2016-10-18 | 14 | 14 | 912 |
+| 12.0.4468.0 | 2014.120.4468.0 | SP1 | CU | [3174038 Cumulative update 8 for SQL Server 2014 SP1] | 2016-08-16 | 38 | 38 | 929 |
+| 12.0.4463.0 | 2014.120.4463.0 | SP1 | COD | [3174370 COD Hotfix A memory leak occurs when you use Azure Storage in SQL Server 2014] | 2016-08-04 | 1 | 1 | |
+| 12.0.4459.0 | 2014.120.4459.0 | SP1 | CU | [3162659 Cumulative Update 7 for SQL Server 2014 SP1] | 2016-06-20 | 35 | 33 | 928 |
+| 12.0.4457.0 | 2014.120.4457.0 | SP1 | CU | [3167392 Cumulative Update 6 for SQL Server 2014 Service Pack 1] **Refresh** | 2016-05-31 | 44 | 43 | 927 |
+| 12.0.4452.0 | 2014.120.4452.0 | SP1 | COD | 3147825 COD Hotfix **Deprecated** | 2016-04-05 | 1 | 1 | |
+| 12.0.4449.0 | 2014.120.4449.0 | SP1 | CU | [3144524 Cumulative update 6 for SQL Server 2014 SP1 (deprecated)] **Deprecated** | 2016-04-18 | N/A | N/A | |
+| 12.0.4439.1 | 2014.120.4439.1 | SP1 | CU | [3130926 Cumulative Update 5 (CU5) for SQL Server 2014 Service Pack 1] | 2016-02-22 | 20 | 20 | 924 |
+| 12.0.4437.0 | 2014.120.4437.0 | SP1 | COD | [3130999 On-demand hotfix update package for SQL Server 2014 Service Pack 1 Cumulative Update 4] | 2016-02-05 | 2 | 2 | |
+| 12.0.4436.0 | 2014.120.4436.0 | SP1 | CU | [3106660 Cumulative update package 4 (CU4) for SQL Server 2014 Service Pack 1] | 2015-12-21 | 34 | 34 | |
+| 12.0.4433.0 | 2014.120.4433.0 | SP1 | COD | [3119148 FIX: Error 3203 occurs and a SQL Server 2014 backup job can't restart after a network failure] | 2015-12-09 | 1 | 1 | |
+| 12.0.4432.0 | 2014.120.4432.0 | SP1 | COD | [3097972 FIX: Error when your stored procedure calls another stored procedure on a linked server in SQL Server 2014] | 2015-11-19 | 3 | 3 | |
+| 12.0.4427.24 | 2014.120.4427.24 | SP1 | CU | [3094221 Cumulative update package 3 (CU3) for SQL Server 2014 Service Pack 1] | 2015-10-21 | 40 | 36 | |
+| 12.0.4422.0 | 2014.120.4422.0 | SP1 | CU | [3075950 Cumulative update package 2 (CU2) for SQL Server 2014 Service Pack 1] | 2015-08-17 | 51 | 46 | |
+| 12.0.4419.0 | 2014.120.4419.0 | SP1 | COD | [3078973 An on-demand hotfix update package is available for SQL Server 2014 SP1] | 2015-07-24 | 13 | 13 | |
+| 12.0.4416.0 | 2014.120.4416.0 | SP1 | CU | [3067839 Cumulative update package 1 (CU1) for SQL Server 2014 Service Pack 1] | 2015-06-22 | 141 | 121 | |
+| 12.0.4237.0 | 2014.120.4237.0 | SP1 | GDR | [4019091 Security update for SQL Server 2014 Service Pack 1 GDR: August 8, 2017] | 2017-08-08 | 1 | 1 | 391 |
+| 12.0.4232.0 | 2014.120.4232.0 | SP1 | CU | [3194720 MS16-136: Description of the security update for SQL Server 2014 Service Pack 1 GDR: November 8, 2016] | 2016-11-08 | 1 | 1 | 371 |
+| 12.0.4219.0 | 2014.120.4219.0 | SP1 | GDR | [3098852 SP1 GDR TLS 1.2 Update] | 2016-01-29 | | | |
+| 12.0.4213.0 | 2014.120.4213.0 | SP1 | GDR | [3070446 MS15-058: Description of the nonsecurity update for SQL Server 2014 Service Pack 1 GDR: July 14, 2015] | 2015-07-14 | | | 381 |
+| 12.0.4100.1 | 2014.120.4100.1 | SP1 | SP | [3058865 SQL Server 2014 Service Pack 1 release information] | 2015-05-14 | 29 | 29 | 1025 |
+| 12.0.4050.0 | 2014.120.4050.0 | SP1 | SP | SQL Server 2014 Service Pack 1 (SP1) (initial) | 2015-04-15 | | | |
+| 12.0.2569.0 | 2014.120.2569.0 | RTM | CU | [3158271 Cumulative update package 14 (CU14) for SQL Server 2014] **Last CU for 2014 RTM** | 2016-06-20 | 21 | 20 | 1049 |
+| 12.0.2568.0 | 2014.120.2568.0 | RTM | CU | [3144517 Cumulative update package 13 (CU13) for SQL Server 2014] | 2016-04-18 | 30 | 30 | 1047 |
+| 12.0.2564.0 | 2014.120.2564.0 | RTM | CU | [3130923 Cumulative update package 12 (CU12) for SQL Server 2014] | 2016-02-22 | 7 | 7 | 1045 |
+| 12.0.2560.0 | 2014.120.2550.0 | RTM | CU | [3106659 Cumulative update package 11 (CU11) for SQL Server 2014] | 2015-12-21 | 19 | 19 | |
+| 12.0.2556.4 | 2014.120.2556.4 | RTM | CU | [3094220 Cumulative update package 10 (CU10) for SQL Server 2014] | 2015-10-20 | 33 | 30 | |
+| 12.0.2553.0 | 2014.120.2553.0 | RTM | CU | [3075949 Cumulative update package 9 (CU9) for SQL Server 2014] | 2015-08-17 | 31 | 30 | |
+| 12.0.2548.0 | 2014.120.2548.0 | RTM | CU | [3045323 MS15-058: Description of the security update for SQL Server 2014 QFE: July 14, 2015] | 2015-07-14 | 1 | 1 | 1038 |
+| 12.0.2546.0 | 2014.120.2546.0 | RTM | CU | [3067836 Cumulative update package 8 (CU8) for SQL Server 2014] | 2015-06-22 | 40 | 38 | |
+| 12.0.2506.0 | 2014.120.2506.0 | RTM | COD | [3063054 Update enables Premium Storage support for Data files on Azure Storage and resolves backup failures] | 2015-05-19 | 1 | 1 | |
+| 12.0.2505.0 | 2014.120.2505.0 | RTM | COD | [3052167 FIX: Error 1205 when you execute parallel query that contains outer join operators in SQL Server 2014] | 2015-05-19 | 1 | 1 | |
+| 12.0.2504.0 | 2014.120.2504.0 | RTM | COD | [2999809 FIX: Poor performance when a query contains table joins in SQL Server 2014] | 2015-05-05 | 2 | 2 | |
+| 12.0.2504.0 | 2014.120.2504.0 | RTM | COD | [3058512 FIX: Unpivot Transformation task changes null to zero or empty strings in SSIS 2014] | 2015-05-05 | | | |
+| 12.0.2495.0 | 2014.120.2495.0 | RTM | CU | [3046038 Cumulative update package 7 (CU7) for SQL Server 2014] | 2015-04-23 | 47 | 41 | |
+| 12.0.2488.0 | 2014.120.2488.0 | RTM | COD | [3048751 FIX: Deadlock cannot be resolved automatically when you run a SELECT query that can result in a parallel batch-mode scan] | 2015-04-01 | 1 | 1 | |
+| 12.0.2485.0 | 2014.120.2485.0 | RTM | COD | [3043788 An on-demand hotfix update package is available for SQL Server 2014] | 2015-03-16 | 1 | 1 | |
+| 12.0.2480.0 | 2014.120.2480.0 | RTM | CU | [3031047 Cumulative update package 6 (CU6) for SQL Server 2014] | 2015-02-16 | 64 | 55 | |
+| 12.0.2474.0 | 2014.120.2474.0 | RTM | COD | [3034679 FIX: AlwaysOn availability groups are reported as NOT SYNCHRONIZING] | 2015-02-04 | 1 | 1 | |
+| 12.0.2472.0 | 2014.120.2472.0 | RTM | COD | [3032087 FIX: Cannot show requested dialog after you connect to the latest SQL Database Update V12 (preview) with SQL Server 2014] | 2015-01-28 | 1 | 1 | |
+| 12.0.2464.0 | 2014.120.2464.0 | RTM | COD | [3024815 Large query compilation waits on RESOURCE_SEMAPHORE_QUERY_COMPILE in SQL Server 2014] | 2015-01-05 | 1 | 1 | |
+| 12.0.2456.0 | 2014.120.2456.0 | RTM | CU | [3011055 Cumulative update package 5 (CU5) for SQL Server 2014] | 2014-12-18 | 54 | 48 | |
+| 12.0.2436.0 | 2014.120.2436.0 | RTM | COD | [3014867 FIX: "Remote hardening failure" exception cannot be caught and a potential data loss when you use SQL Server 2014] | 2014-11-27 | 1 | 1 | |
+| 12.0.2430.0 | 2014.120.2430.0 | RTM | CU | [2999197 Cumulative update package 4 (CU4) for SQL Server 2014] | 2014-10-21 | 66 | 54 | |
+| 12.0.2423.0 | 2014.120.2423.0 | RTM | COD | [3007050 FIX: RTDATA_LIST waits when you run natively stored procedures that encounter expected failures in SQL Server 2014] | 2014-10-22 | | | |
+| 12.0.2405.0 | 2014.120.2405.0 | RTM | COD | [2999809 FIX: Poor performance when a query contains table joins in SQL Server 2014] | 2014-09-25 | | | |
+| 12.0.2402.0 | 2014.120.2402.0 | RTM | CU | [2984923 Cumulative update package 3 (CU3) for SQL Server 2014] | 2014-08-18 | 40 | 32 | |
+| 12.0.2381.0 | 2014.120.2381.0 | RTM | QFE | [2977316 MS14-044: Description of the security update for SQL Server 2014 (QFE)] | 2014-08-12 | 1 | 1 | 602 |
+| 12.0.2370.0 | 2014.120.2370.0 | RTM | CU | [2967546 Cumulative update package 2 (CU2) for SQL Server 2014] | 2014-06-27 | 52 | 48 | |
+| 12.0.2342.0 | 2014.120.2342.0 | RTM | CU | [2931693 Cumulative update package 1 (CU1) for SQL Server 2014] | 2014-04-21 | 121 | 114 | |
+| 12.0.2271.0 | 2014.120.2271.0 | RTM | GDR | [TLS 1.2 support for SQL Server 2014 RTM] | 2016-01-29 | 3 | 3 | |
+| 12.0.2269.0 | 2014.120.2269.0 | RTM | GDR | [3045324 MS15-058: Description of the security update for SQL Server 2014 GDR: July 14, 2015] | 2015-07-14 | 2 | 2 | 388 |
+| 12.0.2254.0 | 2014.120.2254.0 | RTM | GDR | [2977315 MS14-044: Description of the security update for SQL Server 2014 (GDR)] | 2014-08-12 | 1 | 1 | 183 |
+| 12.0.2000.8 | 2014.120.2000.8 | RTM | RTM | SQL Server 2014 RTM | 2014-04-01 | - | - | |
+| 12.0.1524.0 | 2014.120.1524.0 | CTP | CTP | Microsoft SQL Server 2014 Community Technology Preview 2 (CTP2) | 2013-10-15 | | | |
+| 11.0.9120.0 | 2013.110.9120.0 | CTP | CTP | Microsoft SQL Server 2014 Community Technology Preview 1 (CTP1) | 2013-06-25 | | | |
+
+[4470220 Cumulative Update 1 for SQL Server 2014 SP3]:https://support.microsoft.com/help/4470220
+[4022619 SQL Server 2014 Service Pack 3 release information]:https://support.microsoft.com/help/4022619
+[4469137 Cumulative Update 15 for SQL Server 2014 SP2]:https://support.microsoft.com/help/4469137
+[4459860 Cumulative Update 14 for SQL Server 2014 SP2]:https://support.microsoft.com/help/4459860
+[4456287 Cumulative Update 13 for SQL Server 2014 SP2]:https://support.microsoft.com/help/4456287
+[4130489 Cumulative Update 12 for SQL Server 2014 SP2]:https://support.microsoft.com/help/4130489
+[4077063 Cumulative Update 11 for SQL Server 2014 SP2]:https://support.microsoft.com/help/4077063
+[4052725 Cumulative Update 10 for SQL Server 2014 SP2]:https://support.microsoft.com/help/4052725/cumulative-update-10-for-sql-server-2014-sp2
+[4055557 Cumulative Update 9 for SQL Server 2014 SP2]:https://support.microsoft.com/help/4055557/cumulative-update-9-for-sql-server-2014-sp2
+[4037356 Cumulative Update 8 for SQL Server 2014 SP2]:https://support.microsoft.com/help/4037356/cumulative-update-8-for-sql-server-2014-sp2
+[4032541 Cumulative Update 7 for SQL Server 2014 SP2]:https://support.microsoft.com/help/4032541/cumulative-update-7-for-sql-server-2014-sp2
+[4019094 Cumulative Update 6 for SQL Server 2014 SP2]:https://support.microsoft.com/help/4019094/cumulative-update-6-for-sql-server-2014-sp2
+[4013098 Cumulative Update 5 for SQL Server 2014 SP2]:https://support.microsoft.com/help/4013098/cumulative-update-5-for-sql-server-2014-sp2
+[4010394 Cumulative Update 4 for SQL Server 2014 SP2]:https://support.microsoft.com/help/4010394/cumulative-update-4-for-sql-server-2014-sp2
+[3204388 Cumulative update 3 for SQL Server 2014 SP2]:https://support.microsoft.com/help/3204388
+[3194718 MS16-136: Description of the security update for SQL Server 2014 Service Pack 2 CU: November 8, 2016]:https://support.microsoft.com/help/3194718
+[3188778 Cumulative update 2 for SQL Server 2014 SP2]:https://support.microsoft.com/help/3188778
+[3178925 Cumulative update 1 for SQL Server 2014 SP2]:https://support.microsoft.com/help/3178925
+[3194714 MS16-136: Description of the security update for SQL Server 2014 Service Pack 2 GDR: November 8, 2016]:https://support.microsoft.com/en-us/help/3194714/
+[3171021 SQL Server 2014 Service Pack 2 release information]:https://support.microsoft.com/help/3171021
+[4019099 Cumulative Update 13 for SQL Server 2014 SP1]:https://support.microsoft.com/help/4019099/cumulative-update-13-for-sql-server-2014-sp1
+[4017793 Cumulative Update 12 for SQL Server 2014 SP1]:https://support.microsoft.com/help/4017793/cumulative-update-12-for-sql-server-2014-sp1
+[4010392 Cumulative Update 11 for SQL Server 2014 SP1]:https://support.microsoft.com/help/4010392/cumulative-update-11-for-sql-server-2014-sp1
+[3204399 Cumulative update package 10 for SQL Server 2014 Service Pack 1]:https://support.microsoft.com/help/3204399
+[3194722 MS16-136: Description of the security update for SQL Server 2014 Service Pack 1 CU: November 8, 2016]:https://support.microsoft.com/en-us/kb/3194722
+[3186964 Cumulative update 9 for SQL Server 2014 SP1]:https://support.microsoft.com/help/3186964
+[4057120 Security update for SQL Server 2014 Service Pack 2 GDR: January 16, 2018]:https://support.microsoft.com/help/4057120
+[4019093 Description of the security update for SQL Server 2014 Service Pack 2 GDR: August 8, 2017]:https://support.microsoft.com/help/4019093/
+[3174038 Cumulative update 8 for SQL Server 2014 SP1]:https://support.microsoft.com/en-us/kb/3174038
+[3174370 COD Hotfix A memory leak occurs when you use Azure Storage in SQL Server 2014]:https://support.microsoft.com/en-us/kb/3174370
+[3162659 Cumulative Update 7 for SQL Server 2014 SP1]:https://support.microsoft.com/en-us/kb/3162659
+[3167392 Cumulative Update 6 for SQL Server 2014 Service Pack 1]:https://support.microsoft.com/en-us/kb/3167392
+[3144524 Cumulative update 6 for SQL Server 2014 SP1 (deprecated)]:https://support.microsoft.com/en-us/kb/3144524
[3130926 Cumulative Update 5 (CU5) for SQL Server 2014 Service Pack 1]:https://support.microsoft.com/en-us/kb/3130926
+[3130999 On-demand hotfix update package for SQL Server 2014 Service Pack 1 Cumulative Update 4]:https://support.microsoft.com/en-us/kb/3130999
[3106660 Cumulative update package 4 (CU4) for SQL Server 2014 Service Pack 1]:https://support.microsoft.com/en-us/kb/3106660
+[3119148 FIX: Error 3203 occurs and a SQL Server 2014 backup job can't restart after a network failure]:http://support.microsoft.com/kb/3119148
+[3097972 FIX: Error when your stored procedure calls another stored procedure on a linked server in SQL Server 2014]:http://support.microsoft.com/kb/3097972
[3094221 Cumulative update package 3 (CU3) for SQL Server 2014 Service Pack 1]:http://support.microsoft.com/kb/3094221
[3075950 Cumulative update package 2 (CU2) for SQL Server 2014 Service Pack 1]:http://support.microsoft.com/kb/3075950
+[3078973 An on-demand hotfix update package is available for SQL Server 2014 SP1]:http://support.microsoft.com/kb/3078973
[3067839 Cumulative update package 1 (CU1) for SQL Server 2014 Service Pack 1]:http://support.microsoft.com/kb/3067839
-[MS15-058: Description of the nonsecurity update for SQL Server 2014 Service Pack 1 GDR: July 14, 2015]:https://support.microsoft.com/en-us/kb/3070446
-[SQL Server 2014 Service Pack 1 (SP1)]:http://www.microsoft.com/en-us/download/details.aspx?id=46694
+[4019091 Security update for SQL Server 2014 Service Pack 1 GDR: August 8, 2017]:http://support.microsoft.com/help/4019091
+[3194720 MS16-136: Description of the security update for SQL Server 2014 Service Pack 1 GDR: November 8, 2016]:https://support.microsoft.com/en-us/kb/3194720
+[3098852 SP1 GDR TLS 1.2 Update]:https://support.microsoft.com/en-us/hotfix/kbhotfix?kbnum=3098852&kbln=en-us
+[3070446 MS15-058: Description of the nonsecurity update for SQL Server 2014 Service Pack 1 GDR: July 14, 2015]:https://support.microsoft.com/en-us/kb/3070446
+[3058865 SQL Server 2014 Service Pack 1 release information]:https://support.microsoft.com/en-us/kb/3058865
+[3158271 Cumulative update package 14 (CU14) for SQL Server 2014]:https://support.microsoft.com/en-us/kb/3158271
+[3144517 Cumulative update package 13 (CU13) for SQL Server 2014]:https://support.microsoft.com/en-us/kb/3144517
+[3130923 Cumulative update package 12 (CU12) for SQL Server 2014]:https://support.microsoft.com/en-us/kb/3130923
[3106659 Cumulative update package 11 (CU11) for SQL Server 2014]:http://support.microsoft.com/kb/3106659
[3094220 Cumulative update package 10 (CU10) for SQL Server 2014]:http://support.microsoft.com/kb/3094220
[3075949 Cumulative update package 9 (CU9) for SQL Server 2014]:http://support.microsoft.com/kb/3075949
-[MS15-058: Description of the security update for SQL Server 2014 QFE: July 14, 2015]:https://support.microsoft.com/en-us/kb/3045323
+[3045323 MS15-058: Description of the security update for SQL Server 2014 QFE: July 14, 2015]:https://support.microsoft.com/en-us/kb/3045323
[3067836 Cumulative update package 8 (CU8) for SQL Server 2014]:http://support.microsoft.com/kb/3067836
[3063054 Update enables Premium Storage support for Data files on Azure Storage and resolves backup failures]:http://support.microsoft.com/kb/3063054
[3052167 FIX: Error 1205 when you execute parallel query that contains outer join operators in SQL Server 2014]:http://support.microsoft.com/kb/3052167
@@ -353,92 +858,130 @@ Service Pack 1 includes a number of enhancements; these were the most interestin
[2977316 MS14-044: Description of the security update for SQL Server 2014 (QFE)]:http://support.microsoft.com/kb/2977316
[2967546 Cumulative update package 2 (CU2) for SQL Server 2014]:http://support.microsoft.com/kb/2967546
[2931693 Cumulative update package 1 (CU1) for SQL Server 2014]:http://support.microsoft.com/kb/2931693
+[TLS 1.2 support for SQL Server 2014 RTM]:https://support.microsoft.com/en-us/hotfix/kbhotfix?kbnum=3098856&kbln=en-us
[3045324 MS15-058: Description of the security update for SQL Server 2014 GDR: July 14, 2015]:https://support.microsoft.com/en-us/kb/3045324
[2977315 MS14-044: Description of the security update for SQL Server 2014 (GDR)]:http://support.microsoft.com/kb/2977315
-## Microsoft SQL Server 2012 Builds
-
-| Build | File version | KB / Description | Release Date |
-|---------------|------------------|----------------------------------------------------------------------------------------------------------------------------------------|--------------|
-| 11.0.6537.0 | 2011.110.6537.0 | [3152635 Cumulative update package 3 for SQL Server 2012 SP3] | 2016-05-16 |
-| 11.0.5649.0 | 2011.110.5649.0 | [3152637 Cumulative update package 12 for SQL Server 2012 SP2] | 2016-05-16 |
-| 11.0.6523.0 | 2011.110.6523.0 | [3137746 Cumulative update package 2 for SQL Server 2012 SP3] | 2016-03-21 |
-| 11.0.5646.0 | 2011.110.5646.2 | [3137745 Cumulative update package 11 for SQL Server 2012 SP2] | 2016-03-21 |
-| 11.0.6518.0 | 2011.110.6518.0 | [3123299 Cumulative update package 1 for SQL Server 2012 SP3] | 2016-01-19 |
-| 11.0.5644.2 | 2011.110.5644.2 | [3120313 Cumulative update package 10 for SQL Server 2012 SP2] | 2016-01-19 |
-| 11.3.6020.0 | 2011.110.6020.0 | [3072779 Microsoft SQL Server 2012 Service Pack 3 (SP3)] | 2015-11-21 |
-| 11.0.5641.0 | 2011.110.5641.0 | [3098512 Cumulative update package 9 for SQL Server 2012 SP2] | 2015-11-16 |
-| 11.0.5636 | 2011.110.5636.3 | [3097636 FIX: Performance decrease when application with connection pooling frequently connects or disconnects in SQL Server] | 2015-09-22 |
-| 11.0.5634 | 2011.110.5634.0 | [3082561 Cumulative update package 8 (CU8) for SQL Server 2012 Service Pack 2] | 2015-09-21 |
-| 11.0.5629 | 2011.110.5629.0 | [3087872 FIX: Access violations when you use the FileTable feature in SQL Server 2012] | 2015-08-31 |
-| 11.0.5623 | 2011.110.5623.0 | [3072100 Cumulative update package 7 (CU7) for SQL Server 2012 Service Pack 2] | 2015-07-20 |
-| 11.0.5613 | 2011.110.5613.0 | [3045319 MS15-058: Description of the security update for SQL Server 2012 Service Pack 2 QFE: July 14, 2015] | 2015-07-14 |
-| 11.0.5592 | 2011.110.5592.0 | [3052468 Cumulative update package 6 (CU6) for SQL Server 2012 Service Pack 2] | 2015-05-19 |
-| 11.0.5582 | 2011.110.5582.0 | [3037255 Cumulative update package 5 (CU5) for SQL Server 2012 Service Pack 2] | 2015-03-16 |
-| 11.0.5571 | 2011.110.5571.0 | [3034679 FIX: AlwaysOn availability groups are reported as NOT SYNCHRONIZING] | 2015-05-15 |
-| 11.0.5569 | 2011.110.5569.0 | [3007556 Cumulative update package 4 (CU4) for SQL Server 2012 Service Pack 2] | 2015-01-20 |
-| 11.0.5556 | 2011.110.5556.0 | [3002049 Cumulative update package 3 (CU3) for SQL Server 2012 Service Pack 2] | 2014-11-17 |
-| 11.0.5548 | 2011.110.5548.0 | [2983175 Cumulative update package 2 (CU2) for SQL Server 2012 Service Pack 2] | 2014-09-15 |
-| 11.0.5532 | 2011.110.5532.0 | [2976982 Cumulative update package 1 (CU1) for SQL Server 2012 Service Pack 2] | 2014-07-24 |
-| 11.0.5522 | 2011.110.5522.0 | [2969896 FIX: Data loss in clustered index occurs when you run online build index in SQL Server 2012 (Hotfix for SQL2012 SP2)] | 2014-06-20 |
-| 11.0.5343 | 2011.110.5343.0 | [3045321 MS15-058: Description of the security update for SQL Server 2012 Service Pack 2 GDR: July 14, 2015] | 2015-07-14 |
-| 11.0.5058 | 2011.110.5058.0 | [SQL Server 2012 Service Pack 2 (SP2)] | 2014-06-10 |
-| 11.0.3513 | 2011.110.3513.0 | [3045317 MS15-058: Description of the security update for SQL Server 2012 SP1 QFE: July 14, 2015] | 2015-07-14 |
-| 11.0.3492 | 2011.110.3492.0 | [3052476 Cumulative update package 16 (CU16) for SQL Server 2012 Service Pack 1] | 2015-05-18 |
-| 11.0.3487 | 2011.110.3487.0 | [3038001 Cumulative update package 15 (CU15) for SQL Server 2012 Service Pack 1] | 2015-03-16 |
-| 11.0.3486 | 2011.110.3486.0 | [3023636 Cumulative update package 14 (CU14) for SQL Server 2012 Service Pack 1] | 2015-01-19 |
-| 11.0.3460 | 2011.110.3460.0 | [2977325 MS14-044: Description of the security update for SQL Server 2012 Service Pack 1 (QFE)] | 2014-08-12 |
-| 11.0.3482 | 2011.110.3482.0 | [3002044 Cumulative update package 13 (CU13) for SQL Server 2012 Service Pack 1] | 2014-11-17 |
-| 11.0.3470 | 2011.110.3470.0 | [2991533 Cumulative update package 12 (CU12) for SQL Server 2012 Service Pack 1] | 2014-09-15 |
-| 11.0.3449 | 2011.110.3449.0 | [2975396 Cumulative update package 11 (CU11) for SQL Server 2012 Service Pack 1] | 2014-07-21 |
-| 11.0.3437 | 2011.110.3437.0 | [2969896 FIX: Data loss in clustered index occurs when you run online build index in SQL Server 2012 (Hotfix for SQL2012 SP1)] | 2014-06-10 |
-| 11.0.3431 | 2011.110.3431.0 | [2954099 Cumulative update package 10 (CU10) for SQL Server 2012 Service Pack 1] | 2014-05-19 |
-| 11.0.3412 | 2011.110.3412.0 | [2931078 Cumulative update package 9 (CU9) for SQL Server 2012 Service Pack 1] | 2014-03-18 |
-| 11.0.3401 | 2011.110.3401.0 | [2917531 Cumulative update package 8 (CU8) for SQL Server 2012 Service Pack 1] | 2014-01-20 |
-| 11.0.3393 | 2011.110.3393.0 | [2894115 Cumulative update package 7 (CU7) for SQL Server 2012 Service Pack 1] | 2013-11-18 |
-| 11.0.3381 | 2011.110.3381.0 | [2874879 Cumulative update package 6 (CU6) for SQL Server 2012 Service Pack 1] | 2013-09-16 |
-| 11.0.3373 | 2011.110.3373.0 | [2861107 Cumulative update package 5 (CU5) for SQL Server 2012 Service Pack 1] | 2013-07-16 |
-| 11.0.3368 | 2011.110.3368.0 | [2833645 Cumulative update package 4 (CU4) for SQL Server 2012 Service Pack 1] | 2013-05-31 |
-| 11.0.3350 | 2011.110.3350.0 | [2832017 FIX: You can’t create or open SSIS projects or maintenance plans after you apply Cumulative Update 3 for SQL Server 2012 SP1] | 2013-04-17 |
-| 11.0.3349 | 2011.110.3349.0 | [2812412 Cumulative update package 3 (CU3) for SQL Server 2012 Service Pack 1] | 2013-03-18 |
-| 11.0.3339 | 2011.110.3339.0 | [2790947 Cumulative update package 2 (CU2) for SQL Server 2012 Service Pack 1] | 2013-01-25 |
-| 11.0.3335 | 2011.110.3335.0 | [2800050 FIX: Component installation process fails after you install SQL Server 2012 SP1] | 2013-01-14 |
-| 11.0.3321 | 2011.110.3321.0 | [2765331 Cumulative update package 1 (CU1) for SQL Server 2012 Service Pack 1] | 2012-11-20 |
-| 11.0.3156 | 2011.110.3156.0 | [3045318 MS15-058: Description of the security update for SQL Server 2012 SP1 GDR: July 14, 2015] | 2015-07-14 |
-| 11.0.3153 | 2011.110.3153.0 | [2977326 MS14-044: Description of the security update for SQL Server 2012 Service Pack 1 (GDR)] | 2014-08-12 |
-| 11.0.3128 | 2011.110.3128.0 | [2793634 Windows Installer starts repeatedly after you install SQL Server 2012 SP1] | 2013-01-03 |
-| 11.0.3000 | 2011.110.3000.0 | [SQL Server 2012 Service Pack 1 (SP1)] | 2012-11-06 |
-| 11.0.2845 | 2011.110.2845.0 | SQL Server 2012 Service Pack 1 Customer Technology Preview 4 (CTP4) | 2012-09-20 |
-| 11.0.2809 | 2011.110.2809.24 | SQL Server 2012 Service Pack 1 Customer Technology Preview 3 (CTP3) | 2012-07-05 |
-| 11.0.2424 | 2011.110.2424.0 | [2908007 Cumulative update package 11 (CU11) for SQL Server 2012] | 2013-12-17 |
-| 11.0.2420 | 2011.110.2420.0 | [2891666 Cumulative update package 10 (CU10) for SQL Server 2012] | 2013-10-21 |
-| 11.0.2419 | 2011.110.2419.0 | [2867319 Cumulative update package 9 (CU9) for SQL Server 2012] | 2013-08-21 |
-| 11.0.2410 | 2011.110.2410.0 | [2844205 Cumulative update package 8 (CU8) for SQL Server 2012] | 2013-06-18 |
-| 11.0.2405 | 2011.110.2405.0 | [2823247 Cumulative update package 7 (CU7) for SQL Server 2012] | 2013-04-15 |
-| 11.0.2401 | 2011.110.2401.0 | [2728897 Cumulative update package 6 (CU6) for SQL Server 2012] | 2013-02-18 |
-| 11.0.2395 | 2011.110.2395.0 | [2777772 Cumulative update package 5 (CU5) for SQL Server 2012] | 2012-12-18 |
-| 11.0.9000 | 2011.110.9000.5 | Microsoft SQL Server 2012 With Power View For Multidimensional Models Customer Technology Preview (CTP3) | 2012-11-27 |
-| 11.0.2383 | 2011.110.2383.0 | [2758687 Cumulative update package 4 (CU4) for SQL Server 2012] | 2012-10-18 |
-| 11.0.2376 | 2011.110.2376.0 | [Microsoft Security Bulletin MS12-070] | 2012-10-09 |
-| 11.0.2332 | 2011.110.2332.0 | [2723749 Cumulative update package 3 (CU3) for SQL Server 2012] | 2012-08-29 |
-| 11.0.2325 | 2011.110.2325.0 | [2703275 Cumulative update package 2 (CU2) for SQL Server 2012] | 2012-06-18 |
-| 11.0.2316 | 2011.110.2316.0 | [2679368 Cumulative update package 1 (CU1) for SQL Server 2012] | 2012-04-12 |
-| 11.0.2218 | 2011.110.2218.0 | [Microsoft Security Bulletin MS12-070] | 2012-10-09 |
-| 11.0.2214 | 2011.110.2214.0 | 2685308 FIX: SSAS uses only 20 cores in SQL Server 2012 Business Intelligence | 2012-04-06 |
-| 11.0.2100 | 2011.110.2100.60 | SQL Server 2012 RTM | 2012-03-06 |
-| 11.0.1913 | 2011.110.1913.37 | Microsoft SQL Server 2012 Release Candidate 1 (RC1) | 2011-12-16 |
-| 11.0.1750 | 2011.110.1750.32 | Microsoft SQL Server 2012 Release Candidate 0 (RC0) | 2011-11-17 |
-| 11.0.1440 | 2010.110.1440.19 | Microsoft SQL Server 2012 (codename Denali) Community Technology Preview 3 (CTP3) | 2011-07-11 |
-| 11.0.1103 | 2010.110.1103.9 | Microsoft SQL Server 2012 (codename Denali) Community Technology Preview 1 (CTP1) | 2010-11-08 |
-
+## Microsoft SQL Server 2012 Builds
+
+
+All SQL Server 2014 CU downloads: [Catalog Update Microsoft SQL Server 2012](http://www.catalog.update.microsoft.com/Search.aspx?q=sql%20server%202012)
+
+| Build | File version | Branch | Type | KB / Description | Release Date |
+|---------------|------------------|--------|------|----------------------------------------------------------------------------------------------------------------------------------------|--------------|
+| 11.0.77462.6 | 2011.110.7462.6 | SP4 | GDR | [4057116 Security Advisory ADV180002 (GDR)] | 2018-01-12 |
+| 11.0.7001.0 | 2011.110.7001.0 | SP4 | SP | [4018073 SQL Server 2012 Service Pack 4 release information] | 2017-10-05 |
+| 11.0.6607.3 | 2011.110.6607.3 | SP3 | CU | [4016762 Cumulative Update 10 for SQL Server 2012 SP3] | 2017-08-08 |
+| 11.0.6598.0 | 2011.110.6598.0 | SP3 | CU | [4016762 Cumulative Update 9 for SQL Server 2012 SP3] | 2017-05-15 |
+| 11.0.6594.0 | 2011.110.6594.0 | SP3 | CU | [4013104 Cumulative Update 8 for SQL Server 2012 SP3] | 2017-03-21 |
+| 11.0.6579.0 | 2011.110.6579.0 | SP3 | CU | [3205051 Cumulative Update Package 7 for SQL Server 2012 SP3] | 2017-01-18 |
+| 11.0.6567.0 | 2011.110.6567.0 | SP3 | COD | [3194724 MS16-136: Description of the security update for SQL Server 2012 Service Pack 3 CU: November 8, 2016] | 2016-11-17 |
+| 11.0.6544.0 | 2011.110.6544.0 | SP3 | CU | [3180915 Cumulative update 5 for SQL Server 2012 Service Pack 3] | 2016-09-20 |
+| 11.0.6540.0 | 2011.110.6540.0 | SP3 | CU | [3165264 Cumulative Update 4 for SQL Server 2012 SP3] | 2016-07-18 |
+| 11.0.6537.0 | 2011.110.6537.0 | SP3 | CU | [3152635 Cumulative update package 3 for SQL Server 2012 SP3] | 2016-05-16 |
+| 11.0.6523.0 | 2011.110.6523.0 | SP3 | CU | [3137746 Cumulative update package 2 for SQL Server 2012 SP3] | 2016-03-21 |
+| 11.0.6518.0 | 2011.110.6518.0 | SP3 | CU | [3123299 Cumulative update package 1 for SQL Server 2012 SP3] | 2016-01-19 |
+| 11.0.6248.0 | 2011.110.6248.0 | SP3 | GDR | [3194721 MS16-136: Description of the security update for SQL Server 2012 Service Pack 3 GDR: November 8, 2016] | 2016-11-08 |
+| 11.0.6216.27 | 2011.110.6216.27 | SP3 | GDR | [3135244 TLS 1.2 support for SQL Server 2012 SP3 GDR] | 2016-01-27 |
+| 11.3.6020.0 | 2011.110.6020.0 | SP3 | SP | [3072779 Microsoft SQL Server 2012 Service Pack 3 (SP3)] | 2015-11-21 |
+| 11.0.5678.0 | 2011.110.5678.0 | SP2 | CU | [3205054 Cumulative Update 16 for SQL Server 2012 SP2] | 2017-01-18 |
+| 11.0.5676.0 | 2011.110.5676.0 | SP2 | CU | [3205416 Cumulative update package 15 (CU15) for SQL Server 2012 Service Pack 2] | 2016-11-17 |
+| 11.0.5676.0 | 2011.110.5676.0 | SP2 | COD | [3194725 MS16-136: Description of the security update for SQL Server 2012 Service Pack 2 CU: November 8, 2016] | 2016-11-17 |
+| 11.0.5657.0 | 2011.110.5657.0 | SP2 | CU | [3180914 Cumulative Update 14 for SQL Server 2012 SP2] | 2016-09-20 |
+| 11.0.5655.0 | 2011.110.5655.0 | SP2 | CU | [3165266 Cumulative Update 13 for SQL Server 2012 SP2] | 2016-07-18 |
+| 11.0.5649.0 | 2011.110.5649.0 | SP2 | CU | [3152637 Cumulative update package 12 for SQL Server 2012 SP2] | 2016-05-16 |
+| 11.0.5646.2 | 2011.110.5646.2 | SP2 | CU | [3137745 Cumulative update package 11 for SQL Server 2012 SP2] | 2016-03-21 |
+| 11.0.5644.2 | 2011.110.5644.2 | SP2 | CU | [3120313 Cumulative update package 10 for SQL Server 2012 SP2] | 2016-01-19 |
+| 11.0.5641.0 | 2011.110.5641.0 | SP2 | CU | [3098512 Cumulative update package 9 for SQL Server 2012 SP2] | 2015-11-16 |
+| 11.0.5636 | 2011.110.5636.3 | SP2 | COD | [3097636 FIX: Performance decrease when application with connection pooling frequently connects or disconnects in SQL Server] | 2015-09-22 |
+| 11.0.5634 | 2011.110.5634.0 | SP2 | CU | [3082561 Cumulative update package 8 (CU8) for SQL Server 2012 Service Pack 2] | 2015-09-21 |
+| 11.0.5629 | 2011.110.5629.0 | SP2 | COD | [3087872 FIX: Access violations when you use the FileTable feature in SQL Server 2012] | 2015-08-31 |
+| 11.0.5623 | 2011.110.5623.0 | SP2 | CU | [3072100 Cumulative update package 7 (CU7) for SQL Server 2012 Service Pack 2] | 2015-07-20 |
+| 11.0.5613 | 2011.110.5613.0 | SP2 | COD | [3045319 MS15-058: Description of the security update for SQL Server 2012 Service Pack 2 QFE: July 14, 2015] | 2015-07-14 |
+| 11.0.5592 | 2011.110.5592.0 | SP2 | CU | [3052468 Cumulative update package 6 (CU6) for SQL Server 2012 Service Pack 2] | 2015-05-19 |
+| 11.0.5582 | 2011.110.5582.0 | SP2 | CU | [3037255 Cumulative update package 5 (CU5) for SQL Server 2012 Service Pack 2] | 2015-03-16 |
+| 11.0.5571 | 2011.110.5571.0 | SP2 | COD | [3034679 FIX: AlwaysOn availability groups are reported as NOT SYNCHRONIZING] | 2015-05-15 |
+| 11.0.5569 | 2011.110.5569.0 | SP2 | CU | [3007556 Cumulative update package 4 (CU4) for SQL Server 2012 Service Pack 2] | 2015-01-20 |
+| 11.0.5556 | 2011.110.5556.0 | SP2 | CU | [3002049 Cumulative update package 3 (CU3) for SQL Server 2012 Service Pack 2] | 2014-11-17 |
+| 11.0.5548 | 2011.110.5548.0 | SP2 | CU | [2983175 Cumulative update package 2 (CU2) for SQL Server 2012 Service Pack 2] | 2014-09-15 |
+| 11.0.5532 | 2011.110.5532.0 | SP2 | CU | [2976982 Cumulative update package 1 (CU1) for SQL Server 2012 Service Pack 2] | 2014-07-24 |
+| 11.0.5522 | 2011.110.5522.0 | SP2 | COD | [2969896 FIX: Data loss in clustered index occurs when you run online build index in SQL Server 2012 (Hotfix for SQL2012 SP2)] | 2014-06-20 |
+| 11.0.5388 | 2012.110.5388.0 | SP2 | GDR | [3194719 MS16-136: Description of the security update for SQL Server 2012 Service Pack 2 GDR: November 8, 2016] | 2016-11-08 |
+| 11.0.5352 | 2012.110.5352.0 | SP2 | GDR | [3135244 TLS 1.2 support for SQL Server 2012 SP2 GDR] | 2016-01-27 |
+| 11.0.5343 | 2011.110.5343.0 | SP2 | GDR | [3045321 MS15-058: Description of the security update for SQL Server 2012 Service Pack 2 GDR: July 14, 2015] | 2015-07-14 |
+| 11.0.5058 | 2011.110.5058.0 | SP2 | SP | [SQL Server 2012 Service Pack 2 (SP2)] | 2014-06-10 |
+| 11.0.3513 | 2011.110.3513.0 | SP1 | QFE | [3045317 MS15-058: Description of the security update for SQL Server 2012 SP1 QFE: July 14, 2015] | 2015-07-14 |
+| 11.0.3492 | 2011.110.3492.0 | SP1 | CU | [3052476 Cumulative update package 16 (CU16) for SQL Server 2012 Service Pack 1] | 2015-05-18 |
+| 11.0.3487 | 2011.110.3487.0 | SP1 | CU | [3038001 Cumulative update package 15 (CU15) for SQL Server 2012 Service Pack 1] | 2015-03-16 |
+| 11.0.3486 | 2011.110.3486.0 | SP1 | QFE | [3023636 Cumulative update package 14 (CU14) for SQL Server 2012 Service Pack 1] | 2015-01-19 |
+| 11.0.3460 | 2011.110.3460.0 | SP1 | COD | [2977325 MS14-044: Description of the security update for SQL Server 2012 Service Pack 1 (QFE)] | 2014-08-12 |
+| 11.0.3482 | 2011.110.3482.0 | SP1 | CU | [3002044 Cumulative update package 13 (CU13) for SQL Server 2012 Service Pack 1] | 2014-11-17 |
+| 11.0.3470 | 2011.110.3470.0 | SP1 | CU | [2991533 Cumulative update package 12 (CU12) for SQL Server 2012 Service Pack 1] | 2014-09-15 |
+| 11.0.3449 | 2011.110.3449.0 | SP1 | CU | [2975396 Cumulative update package 11 (CU11) for SQL Server 2012 Service Pack 1] | 2014-07-21 |
+| 11.0.3437 | 2011.110.3437.0 | SP1 | COD | [2969896 FIX: Data loss in clustered index occurs when you run online build index in SQL Server 2012 (Hotfix for SQL2012 SP1)] | 2014-06-10 |
+| 11.0.3431 | 2011.110.3431.0 | SP1 | CU | [2954099 Cumulative update package 10 (CU10) for SQL Server 2012 Service Pack 1] | 2014-05-19 |
+| 11.0.3412 | 2011.110.3412.0 | SP1 | CU | [2931078 Cumulative update package 9 (CU9) for SQL Server 2012 Service Pack 1] | 2014-03-18 |
+| 11.0.3401 | 2011.110.3401.0 | SP1 | CU | [2917531 Cumulative update package 8 (CU8) for SQL Server 2012 Service Pack 1] | 2014-01-20 |
+| 11.0.3393 | 2011.110.3393.0 | SP1 | CU | [2894115 Cumulative update package 7 (CU7) for SQL Server 2012 Service Pack 1] | 2013-11-18 |
+| 11.0.3381 | 2011.110.3381.0 | SP1 | CU | [2874879 Cumulative update package 6 (CU6) for SQL Server 2012 Service Pack 1] | 2013-09-16 |
+| 11.0.3373 | 2011.110.3373.0 | SP1 | CU | [2861107 Cumulative update package 5 (CU5) for SQL Server 2012 Service Pack 1] | 2013-07-16 |
+| 11.0.3368 | 2011.110.3368.0 | SP1 | CU | [2833645 Cumulative update package 4 (CU4) for SQL Server 2012 Service Pack 1] | 2013-05-31 |
+| 11.0.3350 | 2011.110.3350.0 | SP1 | COD | [2832017 FIX: You can’t create or open SSIS projects or maintenance plans after you apply Cumulative Update 3 for SQL Server 2012 SP1] | 2013-04-17 |
+| 11.0.3349 | 2011.110.3349.0 | SP1 | CU | [2812412 Cumulative update package 3 (CU3) for SQL Server 2012 Service Pack 1] | 2013-03-18 |
+| 11.0.3339 | 2011.110.3339.0 | SP1 | CU | [2790947 Cumulative update package 2 (CU2) for SQL Server 2012 Service Pack 1] | 2013-01-25 |
+| 11.0.3335 | 2011.110.3335.0 | SP1 | COD | [2800050 FIX: Component installation process fails after you install SQL Server 2012 SP1] | 2013-01-14 |
+| 11.0.3321 | 2011.110.3321.0 | SP1 | CU | [2765331 Cumulative update package 1 (CU1) for SQL Server 2012 Service Pack 1] | 2012-11-20 |
+| 11.0.3156 | 2011.110.3156.0 | SP1 | COD | [3045318 MS15-058: Description of the security update for SQL Server 2012 SP1 GDR: July 14, 2015] | 2015-07-14 |
+| 11.0.3153 | 2011.110.3153.0 | SP1 | GDR | [2977326 MS14-044: Description of the security update for SQL Server 2012 Service Pack 1 (GDR)] | 2014-08-12 |
+| 11.0.3128 | 2011.110.3128.0 | SP1 | COD | [2793634 Windows Installer starts repeatedly after you install SQL Server 2012 SP1] | 2013-01-03 |
+| 11.0.3000 | 2011.110.3000.0 | SP1 | SP | [SQL Server 2012 Service Pack 1 (SP1)] | 2012-11-06 |
+| 11.0.2845 | 2011.110.2845.0 | SP1 | CTP | SQL Server 2012 Service Pack 1 Customer Technology Preview 4 (CTP4) | 2012-09-20 |
+| 11.0.2809 | 2011.110.2809.24 | SP1 | CTP | SQL Server 2012 Service Pack 1 Customer Technology Preview 3 (CTP3) | 2012-07-05 |
+| 11.0.2424 | 2011.110.2424.0 | RTM | CU | [2908007 Cumulative update package 11 (CU11) for SQL Server 2012] | 2013-12-17 |
+| 11.0.2420 | 2011.110.2420.0 | RTM | CU | [2891666 Cumulative update package 10 (CU10) for SQL Server 2012] | 2013-10-21 |
+| 11.0.2419 | 2011.110.2419.0 | RTM | CU | [2867319 Cumulative update package 9 (CU9) for SQL Server 2012] | 2013-08-21 |
+| 11.0.2410 | 2011.110.2410.0 | RTM | CU | [2844205 Cumulative update package 8 (CU8) for SQL Server 2012] | 2013-06-18 |
+| 11.0.2405 | 2011.110.2405.0 | RTM | CU | [2823247 Cumulative update package 7 (CU7) for SQL Server 2012] | 2013-04-15 |
+| 11.0.2401 | 2011.110.2401.0 | RTM | CU | [2728897 Cumulative update package 6 (CU6) for SQL Server 2012] | 2013-02-18 |
+| 11.0.2395 | 2011.110.2395.0 | RTM | CU | [2777772 Cumulative update package 5 (CU5) for SQL Server 2012] | 2012-12-18 |
+| 11.0.9000 | 2011.110.9000.5 | RTM | CTP | Microsoft SQL Server 2012 With Power View For Multidimensional Models Customer Technology Preview (CTP3) | 2012-11-27 |
+| 11.0.2383 | 2011.110.2383.0 | RTM | CU | [2758687 Cumulative update package 4 (CU4) for SQL Server 2012] | 2012-10-18 |
+| 11.0.2376 | 2011.110.2376.0 | RTM | COD | [Microsoft Security Bulletin MS12-070] | 2012-10-09 |
+| 11.0.2332 | 2011.110.2332.0 | RTM | CU | [2723749 Cumulative update package 3 (CU3) for SQL Server 2012] | 2012-08-29 |
+| 11.0.2325 | 2011.110.2325.0 | RTM | CU | [2703275 Cumulative update package 2 (CU2) for SQL Server 2012] | 2012-06-18 |
+| 11.0.2316 | 2011.110.2316.0 | RTM | CU | [2679368 Cumulative update package 1 (CU1) for SQL Server 2012] | 2012-04-12 |
+| 11.0.2218 | 2011.110.2218.0 | RTM | COD | [Microsoft Security Bulletin MS12-070] | 2012-10-09 |
+| 11.0.2214 | 2011.110.2214.0 | RTM | COD | 2685308 FIX: SSAS uses only 20 cores in SQL Server 2012 Business Intelligence | 2012-04-06 |
+| 11.0.2100 | 2011.110.2100.60 | RTM | RTM | SQL Server 2012 RTM | 2012-03-06 |
+| 11.0.1913 | 2011.110.1913.37 | RC | RC | Microsoft SQL Server 2012 Release Candidate 1 (RC1) | 2011-12-16 |
+| 11.0.1750 | 2011.110.1750.32 | RC | RC | Microsoft SQL Server 2012 Release Candidate 0 (RC0) | 2011-11-17 |
+| 11.0.1440 | 2010.110.1440.19 | CTP | CTP | Microsoft SQL Server 2012 (codename Denali) Community Technology Preview 3 (CTP3) | 2011-07-11 |
+| 11.0.1103 | 2010.110.1103.9 | CTP | CTP | Microsoft SQL Server 2012 (codename Denali) Community Technology Preview 1 (CTP1) | 2010-11-08 |
+
+[4057116 Security Advisory ADV180002 (GDR)]:https://support.microsoft.com/en-us/help/4057116/security-update-for-vulnerabilities-in-sql-server
+[4018073 SQL Server 2012 Service Pack 4 release information]:https://support.microsoft.com/en-us/help/4018073/sql-server-2012-service-pack-4-release-information
+[4016762 Cumulative Update 10 for SQL Server 2012 SP3]:https://support.microsoft.com/en-us/help/4025925/cumulative-update-10-for-sql-server-2012-sp3
+[4016762 Cumulative Update 9 for SQL Server 2012 SP3]:https://support.microsoft.com/en-us/help/4016762/cumulative-update-9-for-sql-server-2012-sp3
+[4013104 Cumulative Update 8 for SQL Server 2012 SP3]:https://support.microsoft.com/en-us/help/4013104/cumulative-update-8-for-sql-server-2012-sp3
+[3205051 Cumulative Update Package 7 for SQL Server 2012 SP3]:https://support.microsoft.com/en-us/help/3205051/cumulative-update-7-for-sql-server-2012-sp3
+[3194724 MS16-136: Description of the security update for SQL Server 2012 Service Pack 3 CU: November 8, 2016]:https://support.microsoft.com/en-us/kb/3194724
+[3194725 MS16-136: Description of the security update for SQL Server 2012 Service Pack 2 CU: November 8, 2016]:https://support.microsoft.com/en-us/kb/3194725
+[3180914 Cumulative Update 14 for SQL Server 2012 SP2]:https://support.microsoft.com/en-us/kb/3180914
+[3180915 Cumulative update 5 for SQL Server 2012 Service Pack 3]:https://support.microsoft.com/en-us/kb/3180915
+[3165264 Cumulative Update 4 for SQL Server 2012 SP3]:https://support.microsoft.com/en-us/kb/3165264
+[3165266 Cumulative Update 13 for SQL Server 2012 SP2]:https://support.microsoft.com/en-us/kb/3165266
[3152635 Cumulative update package 3 for SQL Server 2012 SP3]:https://support.microsoft.com/en-us/kb/3152635
[3152637 Cumulative update package 12 for SQL Server 2012 SP2]:https://support.microsoft.com/en-us/kb/3152637
[3137746 Cumulative update package 2 for SQL Server 2012 SP3]:https://support.microsoft.com/en-us/kb/3137746
[3137745 Cumulative update package 11 for SQL Server 2012 SP2]:https://support.microsoft.com/en-us/kb/3137745
[3123299 Cumulative update package 1 for SQL Server 2012 SP3]:https://support.microsoft.com/en-us/kb/3123299
+[3205416 Cumulative update package 15 (CU15) for SQL Server 2012 Service Pack 2]:https://support.microsoft.com/en-us/kb/3205416
+[3194721 MS16-136: Description of the security update for SQL Server 2012 Service Pack 3 GDR: November 8, 2016]:https://support.microsoft.com/en-us/kb/3194721
+[3135244 TLS 1.2 support for SQL Server 2012 SP3 GDR]:https://support.microsoft.com/en-us/kb/3135244
[3120313 Cumulative update package 10 for SQL Server 2012 SP2]:https://support.microsoft.com/en-us/kb/3120313
[3072779 Microsoft SQL Server 2012 Service Pack 3 (SP3)]:https://support.microsoft.com/en-us/kb/3072779
+[3205054 Cumulative Update 16 for SQL Server 2012 SP2]:https://support.microsoft.com/en-us/help/3205054/cumulative-update-16-for-sql-server-2012-sp2
[3098512 Cumulative update package 9 for SQL Server 2012 SP2]:https://support.microsoft.com/en-us/kb/3098512
[3097636 FIX: Performance decrease when application with connection pooling frequently connects or disconnects in SQL Server]:https://support.microsoft.com/en-us/kb/3097636
[3082561 Cumulative update package 8 (CU8) for SQL Server 2012 Service Pack 2]:http://support.microsoft.com/kb/3082561
@@ -453,6 +996,8 @@ Service Pack 1 includes a number of enhancements; these were the most interestin
[2983175 Cumulative update package 2 (CU2) for SQL Server 2012 Service Pack 2]:http://support.microsoft.com/kb/2983175
[2976982 Cumulative update package 1 (CU1) for SQL Server 2012 Service Pack 2]:http://support.microsoft.com/kb/2976982
[2969896 FIX: Data loss in clustered index occurs when you run online build index in SQL Server 2012 (Hotfix for SQL2012 SP2)]:http://support.microsoft.com/kb/2969896
+[3194719 MS16-136: Description of the security update for SQL Server 2012 Service Pack 2 GDR: November 8, 2016]:https://support.microsoft.com/en-us/kb/3194719
+[3135244 TLS 1.2 support for SQL Server 2012 SP2 GDR]:https://support.microsoft.com/en-us/kb/3135244
[3045321 MS15-058: Description of the security update for SQL Server 2012 Service Pack 2 GDR: July 14, 2015]:https://support.microsoft.com/en-us/kb/3045321
[SQL Server 2012 Service Pack 2 (SP2)]:http://www.microsoft.com/en-us/download/details.aspx?id=43340
[3045317 MS15-058: Description of the security update for SQL Server 2012 SP1 QFE: July 14, 2015]:https://support.microsoft.com/en-us/kb/3045317
@@ -495,83 +1040,93 @@ Service Pack 1 includes a number of enhancements; these were the most interestin
[2685308 FIX: SSAS uses only 20 cores in SQL Server 2012 Business Intelligence]:http://support.microsoft.com/kb/2685308
-## Microsoft SQL Server 2008 R2 Builds
-
-| Build | File version | KB / Description | Release Date |
-|------------|------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------|
-| 10.50.6529 | 2009.100.6529.0 | [3045314 MS15-058: Description of the security update for SQL Server 2008 R2 Service Pack 3 QFE: July 14, 2015] | 2015-07-14 |
-| 10.50.6525 | 2009.100.6525.0 | [3033860 An on-demand hotfix update package is available for SQL Server 2008 R2 Service Pack 3 (SP3)] | 2015-02-09 |
-| 10.50.6220 | 2009.100.6220.0 | [3045316 MS15-058: Description of the security update for SQL Server 2008 R2 Service Pack 3 GDR: July 14, 2015] | 2015-07-14 |
-| 10.50.6000 | 2009.100.6000.0 | [SQL Server 2008 R2 Service Pack 3 (SP3)] | 2014-09-26 |
-| 10.50.4339 | 2009.100.4339.0 | [3045312 MS15-058: Description of the security update for SQL Server 2008 R2 Service Pack 2 QFE: July 14, 2015] | 2015-07-14 |
-| 10.50.4331 | 2009.100.4331.0 | [2987585 Restore Log with Standby Mode on an Advanced Format disk may cause a 9004 error in SQL Server 2008 R2 or SQL Server 2012] | 2014-08-27 |
-| 10.50.4321 | 2009.100.4321.0 | [2977319 MS14-044: Description of the security update for SQL Server 2008 R2 Service Pack 2 (QFE)] | 2014-08-12 |
-| 10.50.4319 | 2009.100.4319.0 | [2967540 Cumulative update package 13 (CU13) for SQL Server 2008 R2 Service Pack 2] | 2014-06-30 |
-| 10.50.4305 | 2009.100.4305.0 | [2938478 Cumulative update package 12 (CU12) for SQL Server 2008 R2 Service Pack 2] | 2014-04-21 |
-| 10.50.4302 | 2009.100.4302.0 | [2926028 Cumulative update package 11 (CU11) for SQL Server 2008 R2 Service Pack 2] | 2014-02-18 |
-| 10.50.4297 | 2009.100.4297.0 | [2908087 Cumulative update package 10 (CU10) for SQL Server 2008 R2 Service Pack 2] | 2013-12-16 |
-| 10.50.4295 | 2009.100.4295.0 | [2887606 Cumulative update package 9 (CU9) for SQL Server 2008 R2 Service Pack 2] | 2013-10-29 |
-| 10.50.4290 | 2009.100.4290.0 | [2871401 Cumulative update package 8 (CU8) for SQL Server 2008 R2 Service Pack 2] | 2013-08-30 |
-| 10.50.4286 | 2009.100.4286.0 | [2844090 Cumulative update package 7 (CU7) for SQL Server 2008 R2 Service Pack 2] | 2013-06-17 |
-| 10.50.4285 | 2009.100.4285.0 | [2830140 Cumulative update package 6 (CU6) for SQL Server 2008 R2 Service Pack 2 (updated)] | 2013-06-13 |
-| 10.50.4279 | 2009.100.4279.0 | 2830140 Cumulative update package 6 (CU6) for SQL Server 2008 R2 Service Pack 2 (replaced) | 2013-04-15 |
-| 10.50.4276 | 2009.100.4276.0 | [2797460 Cumulative update package 5 (CU5) for SQL Server 2008 R2 Service Pack 2] | 2013-02-18 |
-| 10.50.4270 | 2009.100.4270.0 | [2777358 Cumulative update package 4 (CU4) for SQL Server 2008 R2 Service Pack 2] | 2012-12-17 |
-| 10.50.4266 | 2009.100.4266.0 | [2754552 Cumulative update package 3 (CU3) for SQL Server 2008 R2 Service Pack 2] | 2012-10-15 |
-| 10.50.4263 | 2009.100.4263.0 | [2740411 Cumulative update package 2 (CU2) for SQL Server 2008 R2 Service Pack 2] | 2012-08-29 |
-| 10.50.4260 | 2009.100.4260.0 | [2720425 Cumulative update package 1 (CU1) for SQL Server 2008 R2 Service Pack 2] | 2012-08-01 |
-| 10.50.4042 | 2009.100.4042.0 | [3045313 MS15-058: MS15-058: Description of the security update for SQL Server 2008 R2 Service Pack 2 GDR: July 14, 2015] | 2015-07-14 |
-| 10.50.4033 | 2009.100.4033.0 | [2977320 MS14-044: Description of the security update for SQL Server 2008 R2 Service Pack 2 (GDR)] | 2014-08-12 |
-| 10.50.4000 | 2009.100.4000.0 | [SQL Server 2008 R2 Service Pack 2 (SP2)] | 2012-06-26 |
-| 10.50.3720 | 2009.100.3720.0 | SQL Server 2008 R2 Service Pack 2 Community Technology Preview (CTP) | 2012-05-13 |
-| 10.50.2881 | 2009.100.2881.0 | [2868244 An on-demand hotfix update package for SQL Server 2008 R2 Service Pack 1] | 2013-08-12 |
-| 10.50.2876 | 2009.100.2876.0 | [2855792 Cumulative update package 13 (CU13) for SQL Server 2008 R2 Service Pack 1] | 2013-06-17 |
-| 10.50.2875 | 2009.100.2875.0 | [2828727 Cumulative update package 12 (CU12) for SQL Server 2008 R2 Service Pack 1 (updated)] | 2013-06-13 |
-| 10.50.2874 | 2009.100.2874.0 | 2828727 Cumulative update package 12 (CU12) for SQL Server 2008 R2 Service Pack 1 (replaced) | 2013-04-15 |
-| 10.50.2861 | 2009.100.2861.0 | [Microsoft Security Bulletin MS12-070] | 2012-10-09 |
-| 10.50.2869 | 2009.100.2869.0 | [2812683 Cumulative update package 11 (CU11) for SQL Server 2008 R2 Service Pack 1] | 2013-02-18 |
-| 10.50.2868 | 2009.100.2868.0 | [2783135 Cumulative update package 10 (CU10) for SQL Server 2008 R2 Service Pack 1] | 2012-12-17 |
-| 10.50.2866 | 2009.100.2866.0 | [2756574 Cumulative update package 9 (CU9) for SQL Server 2008 R2 Service Pack 1] | 2012-11-06 |
-| 10.50.2861 | 2009.100.2861.0 | [2716439 MS12-070: Description of the security update for SQL Server 2008 R2 Service Pack 1 QFE: October 9, 2012] | 2012-10-09 |
-| 10.50.2822 | 2009.100.2822.0 | [2723743 Cumulative update package 8 (CU8) for SQL Server 2008 R2 Service Pack 1] | 2012-08-29 |
-| 10.50.2817 | 2009.100.2817.0 | [2703282 Cumulative update package 7 (CU7) for SQL Server 2008 R2 Service Pack 1] | 2012-06-18 |
-| 10.50.2811 | 2009.100.2811.0 | [2679367 Cumulative update package 6 (CU6) for SQL Server 2008 R2 Service Pack 1] | 2012-04-16 |
-| 10.50.2807 | 2009.100.2807.0 | [2675522 FIX: Access violation when you run DML statements against a table that has partitioned indexes in SQL Server 2008 R2] | 2012-03-12 |
-| 10.50.2806 | 2009.100.2806.0 | [2659694 Cumulative update package 5 (CU5) for SQL Server 2008 R2 Service Pack 1] | 2012-02-22 |
-| 10.50.2799 | 2009.100.2799.0 | [2633357 FIX: "Non-yielding Scheduler" error might occur when you run a query that uses the CHARINDEX function in SQL Server 2008 R2] | 2012-02-22 |
-| 10.50.2796 | 2009.100.2796.0 | [2633146 Cumulative update package 4 (CU4) for SQL Server 2008 R2 Service Pack 1] | 2011-12-20 |
-| 10.50.2789 | 2009.100.2789.0 | [2591748 Cumulative update package 3 (CU3) for SQL Server 2008 R2 Service Pack 1] | 2011-10-17 |
-| 10.50.2776 | 2009.100.2776.0 | [2606883 FIX: Slow performance when an AFTER trigger runs on a partitioned table in SQL Server 2008 R2] | 2011-10-18 |
-| 10.50.2772 | 2009.100.2772.0 | [2567714 Cumulative update package 2 (CU2) for SQL Server 2008 R2 Service Pack 1] | 2011-08-15 |
-| 10.50.2769 | 2009.100.2769.0 | [2544793 Cumulative update package 1 (CU1) for SQL Server 2008 R2 Service Pack 1] | 2011-07-18 |
-| 10.50.2550 | 2009.100.2550.0 | [Microsoft Security Bulletin MS12-070] | 2012-10-09 |
-| 10.50.2500 | 2009.100.2500.0 | [SQL Server 2008 R2 Service Pack 1 (SP1)] | 2011-07-11 |
-| 10.50.1817 | 2009.100.1817.0 | [2703280 Cumulative update package 14 (CU14) for SQL Server 2008 R2] | 2012-06-18 |
-| 10.50.1815 | 2009.100.1815.0 | [2679366 Cumulative update package 13 (CU13) for SQL Server 2008 R2] | 2012-04-17 |
-| 10.50.1810 | 2009.100.1810.0 | [2659692 Cumulative update package 12 (CU12) for SQL Server 2008 R2] | 2012-02-21 |
-| 10.50.1809 | 2009.100.1809.0 | [2633145 Cumulative update package 11 (CU11) for SQL Server 2008 R2] | 2012-01-09 |
-| 10.50.1807 | 2009.100.1807.0 | [2591746 Cumulative update package 10 (CU10) for SQL Server 2008 R2] | 2011-10-19 |
-| 10.50.1804 | 2009.100.1804.0 | [2567713 Cumulative update package 9 (CU9) for SQL Server 2008 R2] | 2011-08-16 |
-| 10.50.1800 | 2009.100.1800.0 | [2574699 FIX: Database data files might be incorrectly marked as sparse in SQL Server 2008 R2 or in SQL Server 2008 even when the physical files are marked as not sparse in the file system] | 2011-10-18 |
-| 10.50.1797 | 2009.100.1797.0 | [2534352 Cumulative update package 8 (CU8) for SQL Server 2008 R2] | 2011-06-20 |
-| 10.50.1790 | 2009.100.1790.0 | [2494086 MS11-049: Description of the security update for SQL Server 2008 R2 QFE: June 14, 2011] | 2011-06-17 |
-| 10.50.1777 | 2009.100.1777.0 | [2507770 Cumulative update package 7 (CU7) for SQL Server 2008 R2] | 2011-06-16 |
-| 10.50.1769 | 2009.100.1769.0 | [2520808 FIX: Non-yielding scheduler error when you run a query that uses a TVP in SQL Server 2008 or in SQL Server 2008 R2 if SQL Profiler or SQL Server Extended Events is used] | 2011-04-18 |
-| 10.50.1765 | 2009.100.1765.0 | [2489376 Cumulative update package 6 (CU6) for SQL Server 2008 R2] | 2011-02-21 |
-| 10.50.1753 | 2009.100.1753.0 | [2438347 Cumulative update package 5 (CU5) for SQL Server 2008 R2] | 2010-12-23 |
-| 10.50.1746 | 2009.100.1746.0 | [2345451 Cumulative update package 4 (CU4) for SQL Server 2008 R2] | 2010-10-18 |
-| 10.50.1734 | 2009.100.1734.0 | [2261464 Cumulative update package 3 (CU3) for SQL Server 2008 R2] | 2010-08-20 |
-| 10.50.1720 | 2009.100.1720.0 | [2072493 Cumulative update package 2 (CU2) for SQL Server 2008 R2] | 2010-06-25 |
-| 10.50.1702 | 2009.100.1702.0 | [981355 Cumulative update package 1 (CU1) for SQL Server 2008 R2] | 2010-05-18 |
-| 10.50.1617 | 2009.100.1617.0 | [2494088 MS11-049: Description of the security update for SQL Server 2008 R2 GDR: June 14, 2011] | 2011-06-14 |
-| 10.50.1600 | 2009.100.1600.1 | SQL Server 2008 R2 RTM | 2010-04-21 |
-| 10.50.1352 | 2009.100.1352.12 | Microsoft SQL Server 2008 R2 November Community Technology Preview (CTP) | 2009-11-12 |
-| 10.50.1092 | 2009.100.1092.20 | Microsoft SQL Server 2008 R2 August Community Technology Preview (CTP) | 2009-06-30 |
-
+
+## Microsoft SQL Server 2008 R2 Builds
+
+### All SQL Server 2008 R2 CU downloads
+[Catalog Update Microsoft SQL Server 2008 R2]:http://www.catalog.update.microsoft.com/Search.aspx?q=sql%20server%202008%20R2
+
+| Build | File version | KB / Description | Release Date |
+|---------------|------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------|
+| 10.50.6542 | 2009.100.6542.0 | [3146034 Intermittent service terminations occur after you install any SQL Server 2008 or SQL Server 2008 R2 versions from KB3135244] | 2016-03-03 |
+| 10.50.6537 | 2009.100.6537.0 | [3135244 TLS 1.2 support for SQL Server 2008 R2 SP3] | 2016-01-27 |
+| 10.50.6529 | 2009.100.6529.0 | [3045314 MS15-058: Description of the security update for SQL Server 2008 R2 Service Pack 3 QFE: July 14, 2015] | 2015-07-14 |
+| 10.50.6525 | 2009.100.6525.0 | [3033860 An on-demand hotfix update package is available for SQL Server 2008 R2 Service Pack 3 (SP3)] | 2015-02-09 |
+| 10.50.6220 | 2009.100.6220.0 | [3045316 MS15-058: Description of the security update for SQL Server 2008 R2 Service Pack 3 GDR: July 14, 2015] | 2015-07-14 |
+| 10.50.6000.34 | 2009.100.6000.34 | [SQL Server 2008 R2 Service Pack 3 (SP3)] | 2014-09-26 |
+| 10.50.4343 | 2009.100.4343.0 | [3135244 TLS 1.2 support for SQL Server 2008 R2 SP2 (IA-64 only)] | 2016-01-27 |
+| 10.50.4339 | 2009.100.4339.0 | [3045312 MS15-058: Description of the security update for SQL Server 2008 R2 Service Pack 2 QFE: July 14, 2015] | 2015-07-14 |
+| 10.50.4331 | 2009.100.4331.0 | [2987585 Restore Log with Standby Mode on an Advanced Format disk may cause a 9004 error in SQL Server 2008 R2 or SQL Server 2012] | 2014-08-27 |
+| 10.50.4321 | 2009.100.4321.0 | [2977319 MS14-044: Description of the security update for SQL Server 2008 R2 Service Pack 2 (QFE)] | 2014-08-12 |
+| 10.50.4319 | 2009.100.4319.0 | [2967540 Cumulative update package 13 (CU13) for SQL Server 2008 R2 Service Pack 2] | 2014-06-30 |
+| 10.50.4305 | 2009.100.4305.0 | [2938478 Cumulative update package 12 (CU12) for SQL Server 2008 R2 Service Pack 2] | 2014-04-21 |
+| 10.50.4302 | 2009.100.4302.0 | [2926028 Cumulative update package 11 (CU11) for SQL Server 2008 R2 Service Pack 2] | 2014-02-18 |
+| 10.50.4297 | 2009.100.4297.0 | [2908087 Cumulative update package 10 (CU10) for SQL Server 2008 R2 Service Pack 2] | 2013-12-16 |
+| 10.50.4295 | 2009.100.4295.0 | [2887606 Cumulative update package 9 (CU9) for SQL Server 2008 R2 Service Pack 2] | 2013-10-29 |
+| 10.50.4290 | 2009.100.4290.0 | [2871401 Cumulative update package 8 (CU8) for SQL Server 2008 R2 Service Pack 2] | 2013-08-30 |
+| 10.50.4286 | 2009.100.4286.0 | [2844090 Cumulative update package 7 (CU7) for SQL Server 2008 R2 Service Pack 2] | 2013-06-17 |
+| 10.50.4285 | 2009.100.4285.0 | [2830140 Cumulative update package 6 (CU6) for SQL Server 2008 R2 Service Pack 2 (updated)] | 2013-06-13 |
+| 10.50.4279 | 2009.100.4279.0 | 2830140 Cumulative update package 6 (CU6) for SQL Server 2008 R2 Service Pack 2 (replaced) | 2013-04-15 |
+| 10.50.4276 | 2009.100.4276.0 | [2797460 Cumulative update package 5 (CU5) for SQL Server 2008 R2 Service Pack 2] | 2013-02-18 |
+| 10.50.4270 | 2009.100.4270.0 | [2777358 Cumulative update package 4 (CU4) for SQL Server 2008 R2 Service Pack 2] | 2012-12-17 |
+| 10.50.4266 | 2009.100.4266.0 | [2754552 Cumulative update package 3 (CU3) for SQL Server 2008 R2 Service Pack 2] | 2012-10-15 |
+| 10.50.4263 | 2009.100.4263.0 | [2740411 Cumulative update package 2 (CU2) for SQL Server 2008 R2 Service Pack 2] | 2012-08-29 |
+| 10.50.4260 | 2009.100.4260.0 | [2720425 Cumulative update package 1 (CU1) for SQL Server 2008 R2 Service Pack 2] | 2012-08-01 |
+| 10.50.4042 | 2009.100.4042.0 | [3045313 MS15-058: MS15-058: Description of the security update for SQL Server 2008 R2 Service Pack 2 GDR: July 14, 2015] | 2015-07-14 |
+| 10.50.4033 | 2009.100.4033.0 | [2977320 MS14-044: Description of the security update for SQL Server 2008 R2 Service Pack 2 (GDR)] | 2014-08-12 |
+| 10.50.4000 | 2009.100.4000.0 | [SQL Server 2008 R2 Service Pack 2 (SP2)] | 2012-06-26 |
+| 10.50.3720 | 2009.100.3720.0 | SQL Server 2008 R2 Service Pack 2 Community Technology Preview (CTP) | 2012-05-13 |
+| 10.50.2881 | 2009.100.2881.0 | [2868244 An on-demand hotfix update package for SQL Server 2008 R2 Service Pack 1] | 2013-08-12 |
+| 10.50.2876 | 2009.100.2876.0 | [2855792 Cumulative update package 13 (CU13) for SQL Server 2008 R2 Service Pack 1] | 2013-06-17 |
+| 10.50.2875 | 2009.100.2875.0 | [2828727 Cumulative update package 12 (CU12) for SQL Server 2008 R2 Service Pack 1 (updated)] | 2013-06-13 |
+| 10.50.2874 | 2009.100.2874.0 | 2828727 Cumulative update package 12 (CU12) for SQL Server 2008 R2 Service Pack 1 (replaced) | 2013-04-15 |
+| 10.50.2861 | 2009.100.2861.0 | [Microsoft Security Bulletin MS12-070] | 2012-10-09 |
+| 10.50.2869 | 2009.100.2869.0 | [2812683 Cumulative update package 11 (CU11) for SQL Server 2008 R2 Service Pack 1] | 2013-02-18 |
+| 10.50.2868 | 2009.100.2868.0 | [2783135 Cumulative update package 10 (CU10) for SQL Server 2008 R2 Service Pack 1] | 2012-12-17 |
+| 10.50.2866 | 2009.100.2866.0 | [2756574 Cumulative update package 9 (CU9) for SQL Server 2008 R2 Service Pack 1] | 2012-11-06 |
+| 10.50.2861 | 2009.100.2861.0 | [2716439 MS12-070: Description of the security update for SQL Server 2008 R2 Service Pack 1 QFE: October 9, 2012] | 2012-10-09 |
+| 10.50.2822 | 2009.100.2822.0 | [2723743 Cumulative update package 8 (CU8) for SQL Server 2008 R2 Service Pack 1] | 2012-08-29 |
+| 10.50.2817 | 2009.100.2817.0 | [2703282 Cumulative update package 7 (CU7) for SQL Server 2008 R2 Service Pack 1] | 2012-06-18 |
+| 10.50.2811 | 2009.100.2811.0 | [2679367 Cumulative update package 6 (CU6) for SQL Server 2008 R2 Service Pack 1] | 2012-04-16 |
+| 10.50.2807 | 2009.100.2807.0 | [2675522 FIX: Access violation when you run DML statements against a table that has partitioned indexes in SQL Server 2008 R2] | 2012-03-12 |
+| 10.50.2806 | 2009.100.2806.0 | [2659694 Cumulative update package 5 (CU5) for SQL Server 2008 R2 Service Pack 1] | 2012-02-22 |
+| 10.50.2799 | 2009.100.2799.0 | [2633357 FIX: "Non-yielding Scheduler" error might occur when you run a query that uses the CHARINDEX function in SQL Server 2008 R2] | 2012-02-22 |
+| 10.50.2796 | 2009.100.2796.0 | [2633146 Cumulative update package 4 (CU4) for SQL Server 2008 R2 Service Pack 1] | 2011-12-20 |
+| 10.50.2789 | 2009.100.2789.0 | [2591748 Cumulative update package 3 (CU3) for SQL Server 2008 R2 Service Pack 1] | 2011-10-17 |
+| 10.50.2776 | 2009.100.2776.0 | [2606883 FIX: Slow performance when an AFTER trigger runs on a partitioned table in SQL Server 2008 R2] | 2011-10-18 |
+| 10.50.2772 | 2009.100.2772.0 | [2567714 Cumulative update package 2 (CU2) for SQL Server 2008 R2 Service Pack 1] | 2011-08-15 |
+| 10.50.2769 | 2009.100.2769.0 | [2544793 Cumulative update package 1 (CU1) for SQL Server 2008 R2 Service Pack 1] | 2011-07-18 |
+| 10.50.2550 | 2009.100.2550.0 | [Microsoft Security Bulletin MS12-070] | 2012-10-09 |
+| 10.50.2500 | 2009.100.2500.0 | [SQL Server 2008 R2 Service Pack 1 (SP1)] | 2011-07-11 |
+| 10.50.1817 | 2009.100.1817.0 | [2703280 Cumulative update package 14 (CU14) for SQL Server 2008 R2] | 2012-06-18 |
+| 10.50.1815 | 2009.100.1815.0 | [2679366 Cumulative update package 13 (CU13) for SQL Server 2008 R2] | 2012-04-17 |
+| 10.50.1810 | 2009.100.1810.0 | [2659692 Cumulative update package 12 (CU12) for SQL Server 2008 R2] | 2012-02-21 |
+| 10.50.1809 | 2009.100.1809.0 | [2633145 Cumulative update package 11 (CU11) for SQL Server 2008 R2] | 2012-01-09 |
+| 10.50.1807 | 2009.100.1807.0 | [2591746 Cumulative update package 10 (CU10) for SQL Server 2008 R2] | 2011-10-19 |
+| 10.50.1804 | 2009.100.1804.0 | [2567713 Cumulative update package 9 (CU9) for SQL Server 2008 R2] | 2011-08-16 |
+| 10.50.1800 | 2009.100.1800.0 | [2574699 FIX: Database data files might be incorrectly marked as sparse in SQL Server 2008 R2 or in SQL Server 2008 even when the physical files are marked as not sparse in the file system] | 2011-10-18 |
+| 10.50.1797 | 2009.100.1797.0 | [2534352 Cumulative update package 8 (CU8) for SQL Server 2008 R2] | 2011-06-20 |
+| 10.50.1790 | 2009.100.1790.0 | [2494086 MS11-049: Description of the security update for SQL Server 2008 R2 QFE: June 14, 2011] | 2011-06-17 |
+| 10.50.1777 | 2009.100.1777.0 | [2507770 Cumulative update package 7 (CU7) for SQL Server 2008 R2] | 2011-06-16 |
+| 10.50.1769 | 2009.100.1769.0 | [2520808 FIX: Non-yielding scheduler error when you run a query that uses a TVP in SQL Server 2008 or in SQL Server 2008 R2 if SQL Profiler or SQL Server Extended Events is used] | 2011-04-18 |
+| 10.50.1765 | 2009.100.1765.0 | [2489376 Cumulative update package 6 (CU6) for SQL Server 2008 R2] | 2011-02-21 |
+| 10.50.1753 | 2009.100.1753.0 | [2438347 Cumulative update package 5 (CU5) for SQL Server 2008 R2] | 2010-12-23 |
+| 10.50.1746 | 2009.100.1746.0 | [2345451 Cumulative update package 4 (CU4) for SQL Server 2008 R2] | 2010-10-18 |
+| 10.50.1734 | 2009.100.1734.0 | [2261464 Cumulative update package 3 (CU3) for SQL Server 2008 R2] | 2010-08-20 |
+| 10.50.1720 | 2009.100.1720.0 | [2072493 Cumulative update package 2 (CU2) for SQL Server 2008 R2] | 2010-06-25 |
+| 10.50.1702 | 2009.100.1702.0 | [981355 Cumulative update package 1 (CU1) for SQL Server 2008 R2] | 2010-05-18 |
+| 10.50.1617 | 2009.100.1617.0 | [2494088 MS11-049: Description of the security update for SQL Server 2008 R2 GDR: June 14, 2011] | 2011-06-14 |
+| 10.50.1600.1 | 2009.100.1600.1 | SQL Server 2008 R2 RTM | 2010-04-21 |
+| 10.50.1352 | 2009.100.1352.12 | Microsoft SQL Server 2008 R2 November Community Technology Preview (CTP) | 2009-11-12 |
+| 10.50.1092 | 2009.100.1092.20 | Microsoft SQL Server 2008 R2 August Community Technology Preview (CTP) | 2009-06-30 |
+
+[3146034 Intermittent service terminations occur after you install any SQL Server 2008 or SQL Server 2008 R2 versions from KB3135244]:http://support.microsoft.com/en-us/kb/3146034
+[3135244 TLS 1.2 support for SQL Server 2008 R2 SP3]:http://support.microsoft.com/en-us/kb/3135244
[3045314 MS15-058: Description of the security update for SQL Server 2008 R2 Service Pack 3 QFE: July 14, 2015]:http://support.microsoft.com/kb/3045314
[3033860 An on-demand hotfix update package is available for SQL Server 2008 R2 Service Pack 3 (SP3)]:http://support.microsoft.com/kb/3033860
[3045316 MS15-058: Description of the security update for SQL Server 2008 R2 Service Pack 3 GDR: July 14, 2015]:http://support.microsoft.com/kb/3045316
[SQL Server 2008 R2 Service Pack 3 (SP3)]:http://www.microsoft.com/en-us/download/details.aspx?id=44271
+[3135244 TLS 1.2 support for SQL Server 2008 R2 SP2 (IA-64 only)]:http://support.microsoft.com/en-us/kb/3135244
[3045312 MS15-058: Description of the security update for SQL Server 2008 R2 Service Pack 2 QFE: July 14, 2015]:http://support.microsoft.com/kb/3045312
[2987585 Restore Log with Standby Mode on an Advanced Format disk may cause a 9004 error in SQL Server 2008 R2 or SQL Server 2012]:http://support.microsoft.com/kb/2987585
[2977319 MS14-044: Description of the security update for SQL Server 2008 R2 Service Pack 2 (QFE)]:http://support.microsoft.com/kb/2977319
@@ -630,102 +1185,109 @@ Service Pack 1 includes a number of enhancements; these were the most interestin
[2494088 MS11-049: Description of the security update for SQL Server 2008 R2 GDR: June 14, 2011]:http://support.microsoft.com/kb/2494088
-## Microsoft SQL Server 2008 Builds
-
-| Build | File version | KB / Description | Release Date |
-|------------|------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------|
-| 10.00.6535 | 2007.100.6535.0 | [3045308 MS15-058: Description of the security update for SQL Server 2008 Service Pack 4 QFE: July 14, 2015] | 2015-07-14 |
-| 10.00.6526 | 2007.100.6526.0 | [3034373 An on-demand hotfix update package is available for SQL Server 2008 Service Pack 4 (SP4)] | 2015-02-09 |
-| 10.00.6241 | 2007.100.6241.0 | [3045311 MS15-058: Description of the security update for SQL Server 2008 Service Pack 4 GDR: July 14, 2015] | 2015-07-14 |
-| 10.00.6000 | 2007.100.6000.0 | [SQL Server 2008 Service Pack 4 (SP4)] | 2014-09-30 |
-| 10.00.5890 | 2007.100.5890.0 | [3045303 MS15-058: Description of the security update for SQL Server 2008 Service Pack 3 QFE: July 14, 2015] | 2015-07-14 |
-| 10.00.5869 | 2007.100.5869.0 | [2977322 MS14-044: Description of the security update for SQL Server 2008 SP3 (QFE)] | 2014-08-12 |
-| 10.00.5867 | 2007.100.5867.0 | [2877204 FIX: Error 8985 when you run the "dbcc shrinkfile" statement by using the logical name of a file in SQL Server 2008 R2 or SQL Server 2008] | 2014-07-02 |
-| 10.00.5861 | 2007.100.5861.0 | [2958696 Cumulative update package 17 (CU17) for SQL Server 2008 Service Pack 3] | 2014-05-19 |
-| 10.00.5852 | 2007.100.5852.0 | [2936421 Cumulative update package 16 (CU16) for SQL Server 2008 Service Pack 3] | 2014-03-17 |
-| 10.00.5850 | 2007.100.5850.0 | [2923520 Cumulative update package 15 (CU15) for SQL Server 2008 Service Pack 3] | 2014-01-20 |
-| 10.00.5848 | 2007.100.5848.0 | [2893410 Cumulative update package 14 (CU14) for SQL Server 2008 Service Pack 3] | 2013-11-18 |
-| 10.00.5846 | 2007.100.5846.0 | [2880350 Cumulative update package 13 (CU13) for SQL Server 2008 Service Pack 3] | 2013-09-16 |
-| 10.00.5844 | 2007.100.5844.0 | [2863205 Cumulative update package 12 (CU12) for SQL Server 2008 Service Pack 3] | 2013-07-16 |
-| 10.00.5841 | 2007.100.5841.0 | [2834048 Cumulative update package 11 (CU11) for SQL Server 2008 Service Pack 3 (updated)] | 2013-06-13 |
-| 10.00.5840 | 2007.100.5840.0 | 2834048 Cumulative update package 11 (CU11) for SQL Server 2008 Service Pack 3 (replaced) | 2013-05-20 |
-| 10.00.5835 | 2007.100.5835.0 | [2814783 Cumulative update package 10 (CU10) for SQL Server 2008 Service Pack 3] | 2013-03-18 |
-| 10.00.5829 | 2007.100.5829.0 | [2799883 Cumulative update package 9 (CU9) for SQL Server 2008 Service Pack 3] | 2013-01-23 |
-| 10.00.5828 | 2007.100.5828.0 | [2771833 Cumulative update package 8 (CU8) for SQL Server 2008 Service Pack 3] | 2012-11-19 |
-| 10.00.5826 | 2007.100.5826.0 | [2716435 Microsoft Security Bulletin MS12-070] | 2012-10-09 |
-| 10.00.5794 | 2007.100.5794.0 | [2738350 Cumulative update package 7 (CU7) for SQL Server 2008 Service Pack 3] | 2012-09-21 |
-| 10.00.5788 | 2007.100.5788.0 | [2715953 Cumulative update package 6 (CU6) for SQL Server 2008 Service Pack 3] | 2012-07-16 |
-| 10.00.5785 | 2007.100.5785.0 | [2696626 Cumulative update package 5 (CU5) for SQL Server 2008 Service Pack 3] | 2012-05-19 |
-| 10.00.5775 | 2007.100.5775.0 | [2673383 Cumulative update package 4 (CU4) for SQL Server 2008 Service Pack 3] | 2012-03-20 |
-| 10.00.5770 | 2007.100.5770.0 | [2648098 Cumulative update package 3 (CU3) for SQL Server 2008 Service Pack 3] | 2012-01-16 |
-| 10.00.5768 | 2007.100.5768.0 | [2633143 Cumulative update package 2 (CU2) for SQL Server 2008 Service Pack 3] | 2011-11-22 |
-| 10.00.5766 | 2007.100.5766.0 | [2617146 Cumulative update package 1 (CU1) for SQL Server 2008 Service Pack 3] | 2011-10-18 |
-| 10.00.5538 | 2007.100.5538.0 | [3045305 MS15-058: Description of the security update for SQL Server 2008 Service Pack 3 GDR: July 14, 2015] | 2015-07-14 |
-| 10.00.5520 | 2007.100.5520.0 | [2977321 MS14-044: Description of the security update for SQL Server 2008 SP3 (GDR)] | 2014-08-12 |
-| 10.00.5512 | 2007.100.5512.0 | [Microsoft Security Bulletin MS12-070] | 2012-10-09 |
-| 10.00.5500 | 2007.100.5500.0 | [SQL Server 2008 Service Pack 3 (SP3)] | 2011-10-06 |
-| 10.00.5416 | 2007.100.5416.0 | SQL Server 2008 Service Pack 3 CTP | 2011-08-22 |
-| 10.00.4371 | 2007.100.4371.0 | [Microsoft Security Bulletin MS12-070] | 2012-10-09 |
-| 10.00.4333 | 2007.100.4333.0 | [2715951 Cumulative update package 11 (CU11) for SQL Server 2008 Service Pack 2] | 2012-07-16 |
-| 10.00.4332 | 2007.100.4332.0 | [2696625 Cumulative update package 10 (CU10) for SQL Server 2008 Service Pack 2] | 2012-05-20 |
-| 10.00.4330 | 2007.100.4330.0 | [2673382 Cumulative update package 9 (CU9) for SQL Server 2008 Service Pack 2] | 2012-03-19 |
-| 10.00.4326 | 2007.100.4326.0 | [2648096 Cumulative update package 8 (CU8) for SQL Server 2008 Service Pack 2] | 2012-01-30 |
-| 10.00.4323 | 2007.100.4323.0 | [2617148 Cumulative update package 7 (CU7) for SQL Server 2008 Service Pack 2] | 2011-11-21 |
-| 10.00.4321 | 2007.100.4321.0 | [2582285 Cumulative update package 6 (CU6) for SQL Server 2008 Service Pack 2] | 2011-09-20 |
-| 10.00.4316 | 2007.100.4316.0 | [2555408 Cumulative update package 5 (CU5) for SQL Server 2008 Service Pack 2] | 2011-07-18 |
-| 10.00.4285 | 2007.100.4285.0 | [2527180 Cumulative update package 4 (CU4) for SQL Server 2008 Service Pack 2] | 2011-05-16 |
-| 10.00.4279 | 2007.100.4279.0 | [2498535 Cumulative update package 3 (CU3) for SQL Server 2008 Service Pack 2] | 2011-03-11 |
-| 10.00.4272 | 2007.100.4272.0 | [2467239 Cumulative update package 2 (CU2) for SQL Server 2008 Service Pack 2] | 2011-02-10 |
-| 10.00.4266 | 2007.100.4266.0 | [2289254 Cumulative update package 1 (CU1) for SQL Server 2008 Service Pack 2] | 2010-11-15 |
-| 10.00.4067 | 2007.100.4067.0 | [Microsoft Security Bulletin MS12-070] | 2012-10-09 |
-| 10.00.4064 | 2007.100.4064.0 | [2494089 MS11-049: Description of the security update for SQL Server 2008 Service Pack 2 GDR: June 14, 2011] | 2011-06-14 |
-| 10.00.4000 | 2007.100.4000.0 | [SQL Server 2008 Service Pack 2 (SP2)] | 2010-09-29 |
-| 10.00.3798 | 2007.100.3798.0 | SQL Server 2008 Service Pack 2 CTP | 2010-07-07 |
-| 10.00.2850 | 2007.100.2850.0 | [2582282 Cumulative update package 16 (CU16) for SQL Server 2008 Service Pack 1] | 2011-09-19 |
-| 10.00.2847 | 2007.100.2847.0 | [2555406 Cumulative update package 15 (CU15) for SQL Server 2008 Service Pack 1] | 2011-07-18 |
-| 10.00.2821 | 2007.100.2821.0 | [2527187 Cumulative update package 14 (CU14) for SQL Server 2008 Service Pack 1] | 2011-05-16 |
-| 10.00.2816 | 2007.100.2816.0 | [2497673 Cumulative update package 13 (CU13) for SQL Server 2008 Service Pack 1] | 2011-03-22 |
-| 10.00.2808 | 2007.100.2808.0 | [2467236 Cumulative update package 12 (CU12) for SQL Server 2008 Service Pack 1] | 2011-02-10 |
-| 10.00.2804 | 2007.100.2804.0 | [2413738 Cumulative update package 11 (CU11) for SQL Server 2008 Service Pack 1] | 2010-11-15 |
-| 10.00.2799 | 2007.100.2799.0 | [2279604 Cumulative update package 10 (CU10) for SQL Server 2008 Service Pack 1] | 2010-09-21 |
-| 10.00.2789 | 2007.100.2789.0 | [2083921 Cumulative update package 9 (CU9) for SQL Server 2008 Service Pack 1] | 2010-07-21 |
-| 10.00.2787 | 2007.100.2787.0 | [2231277 FIX: The Reporting Services service stops unexpectedly after you apply SQL Server 2008 SP1 CU 7 or CU8] | 2010-07-30 |
-| 10.00.2775 | 2007.100.2775.0 | [981702 Cumulative update package 8 (CU8) for SQL Server 2008 Service Pack 1] | 2010-05-17 |
-| 10.00.2766 | 2007.100.2766.0 | [979065 Cumulative update package 7 (CU7) for SQL Server 2008 Service Pack 1] | 2010-03-26 |
-| 10.00.2757 | 2007.100.2757.0 | [977443 Cumulative update package 6 (CU6) for SQL Server 2008 Service Pack 1] | 2010-01-18 |
-| 10.00.2746 | 2007.100.2746.0 | [975977 Cumulative update package 5 (CU5) for SQL Server 2008 Service Pack 1] | 2009-11-16 |
-| 10.00.2740 | 2007.100.2740.0 | [976761 FIX: Error message when you perform a rolling upgrade in a SQL Server 2008 cluster : "18401, Login failed for user SQLTEST\AgentService. Reason: Server is in script upgrade mode. Only administrator can connect at this time.[SQLState 42000]"] | 2009-11-24 |
-| 10.00.2734 | 2007.100.2734.0 | [973602 Cumulative update package 4 (CU4) for SQL Server 2008 Service Pack 1] | 2009-09-22 |
-| 10.00.2723 | 2007.100.2723.0 | [971491 Cumulative update package 3 (CU3) for SQL Server 2008 Service Pack 1] | 2009-07-21 |
-| 10.00.2714 | 2007.100.2714.0 | [970315 Cumulative update package 2 (CU2) for SQL Server 2008 Service Pack 1] | 2009-05-18 |
-| 10.00.2712 | 2007.100.2712.0 | [970507 FIX: Error message in SQL Server 2008 when you run an INSERT SELECT statement on a table: "Violation of PRIMARY KEY constraint ''. Cannot insert duplicate key in object ''"] | 2009-07-21 |
-| 10.00.2710 | 2007.100.2710.0 | [969099 Cumulative update package 1 (CU1) for SQL Server 2008 Service Pack 1] | 2009-04-16 |
-| 10.00.2573 | 2007.100.2573.0 | [2494096 MS11-049: Description of the security update for SQL Server 2008 Service Pack 1 GDR: June 14, 2011] | 2011-06-14 |
-| 10.00.2531 | 2007.100.2531.0 | [SQL Server 2008 Service Pack 1 (SP1)] | 2009-04-07 |
-| 10.00.2520 | 2007.100.2520.0 | SQL Server 2008 Service Pack 1 - CTP | 2009-02-23 |
-| 10.00.1835 | 2007.100.1835.0 | [979064 Cumulative update package 10 (CU10) for SQL Server 2008] | 2010-03-15 |
-| 10.00.1828 | 2007.100.1828.0 | [977444 Cumulative update package 9 (CU9) for SQL Server 2008] | 2010-01-18 |
-| 10.00.1823 | 2007.100.1823.0 | [975976 Cumulative update package 8 (CU8) for SQL Server 2008] | 2009-11-16 |
-| 10.00.1818 | 2007.100.1818.0 | [973601 Cumulative update package 7 (CU7) for SQL Server 2008] | 2009-09-21 |
-| 10.00.1812 | 2007.100.1812.0 | [971490 Cumulative update package 6 (CU6) for SQL Server 2008] | 2009-07-21 |
-| 10.00.1806 | 2007.100.1806.0 | [969531 Cumulative update package 5 (CU5) for SQL Server 2008] | 2009-05-18 |
-| 10.00.1798 | 2007.100.1798.0 | [963036 Cumulative update package 4 (CU4) for SQL Server 2008] | 2009-03-17 |
-| 10.00.1787 | 2007.100.1787.0 | [960484 Cumulative update package 3 (CU3) for SQL Server 2008] | 2009-01-19 |
-| 10.00.1779 | 2007.100.1779.0 | [958186 Cumulative update package 2 (CU2) for SQL Server 2008] | 2008-11-19 |
-| 10.00.1771 | 2007.100.1771.0 | [958611 FIX: You may receive incorrect results when you run a query that references three or more tables in the FROM clause in SQL Server 2008] | 2008-10-29 |
-| 10.00.1763 | 2007.100.1763.0 | [956717 Cumulative update package 1 (CU1) for SQL Server 2008] | 2008-10-28 |
-| 10.00.1750 | 2007.100.1750.0 | [956718 FIX: A MERGE statement may not enforce a foreign key constraint when the statement updates a unique key column that is not part of a clustering key that has a single row as the update source in SQL Server 2008] | 2008-08-25 |
-| 10.00.1600 | 2007.100.1600.22 | [SQL Server 2008 RTM] | 2008-08-07 |
-| 10.00.1442 | 2007.100.1442.32 | Microsoft SQL Server 2008 RC0 | 2008-06-05 |
-| 10.00.1300 | 2007.100.1300.13 | Microsoft SQL Server 2008 CTP, February 2008 | 2008-02-19 |
-| 10.00.1075 | 2007.100.1075.23 | Microsoft SQL Server 2008 CTP, November 2007 | 2007-11-18 |
-| 10.00.1049 | 2007.100.1049.14 | SQL Server 2008 CTP, July 2007 | 2007-07-31 |
-| 10.00.1019 | 2007.100.1019.17 | SQL Server 2008 CTP, June 2007 | 2007-05-21 |
-
+## Microsoft SQL Server 2008 Builds
+
+
+| Build | File version | KB / Description | Release Date |
+|--------------|------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------|
+| 10.0.6547 | 2007.100.6547.0 | [3146034 Intermittent service terminations occur after you install any SQL Server 2008 or SQL Server 2008 R2 versions from KB3135244] | 2016-03-03 |
+| 10.0.6543 | 2007.100.6543.0 | [3135244 TLS 1.2 support for SQL Server 2008 SP4] | 2016-01-27 |
+| 10.0.6535 | 2007.100.6535.0 | [3045308 MS15-058: Description of the security update for SQL Server 2008 Service Pack 4 QFE: July 14, 2015] | 2015-07-14 |
+| 10.0.6526 | 2007.100.6526.0 | [3034373 An on-demand hotfix update package is available for SQL Server 2008 Service Pack 4 (SP4)] | 2015-02-09 |
+| 10.0.6241 | 2007.100.6241.0 | [3045311 MS15-058: Description of the security update for SQL Server 2008 Service Pack 4 GDR: July 14, 2015] | 2015-07-14 |
+| 10.0.6000.29 | 2007.100.6000.29 | [2979596 SQL Server 2008 Service Pack 4 release information] | 2014-09-30 |
+| 10.0.5894 | 2007.100.5894.0 | [3135244 TLS 1.2 support for SQL Server 2008 SP3 (IA-64 only)] | 2016-01-27 |
+| 10.0.5890 | 2007.100.5890.0 | [3045303 MS15-058: Description of the security update for SQL Server 2008 Service Pack 3 QFE: July 14, 2015] | 2015-07-14 |
+| 10.0.5869 | 2007.100.5869.0 | [2977322 MS14-044: Description of the security update for SQL Server 2008 SP3 (QFE)] | 2014-08-12 |
+| 10.0.5867 | 2007.100.5867.0 | [2877204 FIX: Error 8985 when you run the "dbcc shrinkfile" statement by using the logical name of a file in SQL Server 2008 R2 or SQL Server 2008] | 2014-07-02 |
+| 10.0.5861 | 2007.100.5861.0 | [2958696 Cumulative update package 17 (CU17) for SQL Server 2008 Service Pack 3] | 2014-05-19 |
+| 10.0.5852 | 2007.100.5852.0 | [2936421 Cumulative update package 16 (CU16) for SQL Server 2008 Service Pack 3] | 2014-03-17 |
+| 10.0.5850 | 2007.100.5850.0 | [2923520 Cumulative update package 15 (CU15) for SQL Server 2008 Service Pack 3] | 2014-01-20 |
+| 10.0.5848 | 2007.100.5848.0 | [2893410 Cumulative update package 14 (CU14) for SQL Server 2008 Service Pack 3] | 2013-11-18 |
+| 10.0.5846 | 2007.100.5846.0 | [2880350 Cumulative update package 13 (CU13) for SQL Server 2008 Service Pack 3] | 2013-09-16 |
+| 10.0.5844 | 2007.100.5844.0 | [2863205 Cumulative update package 12 (CU12) for SQL Server 2008 Service Pack 3] | 2013-07-16 |
+| 10.0.5841 | 2007.100.5841.0 | [2834048 Cumulative update package 11 (CU11) for SQL Server 2008 Service Pack 3 (updated)] | 2013-06-13 |
+| 10.0.5840 | 2007.100.5840.0 | 2834048 Cumulative update package 11 (CU11) for SQL Server 2008 Service Pack 3 (replaced) | 2013-05-20 |
+| 10.0.5835 | 2007.100.5835.0 | [2814783 Cumulative update package 10 (CU10) for SQL Server 2008 Service Pack 3] | 2013-03-18 |
+| 10.0.5829 | 2007.100.5829.0 | [2799883 Cumulative update package 9 (CU9) for SQL Server 2008 Service Pack 3] | 2013-01-23 |
+| 10.0.5828 | 2007.100.5828.0 | [2771833 Cumulative update package 8 (CU8) for SQL Server 2008 Service Pack 3] | 2012-11-19 |
+| 10.0.5826 | 2007.100.5826.0 | [2716435 Microsoft Security Bulletin MS12-070] | 2012-10-09 |
+| 10.0.5794 | 2007.100.5794.0 | [2738350 Cumulative update package 7 (CU7) for SQL Server 2008 Service Pack 3] | 2012-09-21 |
+| 10.0.5788 | 2007.100.5788.0 | [2715953 Cumulative update package 6 (CU6) for SQL Server 2008 Service Pack 3] | 2012-07-16 |
+| 10.0.5785 | 2007.100.5785.0 | [2696626 Cumulative update package 5 (CU5) for SQL Server 2008 Service Pack 3] | 2012-05-19 |
+| 10.0.5775 | 2007.100.5775.0 | [2673383 Cumulative update package 4 (CU4) for SQL Server 2008 Service Pack 3] | 2012-03-20 |
+| 10.0.5770 | 2007.100.5770.0 | [2648098 Cumulative update package 3 (CU3) for SQL Server 2008 Service Pack 3] | 2012-01-16 |
+| 10.0.5768 | 2007.100.5768.0 | [2633143 Cumulative update package 2 (CU2) for SQL Server 2008 Service Pack 3] | 2011-11-22 |
+| 10.0.5766 | 2007.100.5766.0 | [2617146 Cumulative update package 1 (CU1) for SQL Server 2008 Service Pack 3] | 2011-10-18 |
+| 10.0.5538 | 2007.100.5538.0 | [3045305 MS15-058: Description of the security update for SQL Server 2008 Service Pack 3 GDR: July 14, 2015] | 2015-07-14 |
+| 10.0.5520 | 2007.100.5520.0 | [2977321 MS14-044: Description of the security update for SQL Server 2008 SP3 (GDR)] | 2014-08-12 |
+| 10.0.5512 | 2007.100.5512.0 | [Microsoft Security Bulletin MS12-070] | 2012-10-09 |
+| 10.0.5500 | 2007.100.5500.0 | [SQL Server 2008 Service Pack 3 (SP3)] | 2011-10-06 |
+| 10.0.5416 | 2007.100.5416.0 | SQL Server 2008 Service Pack 3 CTP | 2011-08-22 |
+| 10.0.4371 | 2007.100.4371.0 | [Microsoft Security Bulletin MS12-070] | 2012-10-09 |
+| 10.0.4333 | 2007.100.4333.0 | [2715951 Cumulative update package 11 (CU11) for SQL Server 2008 Service Pack 2] | 2012-07-16 |
+| 10.0.4332 | 2007.100.4332.0 | [2696625 Cumulative update package 10 (CU10) for SQL Server 2008 Service Pack 2] | 2012-05-20 |
+| 10.0.4330 | 2007.100.4330.0 | [2673382 Cumulative update package 9 (CU9) for SQL Server 2008 Service Pack 2] | 2012-03-19 |
+| 10.0.4326 | 2007.100.4326.0 | [2648096 Cumulative update package 8 (CU8) for SQL Server 2008 Service Pack 2] | 2012-01-30 |
+| 10.0.4323 | 2007.100.4323.0 | [2617148 Cumulative update package 7 (CU7) for SQL Server 2008 Service Pack 2] | 2011-11-21 |
+| 10.0.4321 | 2007.100.4321.0 | [2582285 Cumulative update package 6 (CU6) for SQL Server 2008 Service Pack 2] | 2011-09-20 |
+| 10.0.4316 | 2007.100.4316.0 | [2555408 Cumulative update package 5 (CU5) for SQL Server 2008 Service Pack 2] | 2011-07-18 |
+| 10.0.4285 | 2007.100.4285.0 | [2527180 Cumulative update package 4 (CU4) for SQL Server 2008 Service Pack 2] | 2011-05-16 |
+| 10.0.4279 | 2007.100.4279.0 | [2498535 Cumulative update package 3 (CU3) for SQL Server 2008 Service Pack 2] | 2011-03-11 |
+| 10.0.4272 | 2007.100.4272.0 | [2467239 Cumulative update package 2 (CU2) for SQL Server 2008 Service Pack 2] | 2011-02-10 |
+| 10.0.4266 | 2007.100.4266.0 | [2289254 Cumulative update package 1 (CU1) for SQL Server 2008 Service Pack 2] | 2010-11-15 |
+| 10.0.4067 | 2007.100.4067.0 | [Microsoft Security Bulletin MS12-070] | 2012-10-09 |
+| 10.0.4064 | 2007.100.4064.0 | [2494089 MS11-049: Description of the security update for SQL Server 2008 Service Pack 2 GDR: June 14, 2011] | 2011-06-14 |
+| 10.0.4000 | 2007.100.4000.0 | [SQL Server 2008 Service Pack 2 (SP2)] | 2010-09-29 |
+| 10.0.3798 | 2007.100.3798.0 | SQL Server 2008 Service Pack 2 CTP | 2010-07-07 |
+| 10.0.2850 | 2007.100.2850.0 | [2582282 Cumulative update package 16 (CU16) for SQL Server 2008 Service Pack 1] | 2011-09-19 |
+| 10.0.2847 | 2007.100.2847.0 | [2555406 Cumulative update package 15 (CU15) for SQL Server 2008 Service Pack 1] | 2011-07-18 |
+| 10.0.2821 | 2007.100.2821.0 | [2527187 Cumulative update package 14 (CU14) for SQL Server 2008 Service Pack 1] | 2011-05-16 |
+| 10.0.2816 | 2007.100.2816.0 | [2497673 Cumulative update package 13 (CU13) for SQL Server 2008 Service Pack 1] | 2011-03-22 |
+| 10.0.2808 | 2007.100.2808.0 | [2467236 Cumulative update package 12 (CU12) for SQL Server 2008 Service Pack 1] | 2011-02-10 |
+| 10.0.2804 | 2007.100.2804.0 | [2413738 Cumulative update package 11 (CU11) for SQL Server 2008 Service Pack 1] | 2010-11-15 |
+| 10.0.2799 | 2007.100.2799.0 | [2279604 Cumulative update package 10 (CU10) for SQL Server 2008 Service Pack 1] | 2010-09-21 |
+| 10.0.2789 | 2007.100.2789.0 | [2083921 Cumulative update package 9 (CU9) for SQL Server 2008 Service Pack 1] | 2010-07-21 |
+| 10.0.2787 | 2007.100.2787.0 | [2231277 FIX: The Reporting Services service stops unexpectedly after you apply SQL Server 2008 SP1 CU 7 or CU8] | 2010-07-30 |
+| 10.0.2775 | 2007.100.2775.0 | [981702 Cumulative update package 8 (CU8) for SQL Server 2008 Service Pack 1] | 2010-05-17 |
+| 10.0.2766 | 2007.100.2766.0 | [979065 Cumulative update package 7 (CU7) for SQL Server 2008 Service Pack 1] | 2010-03-26 |
+| 10.0.2757 | 2007.100.2757.0 | [977443 Cumulative update package 6 (CU6) for SQL Server 2008 Service Pack 1] | 2010-01-18 |
+| 10.0.2746 | 2007.100.2746.0 | [975977 Cumulative update package 5 (CU5) for SQL Server 2008 Service Pack 1] | 2009-11-16 |
+| 10.0.2740 | 2007.100.2740.0 | [976761 FIX: Error message when you perform a rolling upgrade in a SQL Server 2008 cluster : "18401, Login failed for user SQLTEST\AgentService. Reason: Server is in script upgrade mode. Only administrator can connect at this time.SQLState 42000"] | 2009-11-24 |
+| 10.0.2734 | 2007.100.2734.0 | [973602 Cumulative update package 4 (CU4) for SQL Server 2008 Service Pack 1] | 2009-09-22 |
+| 10.0.2723 | 2007.100.2723.0 | [971491 Cumulative update package 3 (CU3) for SQL Server 2008 Service Pack 1] | 2009-07-21 |
+| 10.0.2714 | 2007.100.2714.0 | [970315 Cumulative update package 2 (CU2) for SQL Server 2008 Service Pack 1] | 2009-05-18 |
+| 10.0.2712 | 2007.100.2712.0 | [970507 FIX: Error message in SQL Server 2008 when you run an INSERT SELECT statement on a table: "Violation of PRIMARY KEY constraint ''. Cannot insert duplicate key in object ''"] | 2009-07-21 |
+| 10.0.2710 | 2007.100.2710.0 | [969099 Cumulative update package 1 (CU1) for SQL Server 2008 Service Pack 1] | 2009-04-16 |
+| 10.0.2573 | 2007.100.2573.0 | [2494096 MS11-049: Description of the security update for SQL Server 2008 Service Pack 1 GDR: June 14, 2011] | 2011-06-14 |
+| 10.0.2531 | 2007.100.2531.0 | [SQL Server 2008 Service Pack 1 (SP1)] | 2009-04-07 |
+| 10.0.2520 | 2007.100.2520.0 | SQL Server 2008 Service Pack 1 - CTP | 2009-02-23 |
+| 10.0.1835 | 2007.100.1835.0 | [979064 Cumulative update package 10 (CU10) for SQL Server 2008] | 2010-03-15 |
+| 10.0.1828 | 2007.100.1828.0 | [977444 Cumulative update package 9 (CU9) for SQL Server 2008] | 2010-01-18 |
+| 10.0.1823 | 2007.100.1823.0 | [975976 Cumulative update package 8 (CU8) for SQL Server 2008] | 2009-11-16 |
+| 10.0.1818 | 2007.100.1818.0 | [973601 Cumulative update package 7 (CU7) for SQL Server 2008] | 2009-09-21 |
+| 10.0.1812 | 2007.100.1812.0 | [971490 Cumulative update package 6 (CU6) for SQL Server 2008] | 2009-07-21 |
+| 10.0.1806 | 2007.100.1806.0 | [969531 Cumulative update package 5 (CU5) for SQL Server 2008] | 2009-05-18 |
+| 10.0.1798 | 2007.100.1798.0 | [963036 Cumulative update package 4 (CU4) for SQL Server 2008] | 2009-03-17 |
+| 10.0.1787 | 2007.100.1787.0 | [960484 Cumulative update package 3 (CU3) for SQL Server 2008] | 2009-01-19 |
+| 10.0.1779 | 2007.100.1779.0 | [958186 Cumulative update package 2 (CU2) for SQL Server 2008] | 2008-11-19 |
+| 10.0.1771 | 2007.100.1771.0 | [958611 FIX: You may receive incorrect results when you run a query that references three or more tables in the FROM clause in SQL Server 2008] | 2008-10-29 |
+| 10.0.1763 | 2007.100.1763.0 | [956717 Cumulative update package 1 (CU1) for SQL Server 2008] | 2008-10-28 |
+| 10.0.1750 | 2007.100.1750.0 | [956718 FIX: A MERGE statement may not enforce a foreign key constraint when the statement updates a unique key column that is not part of a clustering key that has a single row as the update source in SQL Server 2008] | 2008-08-25 |
+| 10.0.1600 | 2007.100.1600.22 | [SQL Server 2008 RTM] | 2008-08-07 |
+| 10.0.1442 | 2007.100.1442.32 | Microsoft SQL Server 2008 RC0 | 2008-06-05 |
+| 10.0.1300 | 2007.100.1300.13 | Microsoft SQL Server 2008 CTP, February 2008 | 2008-02-19 |
+| 10.0.1075 | 2007.100.1075.23 | Microsoft SQL Server 2008 CTP, November 2007 | 2007-11-18 |
+| 10.0.1049 | 2007.100.1049.14 | SQL Server 2008 CTP, July 2007 | 2007-07-31 |
+| 10.0.1019 | 2007.100.1019.17 | SQL Server 2008 CTP, June 2007 | 2007-05-21 |
+
+[3146034 Intermittent service terminations occur after you install any SQL Server 2008 or SQL Server 2008 R2 versions from KB3135244]:http://support.microsoft.com/en-us/kb/3146034
+[3135244 TLS 1.2 support for SQL Server 2008 SP4]:http://support.microsoft.com/en-us/kb/3135244
[3045308 MS15-058: Description of the security update for SQL Server 2008 Service Pack 4 QFE: July 14, 2015]:http://support.microsoft.com/kb/3045308
[3034373 An on-demand hotfix update package is available for SQL Server 2008 Service Pack 4 (SP4)]:http://support.microsoft.com/kb/3034373
[3045311 MS15-058: Description of the security update for SQL Server 2008 Service Pack 4 GDR: July 14, 2015]:https://support.microsoft.com/en-us/kb/3045311
-[SQL Server 2008 Service Pack 4 (SP4)]:http://www.microsoft.com/en-us/download/details.aspx?id=44278
+[2979596 SQL Server 2008 Service Pack 4 release information]:https://support.microsoft.com/en-us/kb/2979596
+[3135244 TLS 1.2 support for SQL Server 2008 SP3 (IA-64 only)]:http://support.microsoft.com/en-us/kb/3135244
[3045303 MS15-058: Description of the security update for SQL Server 2008 Service Pack 3 QFE: July 14, 2015]:https://support.microsoft.com/en-us/kb/3045303
[2977322 MS14-044: Description of the security update for SQL Server 2008 SP3 (QFE)]:http://support.microsoft.com/kb/2977322
[2877204 FIX: Error 8985 when you run the "dbcc shrinkfile" statement by using the logical name of a file in SQL Server 2008 R2 or SQL Server 2008]:http://support.microsoft.com/kb/2877204
@@ -779,7 +1341,7 @@ Service Pack 1 includes a number of enhancements; these were the most interestin
[979065 Cumulative update package 7 (CU7) for SQL Server 2008 Service Pack 1]:http://support.microsoft.com/kb/979065
[977443 Cumulative update package 6 (CU6) for SQL Server 2008 Service Pack 1]:http://support.microsoft.com/kb/977443
[975977 Cumulative update package 5 (CU5) for SQL Server 2008 Service Pack 1]:http://support.microsoft.com/kb/975977
-[976761 FIX: Error message when you perform a rolling upgrade in a SQL Server 2008 cluster : "18401, Login failed for user SQLTEST\AgentService. Reason: Server is in script upgrade mode. Only administrator can connect at this time.[SQLState 42000]"]:http://support.microsoft.com/kb/976761
+[976761 FIX: Error message when you perform a rolling upgrade in a SQL Server 2008 cluster : "18401, Login failed for user SQLTEST\AgentService. Reason: Server is in script upgrade mode. Only administrator can connect at this time.SQLState 42000"]:http://support.microsoft.com/kb/976761
[973602 Cumulative update package 4 (CU4) for SQL Server 2008 Service Pack 1]:http://support.microsoft.com/kb/973602
[971491 Cumulative update package 3 (CU3) for SQL Server 2008 Service Pack 1]:http://support.microsoft.com/kb/971491
[970315 Cumulative update package 2 (CU2) for SQL Server 2008 Service Pack 1]:http://support.microsoft.com/kb/970315
@@ -802,7 +1364,8 @@ Service Pack 1 includes a number of enhancements; these were the most interestin
[SQL Server 2008 RTM]:http://msdn.microsoft.com/en-us/subscriptions/downloads/details/default.aspx?pm=pid%3a334
-## Microsoft SQL Server 2005 Builds
+## Microsoft SQL Server 2005 Builds
+
| Build | File version | KB / Description | Release Date |
|-----------|----------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------|
@@ -1291,811 +1854,443 @@ Service Pack 1 includes a number of enhancements; these were the most interestin
[911662 FIX: You may receive an access violation error message when you run a SELECT query in SQL Server 2005]:http://support.microsoft.com/kb/911662
[915793 FIX: You cannot restore the log backups on the mirror server after you remove database mirroring for the mirror database in SQL Server 2005]:http://support.microsoft.com/kb/915793
[910416 FIX: Error message when you run certain queries or certain stored procedures in SQL Server 2005: "A severe error occurred on the current command"]:http://support.microsoft.com/kb/910416
-[932557 FIX: A script task or a script component may not run correctly when you run an SSIS package in SQL Server 2005 build 1399]:http://support.microsoft.com/kb/932557
+[932557 FIX: A script task or a script component may not run correctly when you run an SSIS package in SQL Server 2005 build 1399]:https://support.microsoft.com/help/932557
-## Microsoft SQL Server 2000 Builds
+## Microsoft SQL Server 2000 Builds
+
| Build | File version | KB / Description | Release Date |
|-----------|----------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------|
| 8.00.2305 | 2000.80.2305.0 | [983811 MS12-060: Description of the security update for SQL Server 2000 Service Pack 4 QFE: August 14, 2012] | 2012-08-14 |
| 8.00.2301 | 2000.80.2301.0 | [983809 MS12-027: Description of the security update for Microsoft SQL Server 2000 Service Pack 4 QFE: April 10, 2012] | 2012-04-10 |
-| 8.00.2283 | 2000.80.2283.0 | [971524 FIX: An access violation occurs when you run a DELETE statement or an UPDATE statement in the Itanium-based versions of SQL Server 2000 after you install security update MS09-004] | 2009-06-15 |
+| 8.00.2283 | 2000.80.2283.0 | 971524 FIX: An access violation occurs when you run a DELETE statement or an UPDATE statement in the Itanium-based versions of SQL Server 2000 after you install security update MS09-004] | 2009-06-15 |
| 8.00.2282 | 2000.80.2282.0 | [960083 MS09-004: Description of the security update for SQL Server 2000 QFE and for MSDE 2000: February 10, 2009] | 2009-02-10 |
-| 8.00.2279 | 2000.80.2279.0 | [959678 FIX: When you run the SPSBackup.exe utility to back up a SQL Server 2000 database that is configured as a back-end database for a Windows SharePoint Services server, the backup operation fails] | 2009-04-08 |
-| 8.00.2273 | 2000.80.2273.0 | [948111 MS08-040: Description of the security update for SQL Server 2000 QFE and MSDE 2000 July 8, 2008] | 2008-08-05 |
-| 8.00.2271 | 2000.80.2271.0 | [946584 FIX: The SPACE function always returns one space in SQL Server 2000 if the SPACE function uses a collation that differs from the collation of the current database] | 2008-03-12 |
-| 8.00.2265 | 2000.80.2265.0 | [944985 FIX: The data on the publisher does not match the data on the subscriber when you synchronize a SQL Server 2005 Mobile Edition subscriber with a SQL Server 2000 "merge replication" publisher] | 2007-12-19 |
-| 8.00.2253 | 2000.80.2253.0 | [939317 FIX: The CPU utilization may suddenly increase to 100 percent when there are many connections to an instance of SQL Server 2000 on a computer that has multiple processors] | 2007-10-09 |
-| 8.00.2249 | 2000.80.2249.0 | [936232 FIX: An access violation may occur when you try to log in to an instance of SQL Server 2000] | 2007-05-25 |
-| 8.00.2248 | 2000.80.2248.0 | [935950 FIX: The foreign key that you created between two tables does not work after you run the CREATE INDEX statement in SQL Server 2000] | 2007-06-14 |
-| 8.00.2246 | 2000.80.2246.0 | [935465 An updated version of Sqlvdi.dll is now available for SQL Server 2000] | 2007-06-18 |
-| 8.00.2245 | 2000.80.2245.0 | [933573 FIX: You may receive an assertion or database corruption may occur when you use the bcp utility or the "Bulk Insert" Transact-SQL command to import data in SQL Server 2000] | 2007-04-24 |
-| 8.00.2244 | 2000.80.2244.0 | [934203 FIX: A hotfix for Microsoft SQL Server 2000 Service Pack 4 may not update all the necessary files on an x64-based computer] | 2007-05-10 |
-| 8.00.2242 | 2000.80.2242.0 | [929131 FIX: In SQL Server 2000, the synchronization process is slow, and the CPU usage is high on the computer that is configured as the Distributor] | 2007-03-28 |
-| 8.00.2238 | 2000.80.2238.0 | [931932 FIX: The merge agent fails intermittently when you use merge replication that uses a custom resolver after you install SQL Server 2000 Service Pack 4] | 2007-02-21 |
-| 8.00.2236 | 2000.80.2236.0 | [930484 FIX: CPU utilization may approach 100 percent on a computer that is running SQL Server 2000 after you run the BACKUP DATABASE statement or the BACKUP LOG statement] | 2007-02-02 |
-| 8.00.2234 | 2000.80.2234.0 | [929440 FIX: Error messages when you try to update table rows or insert table rows into a table in SQL Server 2000: "644" or "2511"] | 2007-02-22 |
-| 8.00.2232 | 2000.80.2232.0 | [928568 FIX: SQL Server 2000 stops responding when you cancel a query or when a query time-out occurs, and error messages are logged in the SQL Server error log file] | 2007-01-15 |
-| 8.00.2231 | 2000.80.2231.0 | [928079 FIX: The Sqldumper.exe utility cannot generate a filtered SQL Server dump file when you use the Remote Desktop Connection service or Terminal Services to connect to a Windows 2000 Server-based computer in SQL Server 2000] | 2007-06-19 |
-| 8.00.2229 | 2000.80.2229.0 | [927186 FIX: Error message when you create a merge replication for tables that have computed columns in SQL Server 2000 Service Pack 4: "The process could not log conflict information"] | 2007-07-24 |
-| 8.00.2226 | 2000.80.2226.0 | [925684 FIX: You may experience one or more symptoms when you run a "CREATE INDEX" statement on an instance of SQL Server 2000] | 2006-11-20 |
-| 8.00.2226 | 2000.80.2226.0 | [925732 FIX: You may receive inconsistent comparison results when you compare strings by using a width sensitive collation in SQL Server 2000] | 2006-11-13 |
-| 8.00.2223 | 2000.80.2223.0 | [925419 FIX: The server stops responding, the performance is slow, and a time-out occurs in SQL Server 2000] | 2007-07-20 |
-| 8.00.2223 | 2000.80.2223.0 | [925678 FIX: Error message when you schedule a Replication Merge Agent job to run after you install SQL Server 2000 Service Pack 4: "The process could not enumerate changes at the 'Subscriber'"] | 2006-10-31 |
-| 8.00.2218 | 2000.80.2218.0 | [925297 FIX: The result may be sorted in the wrong order when you run a query that uses the ORDER BY clause to sort a column in a table in SQL Server 2000] | 2007-06-19 |
-| 8.00.2217 | 2000.80.2217.0 | [924664 FIX: You cannot stop the SQL Server service, or many minidump files and many log files are generated in SQL Server 2000] | 2007-10-25 |
-| 8.00.2215 | 2000.80.2215.0 | [923796 FIX: Data in a subscriber of a merge publication in SQL Server 2000 differs from the data in the publisher] | 2007-01-12 |
-| 8.00.2215 | 2000.80.2215.0 | [924662 FIX: The query performance may be slow when you query data from a view in SQL Server 2000] | 2006-10-05 |
-| 8.00.2215 | 2000.80.2215.0 | [923563 FIX: Error message when you configure an immediate updating transactional replication in SQL Server 2000: "Implicit conversion from datatype 'text' to 'nvarchar' is not allowed"] | 2006-10-30 |
-| 8.00.2215 | 2000.80.2215.0 | [923327 FIX: You may receive an access violation error message when you import data by using the "Bulk Insert" command in SQL Server 2000] | 2006-12-28 |
-| 8.00.2209 | 2000.80.2209.0 | [923797 The Knowledge Base (KB) Article You Requested Is Currently Not Available] | ??? |
-| 8.00.2207 | 2000.80.2207.0 | [923344 FIX: A SQL Server 2000 session may be blocked for the whole time that a Snapshot Agent job runs] | 2006-08-28 |
-| 8.00.2201 | 2000.80.2201.0 | [920930 FIX: Error message when you try to run a query on a linked server in SQL Server 2000] | 2006-08-21 |
-| 8.00.2199 | 2000.80.2199.0 | [919221 FIX: SQL Server 2000 may take a long time to complete the synchronization phase when you create a merge publication] | 2006-07-26 |
-| 8.00.2197 | 2000.80.2197.0 | [919133 FIX: Each query takes a long time to compile when you execute a single query or when you execute multiple concurrent queries in SQL Server 2000] | 2006-08-02 |
-| 8.00.2197 | 2000.80.2197.0 | [919068 FIX: The query may return incorrect results, and the execution plan for the query may contain a "Table Spool" operator in SQL Server 2000] | 2006-08-08 |
-| 8.00.2197 | 2000.80.2197.0 | [919399 FIX: A profiler trace in SQL Server 2000 may stop logging events unexpectedly, and you may receive the following error message: "Failed to read trace data"] | 2006-10-18 |
-| 8.00.2196 | 2000.80.2196.0 | [919165 FIX: A memory leak occurs when you run a remote query by using a linked server in SQL Server 2000] | 2006-08-14 |
-| 8.00.2194 | 2000.80.2194.0 | [917565 FIX: Error 17883 is logged in the SQL Server error log, and the instance of SQL Server 2000 temporarily stops responding] | 2007-02-21 |
-| 8.00.2194 | 2000.80.2194.0 | [917972 FIX: You receive an access violation error message when you try to perform a read of a large binary large object column in SQL Server 2000] | 2006-09-22 |
-| 8.00.2192 | 2000.80.2192.0 | [917606 FIX: You may notice a decrease in performance when you run a query that uses the UNION ALL operator in SQL Server 2000 Service Pack 4] | 2006-08-04 |
-| 8.00.2191 | 2000.80.2191.0 | [916698 FIX: Error message when you run SQL Server 2000: "Failed assertion = 'lockFound == TRUE'"] | 2006-07-26 |
-| 8.00.2191 | 2000.80.2191.0 | [916950 FIX: You may experience heap corruption, and SQL Server 2000 may shut down with fatal access violations when you try to browse files in SQL Server 2000 Enterprise Manager on a Windows Server 2003 x64-based computer] | 2006-10-03 |
-| 8.00.2189 | 2000.80.2189.0 | [916652 FIX: An access violation may occur when you run a query on a table that has a multicolumn index in SQL Server 2000] | 2006-07-26 |
-| 8.00.2189 | 2000.80.2189.0 | [913438 FIX: The SQL Server process may end unexpectedly when you turn on trace flag -T1204 and a profiler trace is capturing the Lock:DeadLock Chain event in SQL Server 2000 SP4] | 2006-07-19 |
-| 8.00.2187 | 2000.80.2187.0 | [915340 FIX: A deadlock occurs when the scheduled SQL Server Agent job that you add or that you update is running in SQL Server 2000] | 2007-06-18 |
-| 8.00.2187 | 2000.80.2187.0 | [916287 A cumulative hotfix package is available for SQL Server 2000 Service Pack 4 build 2187] | 2006-10-16 |
-| 8.00.2187 | 2000.80.2187.0 | [914384 FIX: The database status changes to Suspect when you perform a bulk copy in a transaction and then roll back the transaction in SQL Server 2000] | 2006-07-26 |
-| 8.00.2187 | 2000.80.2187.0 | [915065 FIX: Error message when you try to apply a hotfix on a SQL Server 2000-based computer that is configured as a MSCS node: "An error in updating your system has occurred"] | 2006-12-11 |
-| 8.00.2180 | 2000.80.2180.0 | [913789 FIX: The password that you specify in a BACKUP statement appears in the SQL Server Errorlog file or in the Application event log if the BACKUP statement does not run in SQL Server 2000] | 2007-02-19 |
-| 8.00.2180 | 2000.80.2180.0 | [913684 FIX: You may receive error messages when you use linked servers in SQL Server 2000 on a 64-bit Itanium processor] | 2006-07-26 |
-| 8.00.2175 | 2000.80.2175.0 | [911678 FIX: No rows may be returned, and you may receive an error message when you try to import SQL Profiler trace files into tables by using the fn_trace_gettable function in SQL Server 2000] | 2006-07-26 |
-| 8.00.2172 | 2000.80.2172.0 | [910707 FIX: When you query a view that was created by using the VIEW_METADATA option, an access violation may occur in SQL Server 2000] | 2006-07-26 |
-| 8.00.2171 | 2000.80.2171.0 | [909369 FIX: Automatic checkpoints on some SQL Server 2000 databases do not run as expected] | 2006-07-26 |
-| 8.00.2168 | 2000.80.2168.0 | [907813 FIX: An error occurs when you try to access the Analysis Services performance monitor counter object after you apply Windows Server 2003 SP1] | 2006-11-21 |
-| 8.00.2166 | 2000.80.2166.0 | [909734 FIX: An error message is logged, and new diagnostics do not capture the thread stack when the SQL Server User Mode Scheduler (UMS) experiences a nonyielding thread in SQL Server 2000 Service Pack 4] | 2006-07-26 |
-| 8.00.2162 | 2000.80.2162.0 | [904660 A cumulative hotfix package is available for SQL Server 2000 Service Pack 4 build 2162] | 2006-09-15 |
-| 8.00.2159 | 2000.80.2159.0 | [907250 FIX: You may experience concurrency issues when you run the DBCC INDEXDEFRAG statement in SQL Server 2000] | 2006-07-26 |
-| 8.00.2156 | 2000.80.2156.0 | [906790 FIX: You receive an error message when you try to rebuild the master database after you have installed hotfix builds in SQL Server 2000 SP4 64-bit] | 2006-07-25 |
-| 8.00.2151 | 2000.80.2151.0 | [903742 FIX: You receive an "Error: 8526, Severity: 16, State: 2" error message in SQL Profiler when you use SQL Query Analyzer to start or to enlist into a distributed transaction after you have installed SQL Server 2000 SP4] | 2006-07-25 |
-| 8.00.2151 | 2000.80.2151.0 | [904244 FIX: Incorrect data is inserted unexpectedly when you perform a bulk copy operation by using the DB-Library API in SQL Server 2000 Service Pack 4] | 2007-06-13 |
-| 8.00.2148 | 2000.80.2148.0 | [899430 FIX: An access violation may occur when you run a SELECT query and the NO_BROWSETABLE option is set to ON in Microsoft SQL Server 2000] | 2006-07-25 |
-| 8.00.2148 | 2000.80.2148.0 | [899431 FIX: An access violation occurs in the Mssdi98.dll file, and SQL Server crashes when you use SQL Query Analyzer to debug a stored procedure in SQL Server 2000 Service Pack 4] | 2006-07-25 |
-| 8.00.2148 | 2000.80.2148.0 | [900390 FIX: The Mssdmn.exe process may use lots of CPU capacity when you perform a SQL Server 2000 full text search of Office Word documents] | 2006-06-01 |
-| 8.00.2148 | 2000.80.2148.0 | [900404 FIX: The results of the query may be returned much slower than you expect when you run a query that includes a GROUP BY statement in SQL Server 2000] | 2006-06-01 |
-| 8.00.2148 | 2000.80.2148.0 | [901212 FIX: You receive an error message if you use the sp_addalias or sp_dropalias procedures when the IMPLICIT_TRANSACTIONS option is set to ON in SQL Server 2000 SP4] | 2006-07-25 |
-| 8.00.2148 | 2000.80.2148.0 | [902150 FIX: Some 32-bit applications that use SQL-DMO and SQL-VDI APIs may stop working after you install SQL Server 2000 Service Pack 4 on an Itanium-based computer] | 2006-06-01 |
-| 8.00.2148 | 2000.80.2148.0 | [902955 FIX: You receive a "Getting registry information" message when you run the Sqldiag.exe utility after you install SQL Server 2000 SP4] | 2006-07-25 |
-| 8.00.2147 | 2000.80.2147.0 | [899410 FIX: You may experience slow server performance when you start a trace in an instance of SQL Server 2000 that runs on a computer that has more than four processors] | 2006-06-01 |
-| 8.00.2145 | 2000.80.2145.0 | [826906 FIX: A query that uses a view that contains a correlated subquery and an aggregate runs slowly] | 2005-10-25 |
-| 8.00.2145 | 2000.80.2145.0 | [836651 FIX: You receive query results that were not expected when you use both ANSI joins and non-ANSI joins] | 2006-06-07 |
-| 8.00.2066 | 2000.80.2066.0 | [Microsoft Security Bulletin MS12-060] | 2012-08-14 |
-| 8.00.2065 | 2000.80.2065.0 | [983808 MS12-027: Description of the security update for Microsoft SQL Server 2000 Service Pack 4 GDR: April 10, 2012] | 2012-04-10 |
-| 8.00.2055 | 2000.80.2055.0 | [959420 MS09-004: Vulnerabilities in Microsoft SQL Server could allow remote code execution] | 2009-02-10 |
-| 8.00.2040 | 2000.80.2040.0 | [899761 FIX: Not all memory is available when AWE is enabled on a computer that is running a 32-bit version of SQL Server 2000 SP4] | 2006-08-15 |
-| 8.00.2039 | 2000.80.2039.0 | [SQL Server 2000 Service Pack 4 (SP4)] | 2005-05-06 |
+| 8.00.2279 | 2000.80.2279.0 | 959678 FIX: When you run the SPSBackup.exe utility to back up a SQL Server 2000 database that is configured as a back-end database for a Windows SharePoint Services server, the backup operation fails | 2009-04-08 |
+| 8.00.2273 | 2000.80.2273.0 | 948111 MS08-040: Description of the security update for SQL Server 2000 QFE and MSDE 2000 July 8, 2008 | 2008-08-05 |
+| 8.00.2271 | 2000.80.2271.0 | 946584 FIX: The SPACE function always returns one space in SQL Server 2000 if the SPACE function uses a collation that differs from the collation of the current database | 2008-03-12 |
+| 8.00.2265 | 2000.80.2265.0 | 944985 FIX: The data on the publisher does not match the data on the subscriber when you synchronize a SQL Server 2005 Mobile Edition subscriber with a SQL Server 2000 "merge replication" publisher | 2007-12-19 |
+| 8.00.2253 | 2000.80.2253.0 | 939317 FIX: The CPU utilization may suddenly increase to 100 percent when there are many connections to an instance of SQL Server 2000 on a computer that has multiple processors | 2007-10-09 |
+| 8.00.2249 | 2000.80.2249.0 | 936232 FIX: An access violation may occur when you try to log in to an instance of SQL Server 2000 | 2007-05-25 |
+| 8.00.2248 | 2000.80.2248.0 | 935950 FIX: The foreign key that you created between two tables does not work after you run the CREATE INDEX statement in SQL Server 2000 | 2007-06-14 |
+| 8.00.2246 | 2000.80.2246.0 | 935465 An updated version of Sqlvdi.dll is now available for SQL Server 2000 | 2007-06-18 |
+| 8.00.2245 | 2000.80.2245.0 | 933573 FIX: You may receive an assertion or database corruption may occur when you use the bcp utility or the "Bulk Insert" Transact-SQL command to import data in SQL Server 2000 | 2007-04-24 |
+| 8.00.2244 | 2000.80.2244.0 | 934203 FIX: A hotfix for Microsoft SQL Server 2000 Service Pack 4 may not update all the necessary files on an x64-based computer | 2007-05-10 |
+| 8.00.2242 | 2000.80.2242.0 | 929131 FIX: In SQL Server 2000, the synchronization process is slow, and the CPU usage is high on the computer that is configured as the Distributor | 2007-03-28 |
+| 8.00.2238 | 2000.80.2238.0 | 931932 FIX: The merge agent fails intermittently when you use merge replication that uses a custom resolver after you install SQL Server 2000 Service Pack 4 | 2007-02-21 |
+| 8.00.2236 | 2000.80.2236.0 | 930484 FIX: CPU utilization may approach 100 percent on a computer that is running SQL Server 2000 after you run the BACKUP DATABASE statement or the BACKUP LOG statement | 2007-02-02 |
+| 8.00.2234 | 2000.80.2234.0 | 929440 FIX: Error messages when you try to update table rows or insert table rows into a table in SQL Server 2000: "644" or "2511" | 2007-02-22 |
+| 8.00.2232 | 2000.80.2232.0 | 928568 FIX: SQL Server 2000 stops responding when you cancel a query or when a query time-out occurs, and error messages are logged in the SQL Server error log file | 2007-01-15 |
+| 8.00.2231 | 2000.80.2231.0 | 928079 FIX: The Sqldumper.exe utility cannot generate a filtered SQL Server dump file when you use the Remote Desktop Connection service or Terminal Services to connect to a Windows 2000 Server-based computer in SQL Server 2000 | 2007-06-19 |
+| 8.00.2229 | 2000.80.2229.0 | 927186 FIX: Error message when you create a merge replication for tables that have computed columns in SQL Server 2000 Service Pack 4: "The process could not log conflict information" | 2007-07-24 |
+| 8.00.2226 | 2000.80.2226.0 | 925684 FIX: You may experience one or more symptoms when you run a "CREATE INDEX" statement on an instance of SQL Server 2000 | 2006-11-20 |
+| 8.00.2226 | 2000.80.2226.0 | 925732 FIX: You may receive inconsistent comparison results when you compare strings by using a width sensitive collation in SQL Server 2000 | 2006-11-13 |
+| 8.00.2223 | 2000.80.2223.0 | 925419 FIX: The server stops responding, the performance is slow, and a time-out occurs in SQL Server 2000 | 2007-07-20 |
+| 8.00.2223 | 2000.80.2223.0 | 925678 FIX: Error message when you schedule a Replication Merge Agent job to run after you install SQL Server 2000 Service Pack 4: "The process could not enumerate changes at the 'Subscriber'" | 2006-10-31 |
+| 8.00.2218 | 2000.80.2218.0 | 925297 FIX: The result may be sorted in the wrong order when you run a query that uses the ORDER BY clause to sort a column in a table in SQL Server 2000 | 2007-06-19 |
+| 8.00.2217 | 2000.80.2217.0 | 924664 FIX: You cannot stop the SQL Server service, or many minidump files and many log files are generated in SQL Server 2000 | 2007-10-25 |
+| 8.00.2215 | 2000.80.2215.0 | 923796 FIX: Data in a subscriber of a merge publication in SQL Server 2000 differs from the data in the publisher | 2007-01-12 |
+| 8.00.2215 | 2000.80.2215.0 | 924662 FIX: The query performance may be slow when you query data from a view in SQL Server 2000 | 2006-10-05 |
+| 8.00.2215 | 2000.80.2215.0 | 923563 FIX: Error message when you configure an immediate updating transactional replication in SQL Server 2000: "Implicit conversion from datatype 'text' to 'nvarchar' is not allowed" | 2006-10-30 |
+| 8.00.2215 | 2000.80.2215.0 | 923327 FIX: You may receive an access violation error message when you import data by using the "Bulk Insert" command in SQL Server 2000 | 2006-12-28 |
+| 8.00.2209 | 2000.80.2209.0 | 923797 The Knowledge Base (KB) Article You Requested Is Currently Not Available | ??? |
+| 8.00.2207 | 2000.80.2207.0 | 923344 FIX: A SQL Server 2000 session may be blocked for the whole time that a Snapshot Agent job runs | 2006-08-28 |
+| 8.00.2201 | 2000.80.2201.0 | 920930 FIX: Error message when you try to run a query on a linked server in SQL Server 2000 | 2006-08-21 |
+| 8.00.2199 | 2000.80.2199.0 | 919221 FIX: SQL Server 2000 may take a long time to complete the synchronization phase when you create a merge publication | 2006-07-26 |
+| 8.00.2197 | 2000.80.2197.0 | 919133 FIX: Each query takes a long time to compile when you execute a single query or when you execute multiple concurrent queries in SQL Server 2000 | 2006-08-02 |
+| 8.00.2197 | 2000.80.2197.0 | 919068 FIX: The query may return incorrect results, and the execution plan for the query may contain a "Table Spool" operator in SQL Server 2000 | 2006-08-08 |
+| 8.00.2197 | 2000.80.2197.0 | 919399 FIX: A profiler trace in SQL Server 2000 may stop logging events unexpectedly, and you may receive the following error message: "Failed to read trace data" | 2006-10-18 |
+| 8.00.2196 | 2000.80.2196.0 | 919165 FIX: A memory leak occurs when you run a remote query by using a linked server in SQL Server 2000 | 2006-08-14 |
+| 8.00.2194 | 2000.80.2194.0 | 917565 FIX: Error 17883 is logged in the SQL Server error log, and the instance of SQL Server 2000 temporarily stops responding | 2007-02-21 |
+| 8.00.2194 | 2000.80.2194.0 | 917972 FIX: You receive an access violation error message when you try to perform a read of a large binary large object column in SQL Server 2000 | 2006-09-22 |
+| 8.00.2192 | 2000.80.2192.0 | 917606 FIX: You may notice a decrease in performance when you run a query that uses the UNION ALL operator in SQL Server 2000 Service Pack 4 | 2006-08-04 |
+| 8.00.2191 | 2000.80.2191.0 | 916698 FIX: Error message when you run SQL Server 2000: "Failed assertion = 'lockFound == TRUE'" | 2006-07-26 |
+| 8.00.2191 | 2000.80.2191.0 | 916950 FIX: You may experience heap corruption, and SQL Server 2000 may shut down with fatal access violations when you try to browse files in SQL Server 2000 Enterprise Manager on a Windows Server 2003 x64-based computer | 2006-10-03 |
+| 8.00.2189 | 2000.80.2189.0 | 916652 FIX: An access violation may occur when you run a query on a table that has a multicolumn index in SQL Server 2000 | 2006-07-26 |
+| 8.00.2189 | 2000.80.2189.0 | 913438 FIX: The SQL Server process may end unexpectedly when you turn on trace flag -T1204 and a profiler trace is capturing the Lock:DeadLock Chain event in SQL Server 2000 SP4 | 2006-07-19 |
+| 8.00.2187 | 2000.80.2187.0 | 915340 FIX: A deadlock occurs when the scheduled SQL Server Agent job that you add or that you update is running in SQL Server 2000 | 2007-06-18 |
+| 8.00.2187 | 2000.80.2187.0 | 916287 A cumulative hotfix package is available for SQL Server 2000 Service Pack 4 build 2187 | 2006-10-16 |
+| 8.00.2187 | 2000.80.2187.0 | 914384 FIX: The database status changes to Suspect when you perform a bulk copy in a transaction and then roll back the transaction in SQL Server 2000 | 2006-07-26 |
+| 8.00.2187 | 2000.80.2187.0 | 915065 FIX: Error message when you try to apply a hotfix on a SQL Server 2000-based computer that is configured as a MSCS node: "An error in updating your system has occurred" | 2006-12-11 |
+| 8.00.2180 | 2000.80.2180.0 | 913789 FIX: The password that you specify in a BACKUP statement appears in the SQL Server Errorlog file or in the Application event log if the BACKUP statement does not run in SQL Server 2000 | 2007-02-19 |
+| 8.00.2180 | 2000.80.2180.0 | 913684 FIX: You may receive error messages when you use linked servers in SQL Server 2000 on a 64-bit Itanium processor | 2006-07-26 |
+| 8.00.2175 | 2000.80.2175.0 | 911678 FIX: No rows may be returned, and you may receive an error message when you try to import SQL Profiler trace files into tables by using the fn_trace_gettable function in SQL Server 2000 | 2006-07-26 |
+| 8.00.2172 | 2000.80.2172.0 | 910707 FIX: When you query a view that was created by using the VIEW_METADATA option, an access violation may occur in SQL Server 2000 | 2006-07-26 |
+| 8.00.2171 | 2000.80.2171.0 | 909369 FIX: Automatic checkpoints on some SQL Server 2000 databases do not run as expected | 2006-07-26 |
+| 8.00.2168 | 2000.80.2168.0 | 907813 FIX: An error occurs when you try to access the Analysis Services performance monitor counter object after you apply Windows Server 2003 SP1 | 2006-11-21 |
+| 8.00.2166 | 2000.80.2166.0 | 909734 FIX: An error message is logged, and new diagnostics do not capture the thread stack when the SQL Server User Mode Scheduler (UMS) experiences a nonyielding thread in SQL Server 2000 Service Pack 4 | 2006-07-26 |
+| 8.00.2162 | 2000.80.2162.0 | 904660 A cumulative hotfix package is available for SQL Server 2000 Service Pack 4 build 2162 | 2006-09-15 |
+| 8.00.2159 | 2000.80.2159.0 | 907250 FIX: You may experience concurrency issues when you run the DBCC INDEXDEFRAG statement in SQL Server 2000 | 2006-07-26 |
+| 8.00.2156 | 2000.80.2156.0 | 906790 FIX: You receive an error message when you try to rebuild the master database after you have installed hotfix builds in SQL Server 2000 SP4 64-bit | 2006-07-25 |
+| 8.00.2151 | 2000.80.2151.0 | 903742 FIX: You receive an "Error: 8526, Severity: 16, State: 2" error message in SQL Profiler when you use SQL Query Analyzer to start or to enlist into a distributed transaction after you have installed SQL Server 2000 SP4 | 2006-07-25 |
+| 8.00.2151 | 2000.80.2151.0 | 904244 FIX: Incorrect data is inserted unexpectedly when you perform a bulk copy operation by using the DB-Library API in SQL Server 2000 Service Pack 4 | 2007-06-13 |
+| 8.00.2148 | 2000.80.2148.0 | 899430 FIX: An access violation may occur when you run a SELECT query and the NO_BROWSETABLE option is set to ON in Microsoft SQL Server 2000 | 2006-07-25 |
+| 8.00.2148 | 2000.80.2148.0 | 899431 FIX: An access violation occurs in the Mssdi98.dll file, and SQL Server crashes when you use SQL Query Analyzer to debug a stored procedure in SQL Server 2000 Service Pack 4 | 2006-07-25 |
+| 8.00.2148 | 2000.80.2148.0 | 900390 FIX: The Mssdmn.exe process may use lots of CPU capacity when you perform a SQL Server 2000 full text search of Office Word documents | 2006-06-01 |
+| 8.00.2148 | 2000.80.2148.0 | 900404 FIX: The results of the query may be returned much slower than you expect when you run a query that includes a GROUP BY statement in SQL Server 2000 | 2006-06-01 |
+| 8.00.2148 | 2000.80.2148.0 | 901212 FIX: You receive an error message if you use the sp_addalias or sp_dropalias procedures when the IMPLICIT_TRANSACTIONS option is set to ON in SQL Server 2000 SP4 | 2006-07-25 |
+| 8.00.2148 | 2000.80.2148.0 | 902150 FIX: Some 32-bit applications that use SQL-DMO and SQL-VDI APIs may stop working after you install SQL Server 2000 Service Pack 4 on an Itanium-based computer | 2006-06-01 |
+| 8.00.2148 | 2000.80.2148.0 | 902955 FIX: You receive a "Getting registry information" message when you run the Sqldiag.exe utility after you install SQL Server 2000 SP4 | 2006-07-25 |
+| 8.00.2147 | 2000.80.2147.0 | 899410 FIX: You may experience slow server performance when you start a trace in an instance of SQL Server 2000 that runs on a computer that has more than four processors | 2006-06-01 |
+| 8.00.2145 | 2000.80.2145.0 | 826906 FIX: A query that uses a view that contains a correlated subquery and an aggregate runs slowly | 2005-10-25 |
+| 8.00.2145 | 2000.80.2145.0 | 836651 FIX: You receive query results that were not expected when you use both ANSI joins and non-ANSI joins | 2006-06-07 |
+| 8.00.2066 | 2000.80.2066.0 | Microsoft Security Bulletin MS12-060 | 2012-08-14 |
+| 8.00.2065 | 2000.80.2065.0 | 983808 MS12-027: Description of the security update for Microsoft SQL Server 2000 Service Pack 4 GDR: April 10, 2012 | 2012-04-10 |
+| 8.00.2055 | 2000.80.2055.0 | 959420 MS09-004: Vulnerabilities in Microsoft SQL Server could allow remote code execution | 2009-02-10 |
+| 8.00.2040 | 2000.80.2040.0 | 899761 FIX: Not all memory is available when AWE is enabled on a computer that is running a 32-bit version of SQL Server 2000 SP4 | 2006-08-15 |
+| 8.00.2039 | 2000.80.2039.0 | SQL Server 2000 Service Pack 4 (SP4) | 2005-05-06 |
| 8.00.2026 | 2000.80.2026.0 | SQL Server 2000 Service Pack 4 (SP4) Beta | ??? |
-| 8.00.1547 | 2000.80.1547.0 | [899410 FIX: You may experience slow server performance when you start a trace in an instance of SQL Server 2000 that runs on a computer that has more than four processors] | 2006-06-01 |
-| 8.00.1077 | 2000.80.1077.0 | [983814 MS12-070: Description of the security update for SQL Server 2000 Reporting Services Service Pack 2] | 2012-10-09 |
-| 8.00.1037 | 2000.80.1037.0 | [930484 FIX: CPU utilization may approach 100 percent on a computer that is running SQL Server 2000 after you run the BACKUP DATABASE statement or the BACKUP LOG statement] | 2007-02-02 |
-| 8.00.1036 | 2000.80.1036.0 | [929410 FIX: Error message when you run a full-text query in SQL Server 2000: "Error: 17883, Severity: 1, State: 0"] | 2007-01-11 |
-| 8.00.1035 | 2000.80.1035.0 | [917593 FIX: The "Audit Logout" event does not appear in the trace results file when you run a profiler trace against a linked server instance in SQL Server 2000] | 2006-09-22 |
-| 8.00.1034 | 2000.80.1034.0 | [915328 FIX: You may intermittently experience an access violation error when a query is executed in a parallel plan and the execution plan contains either a HASH JOIN operation or a Sort operation in SQL Server 2000] | 2006-08-09 |
-| 8.00.1029 | 2000.80.1029.0 | [902852 FIX: Error message when you run an UPDATE statement that uses two JOIN hints to update a table in SQL Server 2000: "Internal SQL Server error"] | 2006-06-01 |
-| 8.00.1027 | 2000.80.1027.0 | [900416 FIX: A 17883 error may occur you run a query that uses a hash join in SQL Server 2000] | 2006-07-25 |
-| 8.00.1025 | 2000.80.1025.0 | [899428 FIX: You receive incorrect results when you run a query that uses a cross join operator in SQL Server 2000 SP3] | 2006-06-01 |
-| 8.00.1025 | 2000.80.1025.0 | [899430 FIX: An access violation may occur when you run a SELECT query and the NO_BROWSETABLE option is set to ON in Microsoft SQL Server 2000] | 2006-07-25 |
-| 8.00.1024 | 2000.80.1024.0 | [898709 FIX: Error message when you use SQL Server 2000: "Time out occurred while waiting for buffer latch type 3"] | 2006-07-25 |
-| 8.00.1021 | 2000.80.1021.0 | [887700 FIX: Server Network Utility may display incorrect protocol properties in SQL Server 2000] | 2006-07-25 |
-| 8.00.1020 | 2000.80.1020.0 | [896985 FIX: The Subscriber may not be able to upload changes to the Publisher when you incrementally add an article to a publication in SQL Server 2000 SP3] | 2006-07-25 |
-| 8.00.1019 | 2000.80.1019.0 | [897572 FIX: You may receive a memory-related error message when you repeatedly create and destroy an out-of-process COM object within the same batch or stored procedure in SQL Server 2000] | 2006-06-01 |
-| 8.00.1017 | 2000.80.1017.0 | [896425 FIX: The BULK INSERT statement silently skips insert attempts when the data value is NULL and the column is defined as NOT NULL for INT, SMALLINT, and BIGINT data types in SQL Server 2000] | 2006-06-01 |
-| 8.00.1014 | 2000.80.1014.0 | [895123 FIX: You may receive error message 701, error message 802, and error message 17803 when many hashed buffers are available in SQL Server 2000] | 2006-06-01 |
-| 8.00.1014 | 2000.80.1014.0 | [895187 FIX: You receive an error message when you try to delete records by running a Delete Transact-SQL statement in SQL Server 2000] | 2006-07-25 |
-| 8.00.1013 | 2000.80.1013.0 | [891866 FIX: The query runs slower than you expected when you try to parse a query in SQL Server 2000] | 2006-06-01 |
-| 8.00.1009 | 2000.80.1009.0 | [894257 FIX: You receive an "Incorrect syntax near ')'" error message when you run a script that was generated by SQL-DMO for an Operator object in SQL Server 2000] | 2006-06-01 |
-| 8.00.1007 | 2000.80.1007.0 | [893312 FIX: You may receive a "SQL Server could not spawn process_loginread thread" error message, and a memory leak may occur when you cancel a remote query in SQL Server 2000] | 2006-06-01 |
-| 8.00.1003 | 2000.80.1003.0 | [892923 FIX: Differential database backups may not contain database changes in the Page Free Space (PFS) pages in SQL Server 2000] | 2006-06-01 |
-| 8.00.1001 | 2000.80.1001.0 | [892205 FIX: You may receive a 17883 error message when SQL Server 2000 performs a very large hash operation] | 2006-06-01 |
-| 8.00.1000 | 2000.80.1000.0 | [891585 FIX: Database recovery does not occur, or a user database is marked as suspect in SQL Server 2000] | 2006-06-01 |
-| 8.00.997 | 2000.80.997.0 | [891311 FIX: You cannot create new TCP/IP socket based connections after error messages 17882 and 10055 are written to the Microsoft SQL Server 2000 error log] | 2006-07-18 |
-| 8.00.996 | 2000.80.996.0 | [891017 FIX: SQL Server 2000 may stop responding to other requests when you perform a large deallocation operation] | 2006-06-01 |
-| 8.00.996 | 2000.80.996.0 | [891268 FIX: You receive a 17883 error message and SQL Server 2000 may stop responding to other requests when you perform large in-memory sort operations] | 2006-06-01 |
-| 8.00.994 | 2000.80.994.0 | [890942 FIX: Some complex queries are slower after you install SQL Server 2000 Service Pack 2 or SQL Server 2000 Service Pack 3] | 2006-06-01 |
-| 8.00.994 | 2000.80.994.0 | [890768 FIX: You experience non-convergence in a replication topology when you unpublish or drop columns from a dynamically filtered publication in SQL Server 2000] | 2006-06-01 |
-| 8.00.994 | 2000.80.994.0 | [890767 FIX: You receive a "Server: Msg 107, Level 16, State 3, Procedure TEMP_VIEW_Merge, Line 1" error message when the sum of the length of the published column names in a merge publication exceeds 4,000 characters in SQL Server 2000] | 2006-06-01 |
-| 8.00.993 | 2000.80.993.0 | [890925 FIX: The @@ERROR system function may return an incorrect value when you execute a Transact-SQL statement that uses a parallel execution plan in SQL Server 2000 32-bit or in SQL Server 2000 64-bit] | 2006-06-01 |
-| 8.00.993 | 2000.80.993.0 | [888444 FIX: You receive a 17883 error in SQL Server 2000 Service Pack 3 or in SQL Server 2000 Service Pack 3a when a worker thread becomes stuck in a registry call] | 2006-06-01 |
-| 8.00.993 | 2000.80.993.0 | [890742 FIX: Error message when you use a loopback linked server to run a distributed query in SQL Server 2000: "Could not perform the requested operation because the minimum query memory is not available"] | 2006-05-15 |
-| 8.00.991 | 2000.80.991.0 | [889314 FIX: Non-convergence may occur in a merge replication topology if the primary connection to the publisher is disconnected] | 2006-06-01 |
-| 8.00.990 | 2000.80.990.0 | [890200 FIX: SQL Server 2000 stops listening for new TCP/IP Socket connections unexpectedly after error message 17882 is written to the SQL Server 2000 error log] | 2006-06-01 |
-| 8.00.988 | 2000.80.988.0 | [889166 FIX: You receive a "Msg 3628" error message when you run an inner join query in SQL Server 2000] | 2006-06-01 |
-| 8.00.985 | 2000.80.985.0 | [889239 FIX: Start times in the SQL Profiler are different for the Audit:Login and Audit:Logout Events in SQL Server 2000] | 2006-06-01 |
-| 8.00.980 | 2000.80.980.0 | [887974 FIX: A fetch on a dynamic cursor can cause unexpected results in SQL Server 2000 Service Pack 3] | 2006-06-01 |
-| 8.00.977 | 2000.80.977.0 | [888007 You receive a "The product does not have a prerequisite update installed" error message when you try to install a SQL Server 2000 post-Service Pack 3 hotfix] | 2005-08-31 |
-| 8.00.973 | 2000.80.973.0 | [884554 FIX: A SPID stops responding with a NETWORKIO (0x800) waittype in SQL Server Enterprise Manager when SQL Server tries to process a fragmented TDS network packet] | 2006-06-01 |
-| 8.00.972 | 2000.80.972.0 | [885290 FIX: An assertion error occurs when you insert data in the same row in a table by using multiple connections to an instance of SQL Server] | 2006-06-01 |
-| 8.00.970 | 2000.80.970.0 | [872842 FIX: A CHECKDB statement reports a 2537 corruption error after SQL Server transfers data to a sql_variant column in SQL Server 2000] | 2006-06-01 |
-| 8.00.967 | 2000.80.967.0 | [878501 FIX: You may receive an error message when you run a SET IDENTITY_INSERT ON statement on a table and then try to insert a row into the table in SQL Server 2000] | 2006-06-01 |
-| 8.00.962 | 2000.80.962.0 | [883415 FIX: A user-defined function returns results that are not correct for a query] | 2006-06-01 |
-| 8.00.961 | 2000.80.961.0 | [873446 FIX: An access violation exception may occur when multiple users try to perform data modification operations at the same time that fire triggers that reference a deleted or an inserted table in SQL Server 2000 on a computer that is running SMP] | 2006-06-01 |
-| 8.00.959 | 2000.80.959.0 | [878500 FIX: An Audit Object Permission event is not produced when you run a TRUNCATE TABLE statement] | 2006-06-01 |
-| 8.00.957 | 2000.80.957.0 | [870994 FIX: An access violation exception may occur when you run a query that uses index names in the WITH INDEX option to specify an index hint] | 2006-06-01 |
-| 8.00.955 | 2000.80.955.0 | [867798 FIX: The @date_received parameter of the xp_readmail extended stored procedure incorrectly returns the date and the time that an e-mail message is submitted by the sender in SQL Server 2000] | 2007-01-08 |
-| 8.00.954 | 2000.80.954.0 | [843282 FIX: The Osql.exe utility does not run a Transact-SQL script completely if you start the program from a remote session by using a background service and then log off the console session] | 2007-01-05 |
-| 8.00.952 | 2000.80.952.0 | [867878 FIX: The Log Reader Agent may cause 17883 error messages] | 2006-06-01 |
-| 8.00.952 | 2000.80.952.0 | [867879 FIX: Merge replication non-convergence occurs with SQL Server CE subscribers] | 2006-06-01 |
-| 8.00.952 | 2000.80.952.0 | [867880 FIX: Merge Agent may fail with an "Invalid character value for cast specification" error message] | 2006-06-01 |
-| 8.00.949 | 2000.80.949.0 | [843266 FIX: Shared page locks can be held until end of the transaction and can cause blocking or performance problems in SQL Server 2000 Service Pack 3 (SP3)] | 2006-06-02 |
-| 8.00.948 | 2000.80.948.0 | [843263 FIX: You may receive an 8623 error message when you try to run a complex query on an instance of SQL Server] | 2006-06-01 |
-| 8.00.944 | 2000.80.944.0 | [839280 FIX: SQL debugging does not work in Visual Studio .NET after you install Windows XP Service Pack 2] | 2006-06-05 |
-| 8.00.937 | 2000.80.937.0 | [841776 FIX: Additional diagnostics have been added to SQL Server 2000 to detect unreported read operation failures] | 2006-06-01 |
-| 8.00.936 | 2000.80.936.0 | [841627 FIX: SQL Server 2000 may underestimate the cardinality of a query expression under certain circumstances] | 2006-06-01 |
-| 8.00.935 | 2000.80.935.0 | [841401 FIX: You may notice incorrect values for the "Active Transactions" counter when you perform multiple transactions on an instance of SQL Server 2000 that is running on an SMP computer] | 2006-06-01 |
-| 8.00.934 | 2000.80.934.0 | [841404 FIX: You may receive a "The query processor could not produce a query plan" error message in SQL Server when you run a query that includes multiple subqueries that use self-joins] | 2006-06-01 |
-| 8.00.933 | 2000.80.933.0 | [840856 FIX: The MSSQLServer service exits unexpectedly in SQL Server 2000 Service Pack 3] | 2006-06-02 |
-| 8.00.929 | 2000.80.929.0 | [839529 FIX: 8621 error conditions may cause SQL Server 2000 64-bit to close unexpectedly] | 2006-06-01 |
-| 8.00.928 | 2000.80.928.0 | [839589 FIX: The thread priority is raised for some threads in a parallel query] | 2006-06-01 |
-| 8.00.927 | 2000.80.927.0 | [839688 FIX: Profiler RPC events truncate parameters that have a text data type to 16 characters] | 2006-06-01 |
-| 8.00.926 | 2000.80.926.0 | [839523 FIX: An access violation exception may occur when you update a text column by using a stored procedure in SQL Server 2000] | 2006-06-01 |
-| 8.00.923 | 2000.80.923.0 | [838460 FIX: The xp_logininfo procedure may fail with error 8198 after you install Q825042 or any hotfix with SQL Server 8.00.0840 or later] | 2006-06-01 |
-| 8.00.922 | 2000.80.922.0 | [837970 FIX: You may receive an "Invalid object name..." error message when you run the DBCC CHECKCONSTRAINTS Transact-SQL statement on a table in SQL Server 2000] | 2005-10-25 |
-| 8.00.919 | 2000.80.919.0 | [837957 FIX: When you use Transact-SQL cursor variables to perform operations that have large iterations, memory leaks may occur in SQL Server 2000] | 2005-10-25 |
-| 8.00.916 | 2000.80.916.0 | [317989 FIX: Sqlakw32.dll May Corrupt SQL Statements] | 2005-09-27 |
-| 8.00.915 | 2000.80.915.0 | [837401 FIX: Rows are not successfully inserted into a table when you use the BULK INSERT command to insert rows] | 2005-10-25 |
-| 8.00.913 | 2000.80.913.0 | [836651 FIX: You receive query results that were not expected when you use both ANSI joins and non-ANSI joins] | 2006-06-07 |
-| 8.00.911 | 2000.80.911.0 | [837957 FIX: When you use Transact-SQL cursor variables to perform operations that have large iterations, memory leaks may occur in SQL Server 2000] | 2005-10-25 |
-| 8.00.910 | 2000.80.910.0 | [834798 FIX: SQL Server 2000 may not start if many users try to log in to SQL Server when SQL Server is trying to start] | 2005-10-25 |
-| 8.00.908 | 2000.80.908.0 | [834290 FIX: You receive a 644 error message when you run an UPDATE statement and the isolation level is set to READ UNCOMMITTED] | 2005-10-25 |
-| 8.00.904 | 2000.80.904.0 | [834453 FIX: The Snapshot Agent may fail after you make schema changes to the underlying tables of a publication] | 2005-04-22 |
-| 8.00.892 | 2000.80.892.0 | [833710 FIX: You receive an error message when you try to restore a database backup that spans multiple devices] | 2005-10-25 |
-| 8.00.891 | 2000.80.891.0 | [836141 FIX: An access violation exception may occur when SQL Server runs many parallel query processing operations on a multiprocessor computer] | 2005-04-01 |
-| 8.00.879 | 2000.80.879.0 | [832977 FIX: The DBCC PSS Command may cause access violations and 17805 errors in SQL Server 2000] | 2005-10-25 |
-| 8.00.878 | 2000.80.878.0 | [831950 FIX: You receive error message 3456 when you try to apply a transaction log to a server] | 2005-10-25 |
-| 8.00.876 | 2000.80.876.0 | [830912 FIX: Key Names Read from an .Ini File for a Dynamic Properties Task May Be Truncated] | 2005-10-25 |
-| 8.00.876 | 2000.80.876.0 | [831997 FIX: An invalid cursor state occurs after you apply Hotfix 8.00.0859 or later in SQL Server 2000] | 2005-10-25 |
-| 8.00.876 | 2000.80.876.0 | [831999 FIX: An AWE system uses more memory for sorting or for hashing than a non-AWE system in SQL Server 2000] | 2005-10-25 |
-| 8.00.873 | 2000.80.873.0 | [830887 FIX: Some queries that have a left outer join and an IS NULL filter run slower after you install SQL Server 2000 post-SP3 hotfix] | 2005-10-25 |
-| 8.00.871 | 2000.80.871.0 | [830767 FIX: SQL Query Analyzer may stop responding when you close a query window or open a file] | 2005-10-25 |
-| 8.00.871 | 2000.80.871.0 | [830860 FIX: The performance of a computer that is running SQL Server 2000 degrades when query execution plans against temporary tables remain in the procedure cache] | 2005-10-25 |
-| 8.00.870 | 2000.80.870.0 | [830262 FIX: Unconditional Update May Not Hold Key Locks on New Key Values] | 2005-10-25 |
-| 8.00.869 | 2000.80.869.0 | [830588 FIX: Access violation when you trace keyset-driven cursors by using SQL Profiler] | 2005-10-25 |
-| 8.00.866 | 2000.80.866.0 | [830366 FIX: An access violation occurs in SQL Server 2000 when a high volume of local shared memory connections occur after you install security update MS03-031] | 2006-01-16 |
-| 8.00.865 | 2000.80.865.0 | [830395 FIX: An access violation occurs during compilation if the table contains statistics for a computed column] | 2005-10-25 |
-| 8.00.865 | 2000.80.865.0 | [828945 FIX: You cannot insert explicit values in an IDENTITY column of a SQL Server table by using the SQLBulkOperations function or the SQLSetPos ODBC function in SQL Server 2000] | 2005-10-25 |
-| 8.00.863 | 2000.80.863.0 | [829205 FIX: Query performance may be slow and may be inconsistent when you run a query while another query that contains an IN operator with many values is compiled] | 2005-10-25 |
-| 8.00.863 | 2000.80.863.0 | [829444 FIX: A floating point exception occurs during the optimization of a query] | 2005-10-25 |
-| 8.00.859 | 2000.80.859.0 | [821334 FIX: Issues that are resolved in SQL Server 2000 build 8.00.0859] | 2005-03-31 |
-| 8.00.858 | 2000.80.858.0 | [828637 FIX: Users Can Control the Compensating Change Process in Merge Replication] | 2005-10-25 |
-| 8.00.857 | 2000.80.857.0 | [828017 The Knowledge Base (KB) Article You Requested Is Currently Not Available] | ??? |
-| 8.00.857 | 2000.80.857.0 | [827714 FIX: A query may fail with retail assertion when you use the NOLOCK hint or the READ UNCOMMITTED isolation level] | 2005-11-23 |
-| 8.00.857 | 2000.80.857.0 | [828308 FIX: An Internet Explorer script error occurs when you access metadata information by using DTS in SQL Server Enterprise Manager] | 2005-10-25 |
-| 8.00.856 | 2000.80.856.0 | [828096 FIX: Key Locks Are Held Until the End of the Statement for Rows That Do Not Pass Filter Criteria] | 2005-10-25 |
-| 8.00.854 | 2000.80.854.0 | [828699 FIX: An Access Violation Occurs When You Run DBCC UPDATEUSAGE on a Database That Has Many Objects] | 2005-10-25 |
-| 8.00.852 | 2000.80.852.0 | [830466 FIX: You may receive an "Internal SQL Server error" error message when you run a Transact-SQL SELECT statement on a view that has many subqueries in SQL Server 2000] | 2005-04-01 |
-| 8.00.852 | 2000.80.852.0 | [827954 FIX: Slow Execution Times May Occur When You Run DML Statements Against Tables That Have Cascading Referential Integrity] | 2005-10-25 |
-| 8.00.851 | 2000.80.851.0 | [826754 FIX: A Deadlock Occurs If You Run an Explicit UPDATE STATISTICS Command] | 2005-10-25 |
-| 8.00.850 | 2000.80.850.0 | [826860 FIX: Linked Server Query May Return NULL If It Is Performed Through a Keyset Cursor] | 2005-10-25 |
-| 8.00.850 | 2000.80.850.0 | [826815 FIX: You receive an 8623 error message in SQL Server when you try to run a query that has multiple correlated subqueries] | 2005-10-25 |
-| 8.00.850 | 2000.80.850.0 | [826906 FIX: A query that uses a view that contains a correlated subquery and an aggregate runs slowly] | 2005-10-25 |
-| 8.00.848 | 2000.80.848.0 | [826822 FIX: A Member of the db_accessadmin Fixed Database Role Can Create an Alias for the dbo Special User] | 2005-10-25 |
-| 8.00.847 | 2000.80.847.0 | [826433 PRB: Additional SQL Server Diagnostics Added to Detect Unreported I/O Problems] | 2005-10-25 |
-| 8.00.845 | 2000.80.845.0 | [826364 FIX: A Query with a LIKE Comparison Results in a Non-Optimal Query Plan When You Use a Hungarian SQL Server Collation] | 2005-10-05 |
-| 8.00.845 | 2000.80.845.0 | [825854 FIX: No Exclusive Locks May Be Taken If the DisAllowsPageLocks Value Is Set to True] | 2005-10-25 |
-| 8.00.844 | 2000.80.844.0 | [826080 FIX: SQL Server 2000 protocol encryption applies to JDBC clients] | 2006-10-17 |
-| 8.00.842 | 2000.80.842.0 | [825043 FIX: Rows are unexpectedly deleted when you run a distributed query to delete or to update a linked server table] | 2005-10-25 |
-| 8.00.841 | 2000.80.841.0 | [825225 FIX: You receive an error message when you run a parallel query that uses an aggregation function or the GROUP BY clause] | 2005-10-25 |
-| 8.00.840 | 2000.80.840.0 | [319477 FIX: Extremely Large Number of User Tables on AWE System May Cause BPool::Map Errors] | 2005-09-27 |
-| 8.00.840 | 2000.80.840.0 | [319477 FIX: Extremely Large Number of User Tables on AWE System May Cause BPool::Map Errors] | 2005-09-27 |
-| 8.00.839 | 2000.80.839.0 | [823877 FIX: An Access Violation May Occur When You Run a Query That Contains 32,000 or More OR Clauses] | 2005-10-25 |
-| 8.00.839 | 2000.80.839.0 | [824027 FIX: A Cursor with a Large Object Parameter May Cause an Access Violation on CStmtCond::XretExecute] | 2005-10-25 |
-| 8.00.837 | 2000.80.837.0 | [820788 FIX: Delayed domain authentication may cause SQL Server to stop responding] | 2005-10-25 |
-| 8.00.837 | 2000.80.837.0 | [821741 FIX: Lock monitor exception in DeadlockMonitor::ResolveDeadlock] | 2005-10-25 |
-| 8.00.837 | 2000.80.837.0 | [821548 FIX: A Parallel Query May Generate an Access Violation After You Install SQL Server 2000 SP3] | 2005-10-25 |
-| 8.00.837 | 2000.80.837.0 | [821740 FIX: MS DTC Transaction Commit Operation Blocks Itself] | 2005-10-25 |
-| 8.00.837 | 2000.80.837.0 | [823514 FIX: Build 8.00.0837: A query that contains a correlated subquery runs slowly] | 2005-10-25 |
-| 8.00.819 | 2000.80.819.0 | [826161 FIX: You are prompted for password confirmation after you change a standard SQL Server login] | 2005-10-25 |
-| 8.00.818 | 2000.80.818.0 | [821277 MS03-031: Security patch for SQL Server 2000 Service Pack 3] | 2006-01-09 |
-| 8.00.818 | 2000.80.818.0 | [821337 FIX: Localized versions of SQL Mail and the Web Assistant Wizard may not work as expected in SQL Server 2000 64 bit] | 2005-03-16 |
-| 8.00.818 | 2000.80.818.0 | [818388 FIX: A Transact-SQL Statement That Is Embedded in the Database Name Runs with System Administrator Permissions] | 2005-02-10 |
-| 8.00.818 | 2000.80.818.0 | [826161 FIX: You are prompted for password confirmation after you change a standard SQL Server login] | 2005-10-25 |
-| 8.00.818 | 2000.80.818.0 | [821280 MS03-031: Security Patch for SQL Server 2000 64-bit] | 2006-03-14 |
-| 8.00.816 | 2000.80.816.0 | [818766 FIX: Intense SQL Server activity results in spinloop wait] | 2005-10-25 |
-| 8.00.814 | 2000.80.814.0 | [819662 FIX: Distribution Cleanup Agent Incorrectly Cleans Up Entries for Anonymous Subscribers] | 2005-10-25 |
-| 8.00.811 | 2000.80.811.0 | [819248 FIX: An access violation exception may occur when you insert a row in a table that is referenced by indexed views in SQL Server 2000] | 2006-04-03 |
-| 8.00.811 | 2000.80.811.0 | [819662 FIX: Distribution Cleanup Agent Incorrectly Cleans Up Entries for Anonymous Subscribers] | 2005-10-25 |
-| 8.00.811 | 2000.80.811.0 | [818897 FIX: Invalid TDS Sent to SQL Server Results in Access Violation] | 2005-10-25 |
-| 8.00.807 | 2000.80.807.0 | [818899 FIX: Error Message 3628 May Occur When You Run a Complex Query] | 2005-10-25 |
-| 8.00.804 | 2000.80.804.0 | [818729 FIX: Internal Query Processor Error 8623 When Microsoft SQL Server Tries to Compile a Plan for a Complex Query] | 2005-10-25 |
-| 8.00.801 | 2000.80.801.0 | [818540 FIX: SQL Server Enterprise Manager unexpectedly quits when you modify a DTS package] | 2006-01-26 |
-| 8.00.800 | 2000.80.800.0 | [818414 FIX: The Sqldumper.exe File Does Not Generate a Userdump File When It Runs Against a Windows Service] | 2005-09-27 |
-| 8.00.800 | 2000.80.800.0 | [818097 FIX: An Access Violation May Occur When You Run DBCC DBREINDEX on a Table That Has Hypothetical Indexes] | 2005-09-27 |
-| 8.00.800 | 2000.80.800.0 | [818188 FIX: Query on the sysmembers Virtual Table May Fail with a Stack Overflow] | 2005-09-27 |
-| 8.00.798 | 2000.80.798.0 | [817464 FIX: Using Sp_executesql in Merge Agent Operations] | 2005-09-27 |
-| 8.00.794 | 2000.80.794.0 | [817464 FIX: Using Sp_executesql in Merge Agent Operations] | 2005-09-27 |
-| 8.00.794 | 2000.80.794.0 | [813524 FIX: OLE DB conversion errors may occur after you select a literal string that represents datetime data as a column] | 2005-09-27 |
-| 8.00.794 | 2000.80.794.0 | [816440 FIX: Error 8623 is Raised When SQL Server Compiles a Complex Query] | 2005-09-27 |
-| 8.00.794 | 2000.80.794.0 | [817709 FIX: SQL Server 2000 might produce an incorrect cardinality estimate for outer joins] | 2005-02-11 |
-| 8.00.791 | 2000.80.791.0 | [815249 FIX: Performance of a query that is run from a client program on a SQL Server SP3 database is slow after you restart the instance of SQL Server] | 2005-09-27 |
-| 8.00.790 | 2000.80.790.0 | [817081 FIX: You receive an error message when you use the SQL-DMO BulkCopy object to import data into a SQL Server table] | 2005-09-27 |
-| 8.00.789 | 2000.80.789.0 | [816840 FIX: Error 17883 May Display Message Text That Is Not Correct] | 2005-09-27 |
-| 8.00.788 | 2000.80.788.0 | [816985 FIX: You cannot install SQL Server 2000 SP3 on the Korean version of SQL Server 2000] | 2005-09-27 |
-| 8.00.781 | 2000.80.781.0 | [815057 FIX: SQL Server 2000 Uninstall Option Does Not Remove All Files] | 2005-09-27 |
-| 8.00.780 | 2000.80.780.0 | [816039 FIX: Code Point Comparison Semantics for SQL_Latin1_General_Cp850_BIN Collation] | 2005-09-27 |
-| 8.00.780 | 2000.80.780.0 | [816084 FIX: sysindexes.statblob Column May Be Corrupted After You Run a DBCC DBREINDEX Statement] | 2005-09-27 |
-| 8.00.780 | 2000.80.780.0 | [810185 SQL Server 2000 hotfix update for SQL Server 2000 Service Pack 3 and 3a] | 2006-10-10 |
-| 8.00.779 | 2000.80.779.0 | [814035 FIX: A Full-Text Population Fails After You Apply SQL Server 2000 Service Pack 3] | 2005-09-27 |
-| 8.00.776 | 2000.80.776.0 | [Unidentified] | ??? |
-| 8.00.775 | 2000.80.775.0 | [815115 FIX: A DTS package that uses global variables ignores an error message raised by RAISERROR] | 2005-09-27 |
-| 8.00.769 | 2000.80.769.0 | [814889 FIX: A DELETE statement with a JOIN might fail and you receive a 625 error] | 2005-09-27 |
-| 8.00.769 | 2000.80.769.0 | [814893 FIX: Error Message: "Insufficient key column information for updating" Occurs in SQL Server 2000 SP3] | 2005-09-27 |
-| 8.00.765 | 2000.80.765.0 | [810163 FIX: An Access Violation Occurs if an sp_cursoropen Call References a Parameter That Is Not Defined] | 2005-09-27 |
-| 8.00.765 | 2000.80.765.0 | [810688 FIX: Merge Agent Can Resend Changes for Filtered Publications] | 2005-09-27 |
-| 8.00.765 | 2000.80.765.0 | [811611 FIX: Reinitialized SQL Server CE 2.0 subscribers may experience data loss and non-convergence] | 2005-09-27 |
-| 8.00.765 | 2000.80.765.0 | [813769 FIX: You May Experience Slow Performance When You Debug a SQL Server Service] | 2005-09-27 |
-| 8.00.763 | 2000.80.763.0 | [814113 FIX: DTS Designer may generate an access violation after you install SQL Server 2000 Service Pack 3] | 2005-09-27 |
-| 8.00.762 | 2000.80.762.0 | [814032 FIX: Merge publications cannot synchronize on SQL Server 2000 Service Pack 3] | 2005-09-27 |
-| 8.00.760 | 2000.80.760.0 | [SQL Server 2000 Service Pack 3 (SP3 / SP3a)] | 2003-08-27 |
-| 8.00.743 | 2000.80.743.0 | [818406 FIX: A Transact-SQL query that uses views may fail unexpectedly in SQL Server 2000 SP2] | 2005-10-18 |
-| 8.00.743 | 2000.80.743.0 | [818763 FIX: Intense SQL Server Activity Results in Spinloop Wait in SQL Server 2000 Service Pack 2] | 2005-10-25 |
-| 8.00.741 | 2000.80.741.0 | [818096 FIX: Many Extent Lock Time-outs May Occur During Extent Allocation] | 2005-02-10 |
-| 8.00.736 | 2000.80.736.0 | [816937 FIX: A memory leak may occur when you use the sp_OAMethod stored procedure to call a method of a COM object] | 2005-09-27 |
-| 8.00.735 | 2000.80.735.0 | [814889 FIX: A DELETE statement with a JOIN might fail and you receive a 625 error] | 2005-09-27 |
-| 8.00.733 | 2000.80.733.0 | [813759 FIX: A Large Number of NULL Values in Join Columns Result in Slow Query Performance] | 2005-09-27 |
-| 8.00.730 | 2000.80.730.0 | [813769 FIX: You May Experience Slow Performance When You Debug a SQL Server Service] | 2005-09-27 |
-| 8.00.728 | 2000.80.728.0 | [814460 FIX: Merge Replication with Alternate Synchronization Partners May Not Succeed After You Change the Retention Period] | 2005-09-27 |
-| 8.00.725 | 2000.80.725.0 | [812995 FIX: A Query with an Aggregate Function May Fail with a 3628 Error] | 2005-09-27 |
-| 8.00.725 | 2000.80.725.0 | [813494 FIX: Distribution Agent Fails with "Violation of Primary Key Constraint" Error Message] | 2005-09-27 |
-| 8.00.723 | 2000.80.723.0 | [812798 FIX: A UNION ALL View May Not Use Index If Partitions Are Removed at Compile Time] | 2005-09-27 |
-| 8.00.721 | 2000.80.721.0 | [812250 FIX: Indexed View May Cause a Handled Access Violation in CIndex::SetLevel1Names] | 2005-09-27 |
-| 8.00.721 | 2000.80.721.0 | [812393 FIX: Update or Delete Statement Fails with Error 1203 During Row Lock Escalation] | 2005-09-27 |
-| 8.00.718 | 2000.80.718.0 | [811703 FIX: Unexpected results from partial aggregations based on conversions] | 2005-09-27 |
-| 8.00.715 | 2000.80.715.0 | [810688 FIX: Merge Agent Can Resend Changes for Filtered Publications] | 2005-09-27 |
-| 8.00.715 | 2000.80.715.0 | [811611 FIX: Reinitialized SQL Server CE 2.0 subscribers may experience data loss and non-convergence] | 2005-09-27 |
-| 8.00.714 | 2000.80.714.0 | [811478 FIX: Restoring a SQL Server 7.0 database backup in SQL Server 2000 Service Pack 2 (SP2) may cause an assertion error in the Xdes.cpp file] | 2005-10-18 |
-| 8.00.713 | 2000.80.713.0 | [811205 FIX: An error message occurs when you perform a database or a file SHRINK operation] | 2005-09-27 |
-| 8.00.710 | 2000.80.710.0 | [811052 FIX: Latch Time-Out Message 845 Occurs When You Perform a Database or File SHRINK Operation] | 2005-09-27 |
-| 8.00.705 | 2000.80.705.0 | [810920 FIX: The JOIN queries in the triggers that involve the inserted table or the deleted table may return results that are not consistent] | 2005-09-27 |
-| 8.00.703 | 2000.80.703.0 | [810526 FIX: Cursors That Have a Long Lifetime May Cause Memory Fragmentation] | 2005-09-27 |
-| 8.00.702 | 2000.80.702.0 | [328551 FIX: Concurrency enhancements for the tempdb database] | 2006-07-19 |
-| 8.00.701 | 2000.80.701.0 | [810026 FIX: A DELETE Statement with a Self-Join May Fail and You Receive a 625 Error] | 2005-09-27 |
-| 8.00.701 | 2000.80.701.0 | [810163 FIX: An Access Violation Occurs if an sp_cursoropen Call References a Parameter That Is Not Defined] | 2005-09-27 |
-| 8.00.700 | 2000.80.700.0 | [810072 FIX: Merge Replication Reconciler Stack Overflow] | 2005-09-27 |
-| 8.00.696 | 2000.80.696.0 | [810052 FIX: A Memory Leak Occurs When Cursors Are Opened During a Connection] | 2005-09-27 |
-| 8.00.696 | 2000.80.696.0 | [810010 FIX: The fn_get_sql System Table Function May Cause Various Handled Access Violations] | 2005-09-27 |
-| 8.00.695 | 2000.80.695.0 | [331885 FIX: Update/Delete Statement Fails with Error 1203 During Page Lock Escalation] | 2005-09-27 |
-| 8.00.695 | 2000.80.695.0 | [331965 FIX: The xp_readmail Extended Stored Procedure Overwrites Attachment That Already Exists] | 2005-02-10 |
-| 8.00.695 | 2000.80.695.0 | [331968 FIX: The xp_readmail and xp_findnextmsg Extended Stored Procedures Do Not Read Mail in Time Received Order] | 2005-02-10 |
-| 8.00.693 | 2000.80.693.0 | [330212 FIX: Parallel logical operation returns results that are not consistent] | 2005-09-27 |
-| 8.00.690 | 2000.80.690.0 | [311104 FIX: The SELECT Statement with Parallelism Enabled May Cause an Assertion] | 2005-10-12 |
-| 8.00.689 | 2000.80.689.0 | [329499 FIX: Replication Removed from Database After Restore WITH RECOVERY] | 2005-10-11 |
-| 8.00.688 | 2000.80.688.0 | [329487 FIX: Transaction Log Restore Fails with Message 3456] | 2005-10-11 |
-| 8.00.686 | 2000.80.686.0 | [316333 SQL Server 2000 Security Update for Service Pack 2] | 2006-11-24 |
-| 8.00.682 | 2000.80.682.0 | [319851 FIX: Assertion and Error Message 3314 Occurs If You Try to Roll Back a Text Operation with READ UNCOMMITTED] | 2005-10-18 |
-| 8.00.679 | 2000.80.679.0 | [316333 SQL Server 2000 Security Update for Service Pack 2] | 2006-11-24 |
-| 8.00.678 | 2000.80.678.0 | [328354 FIX: A RESTORE DATABASE WITH RECOVERY Statement Can Fail with Error 9003 or Error 9004] | 2005-09-27 |
+| 8.00.1547 | 2000.80.1547.0 | 899410 FIX: You may experience slow server performance when you start a trace in an instance of SQL Server 2000 that runs on a computer that has more than four processors | 2006-06-01 |
+| 8.00.1077 | 2000.80.1077.0 | 983814 MS12-070: Description of the security update for SQL Server 2000 Reporting Services Service Pack 2 | 2012-10-09 |
+| 8.00.1037 | 2000.80.1037.0 | 930484 FIX: CPU utilization may approach 100 percent on a computer that is running SQL Server 2000 after you run the BACKUP DATABASE statement or the BACKUP LOG statement | 2007-02-02 |
+| 8.00.1036 | 2000.80.1036.0 | 929410 FIX: Error message when you run a full-text query in SQL Server 2000: "Error: 17883, Severity: 1, State: 0" | 2007-01-11 |
+| 8.00.1035 | 2000.80.1035.0 | 917593 FIX: The "Audit Logout" event does not appear in the trace results file when you run a profiler trace against a linked server instance in SQL Server 2000 | 2006-09-22 |
+| 8.00.1034 | 2000.80.1034.0 | 915328 FIX: You may intermittently experience an access violation error when a query is executed in a parallel plan and the execution plan contains either a HASH JOIN operation or a Sort operation in SQL Server 2000 | 2006-08-09 |
+| 8.00.1029 | 2000.80.1029.0 | 902852 FIX: Error message when you run an UPDATE statement that uses two JOIN hints to update a table in SQL Server 2000: "Internal SQL Server error" | 2006-06-01 |
+| 8.00.1027 | 2000.80.1027.0 | 900416 FIX: A 17883 error may occur you run a query that uses a hash join in SQL Server 2000 | 2006-07-25 |
+| 8.00.1025 | 2000.80.1025.0 | 899428 FIX: You receive incorrect results when you run a query that uses a cross join operator in SQL Server 2000 SP3 | 2006-06-01 |
+| 8.00.1025 | 2000.80.1025.0 | 899430 FIX: An access violation may occur when you run a SELECT query and the NO_BROWSETABLE option is set to ON in Microsoft SQL Server 2000 | 2006-07-25 |
+| 8.00.1024 | 2000.80.1024.0 | 898709 FIX: Error message when you use SQL Server 2000: "Time out occurred while waiting for buffer latch type 3" | 2006-07-25 |
+| 8.00.1021 | 2000.80.1021.0 | 887700 FIX: Server Network Utility may display incorrect protocol properties in SQL Server 2000 | 2006-07-25 |
+| 8.00.1020 | 2000.80.1020.0 | 896985 FIX: The Subscriber may not be able to upload changes to the Publisher when you incrementally add an article to a publication in SQL Server 2000 SP3 | 2006-07-25 |
+| 8.00.1019 | 2000.80.1019.0 | 897572 FIX: You may receive a memory-related error message when you repeatedly create and destroy an out-of-process COM object within the same batch or stored procedure in SQL Server 2000 | 2006-06-01 |
+| 8.00.1017 | 2000.80.1017.0 | 896425 FIX: The BULK INSERT statement silently skips insert attempts when the data value is NULL and the column is defined as NOT NULL for INT, SMALLINT, and BIGINT data types in SQL Server 2000 | 2006-06-01 |
+| 8.00.1014 | 2000.80.1014.0 | 895123 FIX: You may receive error message 701, error message 802, and error message 17803 when many hashed buffers are available in SQL Server 2000 | 2006-06-01 |
+| 8.00.1014 | 2000.80.1014.0 | 895187 FIX: You receive an error message when you try to delete records by running a Delete Transact-SQL statement in SQL Server 2000 | 2006-07-25 |
+| 8.00.1013 | 2000.80.1013.0 | 891866 FIX: The query runs slower than you expected when you try to parse a query in SQL Server 2000 | 2006-06-01 |
+| 8.00.1009 | 2000.80.1009.0 | 894257 FIX: You receive an "Incorrect syntax near ')'" error message when you run a script that was generated by SQL-DMO for an Operator object in SQL Server 2000 | 2006-06-01 |
+| 8.00.1007 | 2000.80.1007.0 | 893312 FIX: You may receive a "SQL Server could not spawn process_loginread thread" error message, and a memory leak may occur when you cancel a remote query in SQL Server 2000 | 2006-06-01 |
+| 8.00.1003 | 2000.80.1003.0 | 892923 FIX: Differential database backups may not contain database changes in the Page Free Space (PFS) pages in SQL Server 2000 | 2006-06-01 |
+| 8.00.1001 | 2000.80.1001.0 | 892205 FIX: You may receive a 17883 error message when SQL Server 2000 performs a very large hash operation | 2006-06-01 |
+| 8.00.1000 | 2000.80.1000.0 | 891585 FIX: Database recovery does not occur, or a user database is marked as suspect in SQL Server 2000 | 2006-06-01 |
+| 8.00.997 | 2000.80.997.0 | 891311 FIX: You cannot create new TCP/IP socket based connections after error messages 17882 and 10055 are written to the Microsoft SQL Server 2000 error log | 2006-07-18 |
+| 8.00.996 | 2000.80.996.0 | 891017 FIX: SQL Server 2000 may stop responding to other requests when you perform a large deallocation operation | 2006-06-01 |
+| 8.00.996 | 2000.80.996.0 | 891268 FIX: You receive a 17883 error message and SQL Server 2000 may stop responding to other requests when you perform large in-memory sort operations | 2006-06-01 |
+| 8.00.994 | 2000.80.994.0 | 890942 FIX: Some complex queries are slower after you install SQL Server 2000 Service Pack 2 or SQL Server 2000 Service Pack 3 | 2006-06-01 |
+| 8.00.994 | 2000.80.994.0 | 890768 FIX: You experience non-convergence in a replication topology when you unpublish or drop columns from a dynamically filtered publication in SQL Server 2000 | 2006-06-01 |
+| 8.00.994 | 2000.80.994.0 | 890767 FIX: You receive a "Server: Msg 107, Level 16, State 3, Procedure TEMP_VIEW_Merge, Line 1" error message when the sum of the length of the published column names in a merge publication exceeds 4,000 characters in SQL Server 2000 | 2006-06-01 |
+| 8.00.993 | 2000.80.993.0 | 890925 FIX: The @@ERROR system function may return an incorrect value when you execute a Transact-SQL statement that uses a parallel execution plan in SQL Server 2000 32-bit or in SQL Server 2000 64-bit | 2006-06-01 |
+| 8.00.993 | 2000.80.993.0 | 888444 FIX: You receive a 17883 error in SQL Server 2000 Service Pack 3 or in SQL Server 2000 Service Pack 3a when a worker thread becomes stuck in a registry call | 2006-06-01 |
+| 8.00.993 | 2000.80.993.0 | 890742 FIX: Error message when you use a loopback linked server to run a distributed query in SQL Server 2000: "Could not perform the requested operation because the minimum query memory is not available" | 2006-05-15 |
+| 8.00.991 | 2000.80.991.0 | 889314 FIX: Non-convergence may occur in a merge replication topology if the primary connection to the publisher is disconnected | 2006-06-01 |
+| 8.00.990 | 2000.80.990.0 | 890200 FIX: SQL Server 2000 stops listening for new TCP/IP Socket connections unexpectedly after error message 17882 is written to the SQL Server 2000 error log | 2006-06-01 |
+| 8.00.988 | 2000.80.988.0 | 889166 FIX: You receive a "Msg 3628" error message when you run an inner join query in SQL Server 2000 | 2006-06-01 |
+| 8.00.985 | 2000.80.985.0 | 889239 FIX: Start times in the SQL Profiler are different for the Audit:Login and Audit:Logout Events in SQL Server 2000 | 2006-06-01 |
+| 8.00.980 | 2000.80.980.0 | 887974 FIX: A fetch on a dynamic cursor can cause unexpected results in SQL Server 2000 Service Pack 3 | 2006-06-01 |
+| 8.00.977 | 2000.80.977.0 | 888007 You receive a "The product does not have a prerequisite update installed" error message when you try to install a SQL Server 2000 post-Service Pack 3 hotfix | 2005-08-31 |
+| 8.00.973 | 2000.80.973.0 | 884554 FIX: A SPID stops responding with a NETWORKIO (0x800) waittype in SQL Server Enterprise Manager when SQL Server tries to process a fragmented TDS network packet | 2006-06-01 |
+| 8.00.972 | 2000.80.972.0 | 885290 FIX: An assertion error occurs when you insert data in the same row in a table by using multiple connections to an instance of SQL Server | 2006-06-01 |
+| 8.00.970 | 2000.80.970.0 | 872842 FIX: A CHECKDB statement reports a 2537 corruption error after SQL Server transfers data to a sql_variant column in SQL Server 2000 | 2006-06-01 |
+| 8.00.967 | 2000.80.967.0 | 878501 FIX: You may receive an error message when you run a SET IDENTITY_INSERT ON statement on a table and then try to insert a row into the table in SQL Server 2000 | 2006-06-01 |
+| 8.00.962 | 2000.80.962.0 | 883415 FIX: A user-defined function returns results that are not correct for a query | 2006-06-01 |
+| 8.00.961 | 2000.80.961.0 | 873446 FIX: An access violation exception may occur when multiple users try to perform data modification operations at the same time that fire triggers that reference a deleted or an inserted table in SQL Server 2000 on a computer that is running SMP | 2006-06-01 |
+| 8.00.959 | 2000.80.959.0 | 878500 FIX: An Audit Object Permission event is not produced when you run a TRUNCATE TABLE statement | 2006-06-01 |
+| 8.00.957 | 2000.80.957.0 | 870994 FIX: An access violation exception may occur when you run a query that uses index names in the WITH INDEX option to specify an index hint | 2006-06-01 |
+| 8.00.955 | 2000.80.955.0 | 867798 FIX: The @date_received parameter of the xp_readmail extended stored procedure incorrectly returns the date and the time that an e-mail message is submitted by the sender in SQL Server 2000 | 2007-01-08 |
+| 8.00.954 | 2000.80.954.0 | 843282 FIX: The Osql.exe utility does not run a Transact-SQL script completely if you start the program from a remote session by using a background service and then log off the console session | 2007-01-05 |
+| 8.00.952 | 2000.80.952.0 | 867878 FIX: The Log Reader Agent may cause 17883 error messages | 2006-06-01 |
+| 8.00.952 | 2000.80.952.0 | 867879 FIX: Merge replication non-convergence occurs with SQL Server CE subscribers | 2006-06-01 |
+| 8.00.952 | 2000.80.952.0 | 867880 FIX: Merge Agent may fail with an "Invalid character value for cast specification" error message | 2006-06-01 |
+| 8.00.949 | 2000.80.949.0 | 843266 FIX: Shared page locks can be held until end of the transaction and can cause blocking or performance problems in SQL Server 2000 Service Pack 3 (SP3) | 2006-06-02 |
+| 8.00.948 | 2000.80.948.0 | 843263 FIX: You may receive an 8623 error message when you try to run a complex query on an instance of SQL Server | 2006-06-01 |
+| 8.00.944 | 2000.80.944.0 | 839280 FIX: SQL debugging does not work in Visual Studio .NET after you install Windows XP Service Pack 2 | 2006-06-05 |
+| 8.00.937 | 2000.80.937.0 | 841776 FIX: Additional diagnostics have been added to SQL Server 2000 to detect unreported read operation failures | 2006-06-01 |
+| 8.00.936 | 2000.80.936.0 | 841627 FIX: SQL Server 2000 may underestimate the cardinality of a query expression under certain circumstances | 2006-06-01 |
+| 8.00.935 | 2000.80.935.0 | 841401 FIX: You may notice incorrect values for the "Active Transactions" counter when you perform multiple transactions on an instance of SQL Server 2000 that is running on an SMP computer | 2006-06-01 |
+| 8.00.934 | 2000.80.934.0 | 841404 FIX: You may receive a "The query processor could not produce a query plan" error message in SQL Server when you run a query that includes multiple subqueries that use self-joins | 2006-06-01 |
+| 8.00.933 | 2000.80.933.0 | 840856 FIX: The MSSQLServer service exits unexpectedly in SQL Server 2000 Service Pack 3 | 2006-06-02 |
+| 8.00.929 | 2000.80.929.0 | 839529 FIX: 8621 error conditions may cause SQL Server 2000 64-bit to close unexpectedly | 2006-06-01 |
+| 8.00.928 | 2000.80.928.0 | 839589 FIX: The thread priority is raised for some threads in a parallel query | 2006-06-01 |
+| 8.00.927 | 2000.80.927.0 | 839688 FIX: Profiler RPC events truncate parameters that have a text data type to 16 characters | 2006-06-01 |
+| 8.00.926 | 2000.80.926.0 | 839523 FIX: An access violation exception may occur when you update a text column by using a stored procedure in SQL Server 2000 | 2006-06-01 |
+| 8.00.923 | 2000.80.923.0 | 838460 FIX: The xp_logininfo procedure may fail with error 8198 after you install Q825042 or any hotfix with SQL Server 8.00.0840 or later | 2006-06-01 |
+| 8.00.922 | 2000.80.922.0 | 837970 FIX: You may receive an "Invalid object name..." error message when you run the DBCC CHECKCONSTRAINTS Transact-SQL statement on a table in SQL Server 2000 | 2005-10-25 |
+| 8.00.919 | 2000.80.919.0 | 837957 FIX: When you use Transact-SQL cursor variables to perform operations that have large iterations, memory leaks may occur in SQL Server 2000 | 2005-10-25 |
+| 8.00.916 | 2000.80.916.0 | 317989 FIX: Sqlakw32.dll May Corrupt SQL Statements | 2005-09-27 |
+| 8.00.915 | 2000.80.915.0 | 837401 FIX: Rows are not successfully inserted into a table when you use the BULK INSERT command to insert rows | 2005-10-25 |
+| 8.00.913 | 2000.80.913.0 | 836651 FIX: You receive query results that were not expected when you use both ANSI joins and non-ANSI joins | 2006-06-07 |
+| 8.00.911 | 2000.80.911.0 | 837957 FIX: When you use Transact-SQL cursor variables to perform operations that have large iterations, memory leaks may occur in SQL Server 2000 | 2005-10-25 |
+| 8.00.910 | 2000.80.910.0 | 834798 FIX: SQL Server 2000 may not start if many users try to log in to SQL Server when SQL Server is trying to start | 2005-10-25 |
+| 8.00.908 | 2000.80.908.0 | 834290 FIX: You receive a 644 error message when you run an UPDATE statement and the isolation level is set to READ UNCOMMITTED | 2005-10-25 |
+| 8.00.904 | 2000.80.904.0 | 834453 FIX: The Snapshot Agent may fail after you make schema changes to the underlying tables of a publication | 2005-04-22 |
+| 8.00.892 | 2000.80.892.0 | 833710 FIX: You receive an error message when you try to restore a database backup that spans multiple devices | 2005-10-25 |
+| 8.00.891 | 2000.80.891.0 | 836141 FIX: An access violation exception may occur when SQL Server runs many parallel query processing operations on a multiprocessor computer | 2005-04-01 |
+| 8.00.879 | 2000.80.879.0 | 832977 FIX: The DBCC PSS Command may cause access violations and 17805 errors in SQL Server 2000 | 2005-10-25 |
+| 8.00.878 | 2000.80.878.0 | 831950 FIX: You receive error message 3456 when you try to apply a transaction log to a server | 2005-10-25 |
+| 8.00.876 | 2000.80.876.0 | 830912 FIX: Key Names Read from an .Ini File for a Dynamic Properties Task May Be Truncated | 2005-10-25 |
+| 8.00.876 | 2000.80.876.0 | 831997 FIX: An invalid cursor state occurs after you apply Hotfix 8.00.0859 or later in SQL Server 2000 | 2005-10-25 |
+| 8.00.876 | 2000.80.876.0 | 831999 FIX: An AWE system uses more memory for sorting or for hashing than a non-AWE system in SQL Server 2000 | 2005-10-25 |
+| 8.00.873 | 2000.80.873.0 | 830887 FIX: Some queries that have a left outer join and an IS NULL filter run slower after you install SQL Server 2000 post-SP3 hotfix | 2005-10-25 |
+| 8.00.871 | 2000.80.871.0 | 830767 FIX: SQL Query Analyzer may stop responding when you close a query window or open a file | 2005-10-25 |
+| 8.00.871 | 2000.80.871.0 | 830860 FIX: The performance of a computer that is running SQL Server 2000 degrades when query execution plans against temporary tables remain in the procedure cache | 2005-10-25 |
+| 8.00.870 | 2000.80.870.0 | 830262 FIX: Unconditional Update May Not Hold Key Locks on New Key Values | 2005-10-25 |
+| 8.00.869 | 2000.80.869.0 | 830588 FIX: Access violation when you trace keyset-driven cursors by using SQL Profiler | 2005-10-25 |
+| 8.00.866 | 2000.80.866.0 | 830366 FIX: An access violation occurs in SQL Server 2000 when a high volume of local shared memory connections occur after you install security update MS03-031 | 2006-01-16 |
+| 8.00.865 | 2000.80.865.0 | 830395 FIX: An access violation occurs during compilation if the table contains statistics for a computed column | 2005-10-25 |
+| 8.00.865 | 2000.80.865.0 | 828945 FIX: You cannot insert explicit values in an IDENTITY column of a SQL Server table by using the SQLBulkOperations function or the SQLSetPos ODBC function in SQL Server 2000 | 2005-10-25 |
+| 8.00.863 | 2000.80.863.0 | 829205 FIX: Query performance may be slow and may be inconsistent when you run a query while another query that contains an IN operator with many values is compiled | 2005-10-25 |
+| 8.00.863 | 2000.80.863.0 | 829444 FIX: A floating point exception occurs during the optimization of a query | 2005-10-25 |
+| 8.00.859 | 2000.80.859.0 | 821334 FIX: Issues that are resolved in SQL Server 2000 build 8.00.0859 | 2005-03-31 |
+| 8.00.858 | 2000.80.858.0 | 828637 FIX: Users Can Control the Compensating Change Process in Merge Replication | 2005-10-25 |
+| 8.00.857 | 2000.80.857.0 | 828017 The Knowledge Base (KB) Article You Requested Is Currently Not Available | ??? |
+| 8.00.857 | 2000.80.857.0 | 827714 FIX: A query may fail with retail assertion when you use the NOLOCK hint or the READ UNCOMMITTED isolation level | 2005-11-23 |
+| 8.00.857 | 2000.80.857.0 | 828308 FIX: An Internet Explorer script error occurs when you access metadata information by using DTS in SQL Server Enterprise Manager | 2005-10-25 |
+| 8.00.856 | 2000.80.856.0 | 828096 FIX: Key Locks Are Held Until the End of the Statement for Rows That Do Not Pass Filter Criteria | 2005-10-25 |
+| 8.00.854 | 2000.80.854.0 | 828699 FIX: An Access Violation Occurs When You Run DBCC UPDATEUSAGE on a Database That Has Many Objects | 2005-10-25 |
+| 8.00.852 | 2000.80.852.0 | 830466 FIX: You may receive an "Internal SQL Server error" error message when you run a Transact-SQL SELECT statement on a view that has many subqueries in SQL Server 2000 | 2005-04-01 |
+| 8.00.852 | 2000.80.852.0 | 827954 FIX: Slow Execution Times May Occur When You Run DML Statements Against Tables That Have Cascading Referential Integrity | 2005-10-25 |
+| 8.00.851 | 2000.80.851.0 | 826754 FIX: A Deadlock Occurs If You Run an Explicit UPDATE STATISTICS Command | 2005-10-25 |
+| 8.00.850 | 2000.80.850.0 | 826860 FIX: Linked Server Query May Return NULL If It Is Performed Through a Keyset Cursor | 2005-10-25 |
+| 8.00.850 | 2000.80.850.0 | 826815 FIX: You receive an 8623 error message in SQL Server when you try to run a query that has multiple correlated subqueries | 2005-10-25 |
+| 8.00.850 | 2000.80.850.0 | 826906 FIX: A query that uses a view that contains a correlated subquery and an aggregate runs slowly | 2005-10-25 |
+| 8.00.848 | 2000.80.848.0 | 826822 FIX: A Member of the db_accessadmin Fixed Database Role Can Create an Alias for the dbo Special User | 2005-10-25 |
+| 8.00.847 | 2000.80.847.0 | 826433 PRB: Additional SQL Server Diagnostics Added to Detect Unreported I/O Problems | 2005-10-25 |
+| 8.00.845 | 2000.80.845.0 | 826364 FIX: A Query with a LIKE Comparison Results in a Non-Optimal Query Plan When You Use a Hungarian SQL Server Collation | 2005-10-05 |
+| 8.00.845 | 2000.80.845.0 | 825854 FIX: No Exclusive Locks May Be Taken If the DisAllowsPageLocks Value Is Set to True | 2005-10-25 |
+| 8.00.844 | 2000.80.844.0 | 826080 FIX: SQL Server 2000 protocol encryption applies to JDBC clients | 2006-10-17 |
+| 8.00.842 | 2000.80.842.0 | 825043 FIX: Rows are unexpectedly deleted when you run a distributed query to delete or to update a linked server table | 2005-10-25 |
+| 8.00.841 | 2000.80.841.0 | 825225 FIX: You receive an error message when you run a parallel query that uses an aggregation function or the GROUP BY clause | 2005-10-25 |
+| 8.00.840 | 2000.80.840.0 | 319477 FIX: Extremely Large Number of User Tables on AWE System May Cause BPool::Map Errors | 2005-09-27 |
+| 8.00.840 | 2000.80.840.0 | 319477 FIX: Extremely Large Number of User Tables on AWE System May Cause BPool::Map Errors | 2005-09-27 |
+| 8.00.839 | 2000.80.839.0 | 823877 FIX: An Access Violation May Occur When You Run a Query That Contains 32,000 or More OR Clauses | 2005-10-25 |
+| 8.00.839 | 2000.80.839.0 | 824027 FIX: A Cursor with a Large Object Parameter May Cause an Access Violation on CStmtCond::XretExecute | 2005-10-25 |
+| 8.00.837 | 2000.80.837.0 | 820788 FIX: Delayed domain authentication may cause SQL Server to stop responding | 2005-10-25 |
+| 8.00.837 | 2000.80.837.0 | 821741 FIX: Lock monitor exception in DeadlockMonitor::ResolveDeadlock | 2005-10-25 |
+| 8.00.837 | 2000.80.837.0 | 821548 FIX: A Parallel Query May Generate an Access Violation After You Install SQL Server 2000 SP3 | 2005-10-25 |
+| 8.00.837 | 2000.80.837.0 | 821740 FIX: MS DTC Transaction Commit Operation Blocks Itself | 2005-10-25 |
+| 8.00.837 | 2000.80.837.0 | 823514 FIX: Build 8.00.0837: A query that contains a correlated subquery runs slowly | 2005-10-25 |
+| 8.00.819 | 2000.80.819.0 | 826161 FIX: You are prompted for password confirmation after you change a standard SQL Server login | 2005-10-25 |
+| 8.00.818 | 2000.80.818.0 | 821277 MS03-031: Security patch for SQL Server 2000 Service Pack 3 | 2006-01-09 |
+| 8.00.818 | 2000.80.818.0 | 821337 FIX: Localized versions of SQL Mail and the Web Assistant Wizard may not work as expected in SQL Server 2000 64 bit | 2005-03-16 |
+| 8.00.818 | 2000.80.818.0 | 818388 FIX: A Transact-SQL Statement That Is Embedded in the Database Name Runs with System Administrator Permissions | 2005-02-10 |
+| 8.00.818 | 2000.80.818.0 | 826161 FIX: You are prompted for password confirmation after you change a standard SQL Server login | 2005-10-25 |
+| 8.00.818 | 2000.80.818.0 | 821280 MS03-031: Security Patch for SQL Server 2000 64-bit | 2006-03-14 |
+| 8.00.816 | 2000.80.816.0 | 818766 FIX: Intense SQL Server activity results in spinloop wait | 2005-10-25 |
+| 8.00.814 | 2000.80.814.0 | 819662 FIX: Distribution Cleanup Agent Incorrectly Cleans Up Entries for Anonymous Subscribers | 2005-10-25 |
+| 8.00.811 | 2000.80.811.0 | 819248 FIX: An access violation exception may occur when you insert a row in a table that is referenced by indexed views in SQL Server 2000 | 2006-04-03 |
+| 8.00.811 | 2000.80.811.0 | 819662 FIX: Distribution Cleanup Agent Incorrectly Cleans Up Entries for Anonymous Subscribers | 2005-10-25 |
+| 8.00.811 | 2000.80.811.0 | 818897 FIX: Invalid TDS Sent to SQL Server Results in Access Violation | 2005-10-25 |
+| 8.00.807 | 2000.80.807.0 | 818899 FIX: Error Message 3628 May Occur When You Run a Complex Query | 2005-10-25 |
+| 8.00.804 | 2000.80.804.0 | 818729 FIX: Internal Query Processor Error 8623 When Microsoft SQL Server Tries to Compile a Plan for a Complex Query | 2005-10-25 |
+| 8.00.801 | 2000.80.801.0 | 818540 FIX: SQL Server Enterprise Manager unexpectedly quits when you modify a DTS package | 2006-01-26 |
+| 8.00.800 | 2000.80.800.0 | 818414 FIX: The Sqldumper.exe File Does Not Generate a Userdump File When It Runs Against a Windows Service | 2005-09-27 |
+| 8.00.800 | 2000.80.800.0 | 818097 FIX: An Access Violation May Occur When You Run DBCC DBREINDEX on a Table That Has Hypothetical Indexes | 2005-09-27 |
+| 8.00.800 | 2000.80.800.0 | 818188 FIX: Query on the sysmembers Virtual Table May Fail with a Stack Overflow | 2005-09-27 |
+| 8.00.798 | 2000.80.798.0 | 817464 FIX: Using Sp_executesql in Merge Agent Operations | 2005-09-27 |
+| 8.00.794 | 2000.80.794.0 | 817464 FIX: Using Sp_executesql in Merge Agent Operations | 2005-09-27 |
+| 8.00.794 | 2000.80.794.0 | 813524 FIX: OLE DB conversion errors may occur after you select a literal string that represents datetime data as a column | 2005-09-27 |
+| 8.00.794 | 2000.80.794.0 | 816440 FIX: Error 8623 is Raised When SQL Server Compiles a Complex Query | 2005-09-27 |
+| 8.00.794 | 2000.80.794.0 | 817709 FIX: SQL Server 2000 might produce an incorrect cardinality estimate for outer joins | 2005-02-11 |
+| 8.00.791 | 2000.80.791.0 | 815249 FIX: Performance of a query that is run from a client program on a SQL Server SP3 database is slow after you restart the instance of SQL Server | 2005-09-27 |
+| 8.00.790 | 2000.80.790.0 | 817081 FIX: You receive an error message when you use the SQL-DMO BulkCopy object to import data into a SQL Server table | 2005-09-27 |
+| 8.00.789 | 2000.80.789.0 | 816840 FIX: Error 17883 May Display Message Text That Is Not Correct | 2005-09-27 |
+| 8.00.788 | 2000.80.788.0 | 816985 FIX: You cannot install SQL Server 2000 SP3 on the Korean version of SQL Server 2000 | 2005-09-27 |
+| 8.00.781 | 2000.80.781.0 | 815057 FIX: SQL Server 2000 Uninstall Option Does Not Remove All Files | 2005-09-27 |
+| 8.00.780 | 2000.80.780.0 | 816039 FIX: Code Point Comparison Semantics for SQL_Latin1_General_Cp850_BIN Collation | 2005-09-27 |
+| 8.00.780 | 2000.80.780.0 | 816084 FIX: sysindexes.statblob Column May Be Corrupted After You Run a DBCC DBREINDEX Statement | 2005-09-27 |
+| 8.00.780 | 2000.80.780.0 | 810185 SQL Server 2000 hotfix update for SQL Server 2000 Service Pack 3 and 3a | 2006-10-10 |
+| 8.00.779 | 2000.80.779.0 | 814035 FIX: A Full-Text Population Fails After You Apply SQL Server 2000 Service Pack 3 | 2005-09-27 |
+| 8.00.776 | 2000.80.776.0 | Unidentified | ??? |
+| 8.00.775 | 2000.80.775.0 | 815115 FIX: A DTS package that uses global variables ignores an error message raised by RAISERROR | 2005-09-27 |
+| 8.00.769 | 2000.80.769.0 | 814889 FIX: A DELETE statement with a JOIN might fail and you receive a 625 error | 2005-09-27 |
+| 8.00.769 | 2000.80.769.0 | 814893 FIX: Error Message: "Insufficient key column information for updating" Occurs in SQL Server 2000 SP3 | 2005-09-27 |
+| 8.00.765 | 2000.80.765.0 | 810163 FIX: An Access Violation Occurs if an sp_cursoropen Call References a Parameter That Is Not Defined | 2005-09-27 |
+| 8.00.765 | 2000.80.765.0 | 810688 FIX: Merge Agent Can Resend Changes for Filtered Publications | 2005-09-27 |
+| 8.00.765 | 2000.80.765.0 | 811611 FIX: Reinitialized SQL Server CE 2.0 subscribers may experience data loss and non-convergence | 2005-09-27 |
+| 8.00.765 | 2000.80.765.0 | 813769 FIX: You May Experience Slow Performance When You Debug a SQL Server Service | 2005-09-27 |
+| 8.00.763 | 2000.80.763.0 | 814113 FIX: DTS Designer may generate an access violation after you install SQL Server 2000 Service Pack 3 | 2005-09-27 |
+| 8.00.762 | 2000.80.762.0 | 814032 FIX: Merge publications cannot synchronize on SQL Server 2000 Service Pack 3 | 2005-09-27 |
+| 8.00.760 | 2000.80.760.0 | SQL Server 2000 Service Pack 3 (SP3 / SP3a) | 2003-08-27 |
+| 8.00.743 | 2000.80.743.0 | 818406 FIX: A Transact-SQL query that uses views may fail unexpectedly in SQL Server 2000 SP2 | 2005-10-18 |
+| 8.00.743 | 2000.80.743.0 | 818763 FIX: Intense SQL Server Activity Results in Spinloop Wait in SQL Server 2000 Service Pack 2 | 2005-10-25 |
+| 8.00.741 | 2000.80.741.0 | 818096 FIX: Many Extent Lock Time-outs May Occur During Extent Allocation | 2005-02-10 |
+| 8.00.736 | 2000.80.736.0 | 816937 FIX: A memory leak may occur when you use the sp_OAMethod stored procedure to call a method of a COM object | 2005-09-27 |
+| 8.00.735 | 2000.80.735.0 | 814889 FIX: A DELETE statement with a JOIN might fail and you receive a 625 error | 2005-09-27 |
+| 8.00.733 | 2000.80.733.0 | 813759 FIX: A Large Number of NULL Values in Join Columns Result in Slow Query Performance | 2005-09-27 |
+| 8.00.730 | 2000.80.730.0 | 813769 FIX: You May Experience Slow Performance When You Debug a SQL Server Service | 2005-09-27 |
+| 8.00.728 | 2000.80.728.0 | 814460 FIX: Merge Replication with Alternate Synchronization Partners May Not Succeed After You Change the Retention Period | 2005-09-27 |
+| 8.00.725 | 2000.80.725.0 | 812995 FIX: A Query with an Aggregate Function May Fail with a 3628 Error | 2005-09-27 |
+| 8.00.725 | 2000.80.725.0 | 813494 FIX: Distribution Agent Fails with "Violation of Primary Key Constraint" Error Message | 2005-09-27 |
+| 8.00.723 | 2000.80.723.0 | 812798 FIX: A UNION ALL View May Not Use Index If Partitions Are Removed at Compile Time | 2005-09-27 |
+| 8.00.721 | 2000.80.721.0 | 812250 FIX: Indexed View May Cause a Handled Access Violation in CIndex::SetLevel1Names | 2005-09-27 |
+| 8.00.721 | 2000.80.721.0 | 812393 FIX: Update or Delete Statement Fails with Error 1203 During Row Lock Escalation | 2005-09-27 |
+| 8.00.718 | 2000.80.718.0 | 811703 FIX: Unexpected results from partial aggregations based on conversions | 2005-09-27 |
+| 8.00.715 | 2000.80.715.0 | 810688 FIX: Merge Agent Can Resend Changes for Filtered Publications | 2005-09-27 |
+| 8.00.715 | 2000.80.715.0 | 811611 FIX: Reinitialized SQL Server CE 2.0 subscribers may experience data loss and non-convergence | 2005-09-27 |
+| 8.00.714 | 2000.80.714.0 | 811478 FIX: Restoring a SQL Server 7.0 database backup in SQL Server 2000 Service Pack 2 (SP2) may cause an assertion error in the Xdes.cpp file | 2005-10-18 |
+| 8.00.713 | 2000.80.713.0 | 811205 FIX: An error message occurs when you perform a database or a file SHRINK operation | 2005-09-27 |
+| 8.00.710 | 2000.80.710.0 | 811052 FIX: Latch Time-Out Message 845 Occurs When You Perform a Database or File SHRINK Operation | 2005-09-27 |
+| 8.00.705 | 2000.80.705.0 | 810920 FIX: The JOIN queries in the triggers that involve the inserted table or the deleted table may return results that are not consistent | 2005-09-27 |
+| 8.00.703 | 2000.80.703.0 | 810526 FIX: Cursors That Have a Long Lifetime May Cause Memory Fragmentation | 2005-09-27 |
+| 8.00.702 | 2000.80.702.0 | 328551 FIX: Concurrency enhancements for the tempdb database | 2006-07-19 |
+| 8.00.701 | 2000.80.701.0 | 810026 FIX: A DELETE Statement with a Self-Join May Fail and You Receive a 625 Error | 2005-09-27 |
+| 8.00.701 | 2000.80.701.0 | 810163 FIX: An Access Violation Occurs if an sp_cursoropen Call References a Parameter That Is Not Defined | 2005-09-27 |
+| 8.00.700 | 2000.80.700.0 | 810072 FIX: Merge Replication Reconciler Stack Overflow | 2005-09-27 |
+| 8.00.696 | 2000.80.696.0 | 810052 FIX: A Memory Leak Occurs When Cursors Are Opened During a Connection | 2005-09-27 |
+| 8.00.696 | 2000.80.696.0 | 810010 FIX: The fn_get_sql System Table Function May Cause Various Handled Access Violations | 2005-09-27 |
+| 8.00.695 | 2000.80.695.0 | 331885 FIX: Update/Delete Statement Fails with Error 1203 During Page Lock Escalation | 2005-09-27 |
+| 8.00.695 | 2000.80.695.0 | 331965 FIX: The xp_readmail Extended Stored Procedure Overwrites Attachment That Already Exists | 2005-02-10 |
+| 8.00.695 | 2000.80.695.0 | 331968 FIX: The xp_readmail and xp_findnextmsg Extended Stored Procedures Do Not Read Mail in Time Received Order | 2005-02-10 |
+| 8.00.693 | 2000.80.693.0 | 330212 FIX: Parallel logical operation returns results that are not consistent | 2005-09-27 |
+| 8.00.690 | 2000.80.690.0 | 311104 FIX: The SELECT Statement with Parallelism Enabled May Cause an Assertion | 2005-10-12 |
+| 8.00.689 | 2000.80.689.0 | 329499 FIX: Replication Removed from Database After Restore WITH RECOVERY | 2005-10-11 |
+| 8.00.688 | 2000.80.688.0 | 329487 FIX: Transaction Log Restore Fails with Message 3456 | 2005-10-11 |
+| 8.00.686 | 2000.80.686.0 | 316333 SQL Server 2000 Security Update for Service Pack 2 | 2006-11-24 |
+| 8.00.682 | 2000.80.682.0 | 319851 FIX: Assertion and Error Message 3314 Occurs If You Try to Roll Back a Text Operation with READ UNCOMMITTED | 2005-10-18 |
+| 8.00.679 | 2000.80.679.0 | 316333 SQL Server 2000 Security Update for Service Pack 2 | 2006-11-24 |
+| 8.00.678 | 2000.80.678.0 | 328354 FIX: A RESTORE DATABASE WITH RECOVERY Statement Can Fail with Error 9003 or Error 9004 | 2005-09-27 |
| 8.00.667 | 2000.80.667.0 | 2000 SP2+8/14 fix | ??? |
| 8.00.665 | 2000.80.665.0 | 2000 SP2+8/8 fix | ??? |
-| 8.00.661 | 2000.80.661.0 | [326999 FIX: Lock escalation on a scan while an update query is running causes a 1203 error message to occur] | 2005-09-27 |
+| 8.00.661 | 2000.80.661.0 | 326999 FIX: Lock escalation on a scan while an update query is running causes a 1203 error message to occur | 2005-09-27 |
| 8.00.655 | 2000.80.655.0 | 2000 SP2+7/24 fix | ??? |
-| 8.00.652 | 2000.80.652.0 | [810010 FIX: The fn_get_sql System Table Function May Cause Various Handled Access Violations] | 2005-09-27 |
-| 8.00.650 | 2000.80.650.0 | [322853 FIX: SQL Server Grants Unnecessary Permissions or an Encryption Function Contains Unchecked Buffers] | 2003-11-05 |
-| 8.00.644 | 2000.80.644.0 | [324186 FIX: Slow Compile Time and Execution Time with Query That Contains Aggregates and Subqueries] | 2005-09-27 |
-| 8.00.636 | 2000.80.636.0 | [Microsoft Security Bulletin MS02-039] | 2002-06-24 |
-| 8.00.608 | 2000.80.608.0 | [319507 FIX: SQL Extended Procedure Functions Contain Unchecked Buffers] | 2004-06-21 |
+| 8.00.652 | 2000.80.652.0 | 810010 FIX: The fn_get_sql System Table Function May Cause Various Handled Access Violations | 2005-09-27 |
+| 8.00.650 | 2000.80.650.0 | 322853 FIX: SQL Server Grants Unnecessary Permissions or an Encryption Function Contains Unchecked Buffers | 2003-11-05 |
+| 8.00.644 | 2000.80.644.0 | 324186 FIX: Slow Compile Time and Execution Time with Query That Contains Aggregates and Subqueries | 2005-09-27 |
+| 8.00.636 | 2000.80.636.0 | Microsoft Security Bulletin MS02-039 | 2002-06-24 |
+| 8.00.608 | 2000.80.608.0 | 319507 FIX: SQL Extended Procedure Functions Contain Unchecked Buffers | 2004-06-21 |
| 8.00.604 | 2000.80.604.0 | 2000 SP2+3/29 fix | ??? |
-| 8.00.599 | 2000.80.599.0 | [319869 FIX: Improved SQL Manager Robustness for Odd Length Buffer] | 2005-09-27 |
-| 8.00.594 | 2000.80.594.0 | [319477 FIX: Extremely Large Number of User Tables on AWE System May Cause BPool::Map Errors] | 2005-09-27 |
-| 8.00.584 | 2000.80.584.0 | [318530 FIX: Reorder outer joins with filter criteria before non-selective joins and outer joins] | 2008-02-04 |
-| 8.00.578 | 2000.80.578.0 | [317979 FIX: Unchecked Buffer May Occur When You Connect to Remote Data Source] | 2005-09-27 |
-| 8.00.578 | 2000.80.578.0 | [318045 FIX: SELECT with Timestamp Column That Uses FOR XML AUTO May Fail with Stack Overflow or AV] | 2005-09-27 |
-| 8.00.568 | 2000.80.568.0 | [317748 FIX: Handle Leak Occurs in SQL Server When Service or Application Repeatedly Connects and Disconnects with Shared Memory Network Library] | 2002-10-30 |
+| 8.00.599 | 2000.80.599.0 | 319869 FIX: Improved SQL Manager Robustness for Odd Length Buffer | 2005-09-27 |
+| 8.00.594 | 2000.80.594.0 | 319477 FIX: Extremely Large Number of User Tables on AWE System May Cause BPool::Map Errors | 2005-09-27 |
+| 8.00.584 | 2000.80.584.0 | 318530 FIX: Reorder outer joins with filter criteria before non-selective joins and outer joins | 2008-02-04 |
+| 8.00.578 | 2000.80.578.0 | 317979 FIX: Unchecked Buffer May Occur When You Connect to Remote Data Source | 2005-09-27 |
+| 8.00.578 | 2000.80.578.0 | 318045 FIX: SELECT with Timestamp Column That Uses FOR XML AUTO May Fail with Stack Overflow or AV | 2005-09-27 |
+| 8.00.568 | 2000.80.568.0 | 317748 FIX: Handle Leak Occurs in SQL Server When Service or Application Repeatedly Connects and Disconnects with Shared Memory Network Library | 2002-10-30 |
| 8.00.561 | 2000.80.561.0 | 2000 SP2+1/29 fix | ??? |
-| 8.00.558 | 2000.80.558.0 | [314003 FIX: Query That Uses DESC Index May Result in Access Violation] | 2005-09-26 |
-| 8.00.558 | 2000.80.558.0 | [315395 FIX: COM May Not Be Uninitialized for Worker Thread When You Use sp_OA] | 2005-09-27 |
-| 8.00.552 | 2000.80.552.0 | [313002 The Knowledge Base (KB) Article You Requested Is Currently Not Available] | ??? |
-| 8.00.552 | 2000.80.552.0 | [313005 FIX: SELECT from Computed Column That References UDF Causes SQL Server to Terminate] | 2005-09-26 |
-| 8.00.534 | 2000.80.534.0 | 2000 SP2.01 | ??? |
-| 8.00.532 | 2000.80.532.0 | [SQL Server 2000 Service Pack 2 (SP2)] | 2003-02-04 |
+| 8.00.558 | 2000.80.558.0 | 314003 FIX: Query That Uses DESC Index May Result in Access Violation | 2005-09-26 |
+| 8.00.558 | 2000.80.558.0 | 315395 FIX: COM May Not Be Uninitialized for Worker Thread When You Use sp_OA | 2005-09-27 |
+| 8.00.552 | 2000.80.552.0 | 313002 The Knowledge Base (KB) Article You Requested Is Currently Not Available | ??? |
+| 8.00.552 | 2000.80.552.0 | 313005 FIX: SELECT from Computed Column That References UDF Causes SQL Server to Terminate | 2005-09-26 |
+| 8.00.534 | 2000.80.534.0 | 2000 SP2.01 | ??? |
+| 8.00.532 | 2000.80.532.0 | SQL Server 2000 Service Pack 2 (SP2) | 2003-02-04 |
| 8.00.475 | 2000.80.475.0 | 2000 SP1+1/29 fix | ??? |
-| 8.00.474 | 2000.80.474.0 | [315395 FIX: COM May Not Be Uninitialized for Worker Thread When You Use sp_OA] | 2005-09-27 |
-| 8.00.473 | 2000.80.473.0 | [314003 FIX: Query That Uses DESC Index May Result in Access Violation] | 2005-09-26 |
-| 8.00.471 | 2000.80.471.0 | [313302 FIX: Shared Table Lock Is Not Released After Lock Escalation] | 2005-09-26 |
-| 8.00.469 | 2000.80.469.0 | [313005 FIX: SELECT from Computed Column That References UDF Causes SQL Server to Terminate] | 2005-09-26 |
-| 8.00.452 | 2000.80.452.0 | [308547 FIX: SELECT DISTINCT from Table with LEFT JOIN of View Causes Error Messages or Client Application May Stop Responding] | 2005-09-26 |
-| 8.00.444 | 2000.80.444.0 | [307540 FIX: SQLPutData May Result in Leak of Buffer Pool Memory] | 2005-09-26 |
-| 8.00.444 | 2000.80.444.0 | [307655 FIX: Querying Syslockinfo with Large Numbers of Locks May Cause Server to Stop Responding] | 2005-10-07 |
-| 8.00.443 | 2000.80.443.0 | [307538 FIX: SQLTrace Start and Stop is Now Reported in Windows NT Event Log for SQL Server 2000] | 2005-09-26 |
-| 8.00.428 | 2000.80.428.0 | [304850 FIX: SQL Server Text Formatting Functions Contain Unchecked Buffers] | 2004-08-05 |
-| 8.00.384 | 2000.80.384.0 | [SQL Server 2000 Service Pack 1 (SP1)] | 2001-06-11 |
-| 8.00.296 | 2000.80.296.0 | [299717 FIX: Query Method Used to Access Data May Allow Rights that the Login Might Not Normally Have] | 2004-08-09 |
-| 8.00.287 | 2000.80.287.0 | [297209 FIX: Deletes, Updates and Rank Based Selects May Cause Deadlock of MSSEARCH] | 2005-10-07 |
-| 8.00.251 | 2000.80.251.0 | [300194 FIX: Error 644 Using Two Indexes on a Column with Uppercase Preference Sort Order] | 2003-10-17 |
-| 8.00.250 | 2000.80.250.0 | [291683 The Knowledge Base (KB) Article You Requested Is Currently Not Available] | ??? |
-| 8.00.249 | 2000.80.249.0 | [288122 FIX: Lock Monitor Uses Excessive CPU] | 2003-09-12 |
-| 8.00.239 | 2000.80.239.0 | [285290 FIX: Complex ANSI Join Query with Distributed Queries May Cause Handled Access Violation] | 2003-10-09 |
-| 8.00.233 | 2000.80.233.0 | [282416 FIX: Opening the Database Folder in SQL Server Enterprise Manager 2000 Takes a Long Time] | 2003-10-09 |
-| 8.00.231 | 2000.80.231.0 | [282279 FIX: Execution of sp_OACreate on COM Object Without Type Information Causes Server Shut Down] | 2003-10-09 |
-| 8.00.226 | 2000.80.226.0 | [278239 FIX: Extreme Memory Usage When Adding Many Security Roles] | 2006-11-21 |
-| 8.00.225 | 2000.80.225.0 | [281663 "Access Denied" Error Message When You Try to Use a Network Drive to Modify Windows 2000 Permissions] | 2006-10-30 |
-| 8.00.223 | 2000.80.223.0 | [280380 FIX: Buffer Overflow Exploit Possible with Extended Stored Procedures] | 2004-06-29 |
-| 8.00.222 | 2000.80.222.0 | [281769 FIX: Exception Access Violation Encountered During Query Normalization] | 2005-10-07 |
-| 8.00.218 | 2000.80.218.0 | [279183 FIX: Scripting Object with Several Extended Properties May Cause Exception] | 2003-10-09 |
-| 8.00.217 | 2000.80.217.0 | [279293 FIX: CASE Using LIKE with Empty String Can Result in Access Violation or Abnormal Server Shutdown] | 2003-10-09 |
-| 8.00.211 | 2000.80.211.0 | [276329 FIX: Complex Distinct or Group By Query Can Return Unexpected Results with Parallel Execution Plan] | 2003-11-05 |
-| 8.00.210 | 2000.80.210.0 | [275900 FIX: Linked Server Query with Hyphen in LIKE Clause May Run Slowly] | 2003-10-09 |
-| 8.00.205 | 2000.80.205.0 | [274330 FIX: Sending Open Files as Attachment in SQL Mail Fails with Error 18025] | 2005-10-07 |
-| 8.00.204 | 2000.80.204.0 | [274329 FIX: Optimizer Slow to Generate Query Plan for Complex Queries that have Many Joins and Semi-Joins] | 2003-10-09 |
+| 8.00.474 | 2000.80.474.0 | 315395 FIX: COM May Not Be Uninitialized for Worker Thread When You Use sp_OA | 2005-09-27 |
+| 8.00.473 | 2000.80.473.0 | 314003 FIX: Query That Uses DESC Index May Result in Access Violation | 2005-09-26 |
+| 8.00.471 | 2000.80.471.0 | 313302 FIX: Shared Table Lock Is Not Released After Lock Escalation | 2005-09-26 |
+| 8.00.469 | 2000.80.469.0 | 313005 FIX: SELECT from Computed Column That References UDF Causes SQL Server to Terminate | 2005-09-26 |
+| 8.00.452 | 2000.80.452.0 | 308547 FIX: SELECT DISTINCT from Table with LEFT JOIN of View Causes Error Messages or Client Application May Stop Responding | 2005-09-26 |
+| 8.00.444 | 2000.80.444.0 | 307540 FIX: SQLPutData May Result in Leak of Buffer Pool Memory | 2005-09-26 |
+| 8.00.444 | 2000.80.444.0 | 307655 FIX: Querying Syslockinfo with Large Numbers of Locks May Cause Server to Stop Responding | 2005-10-07 |
+| 8.00.443 | 2000.80.443.0 | 307538 FIX: SQLTrace Start and Stop is Now Reported in Windows NT Event Log for SQL Server 2000 | 2005-09-26 |
+| 8.00.428 | 2000.80.428.0 | 304850 FIX: SQL Server Text Formatting Functions Contain Unchecked Buffers | 2004-08-05 |
+| 8.00.384 | 2000.80.384.0 | SQL Server 2000 Service Pack 1 (SP1) | 2001-06-11 |
+| 8.00.296 | 2000.80.296.0 | 299717 FIX: Query Method Used to Access Data May Allow Rights that the Login Might Not Normally Have | 2004-08-09 |
+| 8.00.287 | 2000.80.287.0 | 297209 FIX: Deletes, Updates and Rank Based Selects May Cause Deadlock of MSSEARCH | 2005-10-07 |
+| 8.00.251 | 2000.80.251.0 | 300194 FIX: Error 644 Using Two Indexes on a Column with Uppercase Preference Sort Order | 2003-10-17 |
+| 8.00.250 | 2000.80.250.0 | 291683 The Knowledge Base (KB) Article You Requested Is Currently Not Available | ??? |
+| 8.00.249 | 2000.80.249.0 | 288122 FIX: Lock Monitor Uses Excessive CPU | 2003-09-12 |
+| 8.00.239 | 2000.80.239.0 | 285290 FIX: Complex ANSI Join Query with Distributed Queries May Cause Handled Access Violation | 2003-10-09 |
+| 8.00.233 | 2000.80.233.0 | 282416 FIX: Opening the Database Folder in SQL Server Enterprise Manager 2000 Takes a Long Time | 2003-10-09 |
+| 8.00.231 | 2000.80.231.0 | 282279 FIX: Execution of sp_OACreate on COM Object Without Type Information Causes Server Shut Down | 2003-10-09 |
+| 8.00.226 | 2000.80.226.0 | 278239 FIX: Extreme Memory Usage When Adding Many Security Roles | 2006-11-21 |
+| 8.00.225 | 2000.80.225.0 | 281663 "Access Denied" Error Message When You Try to Use a Network Drive to Modify Windows 2000 Permissions | 2006-10-30 |
+| 8.00.223 | 2000.80.223.0 | 280380 FIX: Buffer Overflow Exploit Possible with Extended Stored Procedures | 2004-06-29 |
+| 8.00.222 | 2000.80.222.0 | 281769 FIX: Exception Access Violation Encountered During Query Normalization | 2005-10-07 |
+| 8.00.218 | 2000.80.218.0 | 279183 FIX: Scripting Object with Several Extended Properties May Cause Exception | 2003-10-09 |
+| 8.00.217 | 2000.80.217.0 | 279293 FIX: CASE Using LIKE with Empty String Can Result in Access Violation or Abnormal Server Shutdown | 2003-10-09 |
+| 8.00.211 | 2000.80.211.0 | 276329 FIX: Complex Distinct or Group By Query Can Return Unexpected Results with Parallel Execution Plan | 2003-11-05 |
+| 8.00.210 | 2000.80.210.0 | 275900 FIX: Linked Server Query with Hyphen in LIKE Clause May Run Slowly | 2003-10-09 |
+| 8.00.205 | 2000.80.205.0 | 274330 FIX: Sending Open Files as Attachment in SQL Mail Fails with Error 18025 | 2005-10-07 |
+| 8.00.204 | 2000.80.204.0 | 274329 FIX: Optimizer Slow to Generate Query Plan for Complex Queries that have Many Joins and Semi-Joins | 2003-10-09 |
| 8.00.194 | 2000.80.194.0 | SQL Server 2000 RTM (no SP) | ??? |
| 8.00.190 | 2000.80.190.0 | SQL Server 2000 Gold | ??? |
| 8.00.100 | 2000.80.100.0 | SQL Server 2000 Beta 2 | ??? |
| 8.00.078 | 2000.80.078.0 | SQL Server 2000 EAP5 | ??? |
| 8.00.047 | 2000.80.047.0 | SQL Server 2000 EAP4 | ??? |
-[983811 MS12-060: Description of the security update for SQL Server 2000 Service Pack 4 QFE: August 14, 2012]:http://support.microsoft.com/kb/983811/
-[983809 MS12-027: Description of the security update for Microsoft SQL Server 2000 Service Pack 4 QFE: April 10, 2012]:http://support.microsoft.com/kb/983809/
-[971524 FIX: An access violation occurs when you run a DELETE statement or an UPDATE statement in the Itanium-based versions of SQL Server 2000 after you install security update MS09-004]:http://support.microsoft.com/kb/971524/
-[960083 MS09-004: Description of the security update for SQL Server 2000 QFE and for MSDE 2000: February 10, 2009]:http://support.microsoft.com/kb/960083/
-[959678 FIX: When you run the SPSBackup.exe utility to back up a SQL Server 2000 database that is configured as a back-end database for a Windows SharePoint Services server, the backup operation fails]:http://support.microsoft.com/kb/959678/
-[948111 MS08-040: Description of the security update for SQL Server 2000 QFE and MSDE 2000 July 8, 2008]:http://support.microsoft.com/kb/948111/
-[946584 FIX: The SPACE function always returns one space in SQL Server 2000 if the SPACE function uses a collation that differs from the collation of the current database]:http://support.microsoft.com/kb/946584/
-[944985 FIX: The data on the publisher does not match the data on the subscriber when you synchronize a SQL Server 2005 Mobile Edition subscriber with a SQL Server 2000 "merge replication" publisher]:http://support.microsoft.com/kb/944985/
-[939317 FIX: The CPU utilization may suddenly increase to 100 percent when there are many connections to an instance of SQL Server 2000 on a computer that has multiple processors]:http://support.microsoft.com/kb/939317/
-[936232 FIX: An access violation may occur when you try to log in to an instance of SQL Server 2000]:http://support.microsoft.com/kb/936232/
-[935950 FIX: The foreign key that you created between two tables does not work after you run the CREATE INDEX statement in SQL Server 2000]:http://support.microsoft.com/kb/935950/
-[935465 An updated version of Sqlvdi.dll is now available for SQL Server 2000]:http://support.microsoft.com/kb/935465/
-[933573 FIX: You may receive an assertion or database corruption may occur when you use the bcp utility or the "Bulk Insert" Transact-SQL command to import data in SQL Server 2000]:http://support.microsoft.com/kb/933573/
-[934203 FIX: A hotfix for Microsoft SQL Server 2000 Service Pack 4 may not update all the necessary files on an x64-based computer]:http://support.microsoft.com/kb/934203/
-[929131 FIX: In SQL Server 2000, the synchronization process is slow, and the CPU usage is high on the computer that is configured as the Distributor]:http://support.microsoft.com/kb/929131/
-[931932 FIX: The merge agent fails intermittently when you use merge replication that uses a custom resolver after you install SQL Server 2000 Service Pack 4]:http://support.microsoft.com/kb/931932/
-[930484 FIX: CPU utilization may approach 100 percent on a computer that is running SQL Server 2000 after you run the BACKUP DATABASE statement or the BACKUP LOG statement]:http://support.microsoft.com/kb/930484/
-[929440 FIX: Error messages when you try to update table rows or insert table rows into a table in SQL Server 2000: "644" or "2511"]:http://support.microsoft.com/kb/929440/
-[928568 FIX: SQL Server 2000 stops responding when you cancel a query or when a query time-out occurs, and error messages are logged in the SQL Server error log file]:http://support.microsoft.com/kb/928568/
-[928079 FIX: The Sqldumper.exe utility cannot generate a filtered SQL Server dump file when you use the Remote Desktop Connection service or Terminal Services to connect to a Windows 2000 Server-based computer in SQL Server 2000]:http://support.microsoft.com/kb/928079/
-[927186 FIX: Error message when you create a merge replication for tables that have computed columns in SQL Server 2000 Service Pack 4: "The process could not log conflict information"]:http://support.microsoft.com/kb/927186/
-[925684 FIX: You may experience one or more symptoms when you run a "CREATE INDEX" statement on an instance of SQL Server 2000]:http://support.microsoft.com/kb/925684/
-[925732 FIX: You may receive inconsistent comparison results when you compare strings by using a width sensitive collation in SQL Server 2000]:http://support.microsoft.com/kb/925732/
-[925419 FIX: The server stops responding, the performance is slow, and a time-out occurs in SQL Server 2000]:http://support.microsoft.com/kb/925419/
-[925678 FIX: Error message when you schedule a Replication Merge Agent job to run after you install SQL Server 2000 Service Pack 4: "The process could not enumerate changes at the 'Subscriber'"]:http://support.microsoft.com/kb/925678/
-[925297 FIX: The result may be sorted in the wrong order when you run a query that uses the ORDER BY clause to sort a column in a table in SQL Server 2000]:http://support.microsoft.com/kb/925297/
-[924664 FIX: You cannot stop the SQL Server service, or many minidump files and many log files are generated in SQL Server 2000]:http://support.microsoft.com/kb/924664/
-[923796 FIX: Data in a subscriber of a merge publication in SQL Server 2000 differs from the data in the publisher]:http://support.microsoft.com/kb/923796/
-[924662 FIX: The query performance may be slow when you query data from a view in SQL Server 2000]:http://support.microsoft.com/kb/924662/
-[923563 FIX: Error message when you configure an immediate updating transactional replication in SQL Server 2000: "Implicit conversion from datatype 'text' to 'nvarchar' is not allowed"]:http://support.microsoft.com/kb/923563/
-[923327 FIX: You may receive an access violation error message when you import data by using the "Bulk Insert" command in SQL Server 2000]:http://support.microsoft.com/kb/923327/
-[923797 The Knowledge Base (KB) Article You Requested Is Currently Not Available]:http://support.microsoft.com/kb/923797/
-[923344 FIX: A SQL Server 2000 session may be blocked for the whole time that a Snapshot Agent job runs]:http://support.microsoft.com/kb/923344/
-[920930 FIX: Error message when you try to run a query on a linked server in SQL Server 2000]:http://support.microsoft.com/kb/920930/
-[919221 FIX: SQL Server 2000 may take a long time to complete the synchronization phase when you create a merge publication]:http://support.microsoft.com/kb/919221/
-[919133 FIX: Each query takes a long time to compile when you execute a single query or when you execute multiple concurrent queries in SQL Server 2000]:http://support.microsoft.com/kb/919133/
-[919068 FIX: The query may return incorrect results, and the execution plan for the query may contain a "Table Spool" operator in SQL Server 2000]:http://support.microsoft.com/kb/919068/
-[919399 FIX: A profiler trace in SQL Server 2000 may stop logging events unexpectedly, and you may receive the following error message: "Failed to read trace data"]:http://support.microsoft.com/kb/919399/
-[919165 FIX: A memory leak occurs when you run a remote query by using a linked server in SQL Server 2000]:http://support.microsoft.com/kb/919165/
-[917565 FIX: Error 17883 is logged in the SQL Server error log, and the instance of SQL Server 2000 temporarily stops responding]:http://support.microsoft.com/kb/917565/
-[917972 FIX: You receive an access violation error message when you try to perform a read of a large binary large object column in SQL Server 2000]:http://support.microsoft.com/kb/917972/
-[917606 FIX: You may notice a decrease in performance when you run a query that uses the UNION ALL operator in SQL Server 2000 Service Pack 4]:http://support.microsoft.com/kb/917606/
-[916698 FIX: Error message when you run SQL Server 2000: "Failed assertion = 'lockFound == TRUE'"]:http://support.microsoft.com/kb/916698/
-[916950 FIX: You may experience heap corruption, and SQL Server 2000 may shut down with fatal access violations when you try to browse files in SQL Server 2000 Enterprise Manager on a Windows Server 2003 x64-based computer]:http://support.microsoft.com/kb/916950/
-[916652 FIX: An access violation may occur when you run a query on a table that has a multicolumn index in SQL Server 2000]:http://support.microsoft.com/kb/916652/
-[913438 FIX: The SQL Server process may end unexpectedly when you turn on trace flag -T1204 and a profiler trace is capturing the Lock:DeadLock Chain event in SQL Server 2000 SP4]:http://support.microsoft.com/kb/913438/
-[915340 FIX: A deadlock occurs when the scheduled SQL Server Agent job that you add or that you update is running in SQL Server 2000]:http://support.microsoft.com/kb/915340/
-[916287 A cumulative hotfix package is available for SQL Server 2000 Service Pack 4 build 2187]:http://support.microsoft.com/kb/916287/
-[914384 FIX: The database status changes to Suspect when you perform a bulk copy in a transaction and then roll back the transaction in SQL Server 2000]:http://support.microsoft.com/kb/914384/
-[915065 FIX: Error message when you try to apply a hotfix on a SQL Server 2000-based computer that is configured as a MSCS node: "An error in updating your system has occurred"]:http://support.microsoft.com/kb/915065/
-[913789 FIX: The password that you specify in a BACKUP statement appears in the SQL Server Errorlog file or in the Application event log if the BACKUP statement does not run in SQL Server 2000]:http://support.microsoft.com/kb/913789/
-[913684 FIX: You may receive error messages when you use linked servers in SQL Server 2000 on a 64-bit Itanium processor]:http://support.microsoft.com/kb/913684/
-[911678 FIX: No rows may be returned, and you may receive an error message when you try to import SQL Profiler trace files into tables by using the fn_trace_gettable function in SQL Server 2000]:http://support.microsoft.com/kb/911678/
-[910707 FIX: When you query a view that was created by using the VIEW_METADATA option, an access violation may occur in SQL Server 2000]:http://support.microsoft.com/kb/910707/
-[909369 FIX: Automatic checkpoints on some SQL Server 2000 databases do not run as expected]:http://support.microsoft.com/kb/909369/
-[907813 FIX: An error occurs when you try to access the Analysis Services performance monitor counter object after you apply Windows Server 2003 SP1]:http://support.microsoft.com/kb/907813/
-[909734 FIX: An error message is logged, and new diagnostics do not capture the thread stack when the SQL Server User Mode Scheduler (UMS) experiences a nonyielding thread in SQL Server 2000 Service Pack 4]:http://support.microsoft.com/kb/909734/
-[904660 A cumulative hotfix package is available for SQL Server 2000 Service Pack 4 build 2162]:http://support.microsoft.com/kb/904660/
-[907250 FIX: You may experience concurrency issues when you run the DBCC INDEXDEFRAG statement in SQL Server 2000]:http://support.microsoft.com/kb/907250/
-[906790 FIX: You receive an error message when you try to rebuild the master database after you have installed hotfix builds in SQL Server 2000 SP4 64-bit]:http://support.microsoft.com/kb/906790/
-[903742 FIX: You receive an "Error: 8526, Severity: 16, State: 2" error message in SQL Profiler when you use SQL Query Analyzer to start or to enlist into a distributed transaction after you have installed SQL Server 2000 SP4]:http://support.microsoft.com/kb/903742/
-[904244 FIX: Incorrect data is inserted unexpectedly when you perform a bulk copy operation by using the DB-Library API in SQL Server 2000 Service Pack 4]:http://support.microsoft.com/kb/904244/
-[899430 FIX: An access violation may occur when you run a SELECT query and the NO_BROWSETABLE option is set to ON in Microsoft SQL Server 2000]:http://support.microsoft.com/kb/899430/
-[899431 FIX: An access violation occurs in the Mssdi98.dll file, and SQL Server crashes when you use SQL Query Analyzer to debug a stored procedure in SQL Server 2000 Service Pack 4]:http://support.microsoft.com/kb/899431/
-[900390 FIX: The Mssdmn.exe process may use lots of CPU capacity when you perform a SQL Server 2000 full text search of Office Word documents]:http://support.microsoft.com/kb/900390/
-[900404 FIX: The results of the query may be returned much slower than you expect when you run a query that includes a GROUP BY statement in SQL Server 2000]:http://support.microsoft.com/kb/900404/
-[901212 FIX: You receive an error message if you use the sp_addalias or sp_dropalias procedures when the IMPLICIT_TRANSACTIONS option is set to ON in SQL Server 2000 SP4]:http://support.microsoft.com/kb/901212/
-[902150 FIX: Some 32-bit applications that use SQL-DMO and SQL-VDI APIs may stop working after you install SQL Server 2000 Service Pack 4 on an Itanium-based computer]:http://support.microsoft.com/kb/902150/
-[902955 FIX: You receive a "Getting registry information" message when you run the Sqldiag.exe utility after you install SQL Server 2000 SP4]:http://support.microsoft.com/kb/902955/
-[899410 FIX: You may experience slow server performance when you start a trace in an instance of SQL Server 2000 that runs on a computer that has more than four processors]:http://support.microsoft.com/kb/899410/
-[826906 FIX: A query that uses a view that contains a correlated subquery and an aggregate runs slowly]:http://support.microsoft.com/kb/826906/
-[836651 FIX: You receive query results that were not expected when you use both ANSI joins and non-ANSI joins]:http://support.microsoft.com/kb/836651/
-[Microsoft Security Bulletin MS12-060]:https://technet.microsoft.com/en-us/security/bulletin/MS12-060
-[983808 MS12-027: Description of the security update for Microsoft SQL Server 2000 Service Pack 4 GDR: April 10, 2012]:http://support.microsoft.com/kb/983808/
-[959420 MS09-004: Vulnerabilities in Microsoft SQL Server could allow remote code execution]:http://support.microsoft.com/kb/959420/
-[899761 FIX: Not all memory is available when AWE is enabled on a computer that is running a 32-bit version of SQL Server 2000 SP4]:http://support.microsoft.com/kb/899761/
-[SQL Server 2000 Service Pack 4 (SP4)]:http://www.microsoft.com/downloads/details.aspx?FamilyId=8E2DFC8D-C20E-4446-99A9-B7F0213F8BC5
-[899410 FIX: You may experience slow server performance when you start a trace in an instance of SQL Server 2000 that runs on a computer that has more than four processors]:http://support.microsoft.com/kb/899410/
-[983814 MS12-070: Description of the security update for SQL Server 2000 Reporting Services Service Pack 2]:http://support.microsoft.com/kb/983814
-[930484 FIX: CPU utilization may approach 100 percent on a computer that is running SQL Server 2000 after you run the BACKUP DATABASE statement or the BACKUP LOG statement]:http://support.microsoft.com/kb/930484/
-[929410 FIX: Error message when you run a full-text query in SQL Server 2000: "Error: 17883, Severity: 1, State: 0"]:http://support.microsoft.com/kb/929410/
-[917593 FIX: The "Audit Logout" event does not appear in the trace results file when you run a profiler trace against a linked server instance in SQL Server 2000]:http://support.microsoft.com/kb/917593/
-[915328 FIX: You may intermittently experience an access violation error when a query is executed in a parallel plan and the execution plan contains either a HASH JOIN operation or a Sort operation in SQL Server 2000]:http://support.microsoft.com/kb/915328/
-[902852 FIX: Error message when you run an UPDATE statement that uses two JOIN hints to update a table in SQL Server 2000: "Internal SQL Server error"]:http://support.microsoft.com/kb/902852/
-[900416 FIX: A 17883 error may occur you run a query that uses a hash join in SQL Server 2000]:http://support.microsoft.com/kb/900416/
-[899428 FIX: You receive incorrect results when you run a query that uses a cross join operator in SQL Server 2000 SP3]:http://support.microsoft.com/kb/899428/
-[899430 FIX: An access violation may occur when you run a SELECT query and the NO_BROWSETABLE option is set to ON in Microsoft SQL Server 2000]:http://support.microsoft.com/kb/899430/
-[898709 FIX: Error message when you use SQL Server 2000: "Time out occurred while waiting for buffer latch type 3"]:http://support.microsoft.com/kb/898709/
-[887700 FIX: Server Network Utility may display incorrect protocol properties in SQL Server 2000]:http://support.microsoft.com/kb/887700/
-[896985 FIX: The Subscriber may not be able to upload changes to the Publisher when you incrementally add an article to a publication in SQL Server 2000 SP3]:http://support.microsoft.com/kb/896985/
-[897572 FIX: You may receive a memory-related error message when you repeatedly create and destroy an out-of-process COM object within the same batch or stored procedure in SQL Server 2000]:http://support.microsoft.com/kb/897572/
-[896425 FIX: The BULK INSERT statement silently skips insert attempts when the data value is NULL and the column is defined as NOT NULL for INT, SMALLINT, and BIGINT data types in SQL Server 2000]:http://support.microsoft.com/kb/896425/
-[895123 FIX: You may receive error message 701, error message 802, and error message 17803 when many hashed buffers are available in SQL Server 2000]:http://support.microsoft.com/kb/895123/
-[895187 FIX: You receive an error message when you try to delete records by running a Delete Transact-SQL statement in SQL Server 2000]:http://support.microsoft.com/kb/895187/
-[891866 FIX: The query runs slower than you expected when you try to parse a query in SQL Server 2000]:http://support.microsoft.com/kb/891866/
-[894257 FIX: You receive an "Incorrect syntax near ')'" error message when you run a script that was generated by SQL-DMO for an Operator object in SQL Server 2000]:http://support.microsoft.com/kb/894257/
-[893312 FIX: You may receive a "SQL Server could not spawn process_loginread thread" error message, and a memory leak may occur when you cancel a remote query in SQL Server 2000]:http://support.microsoft.com/kb/893312/
-[892923 FIX: Differential database backups may not contain database changes in the Page Free Space (PFS) pages in SQL Server 2000]:http://support.microsoft.com/kb/892923/
-[892205 FIX: You may receive a 17883 error message when SQL Server 2000 performs a very large hash operation]:http://support.microsoft.com/kb/892205/
-[891585 FIX: Database recovery does not occur, or a user database is marked as suspect in SQL Server 2000]:http://support.microsoft.com/kb/891585/
-[891311 FIX: You cannot create new TCP/IP socket based connections after error messages 17882 and 10055 are written to the Microsoft SQL Server 2000 error log]:http://support.microsoft.com/kb/891311/
-[891017 FIX: SQL Server 2000 may stop responding to other requests when you perform a large deallocation operation]:http://support.microsoft.com/kb/891017/
-[891268 FIX: You receive a 17883 error message and SQL Server 2000 may stop responding to other requests when you perform large in-memory sort operations]:http://support.microsoft.com/kb/891268/
-[890942 FIX: Some complex queries are slower after you install SQL Server 2000 Service Pack 2 or SQL Server 2000 Service Pack 3]:http://support.microsoft.com/kb/890942/
-[890768 FIX: You experience non-convergence in a replication topology when you unpublish or drop columns from a dynamically filtered publication in SQL Server 2000]:http://support.microsoft.com/kb/890768/
-[890767 FIX: You receive a "Server: Msg 107, Level 16, State 3, Procedure TEMP_VIEW_Merge, Line 1" error message when the sum of the length of the published column names in a merge publication exceeds 4,000 characters in SQL Server 2000]:http://support.microsoft.com/kb/890767/
-[890925 FIX: The @@ERROR system function may return an incorrect value when you execute a Transact-SQL statement that uses a parallel execution plan in SQL Server 2000 32-bit or in SQL Server 2000 64-bit]:http://support.microsoft.com/kb/890925/
-[888444 FIX: You receive a 17883 error in SQL Server 2000 Service Pack 3 or in SQL Server 2000 Service Pack 3a when a worker thread becomes stuck in a registry call]:http://support.microsoft.com/kb/888444/
-[890742 FIX: Error message when you use a loopback linked server to run a distributed query in SQL Server 2000: "Could not perform the requested operation because the minimum query memory is not available"]:http://support.microsoft.com/kb/890742/
-[889314 FIX: Non-convergence may occur in a merge replication topology if the primary connection to the publisher is disconnected]:http://support.microsoft.com/kb/889314/
-[890200 FIX: SQL Server 2000 stops listening for new TCP/IP Socket connections unexpectedly after error message 17882 is written to the SQL Server 2000 error log]:http://support.microsoft.com/kb/890200/
-[889166 FIX: You receive a "Msg 3628" error message when you run an inner join query in SQL Server 2000]:http://support.microsoft.com/kb/889166/
-[889239 FIX: Start times in the SQL Profiler are different for the Audit:Login and Audit:Logout Events in SQL Server 2000]:http://support.microsoft.com/kb/889239/
-[887974 FIX: A fetch on a dynamic cursor can cause unexpected results in SQL Server 2000 Service Pack 3]:http://support.microsoft.com/kb/887974/
-[888007 You receive a "The product does not have a prerequisite update installed" error message when you try to install a SQL Server 2000 post-Service Pack 3 hotfix]:http://support.microsoft.com/kb/888007/
-[884554 FIX: A SPID stops responding with a NETWORKIO (0x800) waittype in SQL Server Enterprise Manager when SQL Server tries to process a fragmented TDS network packet]:http://support.microsoft.com/kb/884554/
-[885290 FIX: An assertion error occurs when you insert data in the same row in a table by using multiple connections to an instance of SQL Server]:http://support.microsoft.com/kb/885290/
-[872842 FIX: A CHECKDB statement reports a 2537 corruption error after SQL Server transfers data to a sql_variant column in SQL Server 2000]:http://support.microsoft.com/kb/872842/
-[878501 FIX: You may receive an error message when you run a SET IDENTITY_INSERT ON statement on a table and then try to insert a row into the table in SQL Server 2000]:http://support.microsoft.com/kb/878501/
-[883415 FIX: A user-defined function returns results that are not correct for a query]:http://support.microsoft.com/kb/883415/
-[873446 FIX: An access violation exception may occur when multiple users try to perform data modification operations at the same time that fire triggers that reference a deleted or an inserted table in SQL Server 2000 on a computer that is running SMP]:http://support.microsoft.com/kb/873446/
-[878500 FIX: An Audit Object Permission event is not produced when you run a TRUNCATE TABLE statement]:http://support.microsoft.com/kb/878500/
-[870994 FIX: An access violation exception may occur when you run a query that uses index names in the WITH INDEX option to specify an index hint]:http://support.microsoft.com/kb/870994/
-[867798 FIX: The @date_received parameter of the xp_readmail extended stored procedure incorrectly returns the date and the time that an e-mail message is submitted by the sender in SQL Server 2000]:http://support.microsoft.com/kb/867798/
-[843282 FIX: The Osql.exe utility does not run a Transact-SQL script completely if you start the program from a remote session by using a background service and then log off the console session]:http://support.microsoft.com/kb/843282/
-[867878 FIX: The Log Reader Agent may cause 17883 error messages]:http://support.microsoft.com/kb/867878/
-[867879 FIX: Merge replication non-convergence occurs with SQL Server CE subscribers]:http://support.microsoft.com/kb/867879/
-[867880 FIX: Merge Agent may fail with an "Invalid character value for cast specification" error message]:http://support.microsoft.com/kb/867880/
-[843266 FIX: Shared page locks can be held until end of the transaction and can cause blocking or performance problems in SQL Server 2000 Service Pack 3 (SP3)]:http://support.microsoft.com/kb/843266/
-[843263 FIX: You may receive an 8623 error message when you try to run a complex query on an instance of SQL Server]:http://support.microsoft.com/kb/843263/
-[839280 FIX: SQL debugging does not work in Visual Studio .NET after you install Windows XP Service Pack 2]:http://support.microsoft.com/kb/839280/
-[841776 FIX: Additional diagnostics have been added to SQL Server 2000 to detect unreported read operation failures]:http://support.microsoft.com/kb/841776/
-[841627 FIX: SQL Server 2000 may underestimate the cardinality of a query expression under certain circumstances]:http://support.microsoft.com/kb/841627/
-[841401 FIX: You may notice incorrect values for the "Active Transactions" counter when you perform multiple transactions on an instance of SQL Server 2000 that is running on an SMP computer]:http://support.microsoft.com/kb/841401/
-[841404 FIX: You may receive a "The query processor could not produce a query plan" error message in SQL Server when you run a query that includes multiple subqueries that use self-joins]:http://support.microsoft.com/kb/841404/
-[840856 FIX: The MSSQLServer service exits unexpectedly in SQL Server 2000 Service Pack 3]:http://support.microsoft.com/kb/840856/
-[839529 FIX: 8621 error conditions may cause SQL Server 2000 64-bit to close unexpectedly]:http://support.microsoft.com/kb/839529/
-[839589 FIX: The thread priority is raised for some threads in a parallel query]:http://support.microsoft.com/kb/839589/
-[839688 FIX: Profiler RPC events truncate parameters that have a text data type to 16 characters]:http://support.microsoft.com/kb/839688/
-[839523 FIX: An access violation exception may occur when you update a text column by using a stored procedure in SQL Server 2000]:http://support.microsoft.com/kb/839523/
-[838460 FIX: The xp_logininfo procedure may fail with error 8198 after you install Q825042 or any hotfix with SQL Server 8.00.0840 or later]:http://support.microsoft.com/kb/838460/
-[837970 FIX: You may receive an "Invalid object name..." error message when you run the DBCC CHECKCONSTRAINTS Transact-SQL statement on a table in SQL Server 2000]:http://support.microsoft.com/kb/837970/
-[837957 FIX: When you use Transact-SQL cursor variables to perform operations that have large iterations, memory leaks may occur in SQL Server 2000]:http://support.microsoft.com/kb/837957/
-[317989 FIX: Sqlakw32.dll May Corrupt SQL Statements]:http://support.microsoft.com/kb/317989/
-[837401 FIX: Rows are not successfully inserted into a table when you use the BULK INSERT command to insert rows]:http://support.microsoft.com/kb/837401/
-[836651 FIX: You receive query results that were not expected when you use both ANSI joins and non-ANSI joins]:http://support.microsoft.com/kb/836651/
-[837957 FIX: When you use Transact-SQL cursor variables to perform operations that have large iterations, memory leaks may occur in SQL Server 2000]:http://support.microsoft.com/kb/837957/
-[834798 FIX: SQL Server 2000 may not start if many users try to log in to SQL Server when SQL Server is trying to start]:http://support.microsoft.com/kb/834798/
-[834290 FIX: You receive a 644 error message when you run an UPDATE statement and the isolation level is set to READ UNCOMMITTED]:http://support.microsoft.com/kb/834290/
-[834453 FIX: The Snapshot Agent may fail after you make schema changes to the underlying tables of a publication]:http://support.microsoft.com/kb/834453/
-[833710 FIX: You receive an error message when you try to restore a database backup that spans multiple devices]:http://support.microsoft.com/kb/833710/
-[836141 FIX: An access violation exception may occur when SQL Server runs many parallel query processing operations on a multiprocessor computer]:http://support.microsoft.com/kb/836141/
-[832977 FIX: The DBCC PSS Command may cause access violations and 17805 errors in SQL Server 2000]:http://support.microsoft.com/kb/832977/
-[831950 FIX: You receive error message 3456 when you try to apply a transaction log to a server]:http://support.microsoft.com/kb/831950/
-[830912 FIX: Key Names Read from an .Ini File for a Dynamic Properties Task May Be Truncated]:http://support.microsoft.com/kb/830912/
-[831997 FIX: An invalid cursor state occurs after you apply Hotfix 8.00.0859 or later in SQL Server 2000]:http://support.microsoft.com/kb/831997/
-[831999 FIX: An AWE system uses more memory for sorting or for hashing than a non-AWE system in SQL Server 2000]:http://support.microsoft.com/kb/831999/
-[830887 FIX: Some queries that have a left outer join and an IS NULL filter run slower after you install SQL Server 2000 post-SP3 hotfix]:http://support.microsoft.com/kb/830887/
-[830767 FIX: SQL Query Analyzer may stop responding when you close a query window or open a file]:http://support.microsoft.com/kb/830767/
-[830860 FIX: The performance of a computer that is running SQL Server 2000 degrades when query execution plans against temporary tables remain in the procedure cache]:http://support.microsoft.com/kb/830860/
-[830262 FIX: Unconditional Update May Not Hold Key Locks on New Key Values]:http://support.microsoft.com/kb/830262/
-[830588 FIX: Access violation when you trace keyset-driven cursors by using SQL Profiler]:http://support.microsoft.com/kb/830588/
-[830366 FIX: An access violation occurs in SQL Server 2000 when a high volume of local shared memory connections occur after you install security update MS03-031]:http://support.microsoft.com/kb/830366/
-[830395 FIX: An access violation occurs during compilation if the table contains statistics for a computed column]:http://support.microsoft.com/kb/830395/
-[828945 FIX: You cannot insert explicit values in an IDENTITY column of a SQL Server table by using the SQLBulkOperations function or the SQLSetPos ODBC function in SQL Server 2000]:http://support.microsoft.com/kb/828945/
-[829205 FIX: Query performance may be slow and may be inconsistent when you run a query while another query that contains an IN operator with many values is compiled]:http://support.microsoft.com/kb/829205/
-[829444 FIX: A floating point exception occurs during the optimization of a query]:http://support.microsoft.com/kb/829444/
-[821334 FIX: Issues that are resolved in SQL Server 2000 build 8.00.0859]:http://support.microsoft.com/kb/821334/
-[828637 FIX: Users Can Control the Compensating Change Process in Merge Replication]:http://support.microsoft.com/kb/828637/
-[828017 The Knowledge Base (KB) Article You Requested Is Currently Not Available]:http://support.microsoft.com/kb/828017/
-[827714 FIX: A query may fail with retail assertion when you use the NOLOCK hint or the READ UNCOMMITTED isolation level]:http://support.microsoft.com/kb/827714/
-[828308 FIX: An Internet Explorer script error occurs when you access metadata information by using DTS in SQL Server Enterprise Manager]:http://support.microsoft.com/kb/828308/
-[828096 FIX: Key Locks Are Held Until the End of the Statement for Rows That Do Not Pass Filter Criteria]:http://support.microsoft.com/kb/828096/
-[828699 FIX: An Access Violation Occurs When You Run DBCC UPDATEUSAGE on a Database That Has Many Objects]:http://support.microsoft.com/kb/828699/
-[830466 FIX: You may receive an "Internal SQL Server error" error message when you run a Transact-SQL SELECT statement on a view that has many subqueries in SQL Server 2000]:http://support.microsoft.com/kb/830466/
-[827954 FIX: Slow Execution Times May Occur When You Run DML Statements Against Tables That Have Cascading Referential Integrity]:http://support.microsoft.com/kb/827954/
-[826754 FIX: A Deadlock Occurs If You Run an Explicit UPDATE STATISTICS Command]:http://support.microsoft.com/kb/826754/
-[826860 FIX: Linked Server Query May Return NULL If It Is Performed Through a Keyset Cursor]:http://support.microsoft.com/kb/826860/
-[826815 FIX: You receive an 8623 error message in SQL Server when you try to run a query that has multiple correlated subqueries]:http://support.microsoft.com/kb/826815/
-[826906 FIX: A query that uses a view that contains a correlated subquery and an aggregate runs slowly]:http://support.microsoft.com/kb/826906/
-[826822 FIX: A Member of the db_accessadmin Fixed Database Role Can Create an Alias for the dbo Special User]:http://support.microsoft.com/kb/826822/
-[826433 PRB: Additional SQL Server Diagnostics Added to Detect Unreported I/O Problems]:http://support.microsoft.com/kb/826433/
-[826364 FIX: A Query with a LIKE Comparison Results in a Non-Optimal Query Plan When You Use a Hungarian SQL Server Collation]:http://support.microsoft.com/kb/826364/
-[825854 FIX: No Exclusive Locks May Be Taken If the DisAllowsPageLocks Value Is Set to True]:http://support.microsoft.com/kb/825854/
-[826080 FIX: SQL Server 2000 protocol encryption applies to JDBC clients]:http://support.microsoft.com/kb/826080/
-[825043 FIX: Rows are unexpectedly deleted when you run a distributed query to delete or to update a linked server table]:http://support.microsoft.com/kb/825043/
-[825225 FIX: You receive an error message when you run a parallel query that uses an aggregation function or the GROUP BY clause]:http://support.microsoft.com/kb/825225/
-[319477 FIX: Extremely Large Number of User Tables on AWE System May Cause BPool::Map Errors]:http://support.microsoft.com/kb/319477/
-[319477 FIX: Extremely Large Number of User Tables on AWE System May Cause BPool::Map Errors]:http://support.microsoft.com/kb/319477/
-[823877 FIX: An Access Violation May Occur When You Run a Query That Contains 32,000 or More OR Clauses]:http://support.microsoft.com/kb/823877/
-[824027 FIX: A Cursor with a Large Object Parameter May Cause an Access Violation on CStmtCond::XretExecute]:http://support.microsoft.com/kb/824027/
-[820788 FIX: Delayed domain authentication may cause SQL Server to stop responding]:http://support.microsoft.com/kb/820788/
-[821741 FIX: Lock monitor exception in DeadlockMonitor::ResolveDeadlock]:http://support.microsoft.com/kb/821741/
-[821548 FIX: A Parallel Query May Generate an Access Violation After You Install SQL Server 2000 SP3]:http://support.microsoft.com/kb/821548/
-[821740 FIX: MS DTC Transaction Commit Operation Blocks Itself]:http://support.microsoft.com/kb/821740/
-[823514 FIX: Build 8.00.0837: A query that contains a correlated subquery runs slowly]:http://support.microsoft.com/kb/823514/
-[826161 FIX: You are prompted for password confirmation after you change a standard SQL Server login]:http://support.microsoft.com/kb/826161/
-[821277 MS03-031: Security patch for SQL Server 2000 Service Pack 3]:http://support.microsoft.com/kb/821277/
-[821337 FIX: Localized versions of SQL Mail and the Web Assistant Wizard may not work as expected in SQL Server 2000 64 bit]:http://support.microsoft.com/kb/821337/
-[818388 FIX: A Transact-SQL Statement That Is Embedded in the Database Name Runs with System Administrator Permissions]:http://support.microsoft.com/kb/818388/
-[826161 FIX: You are prompted for password confirmation after you change a standard SQL Server login]:http://support.microsoft.com/kb/826161/
-[821280 MS03-031: Security Patch for SQL Server 2000 64-bit]:http://support.microsoft.com/kb/821280/
-[818766 FIX: Intense SQL Server activity results in spinloop wait]:http://support.microsoft.com/kb/818766/
-[819662 FIX: Distribution Cleanup Agent Incorrectly Cleans Up Entries for Anonymous Subscribers]:http://support.microsoft.com/kb/819662/
-[819248 FIX: An access violation exception may occur when you insert a row in a table that is referenced by indexed views in SQL Server 2000]:http://support.microsoft.com/kb/819248/
-[819662 FIX: Distribution Cleanup Agent Incorrectly Cleans Up Entries for Anonymous Subscribers]:http://support.microsoft.com/kb/819662/
-[818897 FIX: Invalid TDS Sent to SQL Server Results in Access Violation]:http://support.microsoft.com/kb/818897/
-[818899 FIX: Error Message 3628 May Occur When You Run a Complex Query]:http://support.microsoft.com/kb/818899/
-[818729 FIX: Internal Query Processor Error 8623 When Microsoft SQL Server Tries to Compile a Plan for a Complex Query]:http://support.microsoft.com/kb/818729/
-[818540 FIX: SQL Server Enterprise Manager unexpectedly quits when you modify a DTS package]:http://support.microsoft.com/kb/818540/
-[818414 FIX: The Sqldumper.exe File Does Not Generate a Userdump File When It Runs Against a Windows Service]:http://support.microsoft.com/kb/818414/
-[818097 FIX: An Access Violation May Occur When You Run DBCC DBREINDEX on a Table That Has Hypothetical Indexes]:http://support.microsoft.com/kb/818097/
-[818188 FIX: Query on the sysmembers Virtual Table May Fail with a Stack Overflow]:http://support.microsoft.com/kb/818188/
-[817464 FIX: Using Sp_executesql in Merge Agent Operations]:http://support.microsoft.com/kb/817464/
-[817464 FIX: Using Sp_executesql in Merge Agent Operations]:http://support.microsoft.com/kb/817464/
-[813524 FIX: OLE DB conversion errors may occur after you select a literal string that represents datetime data as a column]:http://support.microsoft.com/kb/813524/
-[816440 FIX: Error 8623 is Raised When SQL Server Compiles a Complex Query]:http://support.microsoft.com/kb/816440/
-[817709 FIX: SQL Server 2000 might produce an incorrect cardinality estimate for outer joins]:http://support.microsoft.com/kb/817709/
-[815249 FIX: Performance of a query that is run from a client program on a SQL Server SP3 database is slow after you restart the instance of SQL Server]:http://support.microsoft.com/kb/815249/
-[817081 FIX: You receive an error message when you use the SQL-DMO BulkCopy object to import data into a SQL Server table]:http://support.microsoft.com/kb/817081/
-[816840 FIX: Error 17883 May Display Message Text That Is Not Correct]:http://support.microsoft.com/kb/816840/
-[816985 FIX: You cannot install SQL Server 2000 SP3 on the Korean version of SQL Server 2000]:http://support.microsoft.com/kb/816985/
-[815057 FIX: SQL Server 2000 Uninstall Option Does Not Remove All Files]:http://support.microsoft.com/kb/815057/
-[816039 FIX: Code Point Comparison Semantics for SQL_Latin1_General_Cp850_BIN Collation]:http://support.microsoft.com/kb/816039/
-[816084 FIX: sysindexes.statblob Column May Be Corrupted After You Run a DBCC DBREINDEX Statement]:http://support.microsoft.com/kb/816084/
-[810185 SQL Server 2000 hotfix update for SQL Server 2000 Service Pack 3 and 3a]:http://support.microsoft.com/kb/810185/
-[814035 FIX: A Full-Text Population Fails After You Apply SQL Server 2000 Service Pack 3]:http://support.microsoft.com/kb/814035/
-[815115 FIX: A DTS package that uses global variables ignores an error message raised by RAISERROR]:http://support.microsoft.com/kb/815115/
-[814889 FIX: A DELETE statement with a JOIN might fail and you receive a 625 error]:http://support.microsoft.com/kb/814889/
-[814893 FIX: Error Message: "Insufficient key column information for updating" Occurs in SQL Server 2000 SP3]:http://support.microsoft.com/kb/814893/
-[810163 FIX: An Access Violation Occurs if an sp_cursoropen Call References a Parameter That Is Not Defined]:http://support.microsoft.com/kb/810163/
-[810688 FIX: Merge Agent Can Resend Changes for Filtered Publications]:http://support.microsoft.com/kb/810688/
-[811611 FIX: Reinitialized SQL Server CE 2.0 subscribers may experience data loss and non-convergence]:http://support.microsoft.com/kb/811611/
-[813769 FIX: You May Experience Slow Performance When You Debug a SQL Server Service]:http://support.microsoft.com/kb/813769/
-[814113 FIX: DTS Designer may generate an access violation after you install SQL Server 2000 Service Pack 3]:http://support.microsoft.com/kb/814113/
-[814032 FIX: Merge publications cannot synchronize on SQL Server 2000 Service Pack 3]:http://support.microsoft.com/kb/814032/
-[SQL Server 2000 Service Pack 3 (SP3 / SP3a)]:http://www.microsoft.com/downloads/details.aspx?familyid=90DCD52C-0488-4E46-AFBF-ACACE5369FA3
-[818406 FIX: A Transact-SQL query that uses views may fail unexpectedly in SQL Server 2000 SP2]:http://support.microsoft.com/kb/818406/
-[818763 FIX: Intense SQL Server Activity Results in Spinloop Wait in SQL Server 2000 Service Pack 2]:http://support.microsoft.com/kb/818763/
-[818096 FIX: Many Extent Lock Time-outs May Occur During Extent Allocation]:http://support.microsoft.com/kb/818096/
-[816937 FIX: A memory leak may occur when you use the sp_OAMethod stored procedure to call a method of a COM object]:http://support.microsoft.com/kb/816937/
-[814889 FIX: A DELETE statement with a JOIN might fail and you receive a 625 error]:http://support.microsoft.com/kb/814889/
-[813759 FIX: A Large Number of NULL Values in Join Columns Result in Slow Query Performance]:http://support.microsoft.com/kb/813759/
-[813769 FIX: You May Experience Slow Performance When You Debug a SQL Server Service]:http://support.microsoft.com/kb/813769/
-[814460 FIX: Merge Replication with Alternate Synchronization Partners May Not Succeed After You Change the Retention Period]:http://support.microsoft.com/kb/814460/
-[812995 FIX: A Query with an Aggregate Function May Fail with a 3628 Error]:http://support.microsoft.com/kb/812995/
-[813494 FIX: Distribution Agent Fails with "Violation of Primary Key Constraint" Error Message]:http://support.microsoft.com/kb/813494/
-[812798 FIX: A UNION ALL View May Not Use Index If Partitions Are Removed at Compile Time]:http://support.microsoft.com/kb/812798/
-[812250 FIX: Indexed View May Cause a Handled Access Violation in CIndex::SetLevel1Names]:http://support.microsoft.com/kb/812250/
-[812393 FIX: Update or Delete Statement Fails with Error 1203 During Row Lock Escalation]:http://support.microsoft.com/kb/812393/
-[811703 FIX: Unexpected results from partial aggregations based on conversions]:http://support.microsoft.com/kb/811703/
-[810688 FIX: Merge Agent Can Resend Changes for Filtered Publications]:http://support.microsoft.com/kb/810688/
-[811611 FIX: Reinitialized SQL Server CE 2.0 subscribers may experience data loss and non-convergence]:http://support.microsoft.com/kb/811611/
-[811478 FIX: Restoring a SQL Server 7.0 database backup in SQL Server 2000 Service Pack 2 (SP2) may cause an assertion error in the Xdes.cpp file]:http://support.microsoft.com/kb/811478/
-[811205 FIX: An error message occurs when you perform a database or a file SHRINK operation]:http://support.microsoft.com/kb/811205/
-[811052 FIX: Latch Time-Out Message 845 Occurs When You Perform a Database or File SHRINK Operation]:http://support.microsoft.com/kb/811052/
-[810920 FIX: The JOIN queries in the triggers that involve the inserted table or the deleted table may return results that are not consistent]:http://support.microsoft.com/kb/810920/
-[810526 FIX: Cursors That Have a Long Lifetime May Cause Memory Fragmentation]:http://support.microsoft.com/kb/810526/
-[328551 FIX: Concurrency enhancements for the tempdb database]:http://support.microsoft.com/kb/328551/
-[810026 FIX: A DELETE Statement with a Self-Join May Fail and You Receive a 625 Error]:http://support.microsoft.com/kb/810026/
-[810163 FIX: An Access Violation Occurs if an sp_cursoropen Call References a Parameter That Is Not Defined]:http://support.microsoft.com/kb/810163/
-[810072 FIX: Merge Replication Reconciler Stack Overflow]:http://support.microsoft.com/kb/810072/
-[810052 FIX: A Memory Leak Occurs When Cursors Are Opened During a Connection]:http://support.microsoft.com/kb/810052/
-[810010 FIX: The fn_get_sql System Table Function May Cause Various Handled Access Violations]:http://support.microsoft.com/kb/810010/
-[331885 FIX: Update/Delete Statement Fails with Error 1203 During Page Lock Escalation]:http://support.microsoft.com/kb/331885/
-[331965 FIX: The xp_readmail Extended Stored Procedure Overwrites Attachment That Already Exists]:http://support.microsoft.com/kb/331965/
-[331968 FIX: The xp_readmail and xp_findnextmsg Extended Stored Procedures Do Not Read Mail in Time Received Order]:http://support.microsoft.com/kb/331968/
-[330212 FIX: Parallel logical operation returns results that are not consistent]:http://support.microsoft.com/kb/330212/
-[311104 FIX: The SELECT Statement with Parallelism Enabled May Cause an Assertion]:http://support.microsoft.com/kb/311104/
-[329499 FIX: Replication Removed from Database After Restore WITH RECOVERY]:http://support.microsoft.com/kb/329499/
-[329487 FIX: Transaction Log Restore Fails with Message 3456]:http://support.microsoft.com/kb/329487/
-[316333 SQL Server 2000 Security Update for Service Pack 2]:http://support.microsoft.com/kb/316333/
-[319851 FIX: Assertion and Error Message 3314 Occurs If You Try to Roll Back a Text Operation with READ UNCOMMITTED]:http://support.microsoft.com/kb/319851/
-[316333 SQL Server 2000 Security Update for Service Pack 2]:http://support.microsoft.com/kb/316333/
-[328354 FIX: A RESTORE DATABASE WITH RECOVERY Statement Can Fail with Error 9003 or Error 9004]:http://support.microsoft.com/kb/328354/
-[326999 FIX: Lock escalation on a scan while an update query is running causes a 1203 error message to occur]:http://support.microsoft.com/kb/326999/
-[810010 FIX: The fn_get_sql System Table Function May Cause Various Handled Access Violations]:http://support.microsoft.com/kb/810010/
-[322853 FIX: SQL Server Grants Unnecessary Permissions or an Encryption Function Contains Unchecked Buffers]:http://support.microsoft.com/kb/322853/
-[324186 FIX: Slow Compile Time and Execution Time with Query That Contains Aggregates and Subqueries]:http://support.microsoft.com/kb/324186/
-[Microsoft Security Bulletin MS02-039]:http://technet.microsoft.com/en-us/security/bulletin/ms02-039
-[319507 FIX: SQL Extended Procedure Functions Contain Unchecked Buffers]:http://support.microsoft.com/kb/319507/
-[319869 FIX: Improved SQL Manager Robustness for Odd Length Buffer]:http://support.microsoft.com/kb/319869/
-[319477 FIX: Extremely Large Number of User Tables on AWE System May Cause BPool::Map Errors]:http://support.microsoft.com/kb/319477/
-[318530 FIX: Reorder outer joins with filter criteria before non-selective joins and outer joins]:http://support.microsoft.com/kb/318530/
-[317979 FIX: Unchecked Buffer May Occur When You Connect to Remote Data Source]:http://support.microsoft.com/kb/317979/
-[318045 FIX: SELECT with Timestamp Column That Uses FOR XML AUTO May Fail with Stack Overflow or AV]:http://support.microsoft.com/kb/318045/
-[317748 FIX: Handle Leak Occurs in SQL Server When Service or Application Repeatedly Connects and Disconnects with Shared Memory Network Library]:http://support.microsoft.com/kb/317748
-[314003 FIX: Query That Uses DESC Index May Result in Access Violation]:http://support.microsoft.com/kb/314003/
-[315395 FIX: COM May Not Be Uninitialized for Worker Thread When You Use sp_OA]:http://support.microsoft.com/kb/315395/
-[313002 The Knowledge Base (KB) Article You Requested Is Currently Not Available]:http://support.microsoft.com/kb/313002/
-[313005 FIX: SELECT from Computed Column That References UDF Causes SQL Server to Terminate]:http://support.microsoft.com/kb/313005/
-[SQL Server 2000 Service Pack 2 (SP2)]:http://www.microsoft.com/downloads/details.aspx?FamilyID=75672496-af8e-40dc-853e-ad2c9fe96882
-[315395 FIX: COM May Not Be Uninitialized for Worker Thread When You Use sp_OA]:http://support.microsoft.com/kb/315395/
-[314003 FIX: Query That Uses DESC Index May Result in Access Violation]:http://support.microsoft.com/kb/314003/
-[313302 FIX: Shared Table Lock Is Not Released After Lock Escalation]:http://support.microsoft.com/kb/313302/
-[313005 FIX: SELECT from Computed Column That References UDF Causes SQL Server to Terminate]:http://support.microsoft.com/kb/313005/
-[308547 FIX: SELECT DISTINCT from Table with LEFT JOIN of View Causes Error Messages or Client Application May Stop Responding]:http://support.microsoft.com/kb/308547/
-[307540 FIX: SQLPutData May Result in Leak of Buffer Pool Memory]:http://support.microsoft.com/kb/307540/
-[307655 FIX: Querying Syslockinfo with Large Numbers of Locks May Cause Server to Stop Responding]:http://support.microsoft.com/kb/307655/
-[307538 FIX: SQLTrace Start and Stop is Now Reported in Windows NT Event Log for SQL Server 2000]:http://support.microsoft.com/kb/307538/
-[304850 FIX: SQL Server Text Formatting Functions Contain Unchecked Buffers]:http://support.microsoft.com/kb/304850/
-[SQL Server 2000 Service Pack 1 (SP1)]:http://www.microsoft.com/downloads/details.aspx?FamilyID=DFF43C50-51DF-4FE0-9717-DE41FB48556E
-[299717 FIX: Query Method Used to Access Data May Allow Rights that the Login Might Not Normally Have]:http://support.microsoft.com/kb/299717/
-[297209 FIX: Deletes, Updates and Rank Based Selects May Cause Deadlock of MSSEARCH]:http://support.microsoft.com/kb/297209/
-[300194 FIX: Error 644 Using Two Indexes on a Column with Uppercase Preference Sort Order]:http://support.microsoft.com/kb/300194/
-[291683 The Knowledge Base (KB) Article You Requested Is Currently Not Available]:http://support.microsoft.com/kb/291683/
-[288122 FIX: Lock Monitor Uses Excessive CPU]:http://support.microsoft.com/kb/288122/
-[285290 FIX: Complex ANSI Join Query with Distributed Queries May Cause Handled Access Violation]:http://support.microsoft.com/kb/285290/
-[282416 FIX: Opening the Database Folder in SQL Server Enterprise Manager 2000 Takes a Long Time]:http://support.microsoft.com/kb/282416/
-[282279 FIX: Execution of sp_OACreate on COM Object Without Type Information Causes Server Shut Down]:http://support.microsoft.com/kb/282279/
-[278239 FIX: Extreme Memory Usage When Adding Many Security Roles]:http://support.microsoft.com/kb/278239/
-[281663 "Access Denied" Error Message When You Try to Use a Network Drive to Modify Windows 2000 Permissions]:http://support.microsoft.com/kb/281663/
-[280380 FIX: Buffer Overflow Exploit Possible with Extended Stored Procedures]:http://support.microsoft.com/kb/280380/
-[281769 FIX: Exception Access Violation Encountered During Query Normalization]:http://support.microsoft.com/kb/281769/
-[279183 FIX: Scripting Object with Several Extended Properties May Cause Exception]:http://support.microsoft.com/kb/279183/
-[279293 FIX: CASE Using LIKE with Empty String Can Result in Access Violation or Abnormal Server Shutdown]:http://support.microsoft.com/kb/279293/
-[276329 FIX: Complex Distinct or Group By Query Can Return Unexpected Results with Parallel Execution Plan]:http://support.microsoft.com/kb/276329/
-[275900 FIX: Linked Server Query with Hyphen in LIKE Clause May Run Slowly]:http://support.microsoft.com/kb/275900/
-[274330 FIX: Sending Open Files as Attachment in SQL Mail Fails with Error 18025]:http://support.microsoft.com/kb/274330/
-[274329 FIX: Optimizer Slow to Generate Query Plan for Complex Queries that have Many Joins and Semi-Joins]:http://support.microsoft.com/kb/274329/
-
-
-## Microsoft SQL Server 7.0 Builds
-
-| Build | KB / Description | Release Date |
-|-----------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------|
-| 7.00.1152 | [948113 MS08-040: Description of the security update for SQL Server 7.0: July 8, 2008] | 2008-07-08 |
-| 7.00.1149 | [867763 FIX: An access violation exception may occur when you run a SELECT statement that contains complex JOIN operations in SQL Server 7.0] | 2006-06-01 |
-| 7.00.1143 | [830233 New Connection Events Are Not Recorded in SQL Server Traces] | 2005-10-25 |
-| 7.00.1143 | [829015 FIX: An attention signal that is sent from a SQL Server client application because of a query time-out may cause the SQL Server service to quit unexpectedly] | 2005-10-25 |
-| 7.00.1097 | [822756 A Complex UPDATE Statement That Uses an Index Spool Operation May Cause an Assertion] | 2005-10-25 |
-| 7.00.1094 | [821279 MS03-031: Security patch for SQL Server 7.0 Service Pack 4] | 2006-05-11 |
-| 7.00.1094 | [815495 MS03-031: Cumulative security patch for SQL Server] | 2006-05-10 |
-| 7.00.1092 | [820788 FIX: Delayed domain authentication may cause SQL Server to stop responding] | 2005-10-25 |
-| 7.00.1087 | [814693 FIX: SQL Server 7.0 Scheduler May Periodically Stop Responding During Large Sort Operation] | 2005-09-27 |
-| 7.00.1079 | [329499 FIX: Replication Removed from Database After Restore WITH RECOVERY] | 2005-10-11 |
-| 7.00.1078 | [327068 INF: SQL Server 7.0 Security Update for Service Pack 4] | 2005-09-27 |
-| 7.00.1077 | [316333 SQL Server 2000 Security Update for Service Pack 2] | 2006-11-24 |
-| 7.00.1063 | [SQL Server 7.0 Service Pack 4 (SP4)] | 2002-04-26 |
-| 7.00.1033 | [324469 FIX: Error message 9004 may occur when you restore a log that does not contain any transactions] | 2005-10-12 |
-| 7.00.1026 | [319851 FIX: Assertion and Error Message 3314 Occurs If You Try to Roll Back a Text Operation with READ UNCOMMITTED] | 2005-10-18 |
-| 7.00.1004 | [304851 FIX: SQL Server Text Formatting Functions Contain Unchecked Buffers] | 2004-08-05 |
-| 7.00.996 | [299717 FIX: Query Method Used to Access Data May Allow Rights that the Login Might Not Normally Have] | 2004-08-09 |
-| 7.00.978 | [285870 FIX: Update With Self Join May Update Incorrect Number Of Rows] | 2003-10-28 |
-| 7.00.977 | [284351 FIX: SQL Server Profiler and SQL Server Agent Alerts May Fail to Work After Installing SQL Server 7.0 SP3] | 2002-04-25 |
-| 7.00.970 | [283837 FIX: SQL Server May Generate Nested Query For Linked Server When Option Is Disabled] | 2002-10-15 |
-| 7.00.970 | [282243 FIX: Incorrect Results with Join of Column Converted to Binary] | 2003-10-29 |
-| 7.00.961 | [SQL Server 7.0 Service Pack 3 (SP3)] | 2000-12-15 |
-| 7.00.921 | [283837 FIX: SQL Server May Generate Nested Query For Linked Server When Option Is Disabled] | 2002-10-15 |
-| 7.00.919 | [282243 FIX: Incorrect Results with Join of Column Converted to Binary] | 2003-10-29 |
-| 7.00.918 | [280380 FIX: Buffer Overflow Exploit Possible with Extended Stored Procedures] | 2004-06-29 |
-| 7.00.917 | [279180 FIX: Bcp.exe with Long Query String Can Result in Assertion Failure] | 2005-09-26 |
-| 7.00.910 | [275901 FIX: SQL RPC That Raises Error Will Mask @@ERROR with Msg 7221] | 2003-10-31 |
-| 7.00.905 | [274266 FIX: Data Modification Query with a Distinct Subquery on a View May Cause Error 3624] | 2004-07-15 |
-| 7.00.889 | [243741 FIX: Replication Initialize Method Causes Handle Leak on Failure] | 2005-10-05 |
-| 7.00.879 | [281185 FIX: Linked Index Server Query Through OLE DB Provider with OR Clause Reports Error 7349] | 2006-03-14 |
-| 7.00.857 | [260346 FIX: Transactional Publications with a Filter on Numeric Columns Fail to Replicate Data] | 2006-03-14 |
-| 7.00.843 | [266766 FIX: Temporary Stored Procedures in SA Owned Databases May Bypass Permission Checks When You Run Stored Procedures] | 2006-03-14 |
-| 7.00.842 | [SQL Server 7.0 Service Pack 2 (SP2)] | 2000-03-20 |
-| 7.00.839 | SQL Server 7.0 Service Pack 2 (SP2) Unidentified | |
-| 7.00.835 | SQL Server 7.0 Service Pack 2 (SP2) Beta | |
-| 7.00.776 | [258087 FIX: Non-Admin User That Executes Batch While Server Shuts Down May Encounter Retail Assertion] | 2006-03-14 |
-| 7.00.770 | [252905 FIX: Slow Compile Time on Complex Joins with Unfiltered Table] | 2006-03-14 |
-| 7.00.745 | [253738 FIX: SQL Server Components that Access the Registry in a Cluster Environment May Cause a Memory Leak] | 2005-10-07 |
-| 7.00.722 | [239458 FIX: Replication: Problems Mapping Characters to DB2 OLEDB Subscribers] | 2005-10-05 |
-| 7.00.699 | [SQL Server 7.0 Service Pack 1 (SP1)] | 1999-07-01 |
-| 7.00.689 | SQL Server 7.0 Service Pack 1 (SP1) Beta | |
-| 7.00.677 | SQL Server 7.0 MSDE from Office 2000 disc | |
-| 7.00.662 | [232707 FIX: Query with Complex View Hierarchy May Be Slow to Compile] | 2005-10-05 |
-| 7.00.658 | [244763 FIX: Access Violation Under High Cursor Stress] | 2006-03-14 |
-| 7.00.657 | [229875 FIX: Unable to Perform Automated Installation of SQL 7.0 Using File Images] | 2005-10-05 |
-| 7.00.643 | [220156 FIX: SQL Cluster Install Fails When SVS Name Contains Special Characters] | 2005-10-05 |
-| 7.00.623 | SQL Server 7.0 RTM (Gold, no SP) | 1998-11-27 |
-| 7.00.583 | SQL Server 7.0 RC1 | |
-| 7.00.517 | SQL Server 7.0 Beta 3 | |
-
-[948113 MS08-040: Description of the security update for SQL Server 7.0: July 8, 2008]:http://support.microsoft.com/kb/948113/
-[867763 FIX: An access violation exception may occur when you run a SELECT statement that contains complex JOIN operations in SQL Server 7.0]:http://support.microsoft.com/kb/867763/
-[830233 New Connection Events Are Not Recorded in SQL Server Traces]:http://support.microsoft.com/kb/830233/
-[829015 FIX: An attention signal that is sent from a SQL Server client application because of a query time-out may cause the SQL Server service to quit unexpectedly]:http://support.microsoft.com/kb/829015/
-[822756 A Complex UPDATE Statement That Uses an Index Spool Operation May Cause an Assertion]:http://support.microsoft.com/kb/822756/
-[821279 MS03-031: Security patch for SQL Server 7.0 Service Pack 4]:http://support.microsoft.com/kb/821279/
-[815495 MS03-031: Cumulative security patch for SQL Server]:http://support.microsoft.com/kb/815495/
-[820788 FIX: Delayed domain authentication may cause SQL Server to stop responding]:http://support.microsoft.com/kb/820788/
-[814693 FIX: SQL Server 7.0 Scheduler May Periodically Stop Responding During Large Sort Operation]:http://support.microsoft.com/kb/814693/
-[329499 FIX: Replication Removed from Database After Restore WITH RECOVERY]:http://support.microsoft.com/kb/329499/
-[327068 INF: SQL Server 7.0 Security Update for Service Pack 4]:http://support.microsoft.com/kb/327068/
-[316333 SQL Server 2000 Security Update for Service Pack 2]:http://support.microsoft.com/kb/316333/
+[983811 MS12-060: Description of the security update for SQL Server 2000 Service Pack 4 QFE: August 14, 2012]:https://support.microsoft.com/help/983811/
+[983809 MS12-027: Description of the security update for Microsoft SQL Server 2000 Service Pack 4 QFE: April 10, 2012]:https://support.microsoft.com/help/983809/
+[960083 MS09-004: Description of the security update for SQL Server 2000 QFE and for MSDE 2000: February 10, 2009]:https://support.microsoft.com/help/960083/
+
+
+## Microsoft SQL Server 7.0 Builds
+
+
+| Build | KB / Description | Release Date |
+|-----------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------|
+| 7.00.1152 | [948113 MS08-040: Description of the security update for SQL Server 7.0: July 8, 2008] | 2008-07-08 |
+| 7.00.1149 | 867763 FIX: An access violation exception may occur when you run a SELECT statement that contains complex JOIN operations in SQL Server 7.0 | 2006-06-01 |
+| 7.00.1143 | 830233 New Connection Events Are Not Recorded in SQL Server Traces | 2005-10-25 |
+| 7.00.1143 | 829015 FIX: An attention signal that is sent from a SQL Server client application because of a query time-out may cause the SQL Server service to quit unexpectedly | 2005-10-25 |
+| 7.00.1097 | 822756 A Complex UPDATE Statement That Uses an Index Spool Operation May Cause an Assertion | 2005-10-25 |
+| 7.00.1094 | 821279 MS03-031: Security patch for SQL Server 7.0 Service Pack 4 | 2006-05-11 |
+| 7.00.1094 | 815495 MS03-031: Cumulative security patch for SQL Server | 2006-05-10 |
+| 7.00.1092 | 820788 FIX: Delayed domain authentication may cause SQL Server to stop responding | 2005-10-25 |
+| 7.00.1087 | 814693 FIX: SQL Server 7.0 Scheduler May Periodically Stop Responding During Large Sort Operation | 2005-09-27 |
+| 7.00.1079 | 329499 FIX: Replication Removed from Database After Restore WITH RECOVERY | 2005-10-11 |
+| 7.00.1078 | 327068 INF: SQL Server 7.0 Security Update for Service Pack 4 | 2005-09-27 |
+| 7.00.1077 | 316333 SQL Server 2000 Security Update for Service Pack 2 | 2006-11-24 |
+| 7.00.1063 | [SQL Server 7.0 Service Pack 4 (SP4)] | 2002-04-26 |
+| 7.00.1033 | 324469 FIX: Error message 9004 may occur when you restore a log that does not contain any transactions | 2005-10-12 |
+| 7.00.1026 | 319851 FIX: Assertion and Error Message 3314 Occurs If You Try to Roll Back a Text Operation with READ UNCOMMITTED | 2005-10-18 |
+| 7.00.1004 | 304851 FIX: SQL Server Text Formatting Functions Contain Unchecked Buffers | 2004-08-05 |
+| 7.00.996 | 299717 FIX: Query Method Used to Access Data May Allow Rights that the Login Might Not Normally Have | 2004-08-09 |
+| 7.00.978 | 285870 FIX: Update With Self Join May Update Incorrect Number Of Rows | 2003-10-28 |
+| 7.00.977 | 284351 FIX: SQL Server Profiler and SQL Server Agent Alerts May Fail to Work After Installing SQL Server 7.0 SP3 | 2002-04-25 |
+| 7.00.970 | 283837 FIX: SQL Server May Generate Nested Query For Linked Server When Option Is Disabled | 2002-10-15 |
+| 7.00.970 | 282243 FIX: Incorrect Results with Join of Column Converted to Binary | 2003-10-29 |
+| 7.00.961 | SQL Server 7.0 Service Pack 3 (SP3) | 2000-12-15 |
+| 7.00.921 | 283837 FIX: SQL Server May Generate Nested Query For Linked Server When Option Is Disabled | 2002-10-15 |
+| 7.00.919 | 282243 FIX: Incorrect Results with Join of Column Converted to Binary | 2003-10-29 |
+| 7.00.918 | 280380 FIX: Buffer Overflow Exploit Possible with Extended Stored Procedures | 2004-06-29 |
+| 7.00.917 | 279180 FIX: Bcp.exe with Long Query String Can Result in Assertion Failure | 2005-09-26 |
+| 7.00.910 | 275901 FIX: SQL RPC That Raises Error Will Mask @@ERROR with Msg 7221 | 2003-10-31 |
+| 7.00.905 | 274266 FIX: Data Modification Query with a Distinct Subquery on a View May Cause Error 3624 | 2004-07-15 |
+| 7.00.889 | 243741 FIX: Replication Initialize Method Causes Handle Leak on Failure | 2005-10-05 |
+| 7.00.879 | 281185 FIX: Linked Index Server Query Through OLE DB Provider with OR Clause Reports Error 7349 | 2006-03-14 |
+| 7.00.857 | 260346 FIX: Transactional Publications with a Filter on Numeric Columns Fail to Replicate Data | 2006-03-14 |
+| 7.00.843 | 266766 FIX: Temporary Stored Procedures in SA Owned Databases May Bypass Permission Checks When You Run Stored Procedures | 2006-03-14 |
+| 7.00.842 | SQL Server 7.0 Service Pack 2 (SP2) | 2000-03-20 |
+| 7.00.839 | SQL Server 7.0 Service Pack 2 (SP2) Unidentified | |
+| 7.00.835 | SQL Server 7.0 Service Pack 2 (SP2) Beta | |
+| 7.00.776 | 258087 FIX: Non-Admin User That Executes Batch While Server Shuts Down May Encounter Retail Assertion | 2006-03-14 |
+| 7.00.770 | 252905 FIX: Slow Compile Time on Complex Joins with Unfiltered Table | 2006-03-14 |
+| 7.00.745 | 253738 FIX: SQL Server Components that Access the Registry in a Cluster Environment May Cause a Memory Leak | 2005-10-07 |
+| 7.00.722 | 239458 FIX: Replication: Problems Mapping Characters to DB2 OLEDB Subscribers | 2005-10-05 |
+| 7.00.699 | SQL Server 7.0 Service Pack 1 (SP1) | 1999-07-01 |
+| 7.00.689 | SQL Server 7.0 Service Pack 1 (SP1) Beta | |
+| 7.00.677 | SQL Server 7.0 MSDE from Office 2000 disc | |
+| 7.00.662 | 232707 FIX: Query with Complex View Hierarchy May Be Slow to Compile | 2005-10-05 |
+| 7.00.658 | 244763 FIX: Access Violation Under High Cursor Stress | 2006-03-14 |
+| 7.00.657 | 229875 FIX: Unable to Perform Automated Installation of SQL 7.0 Using File Images | 2005-10-05 |
+| 7.00.643 | 220156 FIX: SQL Cluster Install Fails When SVS Name Contains Special Characters | 2005-10-05 |
+| 7.00.623 | SQL Server 7.0 RTM (Gold, no SP) | 1998-11-27 |
+| 7.00.583 | SQL Server 7.0 RC1 | |
+| 7.00.517 | SQL Server 7.0 Beta 3 | |
+
+[948113 MS08-040: Description of the security update for SQL Server 7.0: July 8, 2008]:https://support.microsoft.com/help/941203
[SQL Server 7.0 Service Pack 4 (SP4)]:https://www.microsoft.com/en-us/download/details.aspx?id=7959
-[324469 FIX: Error message 9004 may occur when you restore a log that does not contain any transactions]:http://support.microsoft.com/kb/324469/
-[319851 FIX: Assertion and Error Message 3314 Occurs If You Try to Roll Back a Text Operation with READ UNCOMMITTED]:http://support.microsoft.com/kb/319851/
-[304851 FIX: SQL Server Text Formatting Functions Contain Unchecked Buffers]:http://support.microsoft.com/kb/304851/
-[299717 FIX: Query Method Used to Access Data May Allow Rights that the Login Might Not Normally Have]:http://support.microsoft.com/kb/299717/
-[285870 FIX: Update With Self Join May Update Incorrect Number Of Rows]:http://support.microsoft.com/kb/285870/
-[284351 FIX: SQL Server Profiler and SQL Server Agent Alerts May Fail to Work After Installing SQL Server 7.0 SP3]:http://support.microsoft.com/kb/284351/
-[283837 FIX: SQL Server May Generate Nested Query For Linked Server When Option Is Disabled]:http://support.microsoft.com/kb/283837/
-[282243 FIX: Incorrect Results with Join of Column Converted to Binary]:http://support.microsoft.com/kb/282243/
-[SQL Server 7.0 Service Pack 3 (SP3)]:https://support.microsoft.com/en-us/kb/274799
-[283837 FIX: SQL Server May Generate Nested Query For Linked Server When Option Is Disabled]:http://support.microsoft.com/kb/283837/
-[282243 FIX: Incorrect Results with Join of Column Converted to Binary]:http://support.microsoft.com/kb/282243/
-[280380 FIX: Buffer Overflow Exploit Possible with Extended Stored Procedures]:http://support.microsoft.com/kb/280380/
-[279180 FIX: Bcp.exe with Long Query String Can Result in Assertion Failure]:http://support.microsoft.com/kb/279180/
-[275901 FIX: SQL RPC That Raises Error Will Mask @@ERROR with Msg 7221]:http://support.microsoft.com/kb/275901/
-[274266 FIX: Data Modification Query with a Distinct Subquery on a View May Cause Error 3624]:http://support.microsoft.com/kb/274266/
-[243741 FIX: Replication Initialize Method Causes Handle Leak on Failure]:http://support.microsoft.com/kb/243741/
-[281185 FIX: Linked Index Server Query Through OLE DB Provider with OR Clause Reports Error 7349]:http://support.microsoft.com/kb/281185/
-[260346 FIX: Transactional Publications with a Filter on Numeric Columns Fail to Replicate Data]:http://support.microsoft.com/kb/260346/
-[266766 FIX: Temporary Stored Procedures in SA Owned Databases May Bypass Permission Checks When You Run Stored Procedures]:http://support.microsoft.com/kb/266766/
-[SQL Server 7.0 Service Pack 2 (SP2)]:https://support.microsoft.com/en-us/kb/254561
-[258087 FIX: Non-Admin User That Executes Batch While Server Shuts Down May Encounter Retail Assertion]:http://support.microsoft.com/kb/258087/
-[252905 FIX: Slow Compile Time on Complex Joins with Unfiltered Table]:http://support.microsoft.com/kb/252905/
-[253738 FIX: SQL Server Components that Access the Registry in a Cluster Environment May Cause a Memory Leak]:http://support.microsoft.com/kb/253738/
-[239458 FIX: Replication: Problems Mapping Characters to DB2 OLEDB Subscribers]:http://support.microsoft.com/kb/239458/
-[SQL Server 7.0 Service Pack 1 (SP1)]:https://support.microsoft.com/en-us/kb/232570
-[232707 FIX: Query with Complex View Hierarchy May Be Slow to Compile]:http://support.microsoft.com/kb/232707/
-[244763 FIX: Access Violation Under High Cursor Stress]:http://support.microsoft.com/kb/244763/
-[229875 FIX: Unable to Perform Automated Installation of SQL 7.0 Using File Images]:http://support.microsoft.com/kb/229875/
-[220156 FIX: SQL Cluster Install Fails When SVS Name Contains Special Characters]:http://support.microsoft.com/kb/220156/
-
-
-## Microsoft SQL Server 6.5 Builds
-
-| Build | KB / Description | Release Date |
-|----------|---------------------------------------------------------------------------------------------------------------------|--------------|
-| 6.50.480 | [238621 FIX: Integrated Security Sprocs Have Race Condition Between Threads That Can Result in an Access Violation] | 2005-10-07 |
-| 6.50.479 | [273914 Microsoft SQL Server 6.5 Post Service Pack 5a Update] | 2000-09-12 |
-| 6.50.469 | [249343 FIX: SQL Performance Counters May Cause Handle Leak in WinLogon Process] | |
-| 6.50.465 | [250493 FIX: Memory Leak with xp_sendmail Using Attachments] | |
-| 6.50.464 | [275483 FIX: Insert Error (Msg 213) with NO_BROWSETABLE and INSERT EXEC] | 1999-11-08 |
-| 6.50.462 | [238620 FIX: Terminating Clients with TSQL KILL May Cause ODS AV] | |
-| 6.50.451 | [236447 FIX: ODS Errors During Attention Signal May Cause SQL Server to Stop Responding] | |
-| 6.50.444 | [240172 FIX: Multiple Attachments not Sent Correctly Using xp_sendmail] | |
-| 6.50.441 | [234679 FIX: SNMP Extended Stored Procedures May Leak Memory] | |
-| 6.50.422 | [187278 FIX: Large Query Text from Socket Client May Cause Open Data Services Access Violation] | |
-| 6.50.416 | [197176 Microsoft SQL Server 6.5 Service Pack 5a (SP5a)] | 1998-12-24 |
-| 6.50.415 | Microsoft SQL Server 6.5 Service Pack 5 (SP5) | |
-| 6.50.339 | Y2K hotfix | |
-| 6.50.297 | "Site Server 3.0 Commerce Edition" hotfix | |
-| 6.50.281 | 178295 Microsoft SQL Server 6.5 Service Pack 4 (SP4) | |
-| 6.50.259 | 6.5 as included with "Small Business Server" only | |
-| 6.50.258 | Microsoft SQL Server 6.5 Service Pack 3a (SP3a) | |
-| 6.50.252 | Microsoft SQL Server 6.5 Service Pack 3 (SP3) | |
-| 6.50.240 | [160727 Microsoft SQL Server 6.5 Service Pack 2 (SP2)] | |
-| 6.50.213 | [153096 Microsoft SQL Server 6.5 Service Pack 1 (SP1)] | |
-| 6.50.201 | Microsoft SQL Server 6.5 RTM | 1996-06-30 |
-
-[238621 FIX: Integrated Security Sprocs Have Race Condition Between Threads That Can Result in an Access Violation]:http://support.microsoft.com/kb/238621/en-us#
-[273914 Microsoft SQL Server 6.5 Post Service Pack 5a Update]:http://support.microsoft.com/kb/273914/en-us#
-[249343 FIX: SQL Performance Counters May Cause Handle Leak in WinLogon Process]:http://support.microsoft.com/kb/249343/en-us#
-[250493 FIX: Memory Leak with xp_sendmail Using Attachments]:http://support.microsoft.com/kb/250493/en-us#
-[275483 FIX: Insert Error (Msg 213) with NO_BROWSETABLE and INSERT EXEC]:http://support.microsoft.com/kb/275483/en-us#
-[238620 FIX: Terminating Clients with TSQL KILL May Cause ODS AV]:http://support.microsoft.com/kb/238620/en-us#
-[236447 FIX: ODS Errors During Attention Signal May Cause SQL Server to Stop Responding]:http://support.microsoft.com/kb/236447/en-us#
-[240172 FIX: Multiple Attachments not Sent Correctly Using xp_sendmail]:http://support.microsoft.com/kb/240172/en-us#
-[234679 FIX: SNMP Extended Stored Procedures May Leak Memory]:http://support.microsoft.com/kb/234679/en-us#
-[187278 FIX: Large Query Text from Socket Client May Cause Open Data Services Access Violation]:http://support.microsoft.com/kb/187278/en-us#
-[197176 Microsoft SQL Server 6.5 Service Pack 5a (SP5a)]:http://support.microsoft.com/kb/197176/en-us#
-[178295 Microsoft SQL Server 6.5 Service Pack 4 (SP4)]:http://support.microsoft.com/kb/178295/en-us#
-[160727 Microsoft SQL Server 6.5 Service Pack 2 (SP2)]:http://support.microsoft.com/kb/160727/en-us#
-[153096 Microsoft SQL Server 6.5 Service Pack 1 (SP1)]:http://support.microsoft.com/kb/153096/en-us#
-
-
-## Microsoft SQL Server 6.0 Builds
+
+
+## Microsoft SQL Server 6.5 Builds
+
+
+| Build | KB / Description | Release Date |
+|----------|-------------------------------------------------------------------------------------------------------------------|--------------|
+| 6.50.480 | 238621 FIX: Integrated Security Sprocs Have Race Condition Between Threads That Can Result in an Access Violation | 2005-10-07 |
+| 6.50.479 | 273914 Microsoft SQL Server 6.5 Post Service Pack 5a Update | 2000-09-12 |
+| 6.50.469 | 249343 FIX: SQL Performance Counters May Cause Handle Leak in WinLogon Process | |
+| 6.50.465 | 250493 FIX: Memory Leak with xp_sendmail Using Attachments | |
+| 6.50.464 | 275483 FIX: Insert Error (Msg 213) with NO_BROWSETABLE and INSERT EXEC | 1999-11-08 |
+| 6.50.462 | 238620 FIX: Terminating Clients with TSQL KILL May Cause ODS AV | |
+| 6.50.451 | 236447 FIX: ODS Errors During Attention Signal May Cause SQL Server to Stop Responding | |
+| 6.50.444 | 240172 FIX: Multiple Attachments not Sent Correctly Using xp_sendmail | |
+| 6.50.441 | 234679 FIX: SNMP Extended Stored Procedures May Leak Memory | |
+| 6.50.422 | 187278 FIX: Large Query Text from Socket Client May Cause Open Data Services Access Violation | |
+| 6.50.416 | 197176 Microsoft SQL Server 6.5 Service Pack 5a (SP5a) | 1998-12-24 |
+| 6.50.415 | Microsoft SQL Server 6.5 Service Pack 5 (SP5) | |
+| 6.50.339 | Y2K hotfix | |
+| 6.50.297 | "Site Server 3.0 Commerce Edition" hotfix | |
+| 6.50.281 | 178295 Microsoft SQL Server 6.5 Service Pack 4 (SP4) | |
+| 6.50.259 | 6.5 as included with "Small Business Server" only | |
+| 6.50.258 | Microsoft SQL Server 6.5 Service Pack 3a (SP3a) | |
+| 6.50.252 | Microsoft SQL Server 6.5 Service Pack 3 (SP3) | |
+| 6.50.240 | 160727 Microsoft SQL Server 6.5 Service Pack 2 (SP2) | |
+| 6.50.213 | 153096 Microsoft SQL Server 6.5 Service Pack 1 (SP1) | |
+| 6.50.201 | Microsoft SQL Server 6.5 RTM | 1996-06-30 |
+
+
+## Microsoft SQL Server 6.0 Builds
+
| Build | KB / Description | Release Date |
|----------|-----------------------------------------------|--------------|
diff --git a/SSMS/README.md b/SSMS/README.md
index bfdf0601..6a48739c 100644
--- a/SSMS/README.md
+++ b/SSMS/README.md
@@ -1,26 +1,166 @@
# SQL Server Management Studio
-SQL Server Management Studio is an integrated environment for managing your SQL Server infrastructure and Azure SQL Database. Management Studio provides tools to configure, monitor, and administer instances of SQL Server. It also provides tools to deploy, monitor, and upgrade the data-tier components, such as databases and data warehouses used by your applications, and to build queries and scripts.
+SQL Server Management Studio is an integrated environment for managing your SQL Server infrastructure and Azure SQL Database.
+Management Studio provides tools to configure, monitor, and administer instances of SQL Server.
+It also provides tools to deploy, monitor, and upgrade the data-tier components, such as databases and data warehouses used by your applications, and to build queries and scripts.
+ - [SSMS Tips](SSMS_Tips.md)
- [SSMS Addins](SSMS_Addins.md)
- [SSMS Snippets](SSMS_Snippets)
- [SSMS Shortcuts](SSMS_Shortcuts.md)
- - [MSDN SQL Server Tools](https://msdn.microsoft.com/en-us/library/mt238365.aspx)
- - [MSDN Download link](https://msdn.microsoft.com/en-us/library/mt238290.aspx)
- - [MSDN Official page](https://msdn.microsoft.com/en-us/library/hh213248.aspx)
- - [MSDN Code Snippets Schema Reference](https://msdn.microsoft.com/en-us/library/ms171418.aspx)
- - [MSDN Add Transact-SQL Snippets](https://msdn.microsoft.com/en-us/library/gg492130.aspx)
+ - [Download SQL Server Management Studio (SSMS)](https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms)
+ - [SQL Server Management Studio - Changelog (SSMS)](https://docs.microsoft.com/en-us/sql/ssms/sql-server-management-studio-changelog-ssms)
+ - [SQL Server Management Studio (SSMS) - Release Candidate](https://docs.microsoft.com/en-us/sql/ssms/sql-server-management-studio-ssms-release-candidate)
+ - [Previous SQL Server Management Studio Releases](https://docs.microsoft.com/en-us/sql/ssms/previous-sql-server-management-studio-releases)
+ - [SQLSentry Latest Builds of Management Studio](http://blogs.sqlsentry.com/team-posts/latest-builds-management-studio/)
+ - [SQL Server Tools](https://docs.microsoft.com/en-us/sql/ssdt/sql-server-tools)
+ - [SQL Server Management Studio (SSMS)](https://docs.microsoft.com/en-us/sql/ssms/sql-server-management-studio-ssms)
+ - [Microsoft Download Center SSMS](https://www.microsoft.com/en-us/download/search.aspx?q=sql%20server%20management%20studio&p=0&r=10&t=&s=Relevancy~Descending)
+ - [Add Transact-SQL Snippets](https://docs.microsoft.com/en-us/sql/relational-databases/scripting/add-transact-sql-snippets)
-## SQL Server 2014 Management Studio download links
+## Supported SQL Server versions
+This version of SSMS works with all supported versions of SQL Server (SQL Server 2008 - SQL Server 2017), and provides the greatest level of support for working with the latest cloud features in Azure SQL Database, and Azure SQL Data Warehouse.
+There is no explicit block for SQL Server 2000 or SQL Server 2005, but some features may not work properly.
+Additionally, SSMS 17.x can be installed side-by-side with SSMS 16.X or SQL Server 2014 SSMS and earlier.
+
+
+## Supported Operating systems
+This release of **SSMS 17.x Version** supports the following platforms when used with the latest available service pack: Windows 10, Windows 8, Windows 8.1, Windows 7 (SP1), Windows Server 2016, Windows Server 2012 (64-bit), Windows Server 2012 R2 (64-bit), Windows Server 2008 R2 (64-bit)
+
+SSMS 18.x is not supported on Windows 8. Windows 10 / Windows Server 2016 requires version 1607 (10.0.14393) or later:
+Due to the new dependency on NetFx 4.7.2, SSMS 18.0 does not install on Windows 8, older versions of Windows 10, and Windows Server 2016. SSMS setup will block on those operating systems. Windows 8.1 is still supported.
+
+
+### Note
+SSMS 17.X is based on the Visual Studio 2015 Isolated shell, which was released before Windows Server 2016.
+Microsoft takes app compatibility very seriously and ensures that already-shipped applications continue to run on the latest Windows releases.
+Because of this, we do not anticipate that SSMS with all latest updates applied) will encounter issues when running on Windows Server 2016.
+Customers are advised to contact support, should they encounter any issues with SSMS on Windows Server 2016.
+Support will then work with customers to determine if the issue is with SSMS or Visual Studio or with Windows compatibility, and route the issue appropriately.
+
+SSMS 18.x is based on the new Visual Studio 2017 Isolated Shell: The new shell unlocks all the accessibility fixes that went in to both SSMS and Visual Studio.
+
+
+## Available Languages
+**SQL Server Management Studio 18.0 (preview 6)**:
+ [Chinese (People's Republic of China)](https://go.microsoft.com/fwlink/?linkid=2052501&clcid=0x804) |
+ [Chinese (Taiwan)](https://go.microsoft.com/fwlink/?linkid=2052501&clcid=0x404) |
+ [English (United States)](https://go.microsoft.com/fwlink/?linkid=2052501&clcid=0x409) |
+ [French](https://go.microsoft.com/fwlink/?linkid=2052501&clcid=0x40c) |
+ [German](https://go.microsoft.com/fwlink/?linkid=2052501&clcid=0x407) |
+ [Italian](https://go.microsoft.com/fwlink/?linkid=2052501&clcid=0x410) |
+ [Japanese](https://go.microsoft.com/fwlink/?linkid=2052501&clcid=0x411) |
+ [Korean](https://go.microsoft.com/fwlink/?linkid=2052501&clcid=0x412) |
+ [Portuguese (Brazil)](https://go.microsoft.com/fwlink/?linkid=2052501&clcid=0x416) |
+ [Russian](https://go.microsoft.com/fwlink/?linkid=2052501&clcid=0x419) |
+ [Spanish](https://go.microsoft.com/fwlink/?linkid=2052501&clcid=0x40a)
+
+**SQL Server Management Studio 17.9.1** for another languages:
+ [Chinese (People's Republic of China)](https://go.microsoft.com/fwlink/?linkid=2014306&clcid=0x804) |
+ [Chinese (Taiwan)](https://go.microsoft.com/fwlink/?linkid=2014306&clcid=0x404) |
+ [English (United States)](https://go.microsoft.com/fwlink/?linkid=2014306&clcid=0x409)
+ [French](https://go.microsoft.com/fwlink/?linkid=2014306&clcid=0x40c) |
+ [German](https://go.microsoft.com/fwlink/?linkid=2014306&clcid=0x407) |
+ [Italian](https://go.microsoft.com/fwlink/?linkid=2014306&clcid=0x410) |
+ [Japanese](https://go.microsoft.com/fwlink/?linkid=2014306&clcid=0x411) |
+ [Korean](https://go.microsoft.com/fwlink/?linkid=2014306&clcid=0x412) |
+ [Portuguese (Brazil)](https://go.microsoft.com/fwlink/?linkid=2014306&clcid=0x416) |
+ [Russian](https://go.microsoft.com/fwlink/?linkid=2014306&clcid=0x419) |
+ [Spanish](https://go.microsoft.com/fwlink/?linkid=2014306&clcid=0x40a)
+
+**SQL Server Management Studio 17.9.1 Upgrade Package** (upgrades 17.x to 17.9.1):
+ [Chinese (People's Republic of China)](https://go.microsoft.com/fwlink/?linkid=2043154&clcid=0x804) |
+ [Chinese (Taiwan)](https://go.microsoft.com/fwlink/?linkid=2043154&clcid=0x404) |
+ [English (United States)](https://go.microsoft.com/fwlink/?linkid=2043154&clcid=0x409) |
+ [French](https://go.microsoft.com/fwlink/?linkid=2043154&clcid=0x40c) |
+ [German](https://go.microsoft.com/fwlink/?linkid=2043154&clcid=0x407) |
+ [Italian](https://go.microsoft.com/fwlink/?linkid=2043154&clcid=0x410) |
+ [Japanese](https://go.microsoft.com/fwlink/?linkid=2043154&clcid=0x411) |
+ [Korean](https://go.microsoft.com/fwlink/?linkid=2043154&clcid=0x412) |
+ [Portuguese (Brazil)](https://go.microsoft.com/fwlink/?linkid=2043154&clcid=0x416) |
+ [Russian](https://go.microsoft.com/fwlink/?linkid=2043154&clcid=0x419) |
+ [Spanish](https://go.microsoft.com/fwlink/?linkid=2043154&clcid=0x40a)
+
+
+## SQL Server Management Studio Download Links and Release Info
+ - **GA** - General Availability
+ - **PP** - Public Preview
+ - Size in Megabytes for English version
+
+| Version/Download Link | Build | Release Date | Size, Mb |
+|----------------------------------------|---------------|--------------|---------:|
+| [18.0 Preview 6 Release] **Latest PP** | 15.0.18075.0 | 2018-12-18 | 457 |
+| [18.0 Preview 5 Release] | 15.0.18068.0 | 2018-11-15 | 457 |
+| [18.0 Preview 4 Release] | 15.0.18040.0 | 2018-09-24 | 456 |
+| [17.9.1 Release] **Latest GA** | 14.0.17289.0 | 2018-11-21 | 807 |
+| [17.9 Release] | 14.0.17285.0 | 2018-09-04 | 807 |
+| [17.8.1 Release] | 14.0.17277.0 | 2018-06-26 | 806 |
+| [17.8 Release] **Deprecated** | 14.0.17276.0 | 2018-06-21 | 806 |
+| [17.7 Release] | 14.0.17254.0 | 2018-05-09 | 803 |
+| [17.6 Release] | 14.0.17230.0 | 2018-03-20 | 802 |
+| [17.5 Release] | 14.0.17224.0 | 2018-02-15 | 802 |
+| [17.4 Release] | 14.0.17213.0 | 2017-12-07 | 802 |
+| [17.3 Release] | 14.0.17199.0 | 2017-10-09 | 801 |
+| [17.2 Release] | 14.0.17177.0 | 2017-08-07 | 819 |
+| [17.1 Release] | 14.0.17119.0 | 2017-05-24 | 784 |
+| [17.0 Release] | 14.0.17099.0 | 2017-04-25 | 729 |
+| [17.0 RC3 Release] | 14.0.17028.0 | 2017-03-09 | 677 |
+| [17.0 RC2 Release] | 14.0.16150.0 | 2017-02-01 | 682 |
+| [17.0 RC1 Release] | 14.0.16000.64 | 2016-11-16 | 687 |
+| [16.5.3 Release] | 13.0.16106.4 | 2017-01-26 | 898 |
+| 16.5.2 Release **Deprecated** | 13.0.16105.4 | 2017-01-18 | 898 |
+| [16.5.1 Release] | 13.0.16100.1 | 2016-12-05 | 894 |
+| [16.5 Release] | 13.0.16000.28 | 2016-10-26 | 894 |
+| [16.4.1 Release] | 13.0.15900.1 | 2016-09-23 | 894 |
+| 16.4 Release **Deprecated** | 13.0.15800.18 | 2016-09-20 | |
+| [16.3 Release] | 13.0.15700.28 | 2016-08-15 | 806 |
+| [July 2016 Hotfix Update] | 13.0.15600.2 | 2016-07-13 | 825 |
+| July 2016 Release **Deprecated** | 13.0.15500.91 | 2016-07-01 | |
+| [June 2016 Release] | 13.0.15000.23 | 2016-06-01 | 825 |
+| [SQL Server 2014 SP1] | 12.0.4100.1 | 2015-05-14 | 815 |
+| [SQL Server 2012 SP3] | 11.0.6020.0 | 2015-11-21 | 964 |
+| [SQL Server 2008 R2] | 10.50.4000 | 2012-07-02 | 161 |
+
+[18.0 Preview 6 Release]:https://go.microsoft.com/fwlink/?linkid=2052501
+[18.0 Preview 5 Release]:https://go.microsoft.com/fwlink/?linkid=2041155
+[18.0 Preview 4 Release]:https://go.microsoft.com/fwlink/?linkid=2014662
+[17.9.1 Release]:https://go.microsoft.com/fwlink/?linkid=2043154
+[17.9 Release]:https://go.microsoft.com/fwlink/?linkid=2014306
+[17.8.1 Release]:https://go.microsoft.com/fwlink/?linkid=875802
+[17.8 Release]:https://go.microsoft.com/fwlink/?linkid=875673
+[17.7 Release]:https://go.microsoft.com/fwlink/?linkid=873126
+[17.6 Release]:https://go.microsoft.com/fwlink/?linkid=870039
+[17.5 Release]:https://go.microsoft.com/fwlink/?linkid=867670
+[17.4 Release]:https://go.microsoft.com/fwlink/?linkid=864329
+[17.3 Release]:https://go.microsoft.com/fwlink/?linkid=858904
+[17.2 Release]:https://go.microsoft.com/fwlink/?linkid=854085
+[17.1 Release]:https://go.microsoft.com/fwlink/?linkid=849819
+[17.0 Release]:https://go.microsoft.com/fwlink/?linkid=847722
+[17.0 RC3 Release]:https://go.microsoft.com/fwlink/?linkid=844503
+[17.0 RC2 Release]:https://go.microsoft.com/fwlink/?linkid=840957
+[17.0 RC1 Release]:https://go.microsoft.com/fwlink/?LinkID=835608
+[16.5.3 Release]:https://go.microsoft.com/fwlink/?LinkID=840946
+[16.5.1 Release]:https://go.microsoft.com/fwlink/?linkid=837453
+[16.5 Release]:http://go.microsoft.com/fwlink/?linkid=832812
+[16.4.1 Release]:http://go.microsoft.com/fwlink/?LinkID=828615
+[16.3 Release]:http://go.microsoft.com/fwlink/?LinkID=824938
+[July 2016 Hotfix Update]:http://go.microsoft.com/fwlink/?LinkID=822301
+[June 2016 Release]:http://go.microsoft.com/fwlink/?LinkID=799832
+[SQL Server 2014 SP1]:http://download.microsoft.com/download/1/5/6/156992E6-F7C7-4E55-833D-249BD2348138/ENU/x86/SQLManagementStudio_x86_ENU.exe
+[SQL Server 2012 SP3]:http://download.microsoft.com/download/F/6/7/F673709C-D371-4A64-8BF9-C1DD73F60990/ENU/x86/SQLManagementStudio_x86_ENU.exe
+[SQL Server 2008 R2]:https://www.microsoft.com/en-us/download/details.aspx?id=30438
+
+
+## SQL Server 2014 RTM Management Studio download links
- [SQL Management Studio x64](http://download.microsoft.com/download/E/A/E/EAE6F7FC-767A-4038-A954-49B8B05D04EB/MgmtStudio%2064BIT/SQLManagementStudio_x64_ENU.exe)
- [SQL Management Studio x86](http://download.microsoft.com/download/E/A/E/EAE6F7FC-767A-4038-A954-49B8B05D04EB/MgmtStudio%2032BIT/SQLManagementStudio_x86_ENU.exe)
-## SQL Server 2012 Management Studio download links
+## SQL Server 2012 SP1 Management Studio download links
- [SQL Management Studio x64](http://download.microsoft.com/download/8/D/D/8DD7BDBA-CEF7-4D8E-8C16-D9F69527F909/ENU/x64/SQLManagementStudio_x64_ENU.exe)
- [SQL Management Studio x86](http://download.microsoft.com/download/8/D/D/8DD7BDBA-CEF7-4D8E-8C16-D9F69527F909/ENU/x86/SQLManagementStudio_x86_ENU.exe)
-## SQL Server 2008 Management Studio download links
+## SQL Server 2008 R2 Management Studio download links
- [SQL Management Studio x64](http://download.microsoft.com/download/0/4/B/04BE03CD-EAF3-4797-9D8D-2E08E316C998/SQLManagementStudio_x64_ENU.exe)
- [SQL Management Studio x86](http://download.microsoft.com/download/0/4/B/04BE03CD-EAF3-4797-9D8D-2E08E316C998/SQLManagementStudio_x86_ENU.exe)
diff --git a/SSMS/SSMS_Addins.md b/SSMS/SSMS_Addins.md
index df271cea..b6a10988 100644
--- a/SSMS/SSMS_Addins.md
+++ b/SSMS/SSMS_Addins.md
@@ -1,58 +1,102 @@
# SQL Server Management Studio add-ins
-Complete list of useful and must have add-ins for SQL Server Management Studio
-
-
-| Name | Download page | Release Date | Support Version | Developer | Free version | Price |
-|-------------------------------------------------------|----------------------------|--------------|-----------------|----------------------|--------------|---------|
-| [SSMSBoost](#ssmsboost) | [SSMSBoost] | 2015-12-21 | 2008/2012/2014 | Solutions Crew GmbH | Yes | $150 |
-| [SQL Code Guard](#sql-code-guard) | [SQL Code Guard] | 2015-05-04 | 2008/2012/2014 | Oleksii Kovalov | Yes | No |
-| [SQL Search](#sql-search) | [SQL Search] | 2015-11-05 | 2008/2012/2014 | Red Gate | Yes | No |
-| [SQL Scripts Manager](#sql-scripts-manager) | [SQL Scripts Manager] | 2015-05-31 | 2008/2012/2014 | Red Gate | Yes | No |
-| [Red Gate SQL Test](#red-gate-sql-test) | [Red Gate SQL Test] | 2015-11-17 | 2008/2012/2014 | Red Gate | No | $369 |
-| [Supratimas](#supratimas) | [Supratimas] | 2015-01-27 | 2008/2012/2014 | TTRider LLC | Yes | $34.99 |
-| [SSMS Tools Pack](#ssms-tools-pack) | [SSMS Tools Pack] | 2015-10-07 | 2008/2012/2014 | Mladen Prajdić | No | €30 |
-| [SQL Pretty Printer](#sql-pretty-printer) | [SQL Pretty Printer] | 2015-11-05 | 2008/2012/2014 | Gudu Software | No | $50 |
-| [SQL Sentry Plan Explorer](#sql-sentry-plan-explorer) | [SQL Sentry Plan Explorer] | 2015-09-01 | 2008/2012/2014 | SQL Sentry | Yes | $295.00 |
-| [TSQL Code Smells Finder](#tsql-code-smells-finder) | [TSQL Code Smells Finder] | 2013-02-15 | 2008/2012/2014 | Dave ballantyne | Yes | No |
-| [SQLTreeo](#sqltreeo) | [SQLTreeo] | 2014-05-18 | 2008/2012/2014 | Jakub Dvorak | No | €50 |
-| [ApexSQL Complete](#apexsql-complete) | [ApexSQL Complete] | 2016-04-01 | 2008/2012/2014 | ApexSQL tools | Yes | No |
-| [ApexSQL Refactor](#apexsql-refactor) | [ApexSQL Refactor] | 2016-02-11 | 2008/2012/2014 | ApexSQL tools | Yes | No |
-| [ApexSQL Search](#apexsql-search) | [ApexSQL Search] | 2015-09-04 | 2008/2012/2014 | ApexSQL tools | Yes | No |
-| [ApexSQL Source Control](#apexsql-source-control) | [ApexSQL Source Control] | 2015-04-27 | 2008/2012/2014 | ApexSQL tools | No | $299 |
-| [Spotlight Developer](#spotlight-developer) | [Spotlight Developer] | 2016-02-04 | 2008/2012/2014 | Spotlight Essentials | Yes | No |
-| [dbForge Source Control](#dbforge-source-control) | [dbForge Source Control] | 2015-12-22 | 2008/2012/2014 | Devart | No | $249.95 |
-| [dbForge Unit Test](#dbforge-unit-test) | [dbForge Unit Test] | 2015-12-04 | 2008/2012/2014 | Devart | No | $199.95 |
-| [dbForge Data Pump](#dbforge-data-pump) | [dbForge Data Pump] | 2015-12-04 | 2008/2012/2014 | Devart | No | $149.95 |
-| [dbForge Index Manager](#dbforge-index-manager) | [dbForge Index Manager] | 2015-11-30 | 2008/2012/2014 | Devart | No | $99.95 |
-| [dbForge Object Search](#dbforge-object-search) | [dbForge Object Search] | 2015-11-30 | 2008/2012/2014 | Devart | Yes | No |
-| [dbForge SQL Complete](#dbforge-sql-complete) | [dbForge SQL Complete] | 2015-09-16 | 2008/2012/2014 | Devart | No | $119.95 |
-| [SoftTree SQL Assistant](#softtree-sql-assistant) | [SoftTree SQL Assistant] | 2016-03-18 | 2008/2012/2014 | SoftTree | No | $178.80 |
-
-
-## SSMSBoost
+Complete list of useful and must have add-ins for SQL Server Management Studio - **36** SSMS add-ins
+
+| Name | Download page | Release Date | Support SSMS Version | Developer | Free version | Price |
+|-------------------------------------------------------|-------------------------------|--------------|:---------------------|----------------------|--------------|------:|
+| [SSMSBoost](#ssmsboost) | [SSMSBoost] | 2019-01-09 | 2008-2018 | Solutions Crew GmbH | Yes | $150 |
+| [SqlSmash](#sqlsmash) | [SqlSmash] | 2017-06-10 | 2008-2017 | Smashing Jedis LLC | Yes | $99 |
+| [SQL Code Guard](#sql-code-guard) | [Red Gate SQL Code Guard] | 2017-07-03 | 2016 | Red Gate | Yes | No |
+| [SQL Search](#sql-search) | [SQL Search] | 2017-02-27 | 2008-2017 | Red Gate | Yes | No |
+| [Red Gate SQL Test](#red-gate-sql-test) | [Red Gate SQL Test] | 2017-03-21 | 2008-2017 | Red Gate | No | $369 |
+| [Red Gate SQL Source Control](#red-gate-control) | [Red Gate SQL Source Control] | 2017-06-30 | 2012-2017 | Red Gate | No | $495 |
+| [Supratimas](#supratimas) | [Supratimas] | 2017-07-11 | 2008-2017 | TTRider LLC | Yes | No |
+| [SSMS Tools Pack](#ssms-tools-pack) | [SSMS Tools Pack] | 2016-11-28 | 2012-2017 | Mladen Prajdić | No | €30 |
+| [SQL Pretty Printer](#sql-pretty-printer) | [SQL Pretty Printer] | 2015-11-05 | 2008-2014 | Gudu Software | No | $50 |
+| [SQL Sentry Plan Explorer](#sql-sentry-plan-explorer) | [SQL Sentry Plan Explorer] | 2017-05-25 | 2008-2017 | SQL Sentry | Yes | No |
+| [TSQL Code Smells Finder](#tsql-code-smells-finder) | [TSQL Code Smells Finder] | 2013-02-15 | 2008-2014 | Dave ballantyne | Yes | No |
+| [SQLTreeo](#sqltreeo) | [SQLTreeo] | 2017-06-06 | 2012-2017 | SQLTreeo | No | €50 |
+| [ApexSQL Complete](#apexsql-complete) | [ApexSQL Complete] | 2017-10-26 | 2012-2017 | ApexSQL tools | Yes | No |
+| [ApexSQL Refactor](#apexsql-refactor) | [ApexSQL Refactor] | 2017-07-13 | 2008-2017 | ApexSQL tools | Yes | No |
+| [ApexSQL Search](#apexsql-search) | [ApexSQL Search] | 2017-06-19 | 2008-2017 | ApexSQL tools | Yes | No |
+| [ApexSQL Source Control](#apexsql-source-control) | [ApexSQL Source Control] | 2017-10-12 | 2008-2017 | ApexSQL tools | No | $299 |
+| [ApexSQL Unit Test](#apexsql-unit-test) | [ApexSQL Unit Test] | 2017-08-16 | 2008-2017 | ApexSQL tools | Yes | $499 |
+| [Spotlight Developer](#spotlight-developer) | [Spotlight Developer] | 2016-02-04 | 2008-2014 | Spotlight Essentials | Yes | No |
+| [dbForge Source Control](#dbforge-source-control) | [dbForge Source Control] | 2018-12-21 | 2005-2018 | Devart | No | $249 |
+| [dbForge Unit Test](#dbforge-unit-test) | [dbForge Unit Test] | 2018-12-21 | 2005-2018 | Devart | No | $199 |
+| [dbForge Data Pump](#dbforge-data-pump) | [dbForge Data Pump] | 2018-12-21 | 2008-2018 | Devart | No | $149 |
+| [dbForge Index Manager](#dbforge-index-manager) | [dbForge Index Manager] | 2018-12-21 | 2008-2018 | Devart | No | $99 |
+| [dbForge Search](#dbforge-search) | [dbForge Search] | 2018-12-21 | 2008-2018 | Devart | Yes | No |
+| [dbForge Monitor](#dbforge-monitor) | [dbForge Monitor] | 2018-12-21 | 2008-2018 | Devart | Yes | No |
+| [dbForge SQL Complete](#dbforge-sql-complete) | [dbForge SQL Complete] | 2018-12-21 | 2000-2018 | Devart | Yes | $149 |
+| [SoftTree SQL Assistant](#softtree-sql-assistant) | [SoftTree SQL Assistant] | 2016-03-18 | 2008-2014 | SoftTree | No | $179 |
+| [SQL Enlight For SSMS](#sql-enlight-for-ssms) | [SQL Enlight For SSMS] | 2016-04-25 | 2008-2014 | UbitSoft | No | $195 |
+| [SQL Hunting Dog](#sql-hunting-dog) | [SQL Hunting Dog] | 2016-03-03 | 2008-2014 | Alex Maslyukov | Yes | No |
+| [Poor Mans T-SQL Formatter](#poor-mans) | [Poor Mans T-SQL Formatter] | 2013-10-23 | 2008-2012 | Tao Klerks | Yes | No |
+| [Tabs Studio](#tabs-studio) | [Tabs Studio] | 2017-08-24 | 2012-2017 | Vlasov Studio | No | $49 |
+| [Workload Addin](#workload-addin) | [Workload Addin] | 2017-02-07 | 2008-2012 | Tomáš Bauer | Yes | No |
+| [SQL Server Diagnostics](#sql-server-diagnostics) | [SQL Server Diagnostics] | 2017-06-22 | 2016-2017 | Microsoft | Yes | No |
+| [VersionSQL](#versionsql) | [VersionSQL] | 2017-02-16 | 2012-2017 | VersionSQL | Yes | $149 |
+| [Spotlight Tuning Pack](#spotlight-tuning-pack) | [Spotlight Tuning Pack] | 2018-06-01 | 2012-2017 | Quest Software Inc | Yes | $180 |
+| [Michel Max - SSMS Tools](#michel-max) | [Michel Max - SSMS Tools] | 2018-11-16 | 2012-2018 | Michel Max | Yes | No |
+| [SSMS Schema Folders](#ssms-schema-folders) | [SSMS Schema Folders] | 2018-10-06 | 2012-2018 | Nicholas Ross | Yes | No |
+
+
+
+## SSMSBoost
Download page: [SSMSBoost]
-Release date: 2015-12-21
-Support Version: 2008/2012/2014
-Free version: Yes
+Release date: 2019-01-09
+Support Version: 2008-2018
+Developer: Solutions Crew GmbH
+Free version: Yes
+Price: $150
-SSMSBoost add-in adds missing features and improves your productivity when working with Microsoft SQL Server in SQL Server Management Studio.
-The main goal of the project is to speed-up daily tasks of SQL DBA and SQL developers and to help you avoid destructive DML executions in production environments.
-
-You will realize, that plug-in will save you hundreds of mouse-clicks and key strokes every day !
-
-Licensing options: after 30 day trial period register and get fully-functional free community license or buy the professional version.
-Currently both versions have the same set of features.
+SSMSBoost add-in adds missing features and improves your productivity when working with Microsoft SQL Server in SQL Server Management Studio.
+The main goal of the project is to speed-up daily tasks of SQL DBA and SQL developers and to help you avoid destructive DML executions in production environments.
-## SQL Code Guard
-Download link: [SQL Code Guard]
-Release date: 2015-05-04
-Support Version: 2008/2012/2014
-Free version: Yes
+Licensing options: after 30 day trial period register and get free community license or buy the professional version.
+
+[Features list / SSMSBoost version comparison](http://www.ssmsboost.com/VersionCompare)
+
+
+
+## SqlSmash
+Download page: [SqlSmash]
+Release date: 2017-06-10
+Support Version: 2008-2017
+Developer: Smashing Jedis LLC
+Free version: Yes
+Price: $99
+
+Write maintainable SQL scripts, Understand code better and Navigate faster with SqlSmash, a productivity plugin for SQL Server Management Studio.
+
+ - Search Database Objects
+ - Format Sql
+ - Execute Current Query
+ - Insert Statement Generation
+ - Go To Object
+ - Increase/Decrease Text Selection
+ - Data Protection
+ - Find All References
+ - Recent Tabs and Queries
+ - See Related Data
+ - Quick Info
+ - Summarize Script
+ - Go To Definition
+
+
+
+## SQL Code Guard
+Download link: [Red Gate SQL Code Guard]
+Release date: 2017-02-17
+Support Version: 2016
+Developer: Red Gate
+Free version: Yes
+Price: No
SQL Code Guard is a free solution for SQL Server that provides fast and comprehensive static analysis for T-Sql code, shows code complexity and objects dependencies.
- - Integration with SSMS 2008/2012/2014
+ - Integration with SSMS 2016
- Integration with Visual Studio 2012/2013
- Checkin Policy for TFS (how to install & use)
- Support of msbuild (how to use msbuild)
@@ -60,11 +104,14 @@ SQL Code Guard is a free solution for SQL Server that provides fast and comprehe
- API for custom tool development (demo projects can be found in SQL Code Guard folder)
-## SQL Search
+
+## SQL Search
Download page: [SQL Search]
-Release date: 2015-11-05
-Support Version: 2008/2012/2014
-Free version: Yes
+Release date: 2017-02-27
+Support Version: 2008-2017
+Developer: Red Gate
+Free version: Yes
+Price: No
SQL Search is a free add-in for SQL Server Management Studio that lets you quickly search for SQL across your databases.
@@ -75,103 +122,142 @@ SQL Search is a free add-in for SQL Server Management Studio that lets you quick
- Search with booleans and wildcards
-## SQL Scripts Manager
-Download page: [SQL Scripts Manager]
-Release date: 2015-05-31
-Support Version: 2008/2012/2014
-Free version: Yes
+
+## Red Gate SQL Test
+Download page: [Red Gate SQL Test]
+Release date: 2017-03-21
+Support Version: 2008-2017
+Developer: Red Gate
+Free version: No
+Price: $369
-Powerful and reliable scripts written by SQL Server experts
+Write unit tests (using the open-source [tSQLt framework](https://github.com/tSQLt-org/tSQLt)) for SQL Server databases in SQL Server Management Studio
-## Red Gate SQL Test
-Download page: [Red Gate SQL Test]
-Release date: 2015-11-17
-Support Version: 2008/2012/2014
-Free version: No
-Price: $369
+
+## Red Gate SQL Source Control
+Download page: [Red Gate SQL Source Control]
+Release date: 2017-06-30
+Support Version: 2012-2017
+Developer: Red Gate
+Free version: No
+Price: $495
-Write unit tests (using the open-source tSQLt framework) for SQL Server databases in SQL Server Management Studio
+Connect your databases to your source control system
+ - Version control your schemas and reference data
+ - Version control your schemas and reference data
+ - Handles referential integrity for you
+ - Push and pull Git repos (Synchronize your local and remote Git repositories inside Management Studio)
+ - Roll back any changes you don't want
+ - Lock objects you're working on
+ - Work on a central database or your own local copy
+ - Exclude objects with filters
+ - Deploy your changes without data loss (Avoid losing data during complex deployments with migration scripts)
-## Supratimas
+
+## Supratimas
Download page: [Supratimas]
-Release date: 2015-01-27
-Support Version: 2008/2012/2014
-Free version: Yes
+Release date: 2017-07-11
+Support Version: 2008-2017
+Developer: TTRider LLC
+Free version: Yes
+Price: No
SQL Server query plan execution visualizer
-## SSMS Tools Pack
+
+## SSMS Tools Pack
Download page: [SSMS Tools Pack]
-Release date: 2015-10-07
-Support Version: 2008/2012/2014
-Free version: No
-
-- Keeps your query or window history safe in local files or database
-- Run script at cursor location and an Accidental data destruction protector
-- Keep your favorite statements accessible with a shortcut of your choice
-- Format SQL
-- Color the query windows based on the server/database name or a regex
-- Add custom replacement texts to your scripts in four different features
-- Modifies New Query windows with a template of your choice
-- Run custom scripts from a chosen node in Object Explorer
-
-
-## SQL Pretty Printer
+Release date: 2016-11-28
+Support Version: 2012-2017
+Developer: Mladen Prajdić
+Free version: No
+Price: €30
+
+ - Keeps your query or window history safe in local files or database
+ - Run script at cursor location and an Accidental data destruction protector
+ - Keep your favorite statements accessible with a shortcut of your choice
+ - Format SQL
+ - Color the query windows based on the server/database name or a regex
+ - Add custom replacement texts to your scripts in four different features
+ - Modifies New Query windows with a template of your choice
+ - Run custom scripts from a chosen node in Object Explorer
+
+
+
+## SQL Pretty Printer
Download page: [SQL Pretty Printer]
Release date: 2015-11-05
-Support Version: 2008/2012/2014
-Free version: No
+Support Version: 2008-2014
+Developer: Gudu Software
+Free version: No
+Price: No
-- improve SQL readability
-- use a standard style within your organization
-- use automatic formatting eliminates any disagreements
-- embed well formatted and syntax colored SQL into your documents
-- add SQL format feature within 5 minutes
-- quickly convert between SQL and C#, Java, etc.
+ - improve SQL readability
+ - use a standard style within your organization
+ - use automatic formatting eliminates any disagreements
+ - embed well formatted and syntax colored SQL into your documents
+ - add SQL format feature within 5 minutes
+ - quickly convert between SQL and C#, Java, etc.
-## SQL Sentry Plan Explorer
+
+## SQL Sentry Plan Explorer
Download page: [SQL Sentry Plan Explorer]
-Release date: 2015-09-01
-Support Version: 2008/2012/2014
-Free version: Yes
+Release date: 2017-05-25
+Support Version: 2008-2017
+Developer: SQL Sentry
+Free version: Yes
+Price: No
With both a free and PRO version, Plan Explorer builds upon the graphical plan view in SSMS to make query plan optimization more efficient.
It is a lightweight standalone app that contains many of the plan analysis features introduced in SQL Sentry v6, and does not require a collector service or database.
-## TSQL Code Smells Finder
+
+## TSQL Code Smells Finder
Download page: [TSQL Code Smells Finder]
Release date: 2013-02-15
-Support Version: 2008/2012/2014
-Free version: Yes
+Support Version: 2008-2014
+Developer: Dave ballantyne
+Free version: Yes
+Price: No
TSQL Code can smell, it may work just fine but there can be hidden dangers held within.
This is a proof of concept work which will analyze TSQL scripts in an attempt to weed out some of these dangers.
-## SQLTreeo
+
+## SQLTreeo
Download page: [SQLTreeo]
-Release date: 2014-05-18
-Support Version: 2008/2012/2014
-Free version: No
-
-SQL Treeo enables users to create custom folders for databases, stored procedures, views, functions and tables.
-You can organize your SQL objects in logical modules which are aligned with your project structure.
-
-
-## ApexSQL Complete
+Release date: 2017-06-06
+Support Version: 2008-2017
+Developer: Jakub Dvorak
+Free version: No
+Price: €50
+
+ - Create custom folders for databases, stored procedures, tables, views and user defined functions
+ - Drag&Drop objects in folders
+ - Management interface for bulk folder operations
+ - Ctrl+click command to alter SQL object
+ - Seamless sharing with other team members
+ - Bulk folders creation
+ - Dynamic folders
+
+
+
+## ApexSQL Complete
Download page: [ApexSQL Complete]
-Release date: 2015-09-04
-Support Version: 2008/2012/2014/2016
-Free version: Yes
+Release date: 2017-10-26
+Support Version: 2008-2017
+Developer: ApexSQL tools
+Free version: Yes
+Price: No
-With ApexSQL Complete you can:
- Automatically complete SQL statements
- - Review an object's script and description
+ - Review an objects script and description
- Improve productivity with snippets
- Identify the structure of complex SQL queries
- Keep track of all your tabs
@@ -180,11 +266,14 @@ With ApexSQL Complete you can:
- Check queries in test mode
-## ApexSQL Refactor
+
+## ApexSQL Refactor
Download page: [ApexSQL Refactor]
-Release date: 2015-12-11
-Support Version: 2008/2012/2014/2016
-Free version: Yes
+Release date: 2017-05-08
+Support Version: 2008-2017
+Developer: ApexSQL tools
+Free version: Yes
+Price: No
With ApexSQL Refactor you can:
- Format SQL with over 160 options
@@ -197,11 +286,14 @@ With ApexSQL Refactor you can:
- Locate & highlight unused variables
-## ApexSQL Search
+
+## ApexSQL Search
Download page: [ApexSQL Search]
-Release date: 2015-09-04
-Support Version: 2008/2012/2014
-Free version: Yes
+Release date: 2017-06-19
+Support Version: 2008-2017
+Developer: ApexSQL tools
+Free version: Yes
+Price: No
With ApexSQL Search you can:
- Search for SQL objects
@@ -212,11 +304,14 @@ With ApexSQL Search you can:
- Rename SQL objects safely
-## ApexSQL Source Control
+
+## ApexSQL Source Control
Download page: [ApexSQL Source Control]
-Release date: 2015-04-27
-Support Version: 2008/2012/2014
-Free version: No
+Release date: 2017-10-12
+Support Version: 2008-2017
+Developer: ApexSQL tools
+Free version: No
+Price: $299
- Integrate SQL source control directly into SSMS
- Use dedicated or shared development models
@@ -228,11 +323,33 @@ Free version: No
- Create and apply label from source control
-## Spotlight Developer
+
+## ApexSQL Unit Test
+Download page: [ApexSQL Unit Test]
+Release date: 2017-08-22
+Support Version: 2008-2017
+Developer: ApexSQL tools
+Free version: No
+Price: $499
+
+ - Integrate SQL unit testing directly into SSMS
+ - Install and manage [tSQLt](http://tsqlt.org/) from multiple sources
+ - Create and organize test classes
+ - Automate test execution using the CLI
+ - Create and organize unit tests
+ - Write tests using T-SQL
+ - Run tests with a single click
+ - Manage all tests with a single form
+
+
+
+## Spotlight Developer
Download page: [Spotlight Developer]
Release date: 2016-02-14
-Support Version: 2008/2012/2014
-Free version: Yes
+Support Version: 2008-2014
+Developer: Spotlight Essentials
+Free version: Yes
+Price: No
Users of SQL Server Management Studio can monitor all their connections via a heatmap, alarms list and realtime diagnostics for FREE.
Once installed and configured, users can monitor their connections immediately.
@@ -243,42 +360,54 @@ This makes it possible for you to take advantage of data collections for all you
You also get a FREE System health Check, Performance Health Analysis and comprehensive information about your most expensive queries.
-## dbForge Source Control
+
+## dbForge Source Control
Download page: [dbForge Source Control]
-Release date: 2015-12-22
-Support Version: 2008/2012/2014
-Free version: No
+Release date: 2018-12-21
+Support Version: 2005-2018
+Developer: Devart
+Free version: No
+Price: $249
dbForge Source Control for SQL Server is a powerful SSMS add-in for managing SQL Server database changes in source control.
The tool can link your databases to all popular source control systems, and delivers smooth and clear workflow in a familiar interface.
-## dbForge Unit Test
+
+## dbForge Unit Test
Download page: [dbForge Unit Test]
-Release date: 2015-12-04
-Support Version: 2008/2012/2014
-Free version: No
+Release date: 2018-12-21
+Support Version: 2005-2018
+Developer: Devart
+Free version: No
+Price: $199
An intuitive and convenient GUI for implementing automated unit testing in SQL Server Management Studio.
The tool is based on the open-source tSQLt framework, so SQL developers can now benefit from writing unit tests in regular T-SQL.
dbForge Unit Test for SQL Server functionality allows you to develop stable and reliable code that can be properly regression tested at the unit level.
-## dbForge Data Pump
+
+## dbForge Data Pump
Download page: [dbForge Data Pump]
-Release date: 2015-12-04
-Support Version: 2008/2012/2014
-Free version: No
+Release date: 2018-12-21
+Support Version: 2008-2018
+Developer: Devart
+Free version: No
+Price: $149
-dbForge Data Pump for SQL Server is an SSMS add-in for filling SQL databases with external source data and migrating data between systems.
-The tool supports 10+ widely used data formats and includes a number of advanced options and templates for recurring scenarios.
+dbForge Data Pump is an SSMS add-in for filling SQL databases with external source data and migrating data between systems.
+The tool supports import and export from 10+ widely used data formats (Text, MS Excel, XML, CSV, JSON etc.) and includes a number of advanced options and templates for recurring scenarios.
-## dbForge Index Manager
+
+## dbForge Index Manager
Download page: [dbForge Index Manager]
-Release date: 2015-11-30
-Support Version: 2008/2012/2014
-Free version: No
+Release date: 2018-12-21
+Support Version: 2008-2018
+Developer: Devart
+Free version: No
+Price: $99
dbForge Index Manager for SQL Server is a handy SSMS add-in for analyzing the status of SQL indexes and fixing issues with index fragmentation.
The tool allows you to quickly collect index fragmentation statistics and detect databases that require maintenance.
@@ -286,42 +415,234 @@ You can instantly rebuild and reorganize SQL indexes in visual mode or generate
dbForge Index Manager for SQL Server will significantly boost SQL Server performance without much effort.
-## dbForge Object Search
-Download page: [dbForge Object Search]
-Release date: 2015-11-30
-Support Version: 2008/2012/2014
-Free version: Yes
+
+## dbForge Search
+Download page: [dbForge Search]
+Release date: 2018-12-21
+Support Version: 2008-2018
+Developer: Devart
+Free version: Yes
+Price: No
dbForge Object Search for SQL Server is a FREE add-in for SQL Server Management Studio that allows you to search SQL objects and data in your databases.
It can be very difficult to find a required table or to remember names of your stored routines, when a database contains lots of objects.
With dbForge Object Search for SQL Server you no longer need to look through the entire SSMS Object Explorer to find a required object.
-## dbForge SQL Complete
+
+## dbForge Monitor
+Download page: [dbForge Monitor]
+Release date: 2018-12-21
+Support Version: 2008-2018
+Developer: Devart
+Free version: Yes
+Price: No
+
+ - The Overview tab of the tool allows you to see what actually happens at your SQL Server from various angles.
+ - With the IO data tab of the tool, you can easily view statistics of the read and write operations for each database file.
+ - The Wait Stats tab, you can identify the resources that slow down the server. It shows the list of waiting tasks encountered by execution threads because resources required for the request fulfillment were busy or not available.
+ - dbForge Monitor includes an SQL query performance analyzer that allows you to detect and optimize the most expensive queries that overload the system. Apart from the list of the poorly performing queries, the tool shows the query text and query profiling data that can help you to rewrite a query in the most productive way.
+
+
+
+## dbForge SQL Complete
Download page: [dbForge SQL Complete]
-Release date: 2015-09-16
-Support Version: 2008/2012/2014
-Free version: No
+Release date: 2018-12-21
+Support Version: 2000-2018
+Developer: Devart
+Free version: Yes
+Price: $149
dbForge SQL Complete provides a wide range of code completion features that relieve users from remembering long and complex object names,
column names, SQL operators, etc., but instead allows concentrating on writing high-quality SQL code with proper formatting that is easy to understand and interpret.
-## SoftTree SQL Assistant
+
+## SoftTree SQL Assistant
Download page: [SoftTree SQL Assistant]
Release date: 2016-03-18
-Support Version: 2008/2012/2014
-Free version: No/$178.80
+Support Version: 2008-2014
+Developer: SoftTree
+Free version: No
+Price: $179
SQL Assistant equips database developers and DBAs with the productivity tools they need to speed up the database development process, improve code quality and accuracy.
+
+## SQL Enlight for SSMS
+Download page: [SQL Enlight for SSMS]
+Release date: 2016-04-25
+Support Version: 2008-2014
+Developer: UbitSoft
+Free version: No
+Price: $195
+
+ - Advanced static analysis
+ - T-SQL code formatting
+ - Statements history
+ - Validate T-SQL code for syntax errors
+ - Script Summary
+ - Refactoring
+ - Continuous integration support
+
+
+
+## SQL Hunting Dog
+Download page: [SQL Hunting Dog]
+Release date: 2016-03-03
+Support Version: 2008-2014
+Developer: Alex Maslyukov
+Free version: Yes
+Price: No
+
+ - Quickly find tables, stored procedure, functions and views
+ - Completely removes the pain of clunky Object Explorer
+ - Switch between different servers and databases
+ - Perform common operation (select data, modify table, design table, etc.) with ease
+
+
+
+## Poor Mans T-SQL Formatter
+Download page: [Poor Mans T-SQL Formatter]
+Release date: 2013-10-23
+Support Version: 2008-2012
+Developer: Tao Klerks
+Free version: Yes
+Price: No
+
+This formatter does implement a high-level SQL tokenizer and parser, but the granularity of the parser is not very high.
+It does not distinguish between different types of DML, it does not parse full expression trees, etc - there's a lot it doesn't do, it just does the bare minimum to support the target formatting.
+
+
+
+## Tabs Studio
+Download page: [Tabs Studio]
+Release date: 2017-08-24
+Support Version: 2012-2017
+Developer: Vlasov Studio
+Free version: No
+Price: $49
+
+Tabs Studio is a Visual Studio and SSMS extension empowering you to work comfortably with any number of open documents.
+
+ - Multiple rows of tabs
+ - Tab grouping
+ - Tab coloring
+ - Title transformation
+ - Keyboard navigation
+ - Flexible behavior
+ - Customizable presentation
+ - Extensibility API
+
+
+
+## Workload Addin
+Download page: [Workload Addin]
+Release date: 2017-02-07
+Support Version: 2008-2012
+Developer: Tomáš Bauer
+Free version: Yes
+Price: No
+
+There are tools in SQL Server that allow to collect SQL statements for a certain period.
+The problem of these tools is that the amount of data recorded in this way may not be small and that the recorded data requires further processing.
+Also, work with these tools may not be easy.
+This article describes a tool that solves the problem described above.
+This tool can automatically collect information about executed SQL statements and it does their analysis and stores the required information in a custom SQL database, avoiding unnecessary or duplicate SQL statements being stored.
+
+
+
+## SQL Server Diagnostics
+Download page: [SQL Server Diagnostics]
+Release date: 2017-06-22
+Support Version: 2016-2017
+Developer: Microsoft
+Free version: Yes
+Price: No
+
+SQL Server Diagnostics is a collection of micro-services which enables SQL Server customers to self-help and debug SQL Server issues related to memory dumps and receive recommended fixes for their issues.
+
+
+
+## VersionSQL
+Download page: [VersionSQL]
+Release date: 2017-02-16
+Support Version: 2012-2017
+Developer: VersionSQL
+Free version: Yes
+Price: $149
+
+Lightweight add-in to connect your databases to your source control system
+
+
+
+## Spotlight Tuning Pack
+Download page: [Spotlight Tuning Pack]
+Release date: 2018-06-01
+Support Version: 2012-2017
+Developer: Quest Software Inc
+Free version: Yes
+Price: $180
+
+Powerful SQL optimization and query plan analysis.
+The analysis will indicate whether the Query Plan can be tuned to improve performance, or whether the SQL Statement can be rewritten to optimize its efficiency.
+
+
+
+## Michel Max - SSMS Tools
+Download page: [Michel Max - SSMS Tools]
+Release date: 2018-11-16
+Support Version: 2012-2018
+Developer: Michel Max
+Free version: Yes
+Price: No
+
+ - Format SQL Code.
+ - Prepare the Procedures/Functions to be called.
+ - Regions to organize the code.
+ - Retrieve the complete Information of a Table.
+ - Tab Colorize, base in the configuration window you can colorize the existing session based in the filters that you applied, making easy to the developer to identify each server/database he/she is working on.
+ - Selection Highlight for the same word in the SQL Code.
+ - Style Markers for the same word in the SQL Code.
+ - Configurable CRUD creation.
+ - Copy/Paste Table Structure and Data (Client Side).
+ - Grid Search, with advanced Extended and Regular Expression.
+ - Grid Search Highlight.
+ - Grid Style Markers.
+ - Grid Export to JSON, Excel XML.
+ - Grid Image Capture.
+ - Configurable Header Text Template, with quick insert, so you can easily sign you codes.
+ - Quick encapsulate code in region.
+
+Other versions:
+ - https://sourceforge.net/projects/michelmaxssmstools2012/
+ - https://sourceforge.net/projects/michelmaxssmstools2014/
+ - https://sourceforge.net/projects/michelmaxssmstools2016/
+ - https://sourceforge.net/projects/michelmaxssmstools2017/
+ - https://sourceforge.net/projects/michelmaxssmstools2019/
+
+
+
+## SSMS Schema Folders
+Download page: [SSMS Schema Folders]
+Release date: 2018-10-06
+Support Version: 2012-2018
+Developer: Michel Max
+Free version: Yes
+Price: No
+
+This an extension for SQL Server Management Studio 2012, 2014, 2016 and 17.
+It groups sql objects in Object Explorer (tables, views, etc.) into schema folders.
+
+
[SSMSBoost]:http://www.ssmsboost.com/
-[SQL Code Guard]:http://sqlcodeguard.com/
+[SqlSmash]:http://www.sqlsmash.com/
+[Red Gate SQL Code Guard]:https://www.red-gate.com/products/sql-development/sql-code-guard/
[SQL Search]:http://www.red-gate.com/products/sql-development/sql-search/
-[SQL Scripts Manager]:http://www.red-gate.com/products/dba/sql-scripts-manager/
[Red Gate SQL Test]:http://www.red-gate.com/products/sql-development/sql-test/
-[Supratimas]:http://www.supratimas.com/addin/buy.html
+[Red Gate SQL Source Control]:http://www.red-gate.com/products/sql-development/sql-source-control/
+[Supratimas]:http://www.supratimas.com/Home/Downloads
[dbForge SQL Complete]:https://www.devart.com/dbforge/sql/sqlcomplete/ordering.html
[SSMS Tools Pack]:http://www.ssmstoolspack.com/Features
[SQL Pretty Printer]:http://www.excel-sql-server.com/excel-sql-server-import-export-using-excel-add-ins.htm
@@ -332,10 +653,27 @@ SQL Assistant equips database developers and DBAs with the productivity tools th
[ApexSQL Refactor]:https://www.apexsql.com/sql_tools_refactor.aspx
[ApexSQL Search]:https://www.apexsql.com/sql_tools_search.aspx
[ApexSQL Source Control]:https://www.apexsql.com/sql_tools_source_control.aspx
+[ApexSQL Unit Test]:https://www.apexsql.com/sql_tools_unit_test.aspx
[Spotlight Developer]:https://www.spotlightessentials.com/spotlight-developer
[dbForge Source Control]:https://www.devart.com/dbforge/sql/source-control/
[dbForge Unit Test]:https://www.devart.com/dbforge/sql/unit-test/
[dbForge Data Pump]:https://www.devart.com/dbforge/sql/data-pump/
[dbForge Index Manager]:https://www.devart.com/dbforge/sql/index-manager/
-[dbForge Object Search]:https://www.devart.com/dbforge/sql/search/
+[dbForge Search]:https://www.devart.com/dbforge/sql/search/
+[dbForge Monitor]:https://www.devart.com/dbforge/sql/monitor/
+[dbForge SQL Complete]:https://www.devart.com/dbforge/sql/sqlcomplete/
[SoftTree SQL Assistant]:http://www.softtreetech.com/isql.htm
+[SQL Enlight for SSMS]:http://www.ubitsoft.com/products/sqlenlight-for-ssms/index.php
+[SQL Hunting Dog]:http://www.sql-hunting-dog.com/
+[Poor Mans T-SQL Formatter]:http://architectshack.com/PoorMansTSqlFormatter.ashx
+[Tabs Studio]:https://tabsstudio.com
+[Workload Addin]:https://www.codeproject.com/Articles/1188027/Capture-of-a-Typical-SQL-Server-Database-Workload
+[SQL Server Diagnostics]:https://blogs.msdn.microsoft.com/sql_server_team/sql-server-diagnostics-preview/
+[VersionSQL]:https://www.versionsql.com/
+[Spotlight Tuning Pack]:https://www.spotlightcloud.io/spotlight-cloud-tuning-pack
+[Michel Max - SSMS Tools]:https://sourceforge.net/projects/michelmaxssmstools2017/
+[SSMS Schema Folders]:https://github.com/nicholas-ross/SSMS-Schema-Folders
+
+[SQL_Search Download]:https://download.red-gate.com/SQL_Search.exe
+[Apex SQL Search Download]:https://www.apexsql.com/zips/ApexSQLSearch.exe
+[DbForge Search Download]:https://www.devart.com/dbforge/sql/search/searchsql22std.exe
diff --git a/SSMS/SSMS_Errors.md b/SSMS/SSMS_Errors.md
new file mode 100644
index 00000000..5a2bb310
--- /dev/null
+++ b/SSMS/SSMS_Errors.md
@@ -0,0 +1,12 @@
+# SSMS known errors and bugs
+
+ - [What to Do When You Get a "Cache is Out of Date" Error Message](https://www.databasejournal.com/features/mssql/what-to-do-when-you-get-a-cache-is-out-of-date-error-message.html)
+ - [CTRL+R does not hide the Query Result window in SSMS](https://stackoverflow.com/questions/17068661/ctrlr-does-not-hide-the-query-result-window-in-ssms)
+ - [SQL SERVER – Unable to Launch SSMS Error – Cannot Find One or More Components. Please Reinstall the Application](https://blog.sqlauthority.com/2017/12/06/sql-server-unable-launch-ssms-error-cannot-find-one-components-please-reinstall-application/)
+ - [Object Reference Not Set to an Instance of an Object’ When Failing Over an Availability Group Using SSMS <= 17.5](https://sqlundercover.com/2018/03/29/object-reference-not-set-to-an-instance-of-an-object-when-failing-over-an-availability-group-using-ssms-17-5/)
+ - [File Growth Rate – The GUI Lies](https://sqlrus.com/2018/06/file-growth-rate-the-gui-lies/)
+ - [SSMS: Allow forcing case-insensitive matching in Object Explorer filters](https://feedback.azure.com/forums/908035-sql-server/suggestions/36679522-ssms-allow-forcing-case-insensitive-matching-in-o)
+ - [SSMS: Object Explorer Filtering allows for SQL Injection (oops)](https://feedback.azure.com/forums/908035-sql-server/suggestions/36678803-ssms-object-explorer-filtering-allows-for-sql-inj)
+ - [SSMS won't open scripts on double-click](https://stackoverflow.com/q/1726577/2298061)
+ - [SSMS Crash While Using Backup to URL or Connecting to Storage](https://blog.sqlauthority.com/2018/10/09/sql-server-sql-server-management-studio-crash-while-using-backup-to-url-or-connecting-to-storage/)
+ - [Error in SSMS: Attempted to read or write protected memory.](https://sqlstudies.com/2019/02/18/error-in-ssms-attempted-to-read-or-write-protected-memory/)
diff --git a/SSMS/SSMS_Shortcuts.md b/SSMS/SSMS_Shortcuts.md
index 47bb56e1..e7a0c1e8 100644
--- a/SSMS/SSMS_Shortcuts.md
+++ b/SSMS/SSMS_Shortcuts.md
@@ -1,13 +1,15 @@
# SQL Server Management Studio Keyboard Shortcuts
Source Links:
- - [MSDN SQL Server Management Studio Keyboard Shortcuts](https://msdn.microsoft.com/en-us/library/ms174205.aspx)
- - [MSDN Customize Menus and Shortcut Keys](https://msdn.microsoft.com/en-us/library/ms174178.aspx)
+ - [SQL Server Management Studio Keyboard Shortcuts](https://docs.microsoft.com/en-us/sql/ssms/sql-server-management-studio-keyboard-shortcuts)
+ - [Customize Menus and Shortcut Keys](https://docs.microsoft.com/en-us/sql/ssms/customize-menus-and-shortcut-keys)
+ - [Shortcuts Cheat Sheet SSMS & Windows](https://www.am2.co/2016/03/shortcuts-cheat-sheet/)
+ - [SSMS: The Query Window Keyboard Shortcuts](https://www.red-gate.com/simple-talk/wp-content/uploads/imported/1307-keystrokes.htm)
SQL Server Management Studio offers users two keyboard schemes. By default, it uses the SQL Server 2016 scheme, with keyboard shortcuts based on Microsoft Visual Studio 2010. Management Studio also offers a keyboard scheme similar to the standard scheme from SQL Server 2008 R2. To change the keyboard scheme or add additional keyboard shortcuts, on the **Tools** menu, click **Options**. Select the desired keyboard scheme on the Environment, Keyboard page.
-## Menu Activation Keyboard Shortcuts
+## Menu Activation Keyboard Shortcuts
| Action | SQL Server 2016 | SQL Server 2008 R2 |
|-----------------------------------------------------------------------------------------|------------------------|--------------------|
diff --git a/SSMS/SSMS_Snippets/Procedure_dynamic_create.sql b/SSMS/SSMS_Snippets/Procedure_dynamic_create.sql
index a9f904ca..637d9cc9 100644
--- a/SSMS/SSMS_Snippets/Procedure_dynamic_create.sql
+++ b/SSMS/SSMS_Snippets/Procedure_dynamic_create.sql
@@ -1,17 +1,17 @@
-DECLARE @procedureName SYSNAME = 'dbo.usp_PrintDebug';
-DECLARE @tsqlCommand VARCHAR(MAX) = '';
-
-SET @tsqlCommand = 'IF OBJECT_ID(''' + @procedureName + ''', ''P'') IS NULL EXECUTE (''CREATE PROCEDURE ' + @procedureName + ' as select 1'');
-GO
-
-ALTER PROCEDURE ' + @procedureName + '
-
-AS
-
-BEGIN
-
-SELECT 1
-
-END;'
-
+DECLARE @procedureName SYSNAME = 'dbo.usp_PrintDebug';
+DECLARE @tsqlCommand VARCHAR(MAX) = '';
+
+SET @tsqlCommand = 'IF OBJECT_ID(''' + @procedureName + ''', ''P'') IS NULL EXECUTE (''CREATE PROCEDURE ' + @procedureName + ' as select 1'');
+GO
+
+ALTER PROCEDURE ' + @procedureName + '
+
+AS
+
+BEGIN
+
+SELECT 1
+
+END;'
+
PRINT @tsqlCommand;
\ No newline at end of file
diff --git a/SSMS/SSMS_Snippets/loop.sql b/SSMS/SSMS_Snippets/loop.sql
index 4747f310..20ad7eb4 100644
--- a/SSMS/SSMS_Snippets/loop.sql
+++ b/SSMS/SSMS_Snippets/loop.sql
@@ -1,18 +1,18 @@
-DECLARE @startLoop INTEGER = 1960;
-DECLARE @endLoop INTEGER = 2012;
-DECLARE @columnMask NVARCHAR( 1000 ) = '';
-DECLARE @columns NVARCHAR( MAX ) = '';
-DECLARE @step INTEGER = 1;
-DECLARE @debug BIT = 0;
-
-WHILE( @startLoop <= @endLoop )
-BEGIN
- SET @columns = @columns + QUOTENAME( @columnMask + CAST( @startLoop AS NVARCHAR ) ) + ',';
- IF @debug = 1
- PRINT @columns;
- SET @startLoop = @startLoop + @step;
- IF @debug = 1
- PRINT @startLoop;
-END
-
+DECLARE @startLoop INTEGER = 1960;
+DECLARE @endLoop INTEGER = 2012;
+DECLARE @columnMask NVARCHAR( 1000 ) = '';
+DECLARE @columns NVARCHAR( MAX ) = '';
+DECLARE @step INTEGER = 1;
+DECLARE @debug BIT = 0;
+
+WHILE( @startLoop <= @endLoop )
+BEGIN
+ SET @columns = @columns + QUOTENAME( @columnMask + CAST( @startLoop AS NVARCHAR ) ) + ',';
+ IF @debug = 1
+ PRINT @columns;
+ SET @startLoop = @startLoop + @step;
+ IF @debug = 1
+ PRINT @startLoop;
+END
+
PRINT LEFT( @columns, LEN( @columns ) - 1 );
\ No newline at end of file
diff --git a/SSMS/SSMS_Tips.md b/SSMS/SSMS_Tips.md
new file mode 100644
index 00000000..6a314aaf
--- /dev/null
+++ b/SSMS/SSMS_Tips.md
@@ -0,0 +1,796 @@
+# SQL Server Management Studio Tips
+Most tips works for SSMS higher 2008 but some of them only works for SSMS 2016 and above
+
+## Road map
+ - [ ] https://blogs.technet.microsoft.com/dataplatforminsider/2018/02/20/whats-new-in-ssms-17-5-data-discovery-and-classification/
+ - [ ] https://bertwagner.com/2018/02/27/splitting-it-up-easy-side-by-side-queries-in-ssms/
+ - [ ] https://sqlrus.com/2018/03/ssms-output-window/
+ - [ ] https://www.sqlshack.com/whats-new-in-ssms-17-5-data-discovery-and-classification-and-more/
+ - [ ] Add gifs or images for all tips
+ - [ ] Add some tips from excellent ebook http://insiders.sqldownunder.com/ssms-tips-and-tricks/
+ - [ ] Add Memory Optimiser Advisor tip https://www.red-gate.com/simple-talk/sql/t-sql-programming/converting-database-memory-oltp/
+ - [ ] Add Removing Connections from the SSMS connection dialog https://blog.waynesheffield.com/wayne/archive/2018/05/removing-servers-ssms-connection-dialog/
+ - [ ] Add Save the Connection String Parameters http://www.sqlservercentral.com/blogs/sql-geek/2018/07/26/save-the-connection-string-parameters-in-ssms-alwayson/
+ - [ ] Analyze Actual Execution Plan https://www.scarydba.com/2018/08/06/analyze-actual-execution-plan/
+ - [ ] Compare Actual Execution Plans
+ - [ ] [Database Upgrade using the Query Tuning Assistant wizard in SSMS 18](https://www.sqlshack.com/database-upgrade-using-the-query-tuning-assistant-wizard-in-ssms-18/)
+ - [ ] [Export Data From SSMS Query to Excel](https://blog.sqlauthority.com/2019/01/16/sql-server-export-data-from-ssms-query-to-excel/)
+ - [ ] [Starting SSMS with a specific connection and script file](http://dbamastery.com/tips/ssms-cmdline-utility/)
+
+Content:
+1. [Import and Export Settings](#1)
+2. [SSMS Shortcuts](#2)
+3. [Keyboard Shortcuts for Favorite Stored Procedures](#3)
+4. [SSMS Scripting Option](#4)
+5. [Selecting a block of text using the ALT Key](#5)
+6. [Script Table and Column Names by Dragging from Object Explorer](#6)
+7. [Disable Copy of Empty Text](#7)
+8. [Client Statistics](#8)
+9. [Configure Object Explorer to Script Compression and Partition Schemes for Indexes](#9)
+10. [Using GO X to Execute a Batch or Statement Multiple Times](#10)
+11. [SSMS Template Replacement](#11)
+12. [Color coding of connections](#12)
+13. [SQLCMD mode](#13)
+14. [Script multiple objects using the Object Explorer Details Windows](#14)
+15. [Registered Servers / Central Management Server](#15)
+16. [Splitting the Query Window and Annotations and Map Mode for Vertical Scroll Bar](#16)
+17. [Moving columns in the results pane](#17)
+18. [Generating Charts and Drawings in SQL Server Management Studio](#18)
+19. [Additional Connection Parameters](#19)
+20. [Working with tabs headers](#20)
+21. [Hiding tables in SSMS Object Explorer](#21)
+22. [UnDock Tabs and Windows for Multi Monitor Support](#22)
+23. [RegEx-Based Finding and Replacing of Text in SSMS](#23)
+24. [Changing what SSMS opens on startup](#24)
+25. [Modifying New Query Template](#25)
+26. [Query Execution Options](#26)
+27. [SQL Server Diagnostics Extension](#27)
+28. [Connect to SQL Servers in another domain using Windows Authentication](#28)
+29. [SSMS Default Reports](#29)
+30. [Live Query Statistics](#30)
+31. [Searching in Showplan](#31)
+32. [Object Explore Details](#32)
+33. [Working with Azure SQL](#33)
+34. [Using Extended Events and Profiler in SSMS](#34)
+35. [Vulnerability Assessment in SSMS](#35)
+36. [Import Flat File to SQL Wizard](#36)
+37. [Reference](#reference)
+
+
+Great thanks to:
+ - Kendra Little ([b](http://www.littlekendra.com/) | [t](https://twitter.com/Kendra_Little))
+ - Slava Murygin ([b](http://slavasql.blogspot.ru/))
+ - Mike Milligan ([b](http://www.bidn.com/Blogs/userid/43/author/mike-milligan))
+ - Kenneth Fisher ([b](https://twitter.com/sqlstudent144) | [t](https://twitter.com/sqlstudent144))
+ - William Durkin ([b](http://www.williamdurkin.com/) | [t](https://twitter.com/sql_williamd))
+ - John Morehouse ([b](http://sqlrus.com/) | [t](http://twitter.com/sqlrus))
+ - Phil Factor ([b](https://www.red-gate.com/simple-talk/author/phil-factor/) | [t](https://twitter.com/phil_factor))
+ - Klaus Aschenbrenner ([b](https://www.sqlpassion.at/) | [t](https://twitter.com/Aschenbrenner))
+ - Latish Sehgal ([b](http://www.dotnetsurfers.com/))
+ - Arvind Shyamsundar ([b](https://blogs.msdn.microsoft.com/arvindsh/))
+ - [SQLMatters](http://www.sqlmatters.com/)
+ - [MSSQLTips](https://www.mssqltips.com/)
+ - Anthony Zanevsky, Andrew Zanevsky and Katrin Zanevsky
+ - Andy Mallon ([b](http://www.am2.co/) | [t](https://twitter.com/AMtwo))
+ - Aaron Bertrand ([b](http://sqlperformance.com/author/abertrand) | [t](https://twitter.com/AaronBertrand))
+ - Daniel Calbimonte ([b](https://www.sqlshack.com/author/daniel-calbimonte/) | [t](https://twitter.com/dcalbimonte))
+ - Ahmad Yaseen ([b](https://www.sqlshack.com/author/ahmad-yaseen/) | [t](https://twitter.com/AhmadZYaseen))
+ - Solomon Rutzky ([b](https://sqlquantumleap.com/) | [t](https://twitter.com/SqlQuantumLeap))
+ - Bert Wagner ([b](https://blogs.sentryone.com) | [t](https://twitter.com/bertwagner))
+ - Thomas LaRock ([b](https://thomaslarock.com/) | [t](https://twitter.com/SQLRockstar))
+ - Jen Mccown ([b](http://www.midnightdba.com/Jen/author/jen/))
+ - Louis Davidson ([b](https://www.red-gate.com/simple-talk/author/louis-davidson/) | [t](https://twitter.com/drsql))
+
+
+
+## Import and Export Settings
+`Tools > Options > Environment > Import and Export Settings`
+
+Default settings (if you need to compare with yours) you can find here: [SSMS settings files]
+
+You can configure so many settings in SSMS and then export it and use on all your computers.
+Below link provide detailed instruction and awesome Dark theme configuration: [Making SSMS Pretty: My Dark Theme](https://blogs.sentryone.com/aaronbertrand/making-ssms-pretty-my-dark-theme/)
+
+Also you can create shared team settings file and use it from network location.
+Detailed information you can find in this article [Symbolic Links for Sharing Template Files or "How I Broke Management Studio with Symbolic Links"](http://sqlmag.com/sql-server/symbolic-links-sharing-template-files-or-how-i-broke-management-studio-symbolic-links)
+
+
+
+
+
+## SSMS Shortcuts
+All shortcuts you can find [here](https://github.com/ktaranov/sqlserver-kit/blob/master/SSMS/SSMS_Shortcuts.md)
+Known problem for SSMS 2012 and 2014: [CTRL+R does not hide the Query Result window in SSMS]
+
+Create custom shortcut as simple as possible:
+1. `Tools > Options > Environment > Keyboard`
+2. Use the search bar `Show Commands Containing` to find and select the command.
+3. In `Press Shortcut Keys`, press the shortcut combination you want to use.
+4. Click `Assign`. If you don’t click `Assign`, and just click `OK`, your shortcut won’t be assigned.
+5. Click `OK`. (Note that some shortcut changes take effect in query windows you open after the change.)
+More details here: [MANAGEMENT STUDIO SHORTCUT – CHANGE CONNECTION](http://www.midnightdba.com/Jen/2018/03/management-studio-shortcut-change-connection/)
+
+Most useful are:
+
+| Shortcut | Description |
+|-----------------------|----------------------------------------|
+| `Ctrl + U` | Change Selected Database |
+| `Ctrl + R` | Toggle Results Pane |
+| `Ctrl + Space` | Activate Autocomplete |
+| `Ctrl + Shift + V` | [Cycle through clipboard ring] |
+| `Ctrl + ]` | Navigate to matching parenthesis |
+| `Ctrl + –` | Navigate to last cursor location |
+| `Ctrl + Shift + –` | Navigate forward to cursor location |
+| `Ctrl + K, Ctrl + C` | Comments selected text |
+| `Ctrl + K, Ctrl + U` | Uncomments selected text |
+| `Ctrl + K, Ctrl + K` | Toggle Bookmark |
+| `Ctrl + K, Ctrl + N` | Go to Next Bookmark |
+| `Ctrl + L` | Display Estimated Query Execution plan |
+| `Shift + Alt + Enter` | View Code Editor in Full Screen |
+| `Ctrl + I` | Quick Search |
+| `Ctrl + F4` | Close the current MDI child window |
+| `Ctrl + F5` | Parse query to check for errors |
+| `Shift + F10` | Simulate right mouse button |
+| `Ctrl + Alt + T` | Display Template Explorer |
+| `Ctrl + Shift + M` | Specify values for template parameters |
+| `Ctrl + Shift + R` | Refresh local cache |
+| `Ctrl + Alt + S` | Include Client Statistics |
+
+
+
+## Keyboard Shortcuts for Favorite Stored Procedures
+`Tools > Options > Environment > Keyboard > Query Shortcuts`
+
+
+
+3 Shortcuts can not be changed: `Alt + F1`, `Ctrl + 1` and `Ctrl + 2`.
+For another 9 shortcuts my recommendation awesome open source Brent Ozar teams procedures and with some limitations Adam Machanic `sp_WhoIsActive`:
+
+| Query Shortcut | Stored Procedure |
+|----------------|----------------------|
+| `Alt + F1` | [sp_help] |
+| `Ctrl + F1` | [sp_WhoIsActive] |
+| `Ctrl + 1` | [sp_who] |
+| `Ctrl + 2` | [sp_lock] |
+| `Ctrl + 3` | [sp_Blitz] |
+| `Ctrl + 4` | [sp_BlitzCache] |
+| `Ctrl + 5` | [sp_BlitzWho] |
+| `Ctrl + 6` | [sp_BlitzQueryStore] |
+| `Ctrl + 7` | [sp_BlitzFirst] |
+| `Ctrl + 8` | [usp_BulkUpload] |
+| `Ctrl + 9` | [sp_BlitzTrace] |
+| `Ctrl + 0` | [sp_foreachdb] |
+
+Also recommended:
+ - [sp_BlitzRS]
+ - [sp_DatabaseRestore]
+ - [usp_BulkUpload]
+
+[sp_help]:https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-help-transact-sql
+[sp_who]:https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-who-transact-sql
+[sp_lock]:https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-lock-transact-sql
+[sp_WhoIsActive]:http://whoisactive.com
+[sp_Blitz]:https://github.com/BrentOzarULTD/SQL-Server-First-Responder-Kit/blob/dev/sp_Blitz.sql
+[sp_BlitzBackups]:https://github.com/BrentOzarULTD/SQL-Server-First-Responder-Kit/blob/dev/sp_BlitzBackups.sql
+[sp_BlitzCache]:https://github.com/BrentOzarULTD/SQL-Server-First-Responder-Kit/blob/dev/sp_BlitzCache.sql
+[sp_BlitzFirst]:https://github.com/BrentOzarULTD/SQL-Server-First-Responder-Kit/blob/dev/sp_BlitzFirst.sql
+[sp_BlitzIndex]:https://github.com/BrentOzarULTD/SQL-Server-First-Responder-Kit/blob/dev/sp_BlitzIndex.sql
+[sp_BlitzQueryStore]:https://github.com/BrentOzarULTD/SQL-Server-First-Responder-Kit/blob/dev/sp_BlitzQueryStore.sql
+[sp_BlitzRS]:https://github.com/BrentOzarULTD/SQL-Server-First-Responder-Kit/blob/dev/sp_BlitzRS.sql
+[sp_BlitzTrace]:https://github.com/BrentOzarULTD/SQL-Server-First-Responder-Kit/blob/dev/sp_BlitzTrace.sql
+[sp_BlitzWho]:https://github.com/BrentOzarULTD/SQL-Server-First-Responder-Kit/blob/dev/sp_BlitzWho.sql
+[sp_DatabaseRestore]:https://github.com/BrentOzarULTD/SQL-Server-First-Responder-Kit/blob/dev/sp_DatabaseRestore.sql
+[sp_foreachdb]:https://github.com/BrentOzarULTD/SQL-Server-First-Responder-Kit/blob/dev/sp_foreachdb.sql
+[usp_BulkUpload]:https://github.com/ktaranov/sqlserver-kit/blob/master/Stored_Procedure/usp_BulkUpload.sql
+
+
+
+## SSMS Scripting Option
+
+### Script any object with data
+`Right click on database name > Tasks > Generate Scripts …`
+
+
+
+### The Default Scripting Option
+In the previous SQL Server Management Studio versions, the generated script will target the latest released SQL Server version.
+In SSMS 17.2, the `Match Script Settings to Source` has been added, with the default `True` value means that the generated script will target the source SQL Server instance’s version, edition, and engine type, where the `False` value will force the scripting to behave as the previous SSMS versions.
+
+`Tools > Options > SQL Server Object Explore > Scripting > Version Options > Match Script Settings to Source`
+
+More details here: [What’s new in SQL Server Management Studio 17.2; Authentication methods, scripting options and more]
+
+
+
+## Selecting a block of text using the ALT Key
+By holding down the ALT key as you select a block of text you can control the width of the selection region as well as the number of rows.
+Also you can activate multi line mode with `Shift + Alt` keys and using keyboard arrows to format multi line code.
+
+More info and video about this awesome feature in this article: [My Favorite SSMS Shortcut (After Copy/Paste)](https://bertwagner.com/2017/11/28/multiline-edit-block-selection-alt-highlight-trick/) (by Bert Wagner)
+
+
+
+## Script Table and Column Names by Dragging from Object Explorer
+Save keystrokes by dragging
+Drag the `Columns` folder for a table in to auto-type all column names in the table in a single line.
+ - Warning: this doesn’t include [brackets] around the column names, so if your columns contain spaces or special characters at the beginning, this shortcut isn’t for you
+ - Dragging the table name over will auto-type the schema and table name, with brackets.
+
+
+
+## Disable Copy of Empty Text
+
+ - Select a block of text to copy;
+ - Move the cursor the place where you want to paste the code;
+ - Accidentally press `Ctrl+C` again instead of `Ctrl+V`;
+ - Block of copied text is replaced by an empty block;
+
+This behavior can be disabled in SSMS: go to `Tools > Options > Text Editor > All Languages > General > 'Apply Cut or Copy Commands to blank lines when there is no selection'` and uncheck the checkbox.
+
+
+
+
+
+## Client Statistics
+When you enable that option for your session (`Ctrl + Alt + S`), SQL Server Management Studio will give you more information about the client side processing of your query.
+
+The Network Statistics shows you the following information:
+ - Number of Server Roundtrips
+ - TDS Packets sent from Client
+ - TDS Packets received from Server
+ - Bytes sent from Client
+ - Bytes received from Server
+
+The Time Statistics additionally shows you the following information:
+ - Client Processing Time
+ - Total Execution Time
+ - Wait Time on Server Replies
+
+
+
+## Configure Object Explorer to Script Compression and Partition Schemes for Indexes
+Is this index compressed or partitioned?
+
+By default, you wouldn’t know just by scripting out the index from Object Explorer. If you script out indexes this way to check them into source code, or to tweak the definition slightly, this can lead you to make mistakes.
+
+You can make sure you’re aware when indexes have compression or are partitioned by changing your scripting settings:
+- Click `Tools – > Options -> SQL Server Object Explorer -> Scripting`
+- Scroll down in the right pane of options and set both of these to `True`
+ - *Script Data Compression Options*
+ - *Script Partition Schemes*
+- Click OK
+
+
+
+## Using GO X to Execute a Batch or Statement Multiple Times
+The `GO` command marks the end of a batch of statements that should be sent to SQL Server for processing, and then compiled into a single execution plan.
+By specifying a number after the `GO` the batch can be run specified number of times. This can be useful if, for instance, you want to create test data by running an insert statement a number of times. Note that this is not a Transact SQL statement and will only work in Management Studio (and also SQLCMD or OSQL). For instance the following SQL can be run in SSMS :
+
+```sql
+IF OBJECT_ID('TestData','U') IS NOT NULL DROP TABLE TestData;
+
+CREATE TABLE TestData(ID INT IDENTITY (1,1), CreatedDate DATETIME2);
+GO
+
+INSERT INTO TestData(CreatedDate) SELECT GETDATE();
+GO 10
+
+SELECT ID, CreatedDate FROM TestData;
+
+IF OBJECT_ID('TestData','U') IS NOT NULL DROP TABLE TestData;
+
+```
+
+This will run the insert statement 10 times and therefore insert 10 rows into the `TestData` table.
+In this case this is a simpler alternative than creating a cursor or while loop.
+
+
+
+## SSMS Template Replacement
+One under-used feature of Management Studio is the template replacement feature. SSMS comes with a library of templates, but you can also make your own templates for reusable scripts.
+
+In your saved .sql script, just use the magic incantation to denote the parameters for replacement. The format is simple: `