当前位置:Gxlcms > mysql > SQLSERVER中KeyHashValue的作用(下)

SQLSERVER中KeyHashValue的作用(下)

时间:2021-07-01 10:21:17 帮助过:50人阅读

SQLSERVER中KeyHashValue的作用(下) 昨天中午跟高文佳童鞋讨论了 KeyHashValue 的作用,到最后还是没有讨论出结果 昨天晚上德国的兄弟傅文伟做了一下实验,将实验结果交给我 感谢他们 SQLSERVER中KeyHashValue的作用(上) 虽然对于keyhashvalue的研究还有

SQLSERVER中KeyHashValue的作用(下)

昨天中午跟高文佳童鞋讨论了KeyHashValue的作用,到最后还是没有讨论出结果

昨天晚上德国的兄弟傅文伟做了一下实验,将实验结果交给我

感谢他们

SQLSERVER中KeyHashValue的作用(上)

虽然对于keyhashvalue的研究还有很多问题还没有解决,但是基本可以确定“keyhashvalue是用来锁定资源的”

而不是我之前说的,在seek的时候根据这个KeyHashValue来快速查找到对应的记录

误导大家了,真的不好意思!!!!

资源 说明
RID 用于锁定堆(heap)中的某一行
KEY 用于锁定索引上的某一行,或者某个索引键
PAGE 锁定数据库中的一个8KB页,例如数据页或索引页
EXTENT 一组连续的8页(区)
HOBT 锁定整个堆或B树的锁
TABLE 锁定包括所有数据和索引的整个表
FILE 数据库文件
APPLICATION 应用程序专用的资源
METADATA 元数据锁
ALLOCATION_UNIT 分配单元
DATABASE 整个数据库

KEY是靠生成的这个KeyHashValue来进行锁定索引中的行

KEY 用于锁定索引上的某一行

为什么需要这个KeyHashValue???

由于很苟很苟没有写C#代码,不过我觉得从C#的多线程同步来理解会更加好

例如:

lock 语句 lock 确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代

码,则它将一直等待(即被阻止),直到该对象被释放,大家可以把同步对象理解为KeyHashValue

c# 多线程同步

c# 多线程同步

大家还是看给出的文章链接吧,因为本人很苟很苟没有写C#代码了,细节的东西看文章比较好

网上有很多相关的文章:

例如

建立索引的时候为什麽有900bytes的限制

为了性能,不可能让您在比较大的数据类型下,而且存储了非常多的数据的字段上建立索引

因为这样做的话,要计算出KeyHashValue就会非常消耗性能

这篇文章:Improvement in minimizing lockhash key collisions in SQL Server 2008R2 and its impact on concurrency

Since the key to a row could be as large as 900 bytes, using the real key values would have inflicted larger memory consumption.

引入

The solution to this problem was found when designing SQL server 7.0 in 1996 and 1997 by using the key of the row and apply

a hash algorithm to it which then results in a 6 byte long lockhash value

我将这些文章整理到我的文章里:undocumented virtual column %%lockres%%

在SQLSERVER2005下跟SQLSERVER2012下,建立相同的聚集索引,你会看到在SQL2005下,表的聚集索引页面有KeyHashValue

但是在SQL2012下,表的聚集索引页面的KeyHashValue列全部为NULL

由于我没有SQL2008,所以没有测试SQL2008,估计从SQL2008开始,KeyHashValue开始有些变化了

在SQL2005里,你使用dbcc page查看数据页面,数据页面里的每行记录是没有显示KeyHashValue的,不知道要打开哪个跟踪标记才能看到

在SQL2005里唯一能看到数据页面中的keyhashvalue只有使用%%lockres%%

而在SQL2012,不用做任何设置,使用dbcc page就可以看到KeyHashValue

当然也可以用%%lockres%%:

1 SELECT   %%lockres%% AS '数据页的keyhashvalue' FROM  表名

页面126是数据页面

1 DBCC TRACEON(3604,-1)
2 GO
3 DBCC PAGE(testhashkey,1,126,3) 
4 GO

Slot 0 Offset 0x0 Length 0 Length (physical) 0

KeyHashValue = (8194443284a0)

DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。

SQL2012最大的改进是提示非常清晰,而且以前的SQLSERVER版本没有显示出来的东西都给你显示出来了,

这样有时候就不用做那么多系统表的表连接,如果是以前版本的SQLSERVER要查看某一个信息的时候又要做

这个系统表的表连接又要做那个表的表连接才能得出这个自己想看的东西,非常繁琐

例如如下改进:

聚集索引页面的显示,SQL2005是没有Row Size这一列的

下面的所有测试都是基于SQLSERVER2005 SP4 个人开发版


聚集索引

创建聚集索引的时候无论是唯一还是不唯一都会产生KeyHashValue

但是为了实验的方便,我这里只创建唯一聚集索引,因为不唯一的话会产生range locks不方便查看结果

详细请参考文章:Range locks

脚本:

 1 USE master
 2 GO
 3 CREATE DATABASE testhashkey
 4 GO
 5 
 6 USE testhashkey
 7 GO
 8 
 9 --------------------------------------------
10 --测试聚集索引
11 CREATE TABLE testcluster
12     (
13       a NVARCHAR(3800) NOT NULL ,
14       b INT NOT NULL
15     )
16 GO
17 
18 --这里一定要是唯一的
19 CREATE UNIQUE  CLUSTERED INDEX ucl ON testcluster(b)
20 GO
21 
22 INSERT  testcluster
23 SELECT  CAST(11 AS VARCHAR(10))+replicate('a', 3500),1 UNION ALL
24 SELECT  CAST(22 AS VARCHAR(10))+replicate('a', 3500),2

View Code

查看表情况的脚本

 1 CREATE TABLE DBCCResult (
 2 PageFID NVARCHAR(200),
 3 PagePID NVARCHAR(200),
 4 IAMFID NVARCHAR(200),
 5 IAMPID NVARCHAR(200),
 6 ObjectID NVARCHAR(200),
 7 IndexID NVARCHAR(200),
 8 PartitionNumber NVARCHAR(200),
 9 PartitionID NVARCHAR(200),
10 iam_chain_type NVARCHAR(200),
11 PageType NVARCHAR(200),
12 IndexLevel NVARCHAR(200),
13 NextPageFID NVARCHAR(200),
14 NextPagePID NVARCHAR(200),
15 PrevPageFID NVARCHAR(200),
16 PrevPagePID NVARCHAR(200)
17 )
18 
19 TRUNCATE TABLE [dbo].[DBCCResult]
20 
21 INSERT INTO DBCCResult EXEC ('DBCC IND(testhashkey,testcluster,-1) ')
22 
23 SELECT * FROM [dbo].[DBCCResult] ORDER BY [PageType] DESC 

View Code

聚集索引页面

其实我这里暂时还不清楚聚集索引页面的KeyHashValue有什么作用,为什麽这样说??请往下看

我们看一下表中的每行记录的所产生的keyhashvalue

1 select %%lockres%% AS '数据页的keyhashvalue' from testcluster

大家可以看到,无论是索引行还是数据行都有KeyHashValue

我们使用下面语句进行测试,查看SQLSERVER锁定的资源

 1 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
 2 GO
 3 BEGIN TRANSACTION
 4 SELECT b FROM [dbo].[testcluster] WHERE [b]=1
 5 --COMMIT TRAN
 6 
 7 SELECT  resource_type ,
 8         resource_database_id ,
 9         resource_description ,
10         resource_associated_entity_id ,
11         request_mode ,
12         request_type ,
13         request_status
14 FROM    sys.dm_tran_locks
15 WHERE   [resource_database_id]=DB_ID('testhashkey')
16 ORDER BY [resource_type]

View Code

为什麽我刚才说:不清楚聚集索引页面的KeyHashValue有什么作用???

大家可以用下面的脚本来测试一下,无论我select还是update,DepartmentID BETWEEN 0 AND 122之间

使用sys.dm_tran_locks视图来查询,发现resource_description字段都没有显示聚集索引页面的keyhashvalue,只显示数据页面

的keyhashvalue,说明我在select和update的时候没有用到聚集索引页面的keyhashvalue,这里我不知道在什么情况下会用到

聚集索引页面的KeyHashValue

脚本如下:

 1 USE master
 2 GO
 3 CREATE DATABASE practice
 4 GO
 5 
 6 USE practice
 7 GO
 8 
 9 --只有聚集索引
10 CREATE TABLE Department(
11     DepartmentID int IDENTITY(1,1) NOT NULL PRIMARY KEY,
12     Name NVARCHAR(200) NOT NULL,
13     GroupName NVARCHAR(200) NOT NULL,
14     Company NVARCHAR(300),
15     ModifiedDate datetime NOT NULL  DEFAULT (getdate())
16 )
17 
18 INSERT INTO Department(name,[Company],groupname) VALUES('销售部','中国你好有限公司XX分公司','销售组')
19 GO 100000
20 
21 CREATE TABLE DBCCResult (
22 PageFID NVARCHAR(200),
23 PagePID NVARCHAR(200),
24 IAMFID NVARCHAR(200),
25 IAMPID NVARCHAR(200),
26 ObjectID NVARCHAR(200),
27 IndexID NVARCHAR(200),
28 PartitionNumber NVARCHAR(200),
29 PartitionID NVARCHAR(200),
30 iam_chain_type NVARCHAR(200),
31 PageType NVARCHAR(200),
32 IndexLevel NVARCHAR(200),
33 NextPageFID NVARCHAR(200),
34 NextPagePID NVARCHAR(200),
35 PrevPageFID NVARCHAR(200),
36 PrevPagePID NVARCHAR(200)
37 )
38 
39 TRUNCATE TABLE [dbo].[DBCCResult]
40 
41 INSERT INTO DBCCResult EXEC ('DBCC IND(practice,Department,-1) ')
42 
43 SELECT * FROM [dbo].[DBCCResult] ORDER BY [PageType] DESC 
44 
45 DBCC TRACEON(3604,-1)
46 GO
47 DBCC PAGE(practice,1,114,3) 
48 GO
49 
50 select %%lockres%% AS '数据页的keyhashvalue' from Department
51 
52 
53 
54 
55 
56 
57 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
58 GO
59 BEGIN TRANSACTION
60 SELECT DepartmentID FROM Department WHERE DepartmentID BETWEEN 0 AND 122 
61 --COMMIT TRAN
62 
63 SELECT  resource_type ,
64         resource_database_id ,
65         resource_description ,
66         resource_associated_entity_id ,
67         request_mode ,
68         request_type ,
69         request_status
70 FROM    sys.dm_tran_locks
71 WHERE   [resource_database_id]=DB_ID('practice') 
72 AND [resource_description] LIKE '%b03b%'
73 ORDER BY [resource_type]

View Code


我做了一个大胆的假设:其实聚集索引页面的keyhashvalue是没有用的!!!

原因一:

如果把刚才的脚本在SQL2012下运行,你会发现聚集索引的KeyHashValue列全部为NULL

原因二:

就是我上面的测试脚本,无论我select还是update,DepartmentID BETWEEN 0 AND 122之间

使用sys.dm_tran_locks视图来查询,发现resource_description字段都没有显示聚集索引页面的keyhashvalue,只显示数据页面

KeyHashValue

原因三:

就是昨天跟高文佳童鞋讨论的时候,他也发现了有时候在聚集索引里也会看到KeyHashValue列全部为NULL

我之前在SQLSERVER2005下也测试过,确实是这样

SQLSERVER中KeyHashValue的作用(上)

原因四:

可能为了不改动代码,原先SQLSERVER团队设计的时候只需要非聚集索引有KeyHashValue就可以了,而聚集索引不需要KeyHashValue

但是如果是这样,为了减少改动,不写两套代码,或者为了某种兼容性(与前面版本兼容),而不删除聚集索引的KeyHashValue


非聚集索引

非聚集索引表的非聚集索引页有KeyHashValue,但是数据页是没有KeyHashValue

创建非聚集索引,这里我也是指定唯一的

脚本:

 1 --测试非聚集索引
 2 USE [testhashkey]
 3 GO
 4 CREATE TABLE testnoncluster
 5     (
 6       a NVARCHAR(3800) NOT NULL ,
 7       b INT NOT NULL
 8     )
 9 GO
10 
11 CREATE UNIQUE NONCLUSTERED INDEX ucil ON testnoncluster(b)
12 GO
13 
14 INSERT  testnoncluster
15 SELECT  CAST(11 AS VARCHAR(10))+replicate('a', 3500),1 UNION ALL
16 SELECT  CAST(22 AS VARCHAR(10))+replicate('a', 3500),2
17 
18 
19 SELECT * FROM [dbo].[testnoncluster]

View Code

查看表情况的脚本

 1 TRUNCATE TABLE [dbo].[DBCCResult]
 2 
 3 INSERT INTO DBCCResult EXEC ('DBCC IND(testhashkey,testnoncluster,-1) ')
 4 
 5 SELECT * FROM [dbo].[DBCCResult] ORDER BY [PageType] DESC 
 6 
 7 DBCC TRACEON(3604,-1)
 8 GO
 9 DBCC PAGE(testhashkey,1,77,3) 
10 GO

View Code

非聚集索引页面

我们看一下表中的每行记录的所产生的keyhashvalue

1 select %%lockres%% AS '数据页的keyhashvalue' from testnoncluster

大家可以看到,这里只显示了行记录的FID:PID:RID,并没有显示keyhashvalue

我们使用下面语句进行测试,查看SQLSERVER锁定的资源

 1 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
 2 GO
 3 BEGIN TRANSACTION
 4 SELECT b FROM [dbo].[testnoncluster] WHERE [b]=1
 5 --COMMIT TRAN
 6 
 7 SELECT  resource_type ,
 8         resource_database_id ,
 9         resource_description ,
10         resource_associated_entity_id ,
11         request_mode ,
12         request_type ,
13         request_status
14 FROM    sys.dm_tran_locks
15 WHERE   [resource_database_id]=DB_ID('testhashkey')
16 ORDER BY [resource_type]

View Code

我们使用下面脚本创建一个非聚集索引表testnoncluster2

 1 --测试堆表和非聚集索引表的数据页也有keyhashvalue
 2 USE [testhashkey]
 3 GO
 4 
 5 
 6 CREATE TABLE testnoncluster2
 7     (
 8       a NVARCHAR(3800) NOT NULL ,
 9       b INT NOT NULL,
10       c INT NOT NULL 
11     )
12 GO
13 
14 
15 
16 CREATE UNIQUE NONCLUSTERED INDEX ucil ON testnoncluster2(b)
17 GO
18 
19 INSERT  testnoncluster2
20 SELECT  CAST(11 AS VARCHAR(10))+replicate('a', 3500),1,1 UNION ALL
21 SELECT  CAST(22 AS VARCHAR(10))+replicate('a', 3500),2,2
22 
23 
24 
25 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
26 GO
27 BEGIN TRANSACTION
28 DELETE FROM [dbo].[testnoncluster2]  WHERE [c]=1
29 --ROLLBACK TRAN
30 
31 SELECT  resource_type ,
32         resource_database_id ,
33         resource_description ,
34         resource_associated_entity_id ,
35         request_mode ,
36         request_type ,
37         request_status
38 FROM    sys.dm_tran_locks
39 WHERE   [resource_database_id]=DB_ID('testhashkey') 
40 ORDER BY [resource_type]
41 
42 
43 
44 
45 select %%lockres%% AS '数据页的keyhashvalue' from testnoncluster2

View Code

这次删除非聚集索引表的一行

为了保证我的结论的正确性,我在SQLSERVER2012里也用上面的脚本测试了一下,创建了表testnoncluster2

脚本:

 1 --测试堆表和非聚集索引表的数据页也有keyhashvalue
 2 USE [testhashkey]
 3 GO
 4 
 5 
 6 
 7 CREATE TABLE testnoncluster2
 8     (
 9       a NVARCHAR(3800) NOT NULL ,
10       b INT NOT NULL,
11       c INT NOT NULL 
12     )
13 GO
14 
15 
16 
17 CREATE UNIQUE NONCLUSTERED INDEX ucil ON testnoncluster2(b)
18 GO
19 
20 INSERT  testnoncluster2
21 SELECT  CAST(11 AS VARCHAR(10))+replicate('a', 3500),1,1 UNION ALL
22 SELECT  CAST(22 AS VARCHAR(10))+replicate('a', 3500),2,2
23 
24 
25 
26 
27 
28 TRUNCATE TABLE [dbo].[DBCCResult]
29 
30 INSERT INTO DBCCResult EXEC ('DBCC IND(testhashkey,testnoncluster2,-1) ')
31 
32 SELECT * FROM [dbo].[DBCCResult] ORDER BY [PageType] DESC 
33 
34 DBCC TRACEON(3604,-1)
35 GO
36 DBCC PAGE(testhashkey,1,165,3) 
37 GO

View Code

数据页面165

  1 DBCC 执行完毕。如果 DBCC 
输出了错误信息,请与系统管理员联系。 2 3 PAGE: (1:165) 4 5 6 BUFFER: 7 8 9 BUF @0x049D10A8 10 11 bpage = 0x14784000 bhash = 0x00000000 bpageno = (1:165) 12 bdbid = 7 breferences = 0 bcputicks = 0 13 bsampleCount = 0 bUse1 = 23721 bstat = 0xb 14 blog = 0xdb215acc bnext = 0x00000000 15 16 PAGE HEADER: 17 18 19 Page @0x14784000 20 21 m_pageId = (1:165) m_headerVersion = 1 m_type = 1 22 m_typeFlagBits = 0x0 m_level = 0 m_flagBits = 0x8000 23 m_objId (AllocUnitId.idObj) = 90 m_indexId (AllocUnitId.idInd) = 256 24 Metadata: AllocUnitId = 72057594043826176 25 Metadata: PartitionId = 72057594039238656 Metadata: IndexId = 0 26 Metadata: ObjectId = 629577281 m_prevPage = (0:0) m_nextPage = (0:0) 27 pminlen = 12 m_slotCnt = 1 m_freeCnt = 1071 28 m_freeData = 7119 m_reservedCnt = 0 m_lsn = (35:211:62) 29 m_xactReserved = 0 m_xdesId = (0:0) m_ghostRecCnt = 0 30 m_tornBits = 0 DB Frag ID = 1 31 32 Allocation Status 33 34 GAM (1:2) = ALLOCATED SGAM (1:3) = ALLOCATED 35 PFS (1:1) = 0x63 MIXED_EXT ALLOCATED 95_PCT_FULL DIFF (1:6) = CHANGED 36 ML (1:7) = NOT MIN_LOGGED 37 38 Slot 0 Offset 0x60 Length 7023 39 40 Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP VARIABLE_COLUMNS 41 Record Size = 7023 42 Memory Dump @0x0FB7C060 43 44 00000000: 30000c00 01000000 01000000 03000001 006f1b31 0................o.1 45 00000014: 00310061 00610061 00610061 00610061 00610061 .1.a.a.a.a.a.a.a.a.a 46 00000028: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 47 0000003C: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 48 00000050: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 49 00000064: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 50 00000078: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 51 0000008C: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 52 000000A0: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 53 000000B4: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 54 000000C8: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 55 000000DC: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 56 000000F0: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 57 00000104: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 58 00000118: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 59 0000012C: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 60 00000140: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 61 00000154: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 62 00000168: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 63 0000017C: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 64 00000190: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 65 000001A4: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 66 000001B8: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 67 000001CC: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 68 000001E0: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 69 000001F4: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 70 00000208: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 71 0000021C: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 72 00000230: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 73 00000244: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 74 00000258: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 75 0000026C: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 76 00000280: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 77 00000294: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 78 000002A8: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 79 000002BC: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 80 000002D0: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 81 000002E4: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 82 000002F8: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 83 0000030C: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 84 00000320: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 85 00000334: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 86 00000348: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 87 0000035C: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 88 00000370: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 89 00000384: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 90 00000398: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 91 000003AC: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 92 000003C0: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 93 000003D4: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 94 000003E8: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 95 000003FC: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 96 00000410: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 97 00000424: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 98 00000438: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 99 0000044C: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 100 00000460: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 101 00000474: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 102 00000488: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 103 0000049C: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 104 000004B0: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 105 000004C4: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 106 000004D8: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 107 000004EC: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 108 00000500: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 109 00000514: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 110 00000528: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 111 0000053C: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 112 00000550: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 113 00000564: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 114 00000578: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 115 0000058C: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 116 000005A0: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 117 000005B4: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 118 000005C8: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 119 000005DC: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 120 000005F0: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 121 00000604: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 122 00000618: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 123 0000062C: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 124 00000640: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 125 00000654: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 126 00000668: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 127 0000067C: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 128 00000690: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 129 000006A4: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 130 000006B8: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 131 000006CC: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 132 000006E0: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 133 000006F4: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 134 00000708: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 135 0000071C: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 136 00000730: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 137 00000744: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 138 00000758: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 139 0000076C: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 140 00000780: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 141 00000794: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 142 000007A8: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 143 000007BC: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 144 000007D0: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 145 000007E4: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 146 000007F8: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 147 0000080C: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 148 00000820: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 149 00000834: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 150 00000848: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 151 0000085C: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 152 00000870: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 153 00000884: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 154 00000898: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 155 000008AC: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 156 000008C0: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 157 000008D4: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 158 000008E8: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 159 000008FC: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 160 00000910: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 161 00000924: 00610061 00610061 00610061 00610061 00610061 .a.a.a.a.a.a.a.a.a.a 162 00000938: 00610061 00610061