Sequence-numbering groups

  • gmrose (10/21/2010)


    Thank you again to Lutz and Wayne. I updated my script per Lutz' suggestions to use table #tmpChecks instead of table variable @tmpChecks. I made some minor adjustments to exclude about 100,000 unneeded rows. Now the script runs as desired.

    For timing, yesterday's script ran for over 23 hours and was less than 5% complete when I halted it. Today's script succussfully completed in less than 4 minutes. That's what I call a real improvement.

    gmrose

    You are processing information for a bank. You might want to post your final code so we can double check for you. πŸ™‚

    --Jeff Moden


    RBAR is pronounced "ree-bar" and is a "Modenism" for Row-By-Agonizing-Row.
    First step towards the paradigm shift of writing Set Based code:
    ________Stop thinking about what you want to do to a ROW... think, instead, of what you want to do to a COLUMN.

    Change is inevitable... Change for the better is not.


    Helpful Links:
    How to post code problems
    How to Post Performance Problems
    Create a Tally Function (fnTally)

  • gmrose (10/21/2010)


    Thank you again to Lutz and Wayne. I updated my script per Lutz' suggestions to use table #tmpChecks instead of table variable @tmpChecks. I made some minor adjustments to exclude about 100,000 unneeded rows. Now the script runs as desired.

    For timing, yesterday's script ran for over 23 hours and was less than 5% complete when I halted it. Today's script succussfully completed in less than 4 minutes. That's what I call a real improvement.

    gmrose

    Not sure if I'd be happy with that performance yet... (even without using the quirky update)

    How long does each part of the two actually take? (timing for populating the temp table and for the final select)

    Another question:

    Are you sure that your WHERE condition "ISNUMERIC(PrintedCheckNum) = 1" will actually return the results as needed? What would you do with a row holding '100E12'??

    At this point I'd really like to see the actual execution plans before making any suggestions...



    Lutz
    A pessimist is an optimist with experience.

    How to get fast answers to your question[/url]
    How to post performance related questions[/url]
    Links for Tally Table [/url] , Cross Tabs [/url] and Dynamic Cross Tabs [/url], Delimited Split Function[/url]

  • gmrose (10/21/2010)


    For timing, yesterday's script ran for over 23 hours and was less than 5% complete when I halted it. Today's script succussfully completed in less than 4 minutes. That's what I call a real improvement.

    gmrose

    Heh Jeff's gonna hate me for this but I couldn't resist it.

    400,000 rows in 15 seconds:

    IF OBJECT_ID('tempdb..#tempstore') IS NOT NULL DROP TABLE #tempstore;

    CREATE TABLE #tempstore (acct_nbr INT,

    ckid INT,

    stat varchar(10),

    Grp int);

    INSERT INTO #tempstore (acct_nbr, ckid, stat)

    SELECT 1, 101 ,'Open' UNION ALL

    SELECT 1, 102 ,'Open' UNION ALL

    SELECT 1, 103 ,'Open' UNION ALL

    SELECT 1, 104 ,'Void' UNION ALL

    SELECT 1, 105 ,'Void' UNION ALL

    SELECT 1, 106 ,'Open' UNION ALL

    SELECT 1, 107 ,'Open' UNION ALL

    SELECT 1, 108 ,'Open' UNION ALL

    SELECT 1, 109 ,'Void' UNION ALL

    SELECT 1, 110 ,'Open' UNION ALL

    SELECT 2, 101 ,'Open' UNION ALL

    SELECT 2, 102 ,'Open' UNION ALL

    SELECT 2, 103 ,'Open' UNION ALL

    SELECT 2, 104 ,'Void' UNION ALL

    SELECT 3, 105 ,'Void' UNION ALL

    SELECT 3, 106 ,'Open' UNION ALL

    SELECT 3, 107 ,'Open' UNION ALL

    SELECT 4, 108 ,'Open' UNION ALL

    SELECT 4, 109 ,'Void' UNION ALL

    SELECT 4, 110 ,'Open';

    -- 400,000 rows of data

    IF OBJECT_ID('tempdb..#temp') IS NOT NULL DROP TABLE #temp;

    CREATE TABLE #temp (acct_nbr INT,

    ckid INT,

    stat varchar(10),

    Grp int);

    INSERT INTO #temp (acct_nbr, ckid, stat)

    SELECT acct_nbr+(4*n), ckid+(20*n), stat

    FROM #tempstore

    CROSS JOIN (SELECT TOP 20000 [n] = ROW_NUMBER() OVER(ORDER BY a.[name])-1 FROM master.dbo.syscolumns a, master.dbo.syscolumns b) n

    -- copy our data to a working table

    SELECT rn = ROW_NUMBER() OVER (ORDER BY acct_nbr, ckid),

    acct_nbr, ckid, stat

    INTO #Workings

    FROM #temp

    ORDER BY acct_nbr, ckid

    CREATE UNIQUE CLUSTERED INDEX CIrn ON #Workings ([rn] ASC)

    -- get the results

    ;WITH Calculator AS (

    SELECT rn, acct_nbr, ckid, stat, NewGroup = CAST(1 AS INT)

    FROM #Workings WHERE rn = 1

    UNION ALL

    SELECT w.rn, w.acct_nbr, w.ckid, w.stat,

    NewGroup = CASE

    WHEN w.acct_nbr <> c.acct_nbr THEN 1

    WHEN w.stat <> c.stat THEN c.NewGroup + 1

    ELSE c.NewGroup END

    FROM #Workings w

    INNER JOIN Calculator c ON c.rn+1 = w.rn)

    SELECT acct_nbr, ckid, stat, NewGroup

    FROM Calculator

    OPTION( MAXRECURSION 0)

    -- 400,000 rows: 15 seconds

    β€œWrite the query the simplest way. If through testing it becomes clear that the performance is inadequate, consider alternative query forms.” - Gail Shaw

    For fast, accurate and documented assistance in answering your questions, please read this article.
    Understanding and using APPLY, (I) and (II) Paul White
    Hidden RBAR: Triangular Joins / The "Numbers" or "Tally" Table: What it is and how it replaces a loop Jeff Moden

  • Chris Morris-439714 (10/22/2010)


    Heh Jeff's gonna hate me for this but I couldn't resist it.

    400,000 rows in 15 seconds:

    Actually, I don't hate you. That's some good, solid, creative, fast code, Chris. There's just one thing... you code only displays the data. It doesn't update either table. Make it so you update one of the two tables and we'll have a drag race. πŸ™‚

    --Jeff Moden


    RBAR is pronounced "ree-bar" and is a "Modenism" for Row-By-Agonizing-Row.
    First step towards the paradigm shift of writing Set Based code:
    ________Stop thinking about what you want to do to a ROW... think, instead, of what you want to do to a COLUMN.

    Change is inevitable... Change for the better is not.


    Helpful Links:
    How to post code problems
    How to Post Performance Problems
    Create a Tally Function (fnTally)

  • Jeff Moden (10/22/2010)


    Chris Morris-439714 (10/22/2010)


    Heh Jeff's gonna hate me for this but I couldn't resist it.

    400,000 rows in 15 seconds:

    Actually, I don't hate you. That's some good, solid, creative, fast code, Chris. There's just one thing... you code only displays the data. It doesn't update either table. Make it so you update one of the two tables and we'll have a drag race. πŸ™‚

    I'm not sure I see where the requirement to update the original table comes from?

    If the results need to be persisted, simply change the SELECT into a SELECT INTO.

  • Chris Morris-439714 (10/22/2010)


    400,000 rows in 15 seconds...

    This problem isn't ideal for a SQLCLR solution because it produces the same number of rows it consumes, and there is very little calculation effort involved. Nevertheless, reusing your handy 400,000 row test data, the SQLCLR solution runs on my machine in under 700ms - and even bulk-copies its results to an output table...

    This solution uses Adam Machanic's Query Parallelizer engine, and runs on both SQL Server 2005 and 2008.

    Test Data Creation

    -- ========================================

    -- Test data creation

    -- (thanks to Chris Morris)

    -- ========================================

    USE [tempdb];

    GO

    IF OBJECT_ID (N'tempdb..#tempstore', N'U')

    IS NOT NULL

    DROP TABLE #tempstore;

    GO

    CREATE TABLE #tempstore

    (

    acct_nbr INTEGER NOT NULL,

    ckid INTEGER NOT NULL,

    stat VARCHAR(10) NOT NULL,

    );

    GO

    INSERT INTO

    #tempstore

    (acct_nbr, ckid, stat)

    SELECT 1, 101 ,'Open' UNION ALL

    SELECT 1, 102 ,'Open' UNION ALL

    SELECT 1, 103 ,'Open' UNION ALL

    SELECT 1, 104 ,'Void' UNION ALL

    SELECT 1, 105 ,'Void' UNION ALL

    SELECT 1, 106 ,'Open' UNION ALL

    SELECT 1, 107 ,'Open' UNION ALL

    SELECT 1, 108 ,'Open' UNION ALL

    SELECT 1, 109 ,'Void' UNION ALL

    SELECT 1, 110 ,'Open' UNION ALL

    SELECT 2, 101 ,'Open' UNION ALL

    SELECT 2, 102 ,'Open' UNION ALL

    SELECT 2, 103 ,'Open' UNION ALL

    SELECT 2, 104 ,'Void' UNION ALL

    SELECT 3, 105 ,'Void' UNION ALL

    SELECT 3, 106 ,'Open' UNION ALL

    SELECT 3, 107 ,'Open' UNION ALL

    SELECT 4, 108 ,'Open' UNION ALL

    SELECT 4, 109 ,'Void' UNION ALL

    SELECT 4, 110 ,'Open';

    GO

    IF OBJECT_ID(N'tempdb..##temp')

    IS NOT NULL

    DROP TABLE ##temp;

    GO

    CREATE TABLE

    ##temp

    (

    acct_nbr INTEGER NOT NULL,

    ckid INTEGER NOT NULL,

    stat VARCHAR(10) NOT NULL,

    );

    GO

    CREATE UNIQUE CLUSTERED INDEX cuq ON ##temp (acct_nbr, ckid);

    GO

    -- 400,000 rows of data

    INSERT INTO

    ##temp

    WITH (TABLOCK)

    (

    acct_nbr,

    ckid,

    stat

    )

    SELECT acct_nbr = T.acct_nbr + (4 * Numbers.n),

    ckid = T.ckid + (20 * Numbers.n),

    stat = T.stat

    FROM #tempstore T

    CROSS

    JOIN (

    SELECT TOP (20000)

    n = ROW_NUMBER()

    OVER (

    ORDER BY a.[name]

    ) - 1

    FROM master.dbo.syscolumns a,

    master.dbo.syscolumns b

    ) Numbers;

    GO

    SQLCLR security setup

    -- ========================================

    -- SQLCLR security : master database

    -- ========================================

    USE [master];

    GO

    IF EXISTS

    (

    SELECT *

    FROM sys.server_principals

    WHERE name = N'SQLCLR_Unsafe_Permission_Login'

    AND type_desc = N'CERTIFICATE_MAPPED_LOGIN'

    )

    DROP LOGIN SQLCLR_Unsafe_Permission_Login;

    GO

    IF CERT_ID('SQLCLR_Unsafe_Permission_Cert')

    IS NOT NULL

    DROP CERTIFICATE SQLCLR_Unsafe_Permission_Cert;

    GO

    CREATE CERTIFICATE SQLCLR_Unsafe_Permission_Cert

    ENCRYPTION BY PASSWORD = 'SQLCLRUnsafeCert'

    WITH SUBJECT = 'SQLCLR Unsafe Assembly Permission',

    START_DATE = '01/01/2000',

    EXPIRY_DATE = '12/31/2999';

    GO

    CREATE LOGIN SQLCLR_Unsafe_Permission_Login

    FROM CERTIFICATE SQLCLR_Unsafe_Permission_Cert;

    GO

    GRANT UNSAFE ASSEMBLY

    TO SQLCLR_Unsafe_Permission_Login;

    GO

    -- These two files must not already exist

    BACKUP CERTIFICATE SQLCLR_Unsafe_Permission_Cert

    TO FILE = 'C:\temp\SQLCLR_Unsafe.cer'

    WITH PRIVATE KEY

    (

    DECRYPTION BY PASSWORD = 'SQLCLRUnsafeCert',

    FILE = 'C:\temp\SQLCLR_Unsafe.pvk',

    ENCRYPTION BY PASSWORD = 'SQLCLRUnsafeKey'

    );

    GO

    -- ========================================

    -- SQLCLR security : tempdb

    -- ========================================

    USE [tempdb];

    GO

    IF OBJECT_ID(N'dbo.Sequence', N'FT')

    IS NOT NULL

    DROP FUNCTION dbo.Sequence;

    GO

    IF EXISTS (SELECT * FROM sys.assemblies WHERE name = N'GMRose')

    DROP ASSEMBLY GMRose;

    GO

    IF CERT_ID('SQLCLR_Unsafe_Permission_Cert')

    IS NOT NULL

    DROP CERTIFICATE SQLCLR_Unsafe_Permission_Cert;

    GO

    CREATE CERTIFICATE SQLCLR_Unsafe_Permission_Cert

    FROM FILE = 'C:\temp\SQLCLR_Unsafe.cer'

    WITH PRIVATE KEY

    (

    FILE = 'C:\temp\SQLCLR_Unsafe.pvk',

    DECRYPTION BY PASSWORD = 'SQLCLRUnsafeKey',

    ENCRYPTION BY PASSWORD = 'SQLCLRUnsafeCertPassword'

    );

    SQLCLR solution objects

    -- ========================================

    -- SQLCLR object creation

    -- ========================================

    --

    -- Uses Adam Machanic's Query Parallelizer engine

    -- See http://sqlblog.com/files/folders/beta/entry29021.aspx

    CREATE ASSEMBLY [QueryParallelizer]

    AUTHORIZATION [dbo]

    FROM 0x4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000504500004C0103008D7FC24C0000000000000000E00002210B0108000052000000060000000000006E71000000200000008000000000400000200000000200000400000000000000040000000000000000C0000000020000000000000300408500001000001000000000100000100000000000001000000000000000000000001C7100004F00000000800000900300000000000000000000000000000000000000A000000C000000607000001C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000080000000000000000000000082000004800000000000000000000002E7465787400000074510000002000000052000000020000000000000000000000000000200000602E7273726300000090030000008000000004000000540000000000000000000000000000400000402E72656C6F6300000C00000000A000000002000000580000000000000000000000000000400000420000000000000000000000000000000050710000000000004800000002000500303900003037000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001B300400E900000001000011281300000A39D80000007201000070731400000A0A066F1500000A731600000A0B07066F1700000A0772350000706F1800000A076F1900000A72A70000701F1620800000006F1A00000A186F1B00000A076F1900000A72C10000701F1620800000006F1A00000A186F1B00000A076F1C00000A26731D00000A0C08076F1900000A166F1E00000A6F1F00000A74380000016F2000000A08076F1900000A176F1E00000A6F1F00000A74380000016F2100000A08176F2200000A08166F2300000A0820C80000006F2400000A086F2500000A8001000004DE10062C06066F2600000ADC1480010000042A0000000110000002001500C3D8000A000000001A7E010000042A1E027B2700000A2A6E027B2800000A2C0B72D3000070732900000A7A02037D2700000A2A1E027B2A00000A2AAA027B2800000A2C0B723F010070732900000A7A0316300B72A7010070732900000A7A02037D2A00000A2A1E027B2B00000A2AAA027B2800000A2C0B720D020070732900000A7A0316300B726F020070732900000A7A02037D2B00000A2A1E027B2C00000A2A6E027B2800000A2C0B72CF020070732900000A7A02037D2C00000A2A1E027B2D00000A2A6E027B2800000A2C0B722D030070732900000A7A02037D2D00000A2A1E027B2E00000A2A6E027B2800000A2C0B7297030070732900000A7A02037D2E00000A2A000000133002009300000002000011021F647D2A00000A021F647D2B00000A02282F00000A0E061732060E061F20310B7205040070733000000A7A0E056A0E046A59176A580A0E066A063104066910060E040E05310B7269040070733000000A7A02037D3100000A02047D3200000A02057D3300000A020E047D3400000A020E057D3500000A020E067D3600000A020E077D3700000A0228020000067D2700000A2A0003300E006E00000000000000027B2800000A2C0B72CB040070732900000A7A02177D2800000A027B3100000A027B3200000A027B3300000A027B3400000A027B3500000A027B3600000A027B3700000A027B2700000A027B2A00000A027B2B00000A027B2C00000A027B2D00000A027B2E00000A733800000A2A0000033004004B0000000000000002282F00000A02037D3900000A02047D3A00000A02057D3B00000A020E047D3C00000A020E057D3D00000A020E067D3E00000A0202FE063F00000A734000000A734100000A7D4200000A2A42027C4300000A284400000A166AFE022A1B3002003A00000003000011027C4300000A284500000A26027B3900000A6F4600000ADE0326DE0017734700000A0A066F4800000A027B4200000A6F4900000ADE0326DE002A0000011C000000000C000D19000301000001000029000D360003010000011B3003009801000004000011140A17734A00000A0B076F4800000A027B3900000A6F4B00000A0A027B3C00000A2C11066F1500000A027B3900000A6F4C00000A02284D00000A3A0E010000027B4E00000A6F4F00000A0C0839FC000000027B3900000A6F1900000A166F1E00000A087B5000000A8C410000016F5100000A027B3900000A6F1900000A176F1E00000A087B5200000A8C410000016F5100000A027B3C00000A2D06066F1500000A027B3900000A6F5300000A0D096F5400000A2C59027B3B00000A096F5500000A6F5600000A13072B1A11076F5700000A130402284D00000A2D1202110417285800000A11076F5900000A2DDDDE0C11072C0711076F2600000ADC021208FE150900001B110816285800000A2B18096F5A00000A262B07096F5A00000A26096F5B00000A2DF1027B3C00000A2C08096F5C00000A2B06066F5D00000A027B4E00000A176F5E00000A38E7FEFFFFDE311305723F0500701105735F00000A1306027B4E00000A11066F6000000A027B4E00000A176F5E00000A02286100000ADE00DE15027B3900000A6F6200000A062C06066F6200000ADC2A414C000002000000C800000027000000EF0000000C0000000000000000000000020000004D0100004F0100003100000016000001020000000200000080010000820100001500000000000000A202037D4E00000A027B4200000A6F6300000A2D1302284D00000A2D0B027B4200000A6F6400000A2A00000013300400E000000005000011027B6500000A2D1802027B3D00000A8D0900001B7D6500000A02157D6600000A042C1D027B6500000A02257B6600000A1758250D7D6600000A0903A40900001B027B6600000A027B3D00000A17592E06043A89000000027B6500000A027B6600000A736700000A0A027B3A00000A2C34027B3A00000A6F6800000A0B2B1E027B3A00000A07066F6900000A2C0902147D6500000A2B0E17286A00000A02284D00000A2CDA027B3E00000A2C33027B3E00000A6F6800000A0C2B1D027B3E00000A08066F6900000A2C0802147D6500000A2A17286A00000A02284D00000A2CDB2A133004005A0000000200001102282F00000A02037D6B00000A0203D48D0A00001B7D6C00000A02168D0900001B16736700000A7D6D00000A166A0A2B14027B6C00000A06D4027B6D00000AA206176A580A060332E802156A7D6E00000A02156A7D6F00000A2A62027C6E00000A284500000A027B6B00000A5D287000000A2A62027C6F00000A284500000A027B6B00000A5D287000000A2A8A027B6D00000A027B6C00000A03D48F0A00001B04027B6D00000A280100002BFE012A00133004002900000006000011027B6D00000A04027B6C00000A03D48F0A00001B027B6D00000A280200002B250A5106FE0116FE012A000000033007005C0000000000000002282F00000A02037D7300000A02047D7400000A02057D7500000A020E047D7600000A020E057D7700000A0202FE067800000A734000000A734100000A7D7900000A020E060E070E080E09027B7900000A737A00000A7D7B00000A2AB602037D7C00000A027B7900000A6F6300000A2D18027B7B00000A6F7D00000A2D0B027B7900000A6F6400000A2A32027B7B00000A6F7E00000A2A001B300300CA0000000700001117734A00000A0A066F4800000A027B7300000A027B7500000A737F00000A0B07027B7400000A6F8000000A07166F8100000A07027B7600000A6F8200000A027B7700000A2C49027B7700000A6F8300000A13052B1A11056F0200000A741A0000010C076F8400000A086F8500000A2611056F5900000A2DDDDE1511057503000001130611062C0711066F2600000ADC07027B7B00000A6F8600000ADE1D0D723F05007009735F00000A1304027B7C00000A11046F6000000ADE00DE0D027B7C00000A176F5E00000ADC2A00000128000002005300277A001500000000000000009D9D001D1600000102000000BCBC000D0000000042027C8800000A284400000A166AFE022A0000001B3002003700000003000011027C8800000A284500000A26027B8900000A6F6300000A2C1D17734700000A0A066F4800000A027B8900000A6F4900000ADE0326DE002A0001100000000026000D33000301000001CE02157D8A00000A02282F00000A02037D8B00000A02047D8C00000A02057D8D00000A020E047D8E00000A020E057D8900000A2A1A738F00000A7A1A738F00000A7A1A738F00000A7A1A738F00000A7A1A738F00000A7A00133003008C00000008000011027B9000000A2D58027B8D00000A6F9100000A0A027B8D00000A06027C9000000A6F9200000A2C0902157D8A00000A2B2F027B9300000A2C02162A027B8E00000A176F9400000A2C0702177D9300000A02287D00000A2CBC02287E00000A2BB402257B8A00000A1758250B7D8A00000A07027B9000000A7B9500000A310C02147D9000000A3876FFFFFF172A1A738F00000A7A1A738F00000A7A1E027B8B00000A2A1A738F00000A7A1A738F00000A7A1A738F00000A7A1A738F00000A7A1A738F00000A7A1A738F00000A7A1A738F00000A7A1A738F00000A7A1A738F00000A7A1A738F00000A7A1A738F00000A7A1A738F00000A7A1A738F00000A7A1A738F00000A7A1A738F00000A7A1A738F00000A7A1A738F00000A7A1A738F00000A7A1A738F00000A7A8E027B8C00000A027B9000000A7B9600000A027B8A00000AA30900001B036F9700000A2A1A738F00000A7A1A738F00000A7A1A738F00000A7A1A738F00000A7A5602282F00000A02037D5000000A02047D5200000A2A0000000330030072000000000000000216739800000A7D9900000A02156A7D9A00000A02282F00000A02037D9B00000A02047D9C00000A02057D9D00000A020E047D9E00000A020E057D9F00000A020E067DA000000A020E077DA100000A020E076FA200000A7DA300000A020E076FA200000A0E066FA200000A587DA400000A2A00001B3002002100000009000011027B9D00000A250B28A500000A02FE137BA600000A0ADE070728A700000ADC062A0000000110000002000D000B180007000000001B3002002A0000000A000011027B9D00000A250A28A500000A02FE137BA600000A2D090203FE137DA600000ADE070628A700000ADC2A00000110000002000D00152200070000000072032C0C027CA800000A284500000A26027B9900000A6FA900000A262A000000133002002100000002000011027C9A00000A284500000A0A06027BA300000A2F0A027BA100000A06D49A2A142A0000001B3002004B0000000B000011160A2B16027B9F00000A069A6F6100000ADE0326DE000617580A06027B9F00000A8E6932DF160B2B16027BA000000A079A6FAA00000ADE0326DE000717580B07027BA000000A8E6932DF2A00011C0000000004000F13000301000001000029000F380003010000011B300300F40000000C000011027B9F00000A13051613062B13110511069A0A06026FAB00000A110617581306110611058E6932E5027BA000000A13071613082B13110711089A0B07026FAC00000A110817581308110811078E6932E5027B9C00000A6FA900000A26027CA800000A284400000A0C08027BA300000A330C027B9E00000A6FA900000A2608027BA400000A2E32027B9B00000A6F6300000A2C0A02FE137BA600000A2C080228AD00000A2B13027B9900000A20EE0200006F9400000A262BA4DE1E0D727905007009735F00000A1304021104286000000A0228AD00000ADE00DE19027B9C00000A6FA900000A26027B9D00000A6FA900000A26DC2A011C000000000000BABA001E1600000102000000DADA00190000000003300300550000000000000002282F00000A0E051732060E051F20310B72C3050070733000000A7A02037DAE00000A02047DAF00000A02057DB000000A020E047DB100000A020E057DB200000A020E062C040E062B0528020000067DB300000A2A000000133007005D0000000D000011020304050E040E050E0628B400000A020E077DB500000A020E087DB600000A722D06007073B700000A0A02066F8400000A7DB800000A0E092C220E090C160D2B1508099A0B027BB800000A076F8500000A260917580D09088E6932E52A5602282F00000A02037D9600000A02047D9500000A2A0013300B00D80200000E00001102157DB900000A02282F00000A020E096A73BA00000A7DBB00000A021673BC00000A7DBD00000A140A1673BC00000A0B170C73BE00000A0D0E0D2C650E0D7BB100000A0C0E096A73BA00000A0A1713042B44090E0D7BB300000A0E0D7BAE00000A0E0D7BB500000A0E0D7BB600000A0E0D7BB800000A0E0D7BAF00000A0E0D7BB000000A060773BF00000A6FC000000A11041758130411040E0D7BB200000A31B173C100000A130573C200000A13060E056A0E046A59176A5813090E0B163DA600000011090E066A2F270E04130A2B161106110A110A73C300000A6FC400000A110A1758130A110A0E0531E438C800000016130B2B6B0E046A11090E066A5B110B6A5A58691307110B17580E062E160E046A176A5911090E066A5B110B17586A5A58692B020E051308110820FFFFFF7F2F1911072000000080311011081107175933080E06175910062B1011061107110873C300000A6FC400000A110B1758130B110B0E06328F2B500E04130711070E0B175958130811080E0531040E05130811061107110873C300000A6FC400000A11080E052E231108130C11081758130711070E0B17595813081108110C2F040E05130811070E0531BD16130D2B720E082C040E082B052802000006731400000A130E110E6FC500000A130F110F036F1800000A110F166FC600000A110F6F1900000A041E6FC700000A26110F6F1900000A051E6FC700000A261105110F082D03142B06027BBB00000A0E070E0C0E0A0673C800000A6FC900000A110D1758130D110D11066FCA00000A0E0632040E062B0711066FCA00000A3F71FFFFFF1673BC00000A13100228CB00000A1110027BBD00000A0711056FCC00000A096FCD00000A11066FCE00000A73CF00000A7DD000000A027BD000000AFE06D100000A734000000A734100000A131111116F6400000A111020881300006F9400000A1312027BD000000A6FD200000A2C0C027BD000000A6FD200000A7A11122D0B722F060070732900000A7A2A0A022A0A022A5E027BD300000A7B9600000A027BB900000AA30900001B2A72027BD300000A7B9600000A027BB900000AA30900001B8C0900001B2A00133003009500000008000011027BD300000A2D61027BBB00000A6F9100000A0A027BBB00000A06027CD300000A6F9200000A2C0902157DB900000A2B38027BD400000A2C02162A027BBD00000A176F9400000A2C0702177DD400000A027BD000000A6FD200000A2CB7027BD000000A6FD200000A7A02257BB900000A1758250B7DB900000A07027BD300000A7B9500000A310C02147DD300000A386DFFFFFF172A1A738F00000A7A36027BD000000A166F5E00000A2A000003300300540200000000000073D500000A80510000047E5100000416D04E00000128D600000A6FD700000A7E5100000417D01400001B28D600000A6FD700000A7E5100000418D05000000128D600000A6FD700000A7E5100000419D03800000128D600000A6FD700000A7E510000041F1FD01000000128D600000A6FD700000A7E510000041AD01000000128D600000A6FD700000A7E510000041F21D01000000128D600000A6FD700000A7E510000041F22D01000000128D600000A6FD700000A7E510000041BD01100000128D600000A6FD700000A7E510000041CD05100000128D600000A6FD700000A7E510000041DD01400001B28D600000A6FD700000A7E510000041ED04100000128D600000A6FD700000A7E510000041F09D01100000128D600000A6FD700000A7E510000041F0AD03800000128D600000A6FD700000A7E510000041F0BD03800000128D600000A6FD700000A7E510000041F0CD03800000128D600000A6FD700000A7E510000041F0DD05100000128D600000A6FD700000A7E510000041F0FD01000000128D600000A6FD700000A7E510000041F10D05200000128D600000A6FD700000A7E510000041F11D01100000128D600000A6FD700000A7E510000041F12D03800000128D600000A6FD700000A7E510000041F20D01000000128D600000A6FD700000A7E510000041F13D01400001B28D600000A6FD700000A7E510000041F14D05300000128D600000A6FD700000A7E510000041F0ED01300000128D600000A6FD700000A7E510000041F15D01400001B28D600000A6FD700000A7E510000041F16D03800000128D600000A6FD700000A2A327E51000004026FD800000A2A1E02282F00000A2A2A0203041428630000062A1B300700AC0200000F00001117734A00000A0A066F4800000A140B052C03052B052802000006731400000A0C086FC500000A0D0972990600706F1800000A086F1500000A096F1C00000A2609026F1800000A096F1900000A031E6FC700000A20000000808C410000016F5100000A096F1900000A041E6FC700000A20FFFFFF7F8C410000016F5100000A096F5300000A130411046FD900000A0B072D0B72B9060070732900000A7ADE0C11042C0711046F2600000ADCDE0A092C06096F2600000ADCDE0A082C06086F2600000ADC076FDA00000A6FDB00000A8D1D000001130516130638BB010000076FDA00000A11066FDC00000A72270700706FDD00000AA51C0000011307110717594505000000AE00000038010000AE000000380100002D00000011071F0A59450300000098000000220100009800000011071F155945020000008600000086000000380B01000011051106076FDA00000A11066FDC00000A72410700706FDD00000A7438000001076FDA00000A11066FDC00000A72270700706FDD00000AA51C000001076FDA00000A11066FDC00000A72570700706FDD00000AA552000001D2076FDA00000A11066FDC00000A72790700706FDD00000AA552000001D273DE00000AA238CC00000011051106076FDA00000A11066FDC00000A72410700706FDD00000A7438000001076FDA00000A11066FDC00000A72270700706FDD00000AA51C000001076FDA00000A11066FDC00000A72930700706FDD00000AA5410000016A20FFFFFF7F6A2E1F076FDA00000A11066FDC00000A72930700706FDD00000AA5410000016A2B02156A73DF00000AA22B4211051106076FDA00000A11066FDC00000A72410700706FDD00000A7438000001076FDA00000A11066FDC00000A72270700706FDD00000AA51C00000173E000000AA21106175813061106076FDA00000A6FDB00000A3F33FEFFFF11052A0128000002008600189E000C000000000200270085AC000A000000000200200098B8000A0000000042534A4201000100000000000C00000076322E302E35303732370000000005006C000000F0150000237E00005C160000C812000023537472696E67730000000024290000AC07000023555300D0300000100000002347554944000000E03000005006000023426C6F6200000000000000020000015717A20B090E000000FA25330016000001000000560000001000000051000000630000008B00000008000000E00000000E0000000F000000060000001200000019000000020000001400000001000000030000000B0000000C0000000200000000000A0001000000000006003D0136010A005201460106005E0136010A006A0146010600760136010600A30188010600C401B1010600D00188010600DE01B1010A0043042D0406006F045E040A0054052D040A0067052D0406008A055E040A00290646010600CA0636010600DF0636010600FC06360106001707360106002A085E0406009208720806009D0836010A0051092D040600660936010600730936010A00010A2D040600D70A88010A00E40A46010A00200B050B06006F0B500B06006C0C5A0C0600830C5A0C0600A00C5A0C0600BF0C5A0C0600D80C5A0C0600F10C5A0C06000C0D5A0C0600270D5A0C0600400D500B0600540D500B0600620D5A0C06007B0D5A0C0600AB0D980DAF00BF0D00000600CE0D72080600EE0D72080A001E0E050B0A00390E2D040A005A0E470E0A007B0E470E0A00950E2D040A00BB0E2D040A00CC0E470E0A00D80E46010A00090F2D0406002E0F36010A00890F470E0600B80F36010600CA0F5E040600D60F5E0406000810EC0F06001B10EC0F06003B102B100A005D102D040600881036010A00A610470E0E00D510BF100600F11036010A0013112D0406004C11B10106007C115A0C0600931136010600AB115E040600BE1136010600D3115E040600E6115E040600FA11880106004612360106004C12360106007012360106007812360106007F1236010600851236010A008A1246010A00A51246010A00C012460100000000010000000000010001008101000020003200050001000100010010004A003200050002000300030010005E000000050010001100030010006B00000005001B001700030010007C000000050020001C000300100087000000050028002000030010009A00000005003100440003001000A600000005003300450002010000B4000000150040004C0002010000C500000015004000500002001000DD00000005004000540003001000EE00000005004900560003001000FA00000005004B005700010100000D013200050051005F00810110001B0132000500520062003100EA01180021003802180021003E02180021004A02180021005602270021005F022700210068022700210079022A0001008202320001008F0218000100A60227000100B40227000100C00227000100CA0232000100DA02350021004E04B30021005304B700210079022A0021007604BF002100CA0232002100B402270021007D04B70001008604C30001008E04CB000100970427000100A404D0002100F404D0002100FF04E80021000705F10001000D05D00001001A05D0002100EA01180021009B0518002100AC0533012100C00227002100B80537012100C2053B0121007604BF0001008604C3002100D10527002100DC05430121007D04B7002100E4054B0121007604BF000100F805F1000100FF05270001000D0632000100A404D0002600B00727002600BD0727002100CA07BF002100D5074B012100E9074B012100E4054B0121006802D0002100F907D000210009080E0221001108170221001D08200201003908290201004E08D00001005F08D0000100A7082D022600970918002600A00727002600A80943012600B00932002600CF0927002600DA0918002600EB0933012600060427002600F709370126008E04CB0026001A0A270021005304B7002100E9074B012100240AC3000100F805F1000100FF05270001000D0632003100EE0AF1025020000000009118FB011B000100582100000000960802021F0001005F21000000008608E7023D000100672100000000860802034100010083210000000086081D03460002008B210000000086082F034A000200B621000000008608410346000300BE2100000000860851034A000300E921000000008608610346000400F1210000000086086F034A0004000D220000000086087D034F00050015220000000086089103530005003122000000008608A503580006003922000000008608B603610006005822000000008618C7036B000700F822000000008600CD037B000E007423000000008618C70399000E00CB23000000008608B6044F001400DC23000000008600C904D30014004024000000008600D004D30014003026000000008600D704D70014005C26000000008100DD04E10015004827000000008618C703F9001700AE270000000086002805FE001800C7270000000086003805FE001800E02700000000860049050201180004280000000086004F050D011A003C28000000008618C70319011C00A428000000008600D704D7002500D228000000008600C904D3002600E028000000008600D004D3002600E029000000008608B6044F002600F429000000008600C904D3002600482A000000008618C7034F0126007C2A00000000E6011906D3002B00832A00000000E6091F0646002B008A2A00000000E601330664012B00912A00000000E60942064F002B00982A00000000E6014F064F002B00A02A00000000E6014F054F002B00382B00000000E6095A0646002B003F2B00000000E6016E06D3002B00462B00000000E609760646002B004E2B00000000E601850669012B00552B00000000E60190066E012C005C2B00000000E601980673012D00632B00000000E601A1067D0132006A2B00000000E601A90682013300712B00000000E601B2068C013800782B00000000E601BA06920139007F2B00000000E601D30697013A00862B00000000E601E7069D013B008D2B00000000E601F206A3013C00942B00000000E6010107A8013D009B2B00000000E6010E07AE013E00A22B00000000E6011C07B3013F00A92B00000000E6012407B9014000B02B00000000E6012D07BE014100B72B00000000E6013607C3014200BE2B00000000E6013F0792014300C52B00000000E6014707C8014400CC2B00000000E601520792014500D32B00000000E6015C07CD014600F72B00000000E6016507D2014700FE2B00000000E6016F0769014800052C00000000E6097807D80149000C2C00000000E6097807CD014A00132C000000008618C703E7014B002C2C000000008618C703ED014D00AC2C000000008608BD0833025400EC2C000000008608D70838025400342D000000008600F10853005500542D00000000860004093E025600842D0000000081001709D3005600F82D0000000086002809D30056000000000003008618C7034C025600000000000300C6015F0952025800000000000300C60181095D025900000000000300C6018D0967025C000000000003008618C7034C025D00000000000300C6015F0972025F00000000000300C601810979026100000000000300C6018D0984026500142F000000008618C7038A026600782F000000008618C70399026C00E12F000000008618C703AE027500F82F000000008618C703B6027700DC3200000000E601270AD1028400DF3200000000E101350ADA028400E23200000000E609620ADF028400FA3200000000E1096E0AE4028400183300000000E601990A4F008400B93300000000E601A20AD3008400C03300000000E6016E06D3008400D033000000009118FB011B0084003036000000009600F40AFB0284003D36000000008618C703D300850045360000000096002C0B0203850050360000000096002C0B0B038800000001003D0B000001003D0B000001003D0B000001003D0B000001003D0B000001003D0B000001003802000002003E02000003004A02000004005602000005005F02000006006802000007007902000001004E0400000200530400000300790200000400CA0200000500B402000006007D0400000100860400000100430B00000200DD0400000100F40400000100470B000002003D0B00000100470B020002003D0B00000100EA01000002009B0500000300AC0500000400C00200000500B80500000600D10500000700DC05000008007D0400000900E40500000100860400000100D10500000200DC05000003007D0400000400E405000005007604000001007C0B000001007C0B000001007C0B000002007E0B000003008A0B00000400910B000005009E0B000001007C0B000001007C0B00000200A50B000003008A0B00000400910B000005009E0B000001007C0B000001007C0B000001007C0B000001007C0B000001007C0B000001007C0B000001007C0B000001007C0B000001007C0B000001007C0B000001007C0B000001007C0B00000100B10B000001007C0B000001007C0B00000100B60B000001007C0B00000100B10B000001007C0B00000100B00700000200BD0700000100CA0700000200D50700000300E90700000400BD0B000005000908000006001108000007001D08000001003D0B00000100D30B00000100EE0B00000200F50B00000100FC0B00000100FC0B00000200060C00000300EE0B00000100F80500000100EE0B00000200F50B00000100430B000002000F0C00000100430B000002000F0C00000300060C00000400EE0B00000100F805000001009B0500000200D10500000300DC05000004001D0C000005003C0C00000600EA01000001009B0500000200D10500000300DC05000004001D0C000005003C0C00000600EA0100000700AC0500000800C00200000900B805000001008E04000002001A0A000001003802000002003E02000003004A02000004005602000005005F02000006006802000007007902000008008F0200000900A60200000A00B40200000B00C00200000C00CA0200000D00DA0200000100470C000001003802000002004C0C00000300530C000001003802000002004C0C00000300530C000004008F020700090007000D00070011000E0006000E001D000E000A000E000D000E0025003900270ADA024900620AE402F100C703D300F900C70341000101C70341000901C70341001101C70341001901C70341002101C70341002901C70341003101C70341003901C70353004101C70341004901C70341005101C70341005901C70315036901C7034A007101C703D3007901290E1C038101C70341008901670ED3005100C703D30051006C0E20039101850E41005100AC0E27039901C80E2D03A901EB0E37039101F90E4600B901C703D300990178073E03A901240FE402B901350F4100B901440F4100B901570F5300B9016E0F5300B901790F4A00C901A30F3D0019006E06D3001C008F0218001C0082023200B100C70341001C00A60227001C00B40227001C00C00227001C00CA0232001C00DA0235000900C703D300D101C70341001C00380218001C003E0218001C004A0218001C00560227001C005F0227001C00680227001C0079022A002400C703B6022C004E04B3002C005304B7002C0079022A002C00CA0232002C00B40227002C007D04B7002C00D004D300D901C7034C025900C70369032C007604BF002C00A404D000E1014F057003E101E20F70039101C904D300E901C7037603F9015010D30059005710D3000102C703760351007110830391018010D3002C00B6044F002C008604C300340004093E023C00B0072700A9018E1097033C00BD072700510098109C031102B3104F0044005F0952020C00270AD1021400620ADF022C00DD04E1004900990A4F0011024F054F0011024F064F0011026E06D30089011906D3003400F1085300B100C703AB033400D70838022C00C904D30019026E06D3005900DF104F005900D704D3002C008E04CB002C00970427005400C703AE025C003805FE005C00490502015900EB10DF035C00F404D0005C00FF04E8005C000705F1005C000D05D0005C001A05D0002102F610F003E101FA10F503E1010A110B046400EA01180064009B0518006400AC0533016400C00227006400B80537016400D004D30064007604BF006C00C7034F016400C2053B0164008604C3006C00B6044F006C00C904D3002902C7032D0429021F114100290238114A0029026F034A003102270ADA0229025B1134046900C80E390429026E1140043902C70341006C00A404D0006C007604BF006C00FF0527006C00D10527006C00DC0543016C007D04B7006C00E4054B014102C703D3006C00F805F1005C002805FE005C004F050D016C000D0632004902B611690154001A0A270054008E04CB0074005F097202A100C703530034003908290234004E08D0003400CA07BF003400D5074B013400E9074B013400E4054B01340009080E0234001108170234001D0820025102C411FE0034006802D0003400F907D0005902DB116F043400A7082D025902E1116F0434005F08D0006102F6114F006400C904D3002C00D704D7006400D704D70034001709D3007C00970918007C00A00727007C00A80943017C00B00932007C00CF0927007C00DA0918007C00C7038A027C00EB0933017C00060427002902C70341007C00F70937012400FF0527005C00C703F90024005304B7007100C70353002400E9074B018400C703D3006400C70319018400C80EC8048C00C703D3009400C703D3003C00C703E7019400C80EC80481010112E60491010F124A009901C80EEB042C00C70399008C00C80EC80494002212460059002C12F4048C003E12F90484003E12F90494003E12F9043400C703ED012400240AC30034002809D3003400BD0833022400F805F10024000D0632009C00C703D30091005E1247059C00C80E4F059C0078075A0511023306640179009C126105A90222124600A10278076705B1027807D801E900C7036E05E900C7037705E900C7037F052E004B00C7052E0023009B052E002B00B2052E003300B2052E003B00B8052E0043009B052E006B00E8052E005300B2052E006300B2052E0083001F062E00930031062E007B0012062E008B002806E3003B045904450357037D03B203E40316044604630474047B0480048504B004FF04860502000100030002000400080007000900090010000E00110000001F0223000000D50384000000EC0388000000FA038800000006048800000010048C000000200490000000E5048C000000E5048C00000081078800000087078C000000900788000000A00788000000AB07DD010000AB07E20100003B0947020000A80AE8020000B00AED0202000200030001000400050002000300050002000500070001000600070002000700090001000800090001000A000B00020009000B0002000B000D0001000C000D0001000E000F0002000D000F0002001200110002002000130002002400150002002600170002002900190002002B001B00020042001D00020043001F0002004600210001004700210002005A00230002005B0025000E00B20003000E00B60005000A00110050035B03620389039003A103A803D103D8031F0426046804A904BC04CE04DA043E0557050480000001000000000000000000000000000C0E000002000000000000000000000001002D0100000000020000000000000000000000010046010000000002000000000000000000000001003601000000000400030005000300060003000700060008000300090003000A0003000B0003000C0003000D0003000E00030000000000060044010000000008004401000000000A004401000000000C004401000000000E00440100000000100044010000000012004401000000001400440100000000160044010000000018004401000000001A004401000000001C004401E3000204E50002040000003C4D6F64756C653E005175657279506172616C6C656C697A65722E646C6C00436F6E6E656374696F6E4275696C646572004164616D4D616368616E69632E5175657279546F6F6C73005175657279506172616C6C656C697A6572603100776F726B657254687265616400726F756E64526F62696E4275666665720062756C6B54687265616400696E7465726E616C4461746152656164657200776F726B5061636B616765006D6F6E69746F7254687265616400526F774C6F67696344656C65676174650042756C6B436F70794D617070696E6744656C65676174650042756C6B436F707953657474696E6773006974656D5061636B61676500696E7465726E616C456E756D657261746F720054797065436F6E766572746572004D6574616461746147656E657261746F72006D73636F726C69620053797374656D004F626A65637400540053797374656D2E446174610049446174615265616465720049446973706F7361626C650049446174615265636F7264004D756C74696361737444656C65676174650053797374656D2E436F6C6C656374696F6E732E47656E657269630049456E756D657261626C6560310053797374656D2E436F6C6C656374696F6E730049456E756D657261626C650049456E756D657261746F7260310049456E756D657261746F7200636F6E6E656374696F6E537472696E67002E6363746F72006765745F4C6F6F706261636B436F6E6E656374696F6E537472696E67004C6F6F706261636B436F6E6E656374696F6E537472696E67007175657279006D696E5661726961626C65006D61785661726961626C65006D696E56616C7565006D617856616C7565006E756D576F726B65725468726561647300726F774C6F67696300697350726F63657373696E6700746172676574436F6E6E656374696F6E537472696E6700726F7742756666657253697A65007061636B61676553697A6500626174636853697A65007265757365436F6E6E656374696F6E0062756C6B53657474696E6773006765745F546172676574436F6E6E656374696F6E537472696E67007365745F546172676574436F6E6E656374696F6E537472696E67006765745F526F7742756666657253697A65007365745F526F7742756666657253697A65006765745F5061636B61676553697A65007365745F5061636B61676553697A65006765745F426174636853697A65007365745F426174636853697A65006765745F5265757365436F6E6E656374696F6E007365745F5265757365436F6E6E656374696F6E006765745F42756C6B53657474696E6773007365745F42756C6B53657474696E6773002E63746F720050726F6365737300546172676574436F6E6E656374696F6E537472696E6700526F7742756666657253697A65005061636B61676553697A6500426174636853697A65005265757365436F6E6E656374696F6E0042756C6B53657474696E67730053797374656D2E446174612E53716C436C69656E740053716C436F6D6D616E6400636F6D6D006F7574707574526F77730053797374656D2E546872656164696E670054687265616400776F726B65720062756C6B526F7773006D6F6E69746F72006974656D4C697374006C697374506F736974696F6E0074687265616443616E63656C436F756E74006765745F54687265616443616E63656C65640043616E63656C00646F576F726B00537461727400656E71756575650054687265616443616E63656C65640062756666657253697A65006275666665727300626C616E6B00726561644C6F636174696F6E0077726974654C6F636174696F6E00476574526561644C6F636174696F6E0047657457726974654C6F636174696F6E00577269746500526561640053716C42756C6B436F70794F7074696F6E730053716C42756C6B436F7079436F6C756D6E4D617070696E67436F6C6C656374696F6E004D616E75616C52657365744576656E740064657374696E6174696F6E5461626C6500636F70794F7074696F6E7300636F6C756D6E4D61700062756C6B44617461526561646572006669656C64436F756E7400646174614D61700062756C6B436F6D706C6574696F6E4576656E7400726573756C740063757272656E74526573756C74006D6F6E69746F724578697400436C6F7365006765745F446570746800446174615461626C6500476574536368656D615461626C65006765745F4973436C6F736564004E657874526573756C74006765745F5265636F726473416666656374656400446973706F7365006765745F4669656C64436F756E7400476574426F6F6C65616E0047657442797465004765744279746573004765744368617200476574436861727300476574446174610047657444617461547970654E616D65004461746554696D65004765744461746554696D6500446563696D616C00476574446563696D616C00476574446F75626C650054797065004765744669656C645479706500476574466C6F61740047756964004765744775696400476574496E74313600476574496E74333200476574496E743634004765744E616D65004765744F7264696E616C00476574537472696E670047657456616C75650047657456616C75657300497344424E756C6C006765745F4974656D004465707468004973436C6F736564005265636F7264734166666563746564004669656C64436F756E74004974656D0072616E67654D696E696D756D0072616E67654D6178696D756D006D61696E54687265616400696E697469616C697A6174696F6E4576656E7400636F6D706C6574696F6E4576656E74006E756D546F74616C5468726561647300776F726B6572730062756C6B576F726B65727300776F726B5061636B61676573004175746F52657365744576656E7400776F726B6572436F6D706C657465644576656E74006E657874576F726B6572546872656164006E756D46696E6973686564546872656164730053797374656D2E52756E74696D652E436F6D70696C65725365727669636573004973566F6C6174696C6500457863657074696F6E00776F726B6572546872656164457863657074696F6E006765745F576F726B6572546872656164457863657074696F6E007365745F576F726B6572546872656164457863657074696F6E00536574576F726B6572436F6D706C65746564004765744E657874576F726B5061636B6167650063616E63656C416C6C546872656164730053657475704D6F6E69746F7254687265616400576F726B6572546872656164457863657074696F6E0053716C4461746152656164657200496E766F6B6500494173796E63526573756C74004173796E6343616C6C6261636B00426567696E496E766F6B6500456E64496E766F6B650044657374696E6174696F6E5461626C6500446174614D6170004F7574707574526F7773546F45787465726E616C456E756D657261746F72004E756D5468726561647300436F6E6E656374696F6E537472696E6700436F70794F7074696F6E7300436F6C756D6E4D61700053716C42756C6B436F7079436F6C756D6E4D617070696E67006974656D436F756E74006D7000476574456E756D657261746F720053797374656D2E436F6C6C656374696F6E732E49456E756D657261626C652E476574456E756D657261746F72006765745F43757272656E740053797374656D2E436F6C6C656374696F6E732E49456E756D657261746F722E6765745F43757272656E74004D6F76654E6578740052657365740043757272656E740053797374656D2E436F6C6C656374696F6E732E49456E756D657261746F722E43757272656E740044696374696F6E61727960320053716C44625479706500747970657300436F6E76657274546F4E657454797065004D6963726F736F66742E53716C5365727665722E5365727665720053716C4D657461446174610047657451756572794D657461646174610076616C756500726F77006C6F636174696F6E0053797374656D2E52756E74696D652E496E7465726F705365727669636573004F75744174747269627574650069006669656C644F666673657400627566666572006275666665726F6666736574006C656E677468006669656C646F6666736574006E616D650076616C7565730062756C6B436F6D706C65746974696F6E4576656E7400696E6372656D656E74436F6D706C6574696F6E436F756E746572006F626A656374006D6574686F6400696E707574446174610063616C6C6261636B00636F6C756D6E4F7264696E616C006F7574707574526F7773546F45787465726E616C456E756D657261746F72006E756D546872656164730074797065006D696E566172006D61785661720053797374656D2E5265666C656374696F6E00417373656D626C795469746C6541747472696275746500417373656D626C794465736372697074696F6E41747472696275746500417373656D626C79436F6E66696775726174696F6E41747472696275746500417373656D626C79436F6D70616E7941747472696275746500417373656D626C7950726F6475637441747472696275746500417373656D626C79436F7079726967687441747472696275746500417373656D626C7954726164656D61726B41747472696275746500417373656D626C7943756C7475726541747472696275746500436F6D56697369626C65417474726962757465004775696441747472696275746500417373656D626C7956657273696F6E41747472696275746500417373656D626C7946696C6556657273696F6E4174747269627574650053797374656D2E446961676E6F73746963730044656275676761626C6541747472696275746500446562756767696E674D6F64657300436F6D70696C6174696F6E52656C61786174696F6E734174747269627574650052756E74696D65436F6D7061746962696C697479417474726962757465005175657279506172616C6C656C697A65720053716C436F6E74657874006765745F4973417661696C61626C650053716C436F6E6E656374696F6E0053797374656D2E446174612E436F6D6D6F6E004462436F6E6E656374696F6E004F70656E007365745F436F6E6E656374696F6E004462436F6D6D616E64007365745F436F6D6D616E64546578740053716C506172616D65746572436F6C6C656374696F6E006765745F506172616D65746572730053716C506172616D6574657200416464004462506172616D6574657200506172616D65746572446972656374696F6E007365745F446972656374696F6E00457865637574654E6F6E51756572790053716C436F6E6E656374696F6E537472696E674275696C646572006765745F56616C756500537472696E67007365745F44617461536F75726365007365745F496E697469616C436174616C6F67007365745F496E74656772617465645365637572697479007365745F456E6C697374007365745F4D6178506F6F6C53697A65004462436F6E6E656374696F6E537472696E674275696C646572006765745F436F6E6E656374696F6E537472696E6700417267756D656E74457863657074696F6E00546872656164537461727400496E7465726C6F636B656400496E6372656D656E740053797374656D2E53656375726974792E5065726D697373696F6E730053656375726974795065726D697373696F6E005065726D697373696F6E53746174650053797374656D2E536563757269747900436F64654163636573735065726D697373696F6E004173736572740041626F72740053716C436C69656E745065726D697373696F6E006765745F436F6E6E656374696F6E005072657061726500496E743332007365745F56616C7565004578656375746552656164657200446244617461526561646572006765745F486173526F77730053797374656D2E436F6D706F6E656E744D6F64656C00436F6D706F6E656E74006765745F4973416C69766500536C656570004D6174680041627300436F6D7061726545786368616E67650045786368616E67650053716C42756C6B436F7079007365745F44657374696E6174696F6E5461626C654E616D65007365745F42756C6B436F707954696D656F757400436F6C6C656374696F6E42617365006765745F436F6C756D6E4D617070696E6773005772697465546F5365727665720044656661756C744D656D626572417474726962757465004E6F74496D706C656D656E746564457863657074696F6E005761697448616E646C6500576169744F6E65004172726179006765745F4C6F6E674C656E677468004D6F6E69746F7200456E7465720045786974004576656E745761697448616E646C6500536574004C697374603100437265617465436F6D6D616E64007365745F436F6D6D616E6454696D656F7574006765745F436F756E74006765745F43757272656E7454687265616400546F417272617900496E7436340052756E74696D655479706548616E646C65004765745479706546726F6D48616E646C6500426F6F6C65616E00446F75626C6500496E74313600427974650044617461526F77436F6C6C656374696F6E006765745F526F777300496E7465726E616C44617461436F6C6C656374696F6E426173650044617461526F7700003363006F006E007400650078007400200063006F006E006E0065006300740069006F006E0020003D00200074007200750065000071530045004C00450043005400200040007300650072007600650072005F006E0061006D00650020003D002000400040005300450052005600450052004E0041004D0045002C0020004000640062005F006E0061006D00650020003D002000440042005F004E0041004D00450028002900001940007300650072007600650072005F006E0061006D00650000114000640062005F006E0061006D006500006B43006F006E006E0065006300740069006F006E00200073007400720069006E0067002000630061006E0020006F006E006C007900200062006500200073006500740020007000720069006F007200200074006F002000700072006F00630065007300730069006E006700006752006F00770020006200750066006600650072002000730069007A0065002000630061006E0020006F006E006C007900200062006500200073006500740020007000720069006F007200200074006F002000700072006F00630065007300730069006E006700006552006F00770020006200750066006600650072002000730069007A00650020006D007500730074002000620065002000670072006500610074006500720020007400680061006E0020006F007200200065007100750061006C00200074006F002000310000615000610063006B006100670065002000730069007A0065002000630061006E0020006F006E006C007900200062006500200073006500740020007000720069006F007200200074006F002000700072006F00630065007300730069006E006700005F5000610063006B006100670065002000730069007A00650020006D007500730074002000620065002000670072006500610074006500720020007400680061006E0020006F007200200065007100750061006C00200074006F0020003100005D420061007400630068002000730069007A0065002000630061006E0020006F006E006C007900200062006500200073006500740020007000720069006F007200200074006F002000700072006F00630065007300730069006E006700006943006F006E006E0065006300740069006F006E002000720065007500730065002000630061006E0020006F006E006C007900200062006500200073006500740020007000720069006F007200200074006F002000700072006F00630065007300730069006E006700006D420075006C006B00200063006F00700079002000730065007400740069006E00670073002000630061006E0020006F006E006C007900200062006500200073006500740020007000720069006F007200200074006F002000700072006F00630065007300730069006E00670000634E0075006D0062006500720020006F006600200077006F0072006B00650072002000740068007200650061006400730020006D0075007300740020006200650020006200650074007700650065006E0020003100200061006E00640020003300320000614D0069006E00560061006C007500650020006D0075007300740020006200650020006C0065007300730020007400680061006E0020006F007200200065007100750061006C00200074006F0020004D0061007800560061006C00750065002E000073500072006F00630065007300730069006E0067002000630061006E0020006F006E006C00790020006200650020007300740061007200740065006400200061002000730069006E0067006C0065002000740069006D0065002000700065007200200069006E007300740061006E0063006500003945007800630065007000740069006F006E0020006F006300630075007200720065006400200069006E00200077006F0072006B0065007200004945007800630065007000740069006F006E0020006F006300630075007200720065006400200069006E0020006D006F006E00690074006F007200200074006800720065006100640000694E0075006D0062006500720020006F0066002000620075006C006B00200063006F00700079002000740068007200650061006400730020006D0075007300740020006200650020006200650074007700650065006E0020003100200061006E006400200033003200000100694D006F006E00690074006F007200200074006800720065006100640020006600610069006C0065006400200074006F00200069006E0069007400690061006C0069007A0065002000770069007400680069006E002000350020007300650063006F006E0064007300001F530045005400200046004D0054004F004E004C00590020004F004E003B00006D4D0065007400610064006100740061002000470065006E0065007200610074006F007200200066006F0075006E00640020006E006F00200063006F006C0075006D006E007300200069006E002000740068006500200069006E007000750074002000710075006500720079000019500072006F00760069006400650072005400790070006500001543006F006C0075006D006E004E0061006D00650000214E0075006D00650072006900630050007200650063006900730069006F006E0000194E0075006D0065007200690063005300630061006C006500001543006F006C0075006D006E00530069007A00650000000000AE9DE95E7E303F428427037A29423B560008B77A5C561934E089061512190113000615122101130002060E030000010300000E0308000E020608070615122801130002060207061512300113000320000E042001010E032000080420010108032000020420010102082000151230011300092001011512300113000F2007010E0E0E0808081512280113000820001512190113000328000E032800080328000208280015123001130019200601122915121401130015122801130002081512140113000306122907061512140113000306122D070615122401130004061D130002060A03200001092001011512240113000620020113000208061D1512340113000706151234011300042001010A0320000A0A2002020A1512340113000B2002020A10151234011300192009010E0E11310812350815122C01130015121401130012390306113103061235070615121C011300070615122C01130003061239142005010815122C0113001512140113001239122D042000123D042001020804200105080920050A080A1D05080804200103080920050A080A1D0308080520011209080420010E080520011141080520011145080420010D080520011249080420010C08052001114D08042001060804200108080420010A08042001080E0420011C08052001081D1C0420011C0E0428011C0E0428011C0805200201080820200701122D1239123912391D1512100113001D1512180113001D15122001130008061D15121001130008061D15121801130008061D1512200113000306125105061F55125904200012590520010112590820001512200113000428001259052002011C180A2001151219011300125D0920031261125D12651C0A200115121901130012610620021C1300080A2004126113000812651C0520011C12610E2006010E0815122C01130002080E142009010E0815122C01130002080E1131081D1269072002011D1300081A200D010E0E0E0808081512280113000E08080802151230011300082000151221011300042000122504200013000320001C04280013000328001C090615126D0211711249060001124911710800031D12750E0E0E0900041D12750E0E0E0E062001011180B103000002062001011280C10520001280CD0920031280D10E117108062001011180D90620011280D1080A07031280C112291280DD0615120C0113000307010A0615123801130006151210011300062001011280ED0500010A100A062001011180F90507011280F50520001280C10615122401130006151220011300042001011C042000125D06151228011300021300062002010E12591E07091280C1128101151220011300125D1300125912591512210113001300061512340113000615121401130004000101080B07041512340113000A0A080400010A0A0C1001031E00101E001E001E00080A011512340113000A1001021E00101E001E00080701151234011300061512180113000615121C011300062002010E11310420001235062001126912690520010112091207071281011281151269125912591225120D090100044974656D00000407020A080615122C011300040001011C06070212591239040701123904070208082307091512100113001512180113000A125912591D151210011300081D15121801130008061512300113000B070412811512691D1269080B15128135011512180113000520010113000B15128135011512100113000B151281350115122001130004200012290820021280D10E1171040000122D0520001D13003E07131512140113001239021512813501151218011300081512813501151210011300151281350115122001130008080A080808081280C112291239122D020815126D0211711249070001124911813D0720020113001301021D050620011301130005200012815106200112815908082004010E11710505072003010E11710A062002010E1171140708128101123D1280C11229125D1D1275081171160100115175657279506172616C6C656C697A657200000501000000000E0100094D6963726F736F667400002001001B436F7079726967687420C2A9204D6963726F736F6674203230313000002901002465343635336131332D386538362D343932372D626463312D65613337353665613435363300000C010007312E302E302E3000000801000200000000000801000800000000001E01000100540216577261704E6F6E457863657074696F6E5468726F777301000000008D7FC24C00000000020000009E0000007C7000007C52000052534453CB9B358FF267194295914B7BDE3E336301000000433A5C55736572735C5061756C2057686974655C446F63756D656E74735C56697375616C2053747564696F20323031305C50726F6A656374735C5175657279506172616C6C656C697A65725F62657461315C5175657279506172616C6C656C697A65725C6F626A5C52656C656173655C5175657279506172616C6C656C697A65722E7064620000004471000000000000000000005E71000000200000000000000000000000000000000000000000000050710000000000000000000000005F436F72446C6C4D61696E006D73636F7265652E646C6C0000000000FF2500204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100100000001800008000000000000000000000000000000100010000003000008000000000000000000000000000000100000000004800000058800000380300000000000000000000380334000000560053005F00560045005200530049004F004E005F0049004E0046004F0000000000BD04EFFE00000100000001000000000000000100000000003F000000000000000400000002000000000000000000000000000000440000000100560061007200460069006C00650049006E0066006F00000000002400040000005400720061006E0073006C006100740069006F006E00000000000000B00498020000010053007400720069006E006700460069006C00650049006E0066006F00000074020000010030003000300030003000340062003000000034000A00010043006F006D00700061006E0079004E0061006D006500000000004D006900630072006F0073006F006600740000004C0012000100460069006C0065004400650073006300720069007000740069006F006E00000000005100750065007200790050006100720061006C006C0065006C0069007A00650072000000300008000100460069006C006500560065007200730069006F006E000000000031002E0030002E0030002E00300000004C001600010049006E007400650072006E0061006C004E0061006D00650000005100750065007200790050006100720061006C006C0065006C0069007A00650072002E0064006C006C0000005C001B0001004C006500670061006C0043006F007000790072006900670068007400000043006F0070007900720069006700680074002000A90020004D006900630072006F0073006F006600740020003200300031003000000000005400160001004F0072006900670069006E0061006C00460069006C0065006E0061006D00650000005100750065007200790050006100720061006C006C0065006C0069007A00650072002E0064006C006C000000440012000100500072006F0064007500630074004E0061006D006500000000005100750065007200790050006100720061006C006C0065006C0069007A00650072000000340008000100500072006F006400750063007400560065007200730069006F006E00000031002E0030002E0030002E003000000038000800010041007300730065006D0062006C0079002000560065007200730069006F006E00000031002E0030002E0030002E003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007000000C000000703100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    WITH PERMISSION_SET = SAFE;

    GO

    CREATE ASSEMBLY [GMRose]

    AUTHORIZATION [dbo]

    FROM 0x4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000504500004C010300B7C2C24C0000000000000000E00002210B010800001600000006000000000000AE3500000020000000400000000040000020000000020000040000000000000004000000000000000080000000020000000000000300408500001000001000000000100000100000000000001000000000000000000000005835000053000000004000004003000000000000000000000000000000000000006000000C000000C43400001C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000080000000000000000000000082000004800000000000000000000002E74657874000000B4150000002000000016000000020000000000000000000000000000200000602E7273726300000040030000004000000004000000180000000000000000000000000000400000402E72656C6F6300000C0000000060000000020000001C00000000000000000000000000004000004200000000000000000000000000000000903500000000000048000000020005009423000030110000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013300B00750000000100001173070000060A0F00281200000A0F01281200000A0F02281200000A0F03281300000A0F04281300000A0F05281300000A06FE0608000006731400000A731500000A0B070F06281200000A1914FE0602000006731600000A1618141A1614731700000A6F1800000A07176F1900000A076F1A00000A2A000000133002004500000002000011030A064503000000020000000E0000001A0000002B24027B010000048C1F0000012A027B020000048C1F0000012A027B030000048C1F0000012A7201000070731B00000A7A000000133002003B000000030000110274030000020A03067B01000004281C00000A810400000104067B02000004281C00000A810400000105067B03000004281C00000A81040000012A1E02281D00000A2A1E02281D00000A2A7202281D00000A02037D0100000402047D0200000402057D030000042A1E02281D00000A2A133002004800000004000011282600000A6F2700000A027B060000043315027B050000041FFE330B02167D05000004020A2B131673100000060A06027B100000047D1000000406027B080000047D07000004062A1E0228090000062A133005002B01000002000011027B050000040A06450200000005000000E5000000380F01000002157D0500000402177D0900000402177D0A00000402167D0B00000402147D0C00000402167D0D00000402167D0E00000402147D0F00000438C200000002027B07000004166F2800000A7D0D00000402027B07000004176F2800000A7D0E00000402027B07000004186F2900000A7D0F000004027B090000042C0902167D090000042B36027B0D000004027B0B0000042E0702177D0A000004027B0F000004027B0C000004282A00000A2C0E02257B0A00000417587D0A00000402027B0D000004027B0E000004027B0A00000473060000067D0400000402177D05000004172A02157D0500000402027B0D0000047D0B00000402027B0F0000047D0C000004027B070000046F2B00000A3A2EFFFFFF162A1E027B040000042A1A732C00000A7A062A1E027B040000042A7A02281D00000A02037D0500000402282600000A6F2700000A7D060000042A001330020018000000040000111FFE73100000060A06027D1000000406037D08000004062A42534A4201000100000000000C00000076322E302E35303732370000000005006C000000A4050000237E0000100600004808000023537472696E677300000000580E00001800000023555300700E0000100000002347554944000000800E0000B002000023426C6F6200000000000000020000015717A20B0902000000FA253300160000010000002900000005000000100000001000000012000000050000002D0000001500000004000000010000000200000002000000070000000600000001000000030000000100000000000A00010000000000060056004F00060070005D000A009D0088000A00A700880006001601FB000A003A0124010600CF01B0010600F301E10106000A02E10106002702E10106004602E10106005F02E10106007802E10106009302E1010600AE02E1010600C702B0010600DB02B0010600E902E10106000203E101060032031F035300460300000600750355030600950355030A00D503BA030E001E04060467003204000067004304000067005B0400000A006C0424010A007F0424010600C5044F000600CB044F000600EE04FB000600FC045D00060008054F00060073071F0306009C078B070A00DC07C9070600FC074F00060016084F0006002C08550300000000010000000000010001000100100015000000050001000100010010002A000000050001000500000010003700000005000400070003011000E10400000500040009000600DA003D000600E8003D000600F0003D0001009B05BB01010043063D0001004E063D000600DC01CD0106008E06CD0106009806D1010600AA063D000600B9063D000600CB06D4010600DC063D000600EA063D000600F806D40106000507D7015020000000009600B0000A000100D420000000009600B9001D0008002821000000009600C70024000A006F21000000008618D40032000E007721000000008618D40032000E007F21000000008618D40036000E009C21000000008618D400320011007023000000008600480140001100A42100000000E10114059D011200F82100000000E1016505B1011200002200000000E1019205B7011200372300000000E109A805BF0112003F2300000000E101F50532001200462300000000E101200632001200482300000000E1096306C90112005023000000008618D4005B001200000001004F01000002005501000003006101000004006D01000005007601000006007F01000007008D0100000100A20100000200A60100000100AE0102000200DA0002000300E80002000400F00000000100DA0000000200E80000000300F00000000100DC01000001004306050016000500090005001A000500890005008D003900D40032004100D4004B004900D4004B005100D4004B005900D4004B006100D4004B006900D4004B007100D4004B007900D4004B008100D40050008900D4004B009100D4004B009900D4004B00A100D4005500B100D4005B00B900D4003200C100D40032001900EA0312012100EA0316010C00D40021011400D4002E011C00D40021012400D4004C011400980461011400A90450001400BD046B010101D4004B002100D50483010900D40032002C005705A70111005705B10111019205B7013400E905C40111011A06320019013B0632001101E905C9012101D40032002901A307E9012901B50716013101E907F4013101F207F90139010308FE0131011108B7014101D40032004901D400320020008B0060002E00230010022E002B0016022E0083008F022E003B0025022E00130004022E001B0010022E00530010022E007B0086022E00330004022E00430010022E005B0046022E006B0070022E0073007D02A3006B01E40120012B01E40140012B01E40180012B01E401A0012B01E401E0012B01E40100022B01E40174017F018901EF010500010000000F07DB0100004C07E00102000C00030002000F000500050012003D00050014003F0005001600410005001800430005001A00450005001C00470005001E0049001A0127013E0145018E019501048000000100000000000000000000000000B3030000020000000000000000000000010046000000000002000000000000000000000001007C00000000000100000000000000000000000000F40300000000050004000000003C4D6F64756C653E00474D526F73652E646C6C0055736572446566696E656446756E6374696F6E73004F75747075745265636F726400706172616C6C656C576F726B6572006D73636F726C69620053797374656D004F626A6563740053797374656D2E436F6C6C656374696F6E730049456E756D657261626C650053797374656D2E446174610053797374656D2E446174612E53716C54797065730053716C537472696E670053716C496E7433320053657175656E6365004465636F64654F7264696E616C0053657175656E636546696C6C002E63746F72004163636F756E744E756D62657200436865636B49640053657175656E636549640053797374656D2E436F6C6C656374696F6E732E47656E657269630049456E756D657261626C6560310053797374656D2E446174612E53716C436C69656E740053716C4461746152656164657200646F576F726B007175657279006D696E5661726961626C65006D61785661726961626C65006D696E56616C7565006D617856616C756500776F726B6572546872656164730064657374696E6174696F6E5461626C654E616D6500726F77006F7264696E616C006F0053797374656D2E52756E74696D652E496E7465726F705365727669636573004F757441747472696275746500726F77730053797374656D2E5265666C656374696F6E00417373656D626C795469746C6541747472696275746500417373656D626C794465736372697074696F6E41747472696275746500417373656D626C79436F6E66696775726174696F6E41747472696275746500417373656D626C79436F6D70616E7941747472696275746500417373656D626C7950726F6475637441747472696275746500417373656D626C79436F7079726967687441747472696275746500417373656D626C7954726164656D61726B41747472696275746500417373656D626C7943756C7475726541747472696275746500436F6D56697369626C65417474726962757465004775696441747472696275746500417373656D626C7956657273696F6E41747472696275746500417373656D626C7946696C6556657273696F6E4174747269627574650053797374656D2E446961676E6F73746963730044656275676761626C6541747472696275746500446562756767696E674D6F6465730053797374656D2E52756E74696D652E436F6D70696C6572536572766963657300436F6D70696C6174696F6E52656C61786174696F6E734174747269627574650052756E74696D65436F6D7061746962696C69747941747472696275746500474D526F7365004D6963726F736F66742E53716C5365727665722E5365727665720053716C46756E6374696F6E417474726962757465006765745F56616C7565005175657279506172616C6C656C697A6572004164616D4D616368616E69632E5175657279546F6F6C73005175657279506172616C6C656C697A6572603100526F774C6F67696344656C65676174650042756C6B436F70794D617070696E6744656C65676174650042756C6B436F707953657474696E67730053716C42756C6B436F70794F7074696F6E730053716C42756C6B436F7079436F6C756D6E4D617070696E67007365745F42756C6B53657474696E6773007365745F5265757365436F6E6E656374696F6E0050726F6365737300496E74333200457863657074696F6E006F705F496D706C69636974003C646F576F726B3E645F5F300049456E756D657261746F7260310049456E756D657261746F720049446973706F7361626C650053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261626C653C4F75747075745265636F72643E2E476574456E756D657261746F7200476574456E756D657261746F720053797374656D2E436F6C6C656374696F6E732E49456E756D657261626C652E476574456E756D657261746F72004D6F76654E657874003C3E325F5F63757272656E740053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261746F723C4F75747075745265636F72643E2E6765745F43757272656E74006765745F43757272656E740053797374656D2E436F6C6C656374696F6E732E49456E756D657261746F722E52657365740052657365740053797374656D2E49446973706F7361626C652E446973706F736500446973706F7365003C3E315F5F7374617465003C3E6C5F5F696E697469616C54687265616449640053797374656D2E436F6C6C656374696F6E732E49456E756D657261746F722E6765745F43757272656E74003C3E335F5F726F7773003C66697273745265636F72643E355F5F31003C73657175656E63653E355F5F32003C6C6173744163636F756E743E355F5F33003C6C6173745374617475733E355F5F34003C6163636F756E743E355F5F35003C636865636B49643E355F5F36003C7374617475733E355F5F37003C3E345F5F746869730053797374656D2E436F6C6C656374696F6E732E47656E657269632E49456E756D657261746F723C4F75747075745265636F72643E2E43757272656E740053797374656D2E436F6C6C656374696F6E732E49456E756D657261746F722E43757272656E7400446562756767657248696464656E4174747269627574650053797374656D2E546872656164696E6700546872656164006765745F43757272656E74546872656164006765745F4D616E6167656454687265616449640053797374656D2E446174612E436F6D6D6F6E0044624461746152656164657200476574496E74333200476574537472696E6700537472696E67006F705F496E657175616C6974790052656164004E6F74537570706F72746564457863657074696F6E00436F6D70696C657247656E657261746564417474726962757465000000134E006F0020007300750063006800200069000000000071BF6CF9B7A9454E8C533A1E7D037F3D0008B77A5C561934E0891200071209110D110D110D111111111111110D0600021C120C080D0004011C10111110111110111103200001062003010808080206080A200115121501120C1219042001010E0420010102052001011155042001010880B0010002005455794D6963726F736F66742E53716C5365727665722E5365727665722E446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038390A4461746141636365737301000000540E1146696C6C526F774D6574686F644E616D650C53657175656E636546696C6C0320000E032000080615126901120C052002011C180615126501120C0F2007010E0E0E0808081512690113000615126D01120C0615127101120C142009010E0815126D01130002080E1175081D1279092001011512710113000820001512150113000A0702121015126501120C03070108050001111108040701120C0615121501120C071512808501120C0920001512808501120C09200015128085011300052000128089032000020306120C042000120C04200013000320001C0306121902060202060E03061210042800120C0328001C0401000000050000128095040701121404200108080420010E08050002020E0E0B010006474D526F736500000501000000000E0100094D6963726F736F667400002001001B436F7079726967687420C2A9204D6963726F736F6674203230313000002901002438663639323232382D393939362D346332622D616464332D37363635656138336139396300000C010007312E302E302E3000000801000200000000000801000800000000001E01000100540216577261704E6F6E457863657074696F6E5468726F777301000000000000B7C2C24C000000000200000077000000E0340000E016000052534453AC3390009EAF614ABC3D6E95120DFA0208000000433A5C55736572735C5061756C2057686974655C646F63756D656E74735C76697375616C2073747564696F20323031305C50726F6A656374735C474D526F73655C474D526F73655C6F626A5C52656C656173655C474D526F73652E70646200008035000000000000000000009E3500000020000000000000000000000000000000000000000000009035000000000000000000000000000000005F436F72446C6C4D61696E006D73636F7265652E646C6C0000000000FF25002040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100100000001800008000000000000000000000000000000100010000003000008000000000000000000000000000000100000000004800000058400000E80200000000000000000000E80234000000560053005F00560045005200530049004F004E005F0049004E0046004F0000000000BD04EFFE00000100000001000000000000000100000000003F000000000000000400000002000000000000000000000000000000440000000100560061007200460069006C00650049006E0066006F00000000002400040000005400720061006E0073006C006100740069006F006E00000000000000B00448020000010053007400720069006E006700460069006C00650049006E0066006F00000024020000010030003000300030003000340062003000000034000A00010043006F006D00700061006E0079004E0061006D006500000000004D006900630072006F0073006F00660074000000380007000100460069006C0065004400650073006300720069007000740069006F006E000000000047004D0052006F007300650000000000300008000100460069006C006500560065007200730069006F006E000000000031002E0030002E0030002E003000000038000B00010049006E007400650072006E0061006C004E0061006D006500000047004D0052006F00730065002E0064006C006C00000000005C001B0001004C006500670061006C0043006F007000790072006900670068007400000043006F0070007900720069006700680074002000A90020004D006900630072006F0073006F0066007400200032003000310030000000000040000B0001004F0072006900670069006E0061006C00460069006C0065006E0061006D006500000047004D0052006F00730065002E0064006C006C0000000000300007000100500072006F0064007500630074004E0061006D0065000000000047004D0052006F007300650000000000340008000100500072006F006400750063007400560065007200730069006F006E00000031002E0030002E0030002E003000000038000800010041007300730065006D0062006C0079002000560065007200730069006F006E00000031002E0030002E0030002E0030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000C000000B03500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    WITH PERMISSION_SET = SAFE;

    GO

    -- Sign the QP engine

    ADD SIGNATURE

    TO ASSEMBLY::QueryParallelizer

    BY CERTIFICATE SQLCLR_Unsafe_Permission_Cert

    WITH PASSWORD = 'SQLCLRUnsafeCertPassword';

    GO

    -- Give QP engine UNSAFE permissions (for threading)

    ALTER ASSEMBLY QueryParallelizer

    WITH PERMISSION_SET = UNSAFE,

    VISIBILITY = OFF;

    GO

    -- The SQLCLR function

    CREATE FUNCTION

    dbo.Sequence

    (

    @Query NVARCHAR(4000),

    @MinVariable NVARCHAR(4000),

    @MaxVariable NVARCHAR(4000),

    @MinValue INTEGER,

    @MaxValue INTEGER,

    @WorkerThreads INTEGER,

    @Destimation NVARCHAR(4000)

    )

    RETURNS TABLE

    (

    AccountNumber INTEGER,

    CheckId INTEGER,

    SequenceId INTEGER

    )

    AS EXTERNAL NAME GMRose.UserDefinedFunctions.Sequence;

    Test run

    -- ========================================

    -- Test run

    -- ========================================

    IF OBJECT_ID(N'tempdb..##Results', N'U')

    IS NOT NULL

    DROP TABLE ##Results;

    GO

    -- Results will be bulk-copied to this table

    CREATE TABLE

    ##Results

    (

    AccountNumber INTEGER NOT NULL,

    CheckId INTEGER NOT NULL,

    SequenceId INTEGER NOT NULL,

    );

    GO

    DECLARE @StartTime DATETIME,

    @min-2 INTEGER,

    @max-2 INTEGER;

    -- Set the test start time, and find the range

    -- of account numbers in the input data set

    SELECT @StartTime = GETUTCDATE(),

    @min-2 = MIN(acct_nbr),

    @max-2 = MAX(acct_nbr)

    FROM ##temp;

    -- The SQLCLR function

    -- Produces no output (bulk-copied to ##Results instead)

    SELECT *

    FROM dbo.Sequence

    (

    N'

    SELECT acct_nbr, ckid, stat

    FROM ##temp

    WHERE acct_nbr BETWEEN @low AND @high

    ORDER BY

    acct_nbr,

    ckid

    OPTION (MAXDOP 1);',

    '@low',

    '@high',

    @min-2,

    @max-2,

    8,

    N'##Results'

    ) S;

    -- Show the execution time

    -- Disregard results from the first few runs

    -- The SQLCLR function is just-in-time compiled

    -- from MSIL to native machine code

    SELECT execution_time =

    DATEDIFF(MILLISECOND, @StartTime, GETUTCDATE());

    SELECT result_table_rows =

    COUNT_BIG(*)

    FROM ##Results;

    -- Show the output

    --SELECT AccountNumber,

    -- CheckId,

    -- SequenceId

    --FROM ##Results

    --ORDER BY

    -- AccountNumber,

    -- CheckId;

    Clean-up code

    -- ========================================

    -- Clean-up code

    -- ========================================

    USE [tempdb];

    GO

    DROP TABLE #tempstore;

    GO

    DROP TABLE ##Results;

    GO

    DROP FUNCTION dbo.Sequence;

    GO

    DROP ASSEMBLY GMRose;

    GO

    DROP CERTIFICATE SQLCLR_Unsafe_Permission_Cert;

    GO

    USE [master];

    GO

    DROP LOGIN SQLCLR_Unsafe_Permission_Login;

    GO

    DROP CERTIFICATE SQLCLR_Unsafe_Permission_Cert;

    GO

    -- ========================================

    -- Delete the certificate backup files

    -- from C:\temp manually

    -- ========================================

  • Forgot the attach the C# source code (the meat of the thing is in the parallelWorker class, at the bottom):

    using System;

    using System.Collections;

    using System.Collections.Generic;

    using System.Data.SqlClient;

    using System.Data.SqlTypes;

    using AdamMachanic.QueryTools;

    using Microsoft.SqlServer.Server;

    public partial class UserDefinedFunctions

    {

    /// <summary>

    /// License:

    ///

    /// This code sample is part of the QueryParallelizer project. You are free to use or modify this code for

    /// educational and internal corporate purposes, as long as this header is preserved. Sale or redistribution

    /// of this code to third parties in its original form, modified form, or compiled form, is strictly prohibited

    /// without written consent by Adam Machanic.

    ///

    /// (C) 2010 Adam Machanic

    /// amachanic@gmail.com

    /// </summary>

    [SqlFunction

    (

    DataAccess = DataAccessKind.Read,

    FillRowMethodName = "SequenceFill"

    )

    ]

    public static IEnumerable Sequence

    (

    SqlString query,

    SqlString minVariable,

    SqlString maxVariable,

    SqlInt32 minValue,

    SqlInt32 maxValue,

    SqlInt32 workerThreads,

    SqlString destinationTableName

    )

    {

    parallelWorker worker = new parallelWorker();

    QueryParallelizer<OutputRecord> qp =

    new QueryParallelizer<OutputRecord>

    (

    query.Value,

    minVariable.Value,

    maxVariable.Value,

    minValue.Value,

    maxValue.Value,

    workerThreads.Value,

    new QueryParallelizer<OutputRecord>.RowLogicDelegate(worker.doWork)

    );

    qp.BulkSettings = new QueryParallelizer<OutputRecord>.BulkCopySettings

    (

    destinationTableName.Value,

    3,

    DecodeOrdinal,

    false,

    2,

    null,

    SqlBulkCopyOptions.TableLock,

    0,

    null

    );

    qp.ReuseConnection = true;

    return (qp.Process());

    }

    public static object DecodeOrdinal(OutputRecord row, int ordinal)

    {

    switch (ordinal)

    {

    case 0:

    return (row.AccountNumber);

    case 1:

    return (row.CheckId);

    case 2:

    return (row.SequenceId);

    default:

    throw new Exception("No such i");

    }

    }

    public static void SequenceFill

    (

    object o,

    out SqlInt32 AccountNumber,

    out SqlInt32 CheckId,

    out SqlInt32 SequenceId

    )

    {

    OutputRecord or = (OutputRecord)o;

    AccountNumber = or.AccountNumber;

    CheckId = or.CheckId;

    SequenceId = or.SequenceId;

    }

    };

    public class OutputRecord

    {

    public OutputRecord()

    {

    }

    public OutputRecord

    (

    int AccountNumber,

    int CheckId,

    int SequenceId

    )

    {

    this.AccountNumber = AccountNumber;

    this.CheckId = CheckId;

    this.SequenceId = SequenceId;

    }

    public int AccountNumber;

    public int CheckId;

    public int SequenceId;

    }

    class parallelWorker

    {

    public parallelWorker() { }

    public IEnumerable<OutputRecord> doWork(SqlDataReader rows)

    {

    bool firstRecord = true;

    int sequence = 1;

    int lastAccount = default(int);

    string lastStatus = default(string);

    int account = default(int);

    int checkId = default(int);

    string status = default(string);

    while (rows.Read())

    {

    // Read the columns

    account = rows.GetInt32(0);

    checkId = rows.GetInt32(1);

    status = rows.GetString(2);

    if (firstRecord)

    {

    firstRecord = false;

    }

    else

    {

    if (account != lastAccount)

    {

    sequence = 1;

    }

    if (status != lastStatus)

    {

    sequence++;

    }

    }

    yield return (new OutputRecord(account, checkId, sequence));

    lastAccount = account;

    lastStatus = status;

    }

    }

    }

  • Paul White NZ (10/23/2010)


    I'm not sure I see where the requirement to update the original table comes from?

    True enough. I suppose the output could be consumed by other code.

    --Jeff Moden


    RBAR is pronounced "ree-bar" and is a "Modenism" for Row-By-Agonizing-Row.
    First step towards the paradigm shift of writing Set Based code:
    ________Stop thinking about what you want to do to a ROW... think, instead, of what you want to do to a COLUMN.

    Change is inevitable... Change for the better is not.


    Helpful Links:
    How to post code problems
    How to Post Performance Problems
    Create a Tally Function (fnTally)

  • Paul White NZ (10/23/2010)


    If the results need to be persisted, simply change the SELECT into a SELECT INTO.

    Heh... Of course... I've really got to stop posting when I'm tired. Thanks, Paul.

    --Jeff Moden


    RBAR is pronounced "ree-bar" and is a "Modenism" for Row-By-Agonizing-Row.
    First step towards the paradigm shift of writing Set Based code:
    ________Stop thinking about what you want to do to a ROW... think, instead, of what you want to do to a COLUMN.

    Change is inevitable... Change for the better is not.


    Helpful Links:
    How to post code problems
    How to Post Performance Problems
    Create a Tally Function (fnTally)

  • Paul,

    Do the source (##temp) and destination (##Results) tables need to be global tables in order for the solution that you posted to work?

    --Jeff Moden


    RBAR is pronounced "ree-bar" and is a "Modenism" for Row-By-Agonizing-Row.
    First step towards the paradigm shift of writing Set Based code:
    ________Stop thinking about what you want to do to a ROW... think, instead, of what you want to do to a COLUMN.

    Change is inevitable... Change for the better is not.


    Helpful Links:
    How to post code problems
    How to Post Performance Problems
    Create a Tally Function (fnTally)

  • Jeff Moden (10/23/2010)


    Do the source (##temp) and destination (##Results) tables need to be global tables in order for the solution that you posted to work?

    Hi Jeff,

    The most accurate answer is to say that #tables and table variables won't work because they are private to a particular session. Normal tables and ##tables work fine. The other reason I chose a ##table is because tempdb is always in SIMPLE mode, so bulk loading will be minimally logged (the SQLCLR code takes a table lock).

    The multiple reading and writing threads use different sessions, so a #table or variable would not be visible.

    Paul

  • Paul White NZ (10/23/2010)


    .......

    The multiple reading and writing threads use different sessions, so a #table or variable would not be visible.

    Paul

    That is the ultimate, one and only valid reason to use global temporary tables.

    Great feedback !

    T-14 and counting for SQLPass

    Johan

    Learn to play, play to learn !

    Dont drive faster than your guardian angel can fly ...
    but keeping both feet on the ground wont get you anywhere :w00t:

    - How to post Performance Problems
    - How to post data/code to get the best help[/url]

    - How to prevent a sore throat after hours of presenting ppt

    press F1 for solution, press shift+F1 for urgent solution πŸ˜€

    Need a bit of Powershell? How about this

    Who am I ? Sometimes this is me but most of the time this is me

  • Out of curiosity, how many records are you processing? And did you try out the script that I posted?

    Wayne

    Thank you (and all of the others) for your suggestions. There were about 300,000 records processed. I looked at your script and saw that it was centered on a field you acctnum. There really isn't any such field in my table. Perhaps you saw that field in my table called BankAcctId which one could could think is an account number. For my application, that field contains the same value for all of my 300,000 records. (It had a second value for the other 100,000+ records that I later excluded.)

    Also, since my script might be run by more than one user at the same time, I wanted to avoid having it create and then drop permanent tables.

    gmrose

  • gmrose (10/23/2010)


    Out of curiosity, how many records are you processing? And did you try out the script that I posted?

    Wayne

    Thank you (and all of the others) for your suggestions. There were about 300,000 records processed. I looked at your script and saw that it was centered on a field you acctnum. There really isn't any such field in my table. Perhaps you saw that field in my table called BankAcctId which one could could think is an account number. For my application, that field contains the same value for all of my 300,000 records. (It had a second value for the other 100,000+ records that I later excluded.)

    Also, since my script might be run by more than one user at the same time, I wanted to avoid having it create and then drop permanent tables.

    gmrose

    Thanks for the feedback.

    In the script I posted here, I was only using the ckid and stat fields. However, you would need to populate a temp table with the data you want processed, and put a clustered index on it. (The other script I posted was to try to get ColdCoffee to practice this, and doesn't apply to your issue.)

    Wayne
    Microsoft Certified Master: SQL Server 2008
    Author - SQL Server T-SQL Recipes


    If you can't explain to another person how the code that you're copying from the internet works, then DON'T USE IT on a production system! After all, you will be the one supporting it!
    Links:
    For better assistance in answering your questions
    Performance Problems
    Common date/time routines
    Understanding and Using APPLY Part 1 & Part 2

  • Jeff Moden (10/22/2010)


    ... we'll have a drag race. πŸ™‚

    Quirky Update would win this one Jeff, by a factor of about 7 - we both know that πŸ™‚

    I don't think we'll find a requirement which can be met by both methods and won on performance by a rCTE. Had the OP's requirement been for an update then I wouldn't have bothered but since it was for a select, it was marginally worth it. Thing is, it's so darned easy to get the correct results out of a rCTE. It's only when you want it to run quickly that you have to resort to the same warm cosy cosseted environment that the quirky update requires.

    700ms! Paul you do make me laugh! 24hrs --> 5mins --> 16secs --> (Quirky Update, about 2secs) --> 700ms. Not bad at all.


    [font="Arial"]Low-hanging fruit picker and defender of the moggies[/font]

    For better assistance in answering your questions, please read this[/url].


    Understanding and using APPLY, (I)[/url] and (II)[/url] Paul White[/url]

    Hidden RBAR: Triangular Joins[/url] / The "Numbers" or "Tally" Table: What it is and how it replaces a loop[/url] Jeff Moden[/url]

Viewing 15 posts - 16 through 30 (of 37 total)

You must be logged in to reply to this topic. Login to reply