ÿÿ€ €€‚Write$£€ÉDECwrite V3.1 <39>¡€ €0€Ô Write$DD_PGR¥€ Šï5`0€Ô Write$DD_PGF0€Ô Write$DD_2S€0€Ô Write$DD_2LF€0€Ô Write$DD_2HOF€0€Ô Write$DD_2FOF€0€Ô Write$DF_PF€0€Ô Write$DF_RM0€Ô Write$DF_CB0€Ô Write$D_TYPE¢€Égenrl0€Ô Write$D_SG_RT0€Ô Write$C_FR¢€ÉFloating Frame0€Ô Write$C_TA¢€ÉTable0€Ô Write$C_L¢€ÉBulleted List0€Ô Write$C_FN¢€É Footnote0€Ô Write$C_PG¢€ÉPage-L0€Ô Write$C_M1¢€ÉPage0€Ô Write$C_P¢€ÉInclude Paragraph Text0€Ô Write$C_TR¢€É Textblock0€Ô Write$C_TTL¢€É Table Title0€Ô Write$C_TOC¢€ÉTOC0€ÔW$HT0€ÔW$HU0€ÔW$HV0€ÔW$HW„19960830130305¥€Ô$STSÔ$LO1Ô$FMTD¦€0€€+ ‡s¡€ÉDDIF‚%cda$library_en_us:wr_genrl.doc_styleƒ$RMS„§€€en_US€en_GB€fr_FR€fr_CA€de_DE€de_CH€sv_SE€es_ES€it_IT€da_DK€nl_NL€pt_PT€no_NO€fi_FI€ja_JP€zh_CN€zh_TW€ko_KR€fr_CH€it_CH€fr_BE€iw_IL en_Medical en_Businessˆ¢€b€£€‚$T¤€0€€$PG¡€0€€$PG.ru¡€£€€0€€$PG.rl¡€£€€0€€$PG.au¡€£€€0€€$PG.al¡€£€€‡©€€ ¡€É centipoints«€ €¡€"€«€0€ €€€¬€0€€Ù9-ADOBE-Helvetica-Medium-R-Normal--*-120-*-*-P-*-ISO8859-10€€ß9-ADOBE-Helvetica-Medium-R-Normal--*-140-*-*-P-*-ISO8859-10€€Ü9-ADOBE-Helvetica-Medium-R-Normal--*-180-*-*-P-*-ISO8859-10€€Ú7-ADOBE-Helvetica-Bold-R-Normal--*-120-*-*-P-*-ISO8859-10€€á9-ADOBE-Helvetica-Medium-O-Normal--*-120-*-*-P-*-ISO8859-10€€Þ7-ADOBE-Helvetica-Bold-O-Normal--*-120-*-*-P-*-ISO8859-10€€à7-ADOBE-Helvetica-Bold-O-Normal--*-140-*-*-P-*-ISO8859-10€€Ý7-ADOBE-Helvetica-Bold-O-Normal--*-180-*-*-P-*-ISO8859-10€€Û5-ADOBE-Times-Medium-R-Normal--*-100-*-*-P-*-ISO8859-10€€Ø5-ADOBE-Times-Medium-R-Normal--*-120-*-*-P-*-ISO8859-10€€æ5-ADOBE-Times-Medium-R-Normal--*-140-*-*-P-*-ISO8859-10€€â5-ADOBE-Times-Medium-R-Normal--*-180-*-*-P-*-ISO8859-10€€ã3-ADOBE-Times-Bold-R-Normal--*-120-*-*-P-*-ISO8859-10€€ç3-ADOBE-Times-Bold-R-Normal--*-140-*-*-P-*-ISO8859-10€€ä5-ADOBE-Times-Medium-I-Normal--*-120-*-*-P-*-ISO8859-10€€å3-ADOBE-Times-Bold-I-Normal--*-120-*-*-P-*-ISO8859-1­€0€€7¡€ €€‚¤€0€ÔWrite$ColorName¢€ÉBlack0€€8¡€ €€@@‚@¤€0€ÔWrite$ColorName¢€ÉWhite0€€9¡€ €€@þ‚¤€0€ÔWrite$ColorName¢€ÉRed0€€:¡€ €€@þ‚¤€0€ÔWrite$ColorName¢€ÉGreen0€€;¡€ €€‚@þ¤€0€ÔWrite$ColorName¢€ÉBlue0€€<¡€ €€@þ@þ‚¤€0€ÔWrite$ColorName¢€ÉYellow0€€=¡€ €€@þ‚@þ¤€0€ÔWrite$ColorName¢€ÉCyan0€€>¡€ €€@þ‚@þ¤€0€ÔWrite$ColorName¢€ÉMagenta0€€?¢€€¡€0€€@¢€€¡€0€€A¢€€¡€0€€B¢€€¡€°€0€€Date¢€C 0€€ Footer Text¢€C 0€€ Header Text¢€C ±€0€€Flow¢€¡€Ô$DB‚$T£€Ô$FLOW¤€0€€ $TTL.tab.1¡€€ $TTL.tab.10€€$FN¡€€$FN0€€ $TTL.fig.1¡€€ $TTL.fig.10€€S1¢€£€Ô$S.10€€S2¢€£€Ô$S.20€€S3¢€£€Ô$S.30€€Include Paragraph Tab-2¢€£€Ô$P«€ € €!€€‚€ƒ„…¡€"€‚„¥€€¦€€§€€¨€€©€€°ª€¡€€È«€0€ €€D0€ €€,ˆ0€ €€BÌ0€ €€Y0€ €€oT0€ €€…˜0€ €€›Ü0€ €€² 0€ €€Èd0€ €€Þ¨0€ €€ôì0€ €€ 00€ €€!t0€ €€7¸0€ €€Mü²€€7Ø¢€£€€°¦€É.0€€Include Paragraph Text¢€£€Ô$P«€ € €!€€‚€ƒ„…¡€"€‚„¥€€¦€€§€€¨€€©€€°ª€¡€€È«€0€ €€D0€ €€,ˆ0€ €€BÌ0€ €€Y0€ €€oT0€ €€…˜0€ €€›Ü0€ €€² 0€ €€Èd0€ €€Þ¨0€ €€ôì0€ €€ 00€ €€!t0€ €€7¸0€ €€Mü²€€7Ø¢€£€€°¦€É.¤€€¡€0€€Page-L¡€0€Ô Write$PG_FMT¢€É#0€ÔWrite$PG_PTFMT¢€É.#0€Ô Write$PG_CB¥€èd0€Ô Write$PG_TRT¢€É Textblock0€Ô Write$PG_NUMÿ0€ÔWrite$PG_POINT0€Ô Write$PG_NSTY0€Ô Write$PG_PSTY0€Ô Write$PG_MG¥€      0€Ô Write$PG_FN¥€È0€Ô Write$PG_FIT€£€€Page-L¡€ € €€ï¡€ €€5`‚¤€b€£€‚$2D£€Ô$F³€ €€„…‡‰·€€¡€ € €€¡€€¡€ €€5`¡€€ï£€ €€€ï€€€5`€€5`€ï¤€ €€¡€€b€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$G³€ €€dµ€%€ €€ ¡€€¢€€ £€€ #€$€€ GLY$Page-L.1¡€ € €€ ¡€€ ¡€ €€@¡€€Òðƒ$¤€Ô$DBÔ$RL… GLY$Page-L.1Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.XMXMPDJG³€ €€dµ€%€ €€ ¡€€¢€€ £€€ #€$€€GLY$Page-L.hdr.1¡€ € €€¡€€×®¡€ €€ß–¡€€äVƒ ¤€Ô$HDRÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.XWGGPDJG³€ €€dµ€%€ €€ ¡€€¢€€ £€€ #€$€€GLY$Page-L.ftr.1¡€ € €€㹡€€Ï¡€ €€@¡€€ƒ ¤€Ô$FTRÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.XMXMPDJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page-L.trim.1¡€ € €€áy¡€€×°¡€ €€÷¡€€äVƒ ¤€Ô$DBÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.XWGGPDJG³€ €€dµ€%€ €€ ¡€€¢€€ £€€ #€$€€GLY$Page-L.trim.2¡€ € €€ ¡€€Ï¡€ €€âò¡€€ƒ ¤€Ô$DBÔ$RL‡Ab€‚Flow£€‚$T«€ €¡€"€ GLY$Page-L.1Ab€‚Flow£€¡€Ô$HDR‚$T«€ €¡€"€GLY$Page-L.hdr.1b€‚ Paragraph£€ €£€Ô$P«€ €¡€"€o€ Header TextIAAb€‚Flow£€¡€Ô$FTR‚$T«€ €¡€"€GLY$Page-L.ftr.1b€‚ Paragraph£€ €£€Ô$P«€ € €!€€¡€"€b€£€¥€‚$PGAIAAb€‚Flow£€‚$T«€ €¡€"€GLY$Page-L.trim.1b€‚ Paragraph£€ €£€Ô$P«€ € €!€€¡€"€o€DateIAAb€‚Flow£€‚$T«€ €¡€"€GLY$Page-L.trim.2b€‚ Paragraph£€ €£€Ô$P«€ €¡€"€o€ Footer TextIAAA¥€ € €€0¡€0€Ô Write$PG_FMT¢€É#0€ÔWrite$PG_PTFMT¢€É.#0€Ô Write$PG_CB¥€èd0€Ô Write$PG_TRT¢€É Textblock0€Ô Write$PG_NUM0€ÔWrite$PG_POINT0€Ô Write$PG_NSTY0€Ô Write$PG_PSTY0€Ô Write$PG_MG¥€      0€Ô Write$PG_FN¥€È0€Ô Write$PG_FR€£€€0¡€ € €€ï¡€ €€5`ƒPage¤€b€£€‚$2D£€Ô$F³€ €€„…‡‰·€€¡€ € €€¡€€¡€ €€ï¡€€5`£€ €€€5`€€€ï€€ï€5`¤€ €€¡€€b€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TPJMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.hdr.1-1¡€ € €€ ¡€€.¡€ €€Œˆ¡€€*Ôƒ ¤€Ô$HDRÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TGXMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.ftr.1-1¡€ € €€©N¡€€¡€ €€Òð¡€€”ƒ ¤€Ô$FTRÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TGXMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.trim.1-1¡€ € €€ ¡€€n¡€ €€¨À¡€€”ƒ ¤€Ô$DBÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TPJMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.trim.2-1¡€ € €€ŒØ¡€€.¡€ €€Òð¡€€*Ôƒ ¤€Ô$DBÔ$RL‡Ab€‚Flow£€¡€Ô$HDR‚$T«€ €¡€"€GLY$Page.hdr.1-1b€‚ Paragraph£€ €£€Ô$P«€ €¡€"€o€ Header TextIAAb€‚Flow£€¡€Ô$FTR‚$T«€ €¡€"€GLY$Page.ftr.1-1b€‚ Paragraph£€ €£€Ô$P«€ € €!€€¡€"€b€£€¥€‚$PGC1AIAAb€‚Flow£€‚$T«€ €¡€"€GLY$Page.trim.1-1b€‚ Paragraph£€ €£€Ô$P«€ €¡€"€o€ Footer TextIAAb€‚Flow£€‚$T«€ €¡€"€GLY$Page.trim.2-1b€‚ Paragraph£€ €£€Ô$P«€ € €!€€¡€"€o€DateIAAb€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$G³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€ GLY$XTBKJDJG¡€ € €€ ¡€€ ¡€ €€Òð¡€€@ƒ ¤€Ô$DBÔ$RL† GLY$XWDKJDJGAA €€1¡€0€Ô Write$PG_FMT¢€É#0€ÔWrite$PG_PTFMT¢€É.#0€Ô Write$PG_CB¥€èd0€Ô Write$PG_TRT¢€É Textblock0€Ô Write$PG_NUM0€ÔWrite$PG_POINT0€Ô Write$PG_NSTY0€Ô Write$PG_PSTY0€Ô Write$PG_MG¥€      0€Ô Write$PG_FN¥€È0€Ô Write$PG_FR€£€€1¡€ € €€ï¡€ €€5`ƒPage¤€b€£€‚$2D£€Ô$F³€ €€„…‡‰·€€¡€ € €€¡€€¡€ €€ï¡€€5`£€ €€€5`€€€ï€€ï€5`¤€ €€¡€€b€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TPJMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.hdr.1-2¡€ € €€ ¡€€.¡€ €€Œˆ¡€€*Ôƒ ¤€Ô$HDRÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TGXMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.ftr.1-2¡€ € €€©N¡€€¡€ €€Òð¡€€”ƒ ¤€Ô$FTRÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TGXMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.trim.1-2¡€ € €€ ¡€€n¡€ €€¨À¡€€”ƒ ¤€Ô$DBÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TPJMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.trim.2-2¡€ € €€ŒØ¡€€.¡€ €€Òð¡€€*Ôƒ ¤€Ô$DBÔ$RL‡Ab€‚Flow£€¡€Ô$HDR‚$T«€ €¡€"€GLY$Page.hdr.1-2b€‚ Paragraph£€ €£€Ô$P«€ €¡€"€o€ Header TextIAAb€‚Flow£€¡€Ô$FTR‚$T«€ €¡€"€GLY$Page.ftr.1-2b€‚ Paragraph£€ €£€Ô$P«€ € €!€€¡€"€b€£€¥€‚$PGC2AIAAb€‚Flow£€‚$T«€ €¡€"€GLY$Page.trim.1-2b€‚ Paragraph£€ €£€Ô$P«€ €¡€"€o€ Footer TextIAAb€‚Flow£€‚$T«€ €¡€"€GLY$Page.trim.2-2b€‚ Paragraph£€ €£€Ô$P«€ € €!€€¡€"€o€DateIAAb€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$G³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€ GLY$XWDKJDJG¡€ € €€ ¡€€ ¡€ €€Òð¡€€@ƒ ¤€Ô$DBÔ$RL† GLY$XJPKJDJGAA €€2¡€0€Ô Write$PG_FMT¢€É#0€ÔWrite$PG_PTFMT¢€É.#0€Ô Write$PG_CB¥€èd0€Ô Write$PG_TRT¢€É Textblock0€Ô Write$PG_NUM0€ÔWrite$PG_POINT0€Ô Write$PG_NSTY0€Ô Write$PG_PSTY0€Ô Write$PG_MG¥€      0€Ô Write$PG_FN¥€È0€Ô Write$PG_FR€£€€2¡€ € €€ï¡€ €€5`ƒPage¤€b€£€‚$2D£€Ô$F³€ €€„…‡‰·€€¡€ € €€¡€€¡€ €€ï¡€€5`£€ €€€5`€€€ï€€ï€5`¤€ €€¡€€b€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TPJMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.hdr.1-3¡€ € €€ ¡€€.¡€ €€Œˆ¡€€*Ôƒ ¤€Ô$HDRÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TGXMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.ftr.1-3¡€ € €€©N¡€€¡€ €€Òð¡€€”ƒ ¤€Ô$FTRÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TGXMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.trim.1-3¡€ € €€ ¡€€n¡€ €€¨À¡€€”ƒ ¤€Ô$DBÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TPJMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.trim.2-3¡€ € €€ŒØ¡€€.¡€ €€Òð¡€€*Ôƒ ¤€Ô$DBÔ$RL‡Ab€‚Flow£€¡€Ô$HDR‚$T«€ €¡€"€GLY$Page.hdr.1-3b€‚ Paragraph£€ €£€Ô$P«€ €¡€"€o€ Header TextIAAb€‚Flow£€¡€Ô$FTR‚$T«€ €¡€"€GLY$Page.ftr.1-3b€‚ Paragraph£€ €£€Ô$P«€ € €!€€¡€"€b€£€¥€‚$PGC3AIAAb€‚Flow£€‚$T«€ €¡€"€GLY$Page.trim.1-3b€‚ Paragraph£€ €£€Ô$P«€ €¡€"€o€ Footer TextIAAb€‚Flow£€‚$T«€ €¡€"€GLY$Page.trim.2-3b€‚ Paragraph£€ €£€Ô$P«€ € €!€€¡€"€o€DateIAAb€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$G³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€ GLY$XJPKJDJG¡€ € €€ ¡€€ ¡€ €€Òð¡€€@ƒ ¤€Ô$DBÔ$RL† GLY$XJTTPDJGAA €€3¡€0€Ô Write$PG_FMT¢€É#0€ÔWrite$PG_PTFMT¢€É.#0€Ô Write$PG_CB¥€èd0€Ô Write$PG_TRT¢€É Textblock0€Ô Write$PG_NUM0€ÔWrite$PG_POINT0€Ô Write$PG_NSTY0€Ô Write$PG_PSTY0€Ô Write$PG_MG¥€      0€Ô Write$PG_FN¥€È0€Ô Write$PG_FR€£€€3¡€ € €€ï¡€ €€5`ƒPage¤€b€£€‚$2D£€Ô$F³€ €€„…‡‰·€€¡€ € €€¡€€¡€ €€ï¡€€5`£€ €€€5`€€€ï€€ï€5`¤€ €€¡€€b€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TPJMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.hdr.1-4¡€ € €€ ¡€€.¡€ €€Œˆ¡€€*Ôƒ ¤€Ô$HDRÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TGXMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.ftr.1-4¡€ € €€©N¡€€¡€ €€Òð¡€€”ƒ ¤€Ô$FTRÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TGXMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.trim.1-4¡€ € €€ ¡€€n¡€ €€¨À¡€€”ƒ ¤€Ô$DBÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TPJMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.trim.2-4¡€ € €€ŒØ¡€€.¡€ €€Òð¡€€*Ôƒ ¤€Ô$DBÔ$RL‡Ab€‚Flow£€¡€Ô$HDR‚$T«€ €¡€"€GLY$Page.hdr.1-4b€‚ Paragraph£€ €£€Ô$P«€ €¡€"€o€ Header TextIAAb€‚Flow£€¡€Ô$FTR‚$T«€ €¡€"€GLY$Page.ftr.1-4b€‚ Paragraph£€ €£€Ô$P«€ € €!€€¡€"€b€£€¥€‚$PGC4AIAAb€‚Flow£€‚$T«€ €¡€"€GLY$Page.trim.1-4b€‚ Paragraph£€ €£€Ô$P«€ €¡€"€o€ Footer TextIAAb€‚Flow£€‚$T«€ €¡€"€GLY$Page.trim.2-4b€‚ Paragraph£€ €£€Ô$P«€ € €!€€¡€"€o€DateIAAb€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$G³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€ GLY$XJTTPDJG¡€ € €€ ¡€€ ¡€ €€Òð¡€€@ƒ ¤€Ô$DBÔ$RL† GLY$XWTMPDJGAA €€4¡€0€Ô Write$PG_FMT¢€É#0€ÔWrite$PG_PTFMT¢€É.#0€Ô Write$PG_CB¥€èd0€Ô Write$PG_TRT¢€É Textblock0€Ô Write$PG_NUM0€ÔWrite$PG_POINT0€Ô Write$PG_NSTY0€Ô Write$PG_PSTY0€Ô Write$PG_MG¥€      0€Ô Write$PG_FN¥€È0€Ô Write$PG_FR€£€€4¡€ € €€ï¡€ €€5`ƒPage¤€b€£€‚$2D£€Ô$F³€ €€„…‡‰·€€¡€ € €€¡€€¡€ €€ï¡€€5`£€ €€€5`€€€ï€€ï€5`¤€ €€¡€€b€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TPJMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.hdr.1-5¡€ € €€ ¡€€.¡€ €€Œˆ¡€€*Ôƒ ¤€Ô$HDRÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TGXMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.ftr.1-5¡€ € €€©N¡€€¡€ €€Òð¡€€”ƒ ¤€Ô$FTRÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TGXMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.trim.1-5¡€ € €€ ¡€€n¡€ €€¨À¡€€”ƒ ¤€Ô$DBÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TPJMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.trim.2-5¡€ € €€ŒØ¡€€.¡€ €€Òð¡€€*Ôƒ ¤€Ô$DBÔ$RL‡Ab€‚Flow£€¡€Ô$HDR‚$T«€ €¡€"€GLY$Page.hdr.1-5b€‚ Paragraph£€ €£€Ô$P«€ €¡€"€o€ Header TextIAAb€‚Flow£€¡€Ô$FTR‚$T«€ €¡€"€GLY$Page.ftr.1-5b€‚ Paragraph£€ €£€Ô$P«€ € €!€€¡€"€b€£€¥€‚$PGC5AIAAb€‚Flow£€‚$T«€ €¡€"€GLY$Page.trim.1-5b€‚ Paragraph£€ €£€Ô$P«€ €¡€"€o€ Footer TextIAAb€‚Flow£€‚$T«€ €¡€"€GLY$Page.trim.2-5b€‚ Paragraph£€ €£€Ô$P«€ € €!€€¡€"€o€DateIAAb€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$G³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€ GLY$XWTMPDJG¡€ € €€ ¡€€ ¡€ €€Òð¡€€@ƒ ¤€Ô$DBÔ$RL† GLY$WGPKBDJGAA €€5¡€0€Ô Write$PG_FMT¢€É#0€ÔWrite$PG_PTFMT¢€É.#0€Ô Write$PG_CB¥€èd0€Ô Write$PG_TRT¢€É Textblock0€Ô Write$PG_NUM0€ÔWrite$PG_POINT0€Ô Write$PG_NSTY0€Ô Write$PG_PSTY0€Ô Write$PG_MG¥€      0€Ô Write$PG_FN¥€È0€Ô Write$PG_FR€£€€5¡€ € €€ï¡€ €€5`ƒPage¤€b€£€‚$2D£€Ô$F³€ €€„…‡‰·€€¡€ € €€¡€€¡€ €€ï¡€€5`£€ €€€5`€€€ï€€ï€5`¤€ €€¡€€b€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TPJMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.hdr.1-6¡€ € €€ ¡€€.¡€ €€Œˆ¡€€*Ôƒ ¤€Ô$HDRÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TGXMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.ftr.1-6¡€ € €€©N¡€€¡€ €€Òð¡€€”ƒ ¤€Ô$FTRÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TGXMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.trim.1-6¡€ € €€ ¡€€n¡€ €€¨À¡€€”ƒ ¤€Ô$DBÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TPJMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.trim.2-6¡€ € €€ŒØ¡€€.¡€ €€Òð¡€€*Ôƒ ¤€Ô$DBÔ$RL‡Ab€‚Flow£€¡€Ô$HDR‚$T«€ €¡€"€GLY$Page.hdr.1-6b€‚ Paragraph£€ €£€Ô$P«€ €¡€"€o€ Header TextIAAb€‚Flow£€¡€Ô$FTR‚$T«€ €¡€"€GLY$Page.ftr.1-6b€‚ Paragraph£€ €£€Ô$P«€ € €!€€¡€"€b€£€¥€‚$PGC6AIAAb€‚Flow£€‚$T«€ €¡€"€GLY$Page.trim.1-6b€‚ Paragraph£€ €£€Ô$P«€ €¡€"€o€ Footer TextIAAb€‚Flow£€‚$T«€ €¡€"€GLY$Page.trim.2-6b€‚ Paragraph£€ €£€Ô$P«€ € €!€€¡€"€o€DateIAAb€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$G³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€ GLY$WGPKBDJG¡€ € €€ ¡€€ ¡€ €€Òð¡€€@ƒ ¤€Ô$DBÔ$RL† GLY$WBGBBDJGAA €€6¡€0€Ô Write$PG_FMT¢€É#0€ÔWrite$PG_PTFMT¢€É.#0€Ô Write$PG_CB¥€èd0€Ô Write$PG_TRT¢€É Textblock0€Ô Write$PG_NUM0€ÔWrite$PG_POINT0€Ô Write$PG_NSTY0€Ô Write$PG_PSTY0€Ô Write$PG_MG¥€      0€Ô Write$PG_FN¥€È0€Ô Write$PG_FR€£€€6¡€ € €€ï¡€ €€5`ƒPage¤€b€£€‚$2D£€Ô$F³€ €€„…‡‰·€€¡€ € €€¡€€¡€ €€ï¡€€5`£€ €€€5`€€€ï€€ï€5`¤€ €€¡€€b€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TPJMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.hdr.1-7¡€ € €€ ¡€€.¡€ €€Œˆ¡€€*Ôƒ ¤€Ô$HDRÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TGXMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.ftr.1-7¡€ € €€©N¡€€¡€ €€Òð¡€€”ƒ ¤€Ô$FTRÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TGXMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.trim.1-7¡€ € €€ ¡€€n¡€ €€¨À¡€€”ƒ ¤€Ô$DBÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TPJMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.trim.2-7¡€ € €€ŒØ¡€€.¡€ €€Òð¡€€*Ôƒ ¤€Ô$DBÔ$RL‡Ab€‚Flow£€¡€Ô$HDR‚$T«€ €¡€"€GLY$Page.hdr.1-7b€‚ Paragraph£€ €£€Ô$P«€ €¡€"€o€ Header TextIAAb€‚Flow£€¡€Ô$FTR‚$T«€ €¡€"€GLY$Page.ftr.1-7b€‚ Paragraph£€ €£€Ô$P«€ € €!€€¡€"€b€£€¥€‚$PGC7AIAAb€‚Flow£€‚$T«€ €¡€"€GLY$Page.trim.1-7b€‚ Paragraph£€ €£€Ô$P«€ €¡€"€o€ Footer TextIAAb€‚Flow£€‚$T«€ €¡€"€GLY$Page.trim.2-7b€‚ Paragraph£€ €£€Ô$P«€ € €!€€¡€"€o€DateIAAb€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$G³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€ GLY$WBGBBDJG¡€ € €€ ¡€€ ¡€ €€Òð¡€€@ƒ ¤€Ô$DBÔ$RL† GLY$WDDKBDJGAA €€7¡€0€Ô Write$PG_FMT¢€É#0€ÔWrite$PG_PTFMT¢€É.#0€Ô Write$PG_CB¥€èd0€Ô Write$PG_TRT¢€É Textblock0€Ô Write$PG_NUM0€ÔWrite$PG_POINT0€Ô Write$PG_NSTY0€Ô Write$PG_PSTY0€Ô Write$PG_MG¥€      0€Ô Write$PG_FN¥€È0€Ô Write$PG_FR€£€€7¡€ € €€ï¡€ €€5`ƒPage¤€b€£€‚$2D£€Ô$F³€ €€„…‡‰·€€¡€ € €€¡€€¡€ €€ï¡€€5`£€ €€€5`€€€ï€€ï€5`¤€ €€¡€€b€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TPJMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.hdr.1-8¡€ € €€ ¡€€.¡€ €€Œˆ¡€€*Ôƒ ¤€Ô$HDRÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TGXMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.ftr.1-8¡€ € €€©N¡€€¡€ €€Òð¡€€”ƒ ¤€Ô$FTRÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TGXMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.trim.1-8¡€ € €€ ¡€€n¡€ €€¨À¡€€”ƒ ¤€Ô$DBÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TPJMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.trim.2-8¡€ € €€ŒØ¡€€.¡€ €€Òð¡€€*Ôƒ ¤€Ô$DBÔ$RL‡Ab€‚Flow£€¡€Ô$HDR‚$T«€ €¡€"€GLY$Page.hdr.1-8b€‚ Paragraph£€ €£€Ô$P«€ €¡€"€o€ Header TextIAAb€‚Flow£€¡€Ô$FTR‚$T«€ €¡€"€GLY$Page.ftr.1-8b€‚ Paragraph£€ €£€Ô$P«€ € €!€€¡€"€b€£€¥€‚$PGC8AIAAb€‚Flow£€‚$T«€ €¡€"€GLY$Page.trim.1-8b€‚ Paragraph£€ €£€Ô$P«€ €¡€"€o€ Footer TextIAAb€‚Flow£€‚$T«€ €¡€"€GLY$Page.trim.2-8b€‚ Paragraph£€ €£€Ô$P«€ € €!€€¡€"€o€DateIAAb€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$G³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€ GLY$WDDKBDJG¡€ € €€ ¡€€ ¡€ €€Òð¡€€@ƒ ¤€Ô$DBÔ$RL† GLY$JTMJKDJGAA €€8¡€0€Ô Write$PG_FMT¢€É#0€ÔWrite$PG_PTFMT¢€É.#0€Ô Write$PG_CB¥€èd0€Ô Write$PG_TRT¢€É Textblock0€Ô Write$PG_NUM 0€ÔWrite$PG_POINT0€Ô Write$PG_NSTY0€Ô Write$PG_PSTY0€Ô Write$PG_MG¥€      0€Ô Write$PG_FN¥€È0€Ô Write$PG_FR€£€€8¡€ € €€ï¡€ €€5`ƒPage¤€b€£€‚$2D£€Ô$F³€ €€„…‡‰·€€¡€ € €€¡€€¡€ €€ï¡€€5`£€ €€€5`€€€ï€€ï€5`¤€ €€¡€€b€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TPJMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.hdr.1-9¡€ € €€ ¡€€.¡€ €€Œˆ¡€€*Ôƒ ¤€Ô$HDRÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TGXMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.ftr.1-9¡€ € €€©N¡€€¡€ €€Òð¡€€”ƒ ¤€Ô$FTRÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TGXMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.trim.1-9¡€ € €€ ¡€€n¡€ €€¨À¡€€”ƒ ¤€Ô$DBÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TPJMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.trim.2-9¡€ € €€ŒØ¡€€.¡€ €€Òð¡€€*Ôƒ ¤€Ô$DBÔ$RL‡Ab€‚Flow£€¡€Ô$HDR‚$T«€ €¡€"€GLY$Page.hdr.1-9b€‚ Paragraph£€ €£€Ô$P«€ €¡€"€o€ Header TextIAAb€‚Flow£€¡€Ô$FTR‚$T«€ €¡€"€GLY$Page.ftr.1-9b€‚ Paragraph£€ €£€Ô$P«€ € €!€€¡€"€b€£€¥€‚$PGC9AIAAb€‚Flow£€‚$T«€ €¡€"€GLY$Page.trim.1-9b€‚ Paragraph£€ €£€Ô$P«€ €¡€"€o€ Footer TextIAAb€‚Flow£€‚$T«€ €¡€"€GLY$Page.trim.2-9b€‚ Paragraph£€ €£€Ô$P«€ € €!€€¡€"€o€DateIAAb€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$G³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€ GLY$JTMJKDJG¡€ € €€ ¡€€ ¡€ €€Òð¡€€@ƒ ¤€Ô$DBÔ$RL† GLY$TGKWXDJGAA €€9¡€0€Ô Write$PG_FMT¢€É#0€ÔWrite$PG_PTFMT¢€É.#0€Ô Write$PG_CB¥€èd0€Ô Write$PG_TRT¢€É Textblock0€Ô Write$PG_NUM 0€ÔWrite$PG_POINT0€Ô Write$PG_NSTY0€Ô Write$PG_PSTY0€Ô Write$PG_MG¥€      0€Ô Write$PG_FN¥€È0€Ô Write$PG_FR€£€€9¡€ € €€ï¡€ €€5`ƒPage¤€b€£€‚$2D£€Ô$F³€ €€„…‡‰·€€¡€ € €€¡€€¡€ €€ï¡€€5`£€ €€€5`€€€ï€€ï€5`¤€ €€¡€€b€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TPJMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.hdr.1-10¡€ € €€ ¡€€.¡€ €€Œˆ¡€€*Ôƒ ¤€Ô$HDRÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TGXMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.ftr.1-10¡€ € €€©N¡€€¡€ €€Òð¡€€”ƒ ¤€Ô$FTRÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TGXMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.trim.1-10¡€ € €€ ¡€€n¡€ €€¨À¡€€”ƒ ¤€Ô$DBÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TPJMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.trim.2-10¡€ € €€ŒØ¡€€.¡€ €€Òð¡€€*Ôƒ ¤€Ô$DBÔ$RL‡Ab€‚Flow£€¡€Ô$HDR‚$T«€ €¡€"€GLY$Page.hdr.1-10b€‚ Paragraph£€ €£€Ô$P«€ €¡€"€o€ Header TextIAAb€‚Flow£€¡€Ô$FTR‚$T«€ €¡€"€GLY$Page.ftr.1-10b€‚ Paragraph£€ €£€Ô$P«€ € €!€€¡€"€b€£€¥€‚$PGC10AIAAb€‚Flow£€‚$T«€ €¡€"€GLY$Page.trim.1-10b€‚ Paragraph£€ €£€Ô$P«€ €¡€"€o€ Footer TextIAAb€‚Flow£€‚$T«€ €¡€"€GLY$Page.trim.2-10b€‚ Paragraph£€ €£€Ô$P«€ € €!€€¡€"€o€DateIAAb€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$G³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€ GLY$TGKWXDJG¡€ € €€ ¡€€ ¡€ €€Òð¡€€@ƒ ¤€Ô$DBÔ$RL† GLY$JWPJKDJGAb€£€³€ €€d‰l€€𢀀&@€€F€€€F€€çP€&@€çPAb€£€³€ €€d‰l€€𢀀k €°€Œ €°€Œ €ç°€k €ç°Ab€£€³€ €€d‰l€€𢀀¨`€°€É€°€É€è€¨`€èAb€£€‚$2D‡«€¡€ € €€) €ü¬€7K€ü¬²€س€‰CCPU AAb€£€‚$2D‡«€¡€ € €€o€ûì€}•€ûì²€س€‰C CPU BAb€£€‚$2D‡«€¡€ € €€­@€ý €º©€ý ²€س€‰CCPU CAb€£€³€ €€d‰l€€Š¢€€E€ÙÀ€n €ÙÀ€n €Âx€E€ÂxAb€£€‚$2D‡«€¡€ € €€P@€Ìœ€Y€Ìœ²€س€‰CHSZAb€£€³€ €€d‰l€€𢀀L€€¸µ€[ €¸µ€[ €ª€L€€ª£€ €ÿ?&¨ª¢€€°Ab€£€‚$2D‡«€¡€ € €€O €¯R€Wû€¯R²€س€‰CDiskAb€£€³€ €€d„…‰l€¢€€Fà€΀k €ÎAb€£€³€ €€d„…‰l€¢€€F€€ò‰€l€ò‰Ab€£€‚$2D‡«€¡€ € €€L €N€cÓ€N²€س€‰C SCSI BUS 1Ab€£€‚$2D‡«€¡€ € €€K`€ô €c€ô ²€س€‰C SCSI BUS 2Ab€£€³€ €€d„…‰l€¢€€7à€æå€=€€ÞB€xÀ€ÝâAb€£€³€ €€d„…‰l€¢€€w €ÞB€ºÀ€ÞB€½€èAb€£€³€ €€d„…‰l€¢€€xÀ€Þ¢€xÀ€çEAb€£€‚$2D‡«€¡€ € €€‰ €Ø €™ƒ€Ø ²€س€‰CEthernetAb€£€³€ €€d„…‰l€¢€€O €.€O €Ú Ab€£€³€ €€d„…‰l€¢€€_@€óI€_@€ÙÀAb€£€³€ €€d„…‰l€¢€€S €ÂÙ€S €¹Ab€£€³€ €€d„…‰l€€𢀀&@€ç€Fà€ç€Fà€pG€&@€pGAb€£€³€ €€d„…‰l€€𢀀[€€ç€|€€ç€|€€oç€[€€oçAb€£€³€ €€d„…‰l€€𢀀”à€ç€¶@€ç€¶@€o‡€”à€o‡Ab€£€‚$2D‡«€¡€ € €€.€€€€<+€€²€س€‰CCPU AAb€£€‚$2D‡«€¡€ € €€d €€€q‰€€²€س€‰CCPU BAb€£€‚$2D‡«€¡€ € €€Ÿ€€€¬i€€²€س€‰CCPU CAb€£€³€ €€d„…‰l€¢€€Fà€â€[ €âAb€£€‚$2D‡«€¡€ € €€J €ƒÃ€T†€ƒÃ²€س€‰CSCSIAb€£€³€ €€d„…‰l€¢€€<€‘H€@à€› €n €› €n €‘H€p €› €£à€› €¦à€‘¨Ab€£€‚$2D‡«€¡€ € €€]€œ‹€l〜‹²€س€‰CEthernetAb€£€³€ €€d„…‰l€€Š¢€€W`€]v€„€]v€„€GN€W`€GNAb€£€‚$2D‡«€¡€ € €€cÀ€Q€lš€Q²€س€‰CHSZAb€£€³€ €€d„…‰l€¢€€R €‚B€a €\VAb€£€‚$2D‡«€¡€ € €€^ €d8€i2€d8²€س€‰C SCSIAb€£€³€ €€d„…‰l€¢€€z@€]u€”€€‚BAb€£€‚$2D‡«€¡€ € €€`€c€‹F€c²€س€‰CSCSIAb€£€³€ €€d„…‰l€€Š¢€€f€9Ê€v€€9Ê€v€€*d€f€*d£€ €ÿ?&¨ª¢€€°Ab€£€‚$2D‡«€¡€ € €€j €/¦€rû€/¦²€س€‰CDiskAb€£€³€ €€d„…‰l€¢€€mà€G®€mà€:*Ab€£€‚$2D‡«€¡€ € €€<`€€ˆ€²€检€x³€‰C Fig. 1 - Some HSZ ConfigurationsAA €€10¡€0€Ô Write$PG_FMT¢€É#0€ÔWrite$PG_PTFMT¢€É.#0€Ô Write$PG_CB¥€èd0€Ô Write$PG_TRT¢€É Textblock0€Ô Write$PG_NUM 0€ÔWrite$PG_POINT0€Ô Write$PG_NSTY0€Ô Write$PG_PSTY0€Ô Write$PG_MG¥€      0€Ô Write$PG_FN¥€È0€Ô Write$PG_FR€£€€10¡€ € €€ï¡€ €€5`ƒPage¤€b€£€‚$2D£€Ô$F³€ €€„…‡‰·€€¡€ € €€¡€€¡€ €€ï¡€€5`£€ €€€5`€€€ï€€ï€5`¤€ €€¡€€b€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TPJMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.hdr.1-11¡€ € €€ ¡€€.¡€ €€Œˆ¡€€*Ôƒ ¤€Ô$HDRÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TGXMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.ftr.1-11¡€ € €€©N¡€€¡€ €€Òð¡€€”ƒ ¤€Ô$FTRÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TGXMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.trim.1-11¡€ € €€ ¡€€n¡€ €€¨À¡€€”ƒ ¤€Ô$DBÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TPJMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.trim.2-11¡€ € €€ŒØ¡€€.¡€ €€Òð¡€€*Ôƒ ¤€Ô$DBÔ$RL‡Ab€‚Flow£€¡€Ô$HDR‚$T«€ €¡€"€GLY$Page.hdr.1-11b€‚ Paragraph£€ €£€Ô$P«€ €¡€"€o€ Header TextIAAb€‚Flow£€¡€Ô$FTR‚$T«€ €¡€"€GLY$Page.ftr.1-11b€‚ Paragraph£€ €£€Ô$P«€ € €!€€¡€"€b€£€¥€‚$PGC11AIAAb€‚Flow£€‚$T«€ €¡€"€GLY$Page.trim.1-11b€‚ Paragraph£€ €£€Ô$P«€ €¡€"€o€ Footer TextIAAb€‚Flow£€‚$T«€ €¡€"€GLY$Page.trim.2-11b€‚ Paragraph£€ €£€Ô$P«€ € €!€€¡€"€o€DateIAAb€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$G³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€ GLY$JWPJKDJG¡€ € €€ ¡€€ ¡€ €€Òð¡€€@ƒ ¤€Ô$DBÔ$RL† GLY$MTTJGJJGAb€£€³€ €€d„…‰l€€Š¢€€Cà€ýÍ€© €ýÍ€© €ÙÀ€Cà€ÙÀAb€£€³€ €€d„…‰l€€Š¢€€0À€ÄY€d€€ÄY€d€€¢Ž€0À€¢ŽAb€£€³€ €€d„…‰l€€Š¢€€y€€ÄY€®`€ÄY€®`€£N€y€€£NAb€£€‚$2D‡«€¡€ € €€» €±3€¾¤€±3²€س€‰C...Ab€£€³€ €€d„…‰l€€Š¢€€1€€“é€e@€“é€e@€rÝ€1€€rÝAb€£€³€ €€d„…‰l€€Š¢€€yà€“é€° €“逰 €s=€yà€s=Ab€£€‚$2D‡«€¡€ € €€NÀ€ëÇ€–5€ëDz€⣀€³€‰CDKA100 (primary name)Ab€£€‚$2D‡«€¡€ € €€: €±3€d €±3²€⣀€³€‰C DKA100 UCBAb€£€‚$2D‡«€¡€ € €€ €³€¨½€³²€⣀€³€‰C DKB100 UCBAb€£€‚$2D‡«€¡€ € €€9À€‚€M€‚²€⣀€³€‰CPKA...Ab€£€‚$2D‡«€¡€ € €€…à€‚£€˜Ô€‚£²€⣀€³€‰CPKB...Ab€£€³€ €€d„…‰l€€Š¢€€R €b¸€’ €b¸€’ €GN€R €GNAb€£€‚$2D‡«€¡€ € €€[à€T€‡Ñ€T²€⣀€³€‰CHSZ ControllerAb€£€³€ €€d„…‰l€€Š¢€€c`€=ë€~`€=ë€~`€.†€c`€.†£€ €ÿ?&¨ª¢€€°Ab€£€‚$2D‡«€¡€ € €€fÀ€5H€{r€5H²€⣀€³€‰CDisk(s)Ab€£€³€ €€d„…‰l€¢€€p€€H€p€€=ëAb€£€³€ €€d„…‰l€¢€€V €rÝ€a €bXAb€£€³€ €€d„…‰l€¢€€‹ €sž€€@€cxAb€£€‚$2D‡«€¡€ € €€6`€¨0€N•€¨0²€س€‰CDKDRIVERAb€£€‚$2D‡«€¡€ € €€~€§o€–5€§o²€س€‰CDKDRIVERAb€£€³€ €€d„…‰l€¢€€HÀ€¢Ž€H`€”IAb€£€³€ €€d„…‰l€¢€€“€£®€“€”IAb€£€‚$2D‡«€¡€ € €€QÀ€à〘w€àã²€س€‰C%Switching Software Layer, just insideAb€£€‚$2D‡«€¡€ € €€QÀ€ÛB€y3€ÛB²€س€‰CDKDRIVER start_ioAb€£€³€ €€d„…‰l€¢€€Z€Ú!€Oà€ĹAb€£€³€ €€d„…‰l€¢€€ŠÀ€ÙÀ€“À€ÃùAb€£€³€ €€d„…‰l€¢€€\@€Òþ€ˆ €ÒþAb€£€‚$2D‡«€¡€ € €€^à€Ë€‰×€Ë²€س€‰COne OR the other usedAb€£€³€ €€d„…‰l€¢€€u€€u€þAb€£€‚$2D‡«€¡€ € €€S € ’€§’€ ’²€⣀€³€‰CRest of VMS Driver InterfaceAb€£€‚$2D‡«€¡€ € €€W€ð€Àw€ð²€س€‰C5(Only sees the name DKA100 regardless of driver used)Ab€£€‚$2D‡«€¡€ € €€,@€á€˜Ï€á²€⣀€³€‰C$Figure 2. The Software Layering UsedAA €€11¡€0€Ô Write$PG_FMT¢€É#0€ÔWrite$PG_PTFMT¢€É.#0€Ô Write$PG_CB¥€èd0€Ô Write$PG_TRT¢€É Textblock0€Ô Write$PG_NUM 0€ÔWrite$PG_POINT0€Ô Write$PG_NSTY0€Ô Write$PG_PSTY0€Ô Write$PG_MG¥€      0€Ô Write$PG_FN¥€È0€Ô Write$PG_FR€£€€11¡€ € €€ï¡€ €€5`ƒPage¤€b€£€‚$2D£€Ô$F³€ €€„…‡‰·€€¡€ € €€¡€€¡€ €€ï¡€€5`£€ €€€5`€€€ï€€ï€5`¤€ €€¡€€b€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TPJMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.hdr.1-12¡€ € €€ ¡€€.¡€ €€Œˆ¡€€*Ôƒ ¤€Ô$HDRÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TGXMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.ftr.1-12¡€ € €€©N¡€€¡€ €€Òð¡€€”ƒ ¤€Ô$FTRÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TGXMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.trim.1-12¡€ € €€ ¡€€n¡€ €€¨À¡€€”ƒ ¤€Ô$DBÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TPJMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.trim.2-12¡€ € €€ŒØ¡€€.¡€ €€Òð¡€€*Ôƒ ¤€Ô$DBÔ$RL‡Ab€‚Flow£€¡€Ô$HDR‚$T«€ €¡€"€GLY$Page.hdr.1-12b€‚ Paragraph£€ €£€Ô$P«€ €¡€"€o€ Header TextIAAb€‚Flow£€¡€Ô$FTR‚$T«€ €¡€"€GLY$Page.ftr.1-12b€‚ Paragraph£€ €£€Ô$P«€ € €!€€¡€"€b€£€¥€‚$PGC12AIAAb€‚Flow£€‚$T«€ €¡€"€GLY$Page.trim.1-12b€‚ Paragraph£€ €£€Ô$P«€ €¡€"€o€ Footer TextIAAb€‚Flow£€‚$T«€ €¡€"€GLY$Page.trim.2-12b€‚ Paragraph£€ €£€Ô$P«€ € €!€€¡€"€o€DateIAAb€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$G³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€ GLY$MTTJGJJG¡€ € €€ ¡€€ ¡€ €€Òð¡€€@ƒ ¤€Ô$DBÔ$RL† GLY$TBXGTJJGAb€£€³€ €€d‰l€€Š¢€€) €s€QÀ€s€QÀ€ôi€) €ôiAb€£€‚$2D‡«€¡€ € €€.€€ €I·€ ²€س€‰C VMS ServicesAb€£€³€ €€d‰l€€Š¢€€*€æå€R €æå€R €Ë€*€ËAb€£€‚$2D‡«€¡€ € €€.€€Ö¿€F€Ö¿²€س€‰C Switch layerAb€£€³€ €€d‰l€€Š¢€€n@€€–`€€–`€ôÊ€n@€ôÊAb€£€‚$2D‡«€¡€ € €€q € €‹G€ ²€س€‰C Switch serverAb€£€³€ €€d„…‰l€¢€€€@€õ*€~À€ñh€} €{À€ë€z@€èe€x€æ…€uÀ€å€s€€ãä€q@€âc€oÀ€àã€mà€߀k €Þ¢€iÀ€Ýâ€f€Üa€c`€ÛA€a€€Ú€^€€Ú€[€€ÛA€X€€Üa€Uà€Üa€S@€ÜAb€£€³€ €€d„…‰l€¢€€= €ôÊ€= €ç¥Ab€£€³€ €€d„…‰l€€Š¢€€*`€À8€R €À8€R €§Ï€*`€§ÏAb€£€³€ €€d„…‰l€€Š¢€€*€™Š€S €™Š€S €ƒ€*€ƒAb€£€³€ €€d„…‰l€€Š¢€€gà€¿€“À€¿€“À€¦O€gà€¦OAb€£€³€ €€d„…‰l€€Š¢€€g €šK€“€šK€“€‚€g €‚Ab€£€³€ €€d„…‰l€€Š¢€€Fà€n\€a€€n\€a€€Yµ€Fà€Yµ£€ €ÿ?&¨ª¢€€°Ab€£€‚$2D‡«€¡€ € €€0`€±2€Gò€±2²€س€‰C Class DriverAb€£€‚$2D‡«€¡€ € €€mà€±“€„h€±“²€س€‰C Class driverAb€£€‚$2D‡«€¡€ € €€0€Œf€D0€Œf²€س€‰C Port driverAb€£€‚$2D‡«€¡€ € €€n@€ŒÆ€ƒz€ŒÆ²€س€‰C Port DriverAb€£€‚$2D‡«€¡€ € €€HÀ€a÷€`€a÷²€س€‰C Storage DvcAb€£€³€ €€d„…‰l€¢€€<À€ËÜ€<À€À8Ab€£€³€ €€d„…‰l€¢€€L€€ËÜ€{`€¾WAb€£€³€ €€d„…‰l€¢€€<`€¨€<`€™ŠAb€£€³€ €€d„…‰l€¢€€{`€§€{`€š«Ab€£€³€ €€d„…‰l€¢€€=€€ƒÃ€Q€müAb€£€³€ €€d„…‰l€¢€€v €â€W`€n\Ab€£€‚$2D‡«€¡€ € €€l€s=€Ä'€s=²€س€‰C,(One path may be via some network, e.g. SCS)Ab€£€‚$2D‡«€¡€ € €€7€€`€ÂQ€`²€س€‰CEFigure 3. Layering with Switching Subsystem Added above Class DriversAb€£€‚$2D‡«€¡€ € €€à€Ýâ€ù€Ýâ²€س€‰C$Note: Switch layer hides extra pathsAb€£€‚$2D‡«€¡€ € €€3`€¸µ€?Þ€¸µ²€س€‰CDKAnAb€£€‚$2D‡«€¡€ € €€r€¸U€}€¸U²€س€‰CDKBn ?Ab€£€‚$2D‡«€¡€ € €€?`€ëf€v¸€ëf²€س€‰CDKAn visible to rest of VMSAA €€12¡€0€Ô Write$PG_FMT¢€É#0€ÔWrite$PG_PTFMT¢€É.#0€Ô Write$PG_CB¥€èd0€Ô Write$PG_TRT¢€É Textblock0€Ô Write$PG_NUM 0€ÔWrite$PG_POINT0€Ô Write$PG_NSTY0€Ô Write$PG_PSTY0€Ô Write$PG_MG¥€      0€Ô Write$PG_FN¥€È0€Ô Write$PG_FR€£€€12¡€ € €€ï¡€ €€5`ƒPage¤€b€£€‚$2D£€Ô$F³€ €€„…‡‰·€€¡€ € €€¡€€¡€ €€ï¡€€5`£€ €€€5`€€€ï€€ï€5`¤€ €€¡€€b€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TPJMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.hdr.1-13¡€ € €€ ¡€€.¡€ €€Œˆ¡€€*Ôƒ ¤€Ô$HDRÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TGXMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.ftr.1-13¡€ € €€©N¡€€¡€ €€Òð¡€€”ƒ ¤€Ô$FTRÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TGXMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.trim.1-13¡€ € €€ ¡€€n¡€ €€¨À¡€€”ƒ ¤€Ô$DBÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TPJMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.trim.2-13¡€ € €€ŒØ¡€€.¡€ €€Òð¡€€*Ôƒ ¤€Ô$DBÔ$RL‡Ab€‚Flow£€¡€Ô$HDR‚$T«€ €¡€"€GLY$Page.hdr.1-13b€‚ Paragraph£€ €£€Ô$P«€ €¡€"€o€ Header TextIAAb€‚Flow£€¡€Ô$FTR‚$T«€ €¡€"€GLY$Page.ftr.1-13b€‚ Paragraph£€ €£€Ô$P«€ € €!€€¡€"€b€£€¥€‚$PGC13AIAAb€‚Flow£€‚$T«€ €¡€"€GLY$Page.trim.1-13b€‚ Paragraph£€ €£€Ô$P«€ €¡€"€o€ Footer TextIAAb€‚Flow£€‚$T«€ €¡€"€GLY$Page.trim.2-13b€‚ Paragraph£€ €£€Ô$P«€ € €!€€¡€"€o€DateIAAb€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$G³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€ GLY$TBXGTJJG¡€ € €€ ¡€€ ¡€ €€Òð¡€€@ƒ ¤€Ô$DBÔ$RL† GLY$MXPJGJJGAA €€13¡€0€Ô Write$PG_FMT¢€É#0€ÔWrite$PG_PTFMT¢€É.#0€Ô Write$PG_CB¥€èd0€Ô Write$PG_TRT¢€É Textblock0€Ô Write$PG_NUM0€ÔWrite$PG_POINT0€Ô Write$PG_NSTY0€Ô Write$PG_PSTY0€Ô Write$PG_MG¥€      0€Ô Write$PG_FN¥€È0€Ô Write$PG_FR€£€€13¡€ € €€ï¡€ €€5`ƒPage¤€b€£€‚$2D£€Ô$F³€ €€„…‡‰·€€¡€ € €€¡€€¡€ €€ï¡€€5`£€ €€€5`€€€ï€€ï€5`¤€ €€¡€€b€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TPJMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.hdr.1-14¡€ € €€ ¡€€.¡€ €€Œˆ¡€€*Ôƒ ¤€Ô$HDRÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TGXMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.ftr.1-14¡€ € €€©N¡€€¡€ €€Òð¡€€”ƒ ¤€Ô$FTRÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TGXMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.trim.1-14¡€ € €€ ¡€€n¡€ €€¨À¡€€”ƒ ¤€Ô$DBÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TPJMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.trim.2-14¡€ € €€ŒØ¡€€.¡€ €€Òð¡€€*Ôƒ ¤€Ô$DBÔ$RL‡Ab€‚Flow£€¡€Ô$HDR‚$T«€ €¡€"€GLY$Page.hdr.1-14b€‚ Paragraph£€ €£€Ô$P«€ €¡€"€o€ Header TextIAAb€‚Flow£€¡€Ô$FTR‚$T«€ €¡€"€GLY$Page.ftr.1-14b€‚ Paragraph£€ €£€Ô$P«€ € €!€€¡€"€b€£€¥€‚$PGC14AIAAb€‚Flow£€‚$T«€ €¡€"€GLY$Page.trim.1-14b€‚ Paragraph£€ €£€Ô$P«€ €¡€"€o€ Footer TextIAAb€‚Flow£€‚$T«€ €¡€"€GLY$Page.trim.2-14b€‚ Paragraph£€ €£€Ô$P«€ € €!€€¡€"€o€DateIAAb€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$G³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€ GLY$MXPJGJJG¡€ € €€ ¡€€ ¡€ €€Òð¡€€@ƒ ¤€Ô$DBÔ$RL† GLY$MJKJGJJGAA €€14¡€0€Ô Write$PG_FMT¢€É#0€ÔWrite$PG_PTFMT¢€É.#0€Ô Write$PG_CB¥€èd0€Ô Write$PG_TRT¢€É Textblock0€Ô Write$PG_NUM0€ÔWrite$PG_POINT0€Ô Write$PG_NSTY0€Ô Write$PG_PSTY0€Ô Write$PG_MG¥€      0€Ô Write$PG_FN¥€È0€Ô Write$PG_FR€£€€14¡€ € €€ï¡€ €€5`ƒPage¤€b€£€‚$2D£€Ô$F³€ €€„…‡‰·€€¡€ € €€¡€€¡€ €€ï¡€€5`£€ €€€5`€€€ï€€ï€5`¤€ €€¡€€b€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TPJMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.hdr.1-15¡€ € €€ ¡€€.¡€ €€Œˆ¡€€*Ôƒ ¤€Ô$HDRÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TGXMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.ftr.1-15¡€ € €€©N¡€€¡€ €€Òð¡€€”ƒ ¤€Ô$FTRÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TGXMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.trim.1-15¡€ € €€ ¡€€n¡€ €€¨À¡€€”ƒ ¤€Ô$DBÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TPJMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.trim.2-15¡€ € €€ŒØ¡€€.¡€ €€Òð¡€€*Ôƒ ¤€Ô$DBÔ$RL‡Ab€‚Flow£€¡€Ô$HDR‚$T«€ €¡€"€GLY$Page.hdr.1-15b€‚ Paragraph£€ €£€Ô$P«€ €¡€"€o€ Header TextIAAb€‚Flow£€¡€Ô$FTR‚$T«€ €¡€"€GLY$Page.ftr.1-15b€‚ Paragraph£€ €£€Ô$P«€ € €!€€¡€"€b€£€¥€‚$PGC15AIAAb€‚Flow£€‚$T«€ €¡€"€GLY$Page.trim.1-15b€‚ Paragraph£€ €£€Ô$P«€ €¡€"€o€ Footer TextIAAb€‚Flow£€‚$T«€ €¡€"€GLY$Page.trim.2-15b€‚ Paragraph£€ €£€Ô$P«€ € €!€€¡€"€o€DateIAAb€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$G³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€ GLY$MJKJGJJG¡€ € €€ ¡€€ ¡€ €€Òð¡€€@ƒ ¤€Ô$DBÔ$RL† GLY$JWWDKDJGAA €€15¡€0€Ô Write$PG_FMT¢€É#0€ÔWrite$PG_PTFMT¢€É.#0€Ô Write$PG_CB¥€èd0€Ô Write$PG_TRT¢€É Textblock0€Ô Write$PG_NUM0€ÔWrite$PG_POINT0€Ô Write$PG_NSTY0€Ô Write$PG_PSTY0€Ô Write$PG_MG¥€      0€Ô Write$PG_FN¥€È0€Ô Write$PG_FR€£€€15¡€ € €€ï¡€ €€5`ƒPage¤€b€£€‚$2D£€Ô$F³€ €€„…‡‰·€€¡€ € €€¡€€¡€ €€ï¡€€5`£€ €€€5`€€€ï€€ï€5`¤€ €€¡€€b€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TPJMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.hdr.1-16¡€ € €€ ¡€€.¡€ €€Œˆ¡€€*Ôƒ ¤€Ô$HDRÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TGXMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.ftr.1-16¡€ € €€©N¡€€¡€ €€Òð¡€€”ƒ ¤€Ô$FTRÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TGXMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.trim.1-16¡€ € €€ ¡€€n¡€ €€¨À¡€€”ƒ ¤€Ô$DBÔ$RL‡Ab€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$GÔ $GRP.TPJMMGJG³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€GLY$Page.trim.2-16¡€ € €€ŒØ¡€€.¡€ €€Òð¡€€*Ôƒ ¤€Ô$DBÔ$RL‡Ab€‚Flow£€¡€Ô$HDR‚$T«€ €¡€"€GLY$Page.hdr.1-16b€‚ Paragraph£€ €£€Ô$P«€ €¡€"€o€ Header TextIAAb€‚Flow£€¡€Ô$FTR‚$T«€ €¡€"€GLY$Page.ftr.1-16b€‚ Paragraph£€ €£€Ô$P«€ € €!€€¡€"€b€£€¥€‚$PGC16AIAAb€‚Flow£€‚$T«€ €¡€"€GLY$Page.trim.1-16b€‚ Paragraph£€ €£€Ô$P«€ €¡€"€o€ Footer TextIAAb€‚Flow£€‚$T«€ €¡€"€GLY$Page.trim.2-16b€‚ Paragraph£€ €£€Ô$P«€ € €!€€¡€"€o€DateIAAb€‚ Textblock£€ €0€Ô Write$TR_DH0€Ô Write$TR_PGF¢€É Paragraph0€Ô Write$TR_TYP£€Ô$G³€ €€dµ€%€ €€ ¡€€ ¢€€ £€€ #€$€€ GLY$JWWDKDJG¡€ € €€ ¡€€ ¡€ €€Òð¡€€@ƒ ¤€Ô$DBÔ$RL… GLY$Page.1AAb€€Flow.1‚Flow£€‚$T«€ €¡€"€ GLY$XTBKJDJGb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€b€£€²€£€€CMulti Path SwitchingIAC(Problem Statement & Investigation ReportICGlenn C. EverhartICAugust 30, 1996IAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€CD--------------------------------------------------------------------IAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€b€£€²€¢€CProblem Statement:ACL A variety of situations exist or will shortly exist in which there will be JC]more than one path to a device, and in which these paths will need to be coordinated so that JC[only one is active at a time, and so that VMS sees only one, cluster-unique, name for this JCKstorage clusterwide, regardless of physical path to the storage being used.IICbThis situation exists with SCSI clusters now, where direct SCSI paths to a disk exist at the same JC]time as MSCP served paths. It will shortly exist with HSZ series controllers where these are JC_attached to more than one SCSI bus in a cluster. It can be expected to appear in Fibre Channel JC]connection topologies and in other intelligent controllers in the future. Moreover, when the JCZQIOserver is introduced, it will define additional paths to storage which will need to be JCcoordinated and to fail over.IAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€C\To maintain file system integrity, each storage entity (disk, generally) in VMS must have a JC\name which is consistent and unique across a cluster. To provide greatest system robustness JC^and availability, it should be possible to switch from one path to another, at least when one JC#fails, and possibly at other times.IAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€CaThis is needed for disks in the shortest time frame. Similar controls for other device types are JC desirable.Ib€£€²€¢€ICGoals:IAC\ * Support HSZ failover for HSZ7x type controllers where two SCSI busses are connected to a JCsingle machine.IC[ * Support other multipath failover cases such as SCSI to / from MSCP paths or to and from JCother server types (b€£€²€¢€Ce.g., QIOserverAC).IC[ * Be compatible with planed HSG failover mechanism (which is generally similar to the HSZ JCHone, with some differences due to the changes between SCSI-2 and SCSI-3)Ib€£€²€¢€IC Non-Goals:IAC; * Code for more than two paths initially, though the code b€£€²€¢€Cmust ACextend easily to "n" paths.ICa * Support the case where both HSZ controllers are on a single bus (this is supported within the JC HSZ and needs no system support)IC, * Solve the device naming problem generallyIC^ * Dynamic routing or load balancing between paths to a device in full detail. (That is,it is JCdexpected that the solution must function to switch a failed path, but it is not initially necessary JCZfor a solution to load share between multiple paths dynamically in the first design pass.)ICK * Describe details of compatibility with the HSG proposed failover scheme.IAIb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€b€£€²€¢€£€€xICProblem ComponentsIAAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€C]There are two components to this problem: how to arrange that I/O be directed to the correct JC\place (and how exactly to switch it), and how device names may be kept cluster unique where JCathere is more than one path to a given piece of storage, and these paths' "natural" names are in JC>general not the same. These will be discussed separately here.Ib€£€²€¢€£€€xICSwitching Solutions:IAAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€b€£€²€¢€C*1: Non-Solution: SCSI Port-Class relinkingIAIC^To deal with the problems only of HSZ, it was initially considered that some form of altering JC]SCSI connections' purely SCSI structure based "routing" to devices might be feasible for the JC\switching needed here. However, in principle, two SCSI busses can be controlled by entirely JCddifferent SCSI port drivers, so that an attempt to alter connections on the fly at port level could JCbinvolve considerable complexity in ensuring that port driver specific structures were initialized JCeas the port drivers expect. (These initializations are not all alike.) Also, a "port level" approach JCddoes not deal with the appearance of multiple class driver units after autoconfiguration. That is, JC^one must move not one, but several devices' structures such that no timing windows are opened JC\up for the rest of VMS or for the SCSI subsystem. Idle drivers might be revectored, but any JC[links between SCSI structures and class drivers would need to be traced and reset, and any JC^future asynchronous events would need to be blocked from access to the structures during this JC_time, and any port driver specificities in the SCDT in particular would be a problem. This can JCJprobably be done, but looked error prone and complex to build and to test.IAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€C_Finally, this approach would not help with failover between SCSI and MSCP or other servers; it JCbis peculiar to the internals of SCSI (as they currently stand), and represents an interface which JC^has never been externally constrained to follow a set design. Rather, this interface has been JC!mutable, and may remain that way.IAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€b€£€²€¢€C%2: Non-Solution: Add Code to DKdriverIIAC`It is possible to imagine adding switching code directly into DKdriver and possibly other class JC`drivers which might redirect I/O as needed. In DUdriver, this approach is used, and DUdriver is JC\quite tightly connected with the MSCP server and mount verify. In DUdriver, I/O is switched JC_by requeueing, basically in the beginning of the start-io path, to the "other" path if such is JC[needed. However, the details of most of the processing are heavily involved with MSCP, and JC^rather complex. This part of the driver interface is a large and complex one and touches many JCZplaces in VMS, so that an attempt to duplicate the DU processing in DK would be a sizable JC\increase in DKdriver's complexity. This would introduce considerable risk into DKdriver and JC]may in the end prove completely infeasible. (It is worth noting that this complexity and the JC\difficulty of maintaining it are among the reasons for the qio server project.) The current JCUDUdriver code does not in fact switch to a local DK path now, even when the UCBs and JC\CDDBs are "cross linked", probably because the DU data structures are not completely set up JC`in DKdriver (and don't exist at all in some other disk drivers). What is more of a problem, the JJCYpath switching done between DUdriver, the MSCP server, and SCS is specialized to exactly JCZtwo paths maximum between a piece of storage and a processor. When a new served path must JCUbe found, MSCP commands are sent to attempt this. While this is appropriate for MSCP JC=storage, it is not particularly efficient for other drivers. IAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€CaIt is however important to consider that driver mount verification code must be called to ensure JC_that related components be notified, as mount verification is the signal used in DUdriver that JC path modification may be needed.IIC^A simpler variant of this approach would be to include some "generic" switching code early in JC\DKdriver which would simple queue packets to other driver start-io entries. This would also JCYincrease the complexity of the DKdriver driver interface, but less so than attempting to JCVduplicate DUdriver processing. While this is a feasible approach, it has two problems:IAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€C[1. It would be specialized to DKdriver, and would need to be separately added to any other JC^drivers in the future where failover may be desired. MKdriver and GKdriver may turn out to be JCearly candidates.IAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€C\2. Each DK unit "knows" only about its own device, where multiple path switching would need JC`additional structures and controls to be added to the DK interface so that groupings of devices JC^might be known. The class driver is not at the most appropriate level of globality to perform JC^this operation, and again this would mean easily user visible changes to the DKdriver program JCWinterface, which would have to be do-able in any future drivers which incorporated the JCmodifications.IAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€C[Note that either of these approaches involves requeueing the IRP to the "real" destination JCGdevice, so that the requeueing overhead exists in any related approach.IAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€CbTo the extent that DK-internal code lacks a well defined interface at its back end, it would tend JCZto become specialized over time and would be likely to become harder with time to move to JC`other drivers where it was needed. The lack of generality of this approach makes it appear less JCdesirable than the final one.IAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€C@The approach of adding code to DKdriver seems less than optimal.Ib€£€²€¢€IC3: Solution: Class SwitchingIAICbThe one interface in the I/O driver system which is well defined and constrained to be relatively JC_stable is that at its top. Control transfer into drivers must follow conventions OVMS has long JC[established and which are documented. Therefore, a switching function using this interface JC_should be fairly universal, and may reduce the amount of work to keep it current as future VMS JC]designs arise. It is a confirmation of the value of such a choice that the DUdriver failover JCVcontrol is managed very close to the "top" (i.e., start-io) entry of that driver also.IICYTherefore a simpler approach has been investigated. In this approach, a dedicated device JCdswitching subsystem inserts itself at the class driver external entry points and serves to abstract JJC^the device name used a level from the actual device driver paths. Thus, above this level, the JCXOVMS system sees one device with one name which corresponds to the one piece of storage JC\underneath. Below this level, two or more paths may exist, all leading to the same physical JC`storage. This level's job, then, is to switch all I/O seen by the rest of OVMS (at a documented JCcand fairly stable interface) between these underlying paths. It is not necessary that I/O order be JC^preserved (since the SCSI drivers do not in general preserve it), except that in certain well JC^defined circumstances such as path or cluster node failure, mount verify, and a few more, the JCGguarantees offered by SCSI of order must be maintained. (See Figure 3).IAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€C^This subsystem must offer a control interface distinct from the underlying drivers, which can JC[work with components able to group devices together, select one name consistently across a JC\cluster for the storage device, and allow communication to each underlying device for those JCTswitching situations when sequentiality across all paths must be ensured. (A server JCCcommunicating with an intercept driver is the scheme in mind here.)IAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€CfNote that the external VMS driver interface is the input interface of this intercept driver, since it JCgwill insert its processing in the start-io points of underlying drivers, and that its output interface JC]is also this same external, documented VMS driver interface. These are documented and rather JC`stable interfaces, and simple enough to control. While a separate subsystem may not have direct JCcinternal access to underlying driver private structures, this is a software engineering advantage. JC_If additional information is needed, it must be explicitly made available and added somehow to JC]the underlying driver's external interface, or some driver-private inspection method must be JC_devised to aid processing in some cases. Path switching when mount verification occurs (as the JC]usual case is for DUdriver) can be handled without additions to the external interface,since JC]mount verify currently can operate with any driver. With a general purpose switch subsystem, JCYhowever, switchover functions can be used for any multiple paths to storage, of whatever JC]nature, and it becomes possible to create cluster consistent names for devices across widely JC]divergent interconnects, by creating a dummy alias device name if need be and arranging that JCFactual I/O pass through other paths. (This is a possible future item.)IAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€C[It should be noted too that the MSCP server currently operates promptly when it sees mount JC`verification and uses underlying facilities to find another server node if one is available. It JC_would normally be expected that other servers may wish to do this as well. Should such support JC`be desired, the switching software layer will need to send additional requests to a served path JC\which will cause a new path to be probed for. The current suggested solution will allow the JC]MSCP server's mount verify processing to happen before giving up on that path, so already it JCdeals with MSCP. IAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€b€£€²€¢€Ib€£€²€£€€xCNaming Solutions:IAIAAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€b€£€²€¢€C Background:IAAJb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€CbThe path switching solution is related to device naming in its need to ensure that no device will JC[be accessed via different names in the cluster. While this must be done uniformly across a JCacluster, the namespace can be the current one or any future one; other paths will be hidden (and JC_the search and scan routines must be altered slightly to hide any N such hidden paths) but can JC^exist. A path can come into being with its own name, and the path switching system can handle JC_it under another name, even well after boot, so long as the name being hidden has not begun to JC_be used. Apart from ensuring cluster commonality, path switching is largely independent of the JCchoice of naming schemes.IAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€C\There is one effect that is necessary, and that is that whatever is needed to ensure common JC[device names clusterwide must be provided. This means in particular that when an alternate JCdpath comes up which is not the cluster-required one, some effort is necessary to see that it is not JCaitself served to other nodes where the primary path exists and not used. The preferred switching JC\solution can switch served path UCBs also, but the uniformly named cluster access path must JC^be present and used first, so that only one path is used. This will require some additions in JCcDKdriver to ensure that the "right" path is served, and alternate path access is delayed until the JC[switching system is present. Figure 1 shows some possibilities with SCSI clusters and dual JC]pathed HSZ which will illustrate some of the complexity involved. The picture with QIOserver JCaand MSCP server added is different in detail but not different in concept. It is likely that the JCWtype of processing in DUTUSUBS and in DKdriver which looks for other paths to the same JC\storage will have to be extended to a multipath case. While detail will change, the overall JCconcept need not.Ib€£€²€¢€IICCluster Consistency StrategiesIAAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€C[To accomplish cluster consistent naming, it is essential that some method exist which will JCaprevent use of extra paths, even if they are visible, before the switching code can start. Refer JChagain to Figure 1 and it will be apparent that this is not trivial, particularly since a cluster cannot JC\expect to have any fully shared storage. There are several approaches that might be used to JC achieve this.IAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€b€£€²€¢€C#Naming Solution 1: Common HeuristicIAC^This approach involves use of the same heuristic decision algorithm in the entire cluster for JC_determining which name to use. Thus, for example, where multiple controllers exist, there must JCXbe some way by which a driver coming up can find out whether the present UCB is for the JC`lowest or highest numbered controller, and the algorithm would be "use the path with the lowest JC]serial number controller". The proposed HSZ firmware makes this information available in its JCaINQUIRY data. To deal with multiple paths for SCSI, it would suffice to add a test at the end of JCaunit init to check whether this UCB was the lowest numbered controller one, and if not, hide the JCZUCB so it will not come into use. Other controller services proposed for SCSI-3 will have JCasimilar capabilities, and a common heuristic will permit selection of the proper direct path. So JC_long as servers do not start for nonpreferred paths, this will mean that the same, and common, JC^device name will be seen everywhere. Similarly one could have a rule by which any server path JCVbeing set up checks pre-existing paths and hides any new path if it is not preferred. IAJb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€C\This will mean code in the MSCP driver to detect also QIOserver presence and vice versa, as JC\well as to detect (as currently) local paths. Also code would be needed in DKdriver and any JC^other affected drivers to check for whether a path was optimal, as well as code to hide other JCNpre-existing served paths or to hide itself if another path existed currently.IAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€b€£€²€¢€CWNote: In the presence of switching software, initially configuring a served UCB as the JC^"primary" name to be used is not as performance critical as might otherwise be thought, since JCdany failover will permit the switching code to switch to a local path if one exists. It may even be JCZfeasible to force mount verify processing to achieve this after the switching code starts.Ib€£€²€¢€IAAC\The common heuristic approach can work provided that devices with multiple paths can supply JC^some per-path information to drive the decision. It does not require boot path modifications, JCband does not require intra-cluster negotiation. The processing involved is similar to what is now JC[present. Because only one local path would be ever used to access a device for purposes of JC`determining its cluster name, there could be no conflicts of names. Once other local paths were JC`connected, of course, they could be made available via server, or one could serve the multipath JC[alias device with suitable enabling modifications. The former, with corresponding MSCP and JCXDUTUSUBS modifications, appears simplest since the latter generates routing issues with JC-MSCP packets whose solution could be complex.IAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€CWThe approach does have a possible disadvantage though. That is that the port chosen by JC]heuristic may turn out to be connected to only one system, where another port of some device JCamay be connected to a shared bus, so that instead of instantly allowing two direct paths with no JCdname conflict, only one is allowed, until failover to the direct paths is possible after loading of JCVthe switching components. This can be a temporary problem; certainly the HSZ firmware JC[permits one (via sending SCSI START to the other port) to force mount verify to happen and JCcfailover to occur on the "less connected" port, so long as some global site of intelligence exists JC]to determine when such should be done. Once the switching software is in place, a local path JC#can be used even though the device b€£€²€¢€Cname AC6came from a served path. (See Figures 2 and 3 for the JCconnectivity.)IAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€C[The common heuristic in the HSZ case would be to use the controller marked as preferred by JC_the customer, of course, this information being available also. Basically, however, so long as JC_only one local device name can be chosen by local paths (and this is guaranteed on shared SCSI JC4busses already), naming in a cluster will be unique.IAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€b€£€²€¢€C,Naming Solution 2: Common Configuration FileIAICbIf every cluster node is able to access a common configuration file, and this file is required to JCcbe the same even if storage access requires multiple copies of it to exist, then such a file could JC[be used to select which UCBs should be enabled. It would be necessary to also have cluster JC]code check, at cluster state transitions, that all mappings agreed, and hang any node with a JC]different map, which could involve a sizeable amount of traffic. This traffic cannot well be JC_avoided, though, since where separate files are involved, they can get out of synchronization. JCYJohn Hallyburton's IR on SCSI naming discusses some methods in detail for how this might JChappen.IAJb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€CaMaking a config file work would require that somehow, early in the life of the system, it should JCcbe read in from disk so that driver unit init routines could determine whether a particular device JCashould be connected. Cluster state transition or something similar whch runs early in the system JC_life must also compare this data for any disks being actively used at minimum, so as to ensure JCWthat no disk being used on a system differs in name from that same disk anywhere else. JC>Identifying the "same disk" means using the unique device ID. IAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€C[Cluster transition hooking can be accomplished by sending Worldwide ID / device name pairs JChto the cluster coordinator, to verify that no mispairings are seen. The size of this list is likely not JC_to be excessive; perhaps 128 bits per device could encode the pairs, with 64 devices per 1K of JCZmemory, so that 2048 devices would occupy 32K. When a node was joining a cluster it could JC^then send its pairings to the coordinator node which would validate that no different matches JC were used.IAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€C[It is possible that the lock system could be used instead, within cluster code called from JC]IOGEN, so that at boot time the device name validity can be established. In this case, locks JCYcould be taken out with names corresponding to devices, and lock values corresponding to JC^worldwide IDs. Should a node acquire such a lock and see a different value from its preferred JC[one, it would "know" that another node already running had used that name with a different JC^device, and bugcheck after a message. This would need to live in the swapper process to allow JC^it to live as long as the system,and could be implemented by a doorbell (to reduce the number JC`of locks that must be constantly present) which the cluster coordinator would use, or by having JC`a lot of reserved locks. (If cluster logicals were implemented and loaded early enough at boot, JCeven those might be used.)IAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€b€£€²€¢€C!Recommendations re: common names:IAAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€C]For initial operation, the "common heuristic" solution appears much simpler to implement and JC`would be well to implement first. This has the extra virtue that it may simplify backporting of JC_this capability. Over the longer haul, it is likely that a configuration file approach will be JC\needed to handle naming issues. The naming project needs to ensure only one name per device JCCin any case, and is a better place to put this kind of information.IIC[Even if a cut-down "new naming" scheme is used to only extend LUNs in a more or less fixed JCWway (let unit number be, say, 400*SCSI ID + SCSI LUN, fixed algorithm for scsi3 and/or JC^fibre), this means that multipath failover can accomplish what it needs to. If multiple paths JCYnever are configured, there may be only one path to select from, which is not bad either.Ib€£€²€¢€ICDefect ContainmentIAAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€CbThe investigation has resulted in a driver and control suite already which will serve as a source JCaof a code count. The software written for this purpose (not counting some library functions used JC`to allow the optional configuration file to be free form) totals some 3216 lines of code. It is JC[estimated that another ~250 lines of code will be needed for the automatic controller-pair JJC^recognition, and the DKdriver lines already added (to side copies) to support these functions JCYtotal 180. Thus there are so far about 3400 lines of code and the total for HSZ failover JC_functionality may be expected to total when all is said and done 3650 to 4000 (to pick a round JCnumber) lines of code.IAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€C]The bogey number of defects expected in 4000 lines of code at one per 40 lines of code would JC\be 100. However, for code which is unit tested already (the driver and control daemon code) JC]this estimate is reported high, and an estimate of 10 defects per KLOC is suggested for that JC^segment of the code. This would mean about 34 defects in the code so far, plus another ~10 in JCcode to be generated.IAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€CaNot all of this code is new (in that some older virtual disk driver examples were built on which JC^have been functioning for several years) and the switching driver code has been tested in one JCZsystem, which is why it is expected that a lower defect count will cover the code so far. IAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€C?Methods for defect removal include (in addition to unit tests):ICE * Overall design - minimal modifications will be introduced into theIC IC6(already complex) SCSI drivers to support the failoverIIC;functions. This can be expected to be the chief contributorIIC6to defect containment, since the effects of changes toIIC:existing SCSI drivers form a small fraction of the overallIIC=effort and their function is limited to reporting informationIIC$to the failover system on the whole.ICH* Reviews. It will be important to have the code in the driver reviewed IIC?so that its design, and particularly its detailed control flow,IIC8can be reviewed. The same goes for the server componentsIICparticularly where privileged.ICB* Stress testing. The code must be tested in SMP and large clusterIC IC,environments to catch any timing subtleties.IAb€‚ Paragraph£€ €£€Ô$P«€ €¡€"€b€£€²€¢€£€€xIC Resources:IAAb€‚ Paragraph£€ €£€Ô$P«€ €¡€"€C)Glenn Everhart will work on this project.Ib€£€²€¢€£€€xIAAb€‚ Paragraph£€ €£€Ô$P«€ €¡€"€b€£€²€¢€£€€xCIssues:IAAb€‚ Paragraph£€ €£€Ô$P«€ €¡€"€C`* Details of the function of QIOserver have not been finalized at this time, and these may have JCQsome effect, although designs are being shared and the mesh currently looks good.IAb€‚ Paragraph£€ €£€Ô$P«€ €¡€"€CY* Should the SCSI committee not ultimately support supplying information about all paths JC]when querying a device path, the "common heuristic" approach cannot be used. This would be a JC]change from current plans, but could happen. The approach will be fine for HSZs, though, and JC\by the time such a change could occur, it is likely that the code for unique worldwide name JC]support will have been completed, so that the configuration file approach should be workable.IAb€‚ Paragraph£€ €£€Ô$P«€ €¡€"€IAJb€‚ Paragraph£€ €£€Ô$P«€ €¡€"€b€£€²€¢€£€€xCFigures:IAAb€‚ Paragraph£€ €£€Ô$P«€ €¡€"€C]The following figures are illustrations of some of the types of connections which may occur, JCHconsidering HSZ dual paths and their connections as particular examples.IICaFigure 1 illustrates two possible ways a dual-bus HSZ can be connected to a cluster (in addition JC[to which the case exists of two busses on a single machine where the busses are not shared JCSCSI busses). IAb€‚ Paragraph£€ €£€Ô$P«€ €¡€"€CZFigure 2 illustrates the way naming works to the rest of VMS, again using the HSZ system, JCGwhich is one near-term dual path system, when using an intercept layer.IAb€‚ Paragraph£€ €£€Ô$P«€ € €!€‚¡€"€C`Figure 3 is meant to show the switch server in the picture. It is implicit here that the switch JC]driver has interfaces for its control and communication which are distinct from those of any JCaunderlying drivers. (For that reason, controls do not need to be added to any underlying drivers JCof whatever sort.)IAIb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€IAIIb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€IAIb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€b€£€²€¢€£€€xC Appendix AIAAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€b€£€²€¢€CSome Technical DetailsIAAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€CbSince some work on a prototype was done as one of the early tasks of this IR, it seems fitting to JC^present some of the thought and detail that went into this prototype, and some considerations JC5that can lead to its evolution toward a final system.IAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€C Overview:IICYThe thinking which went into the server prototype was that there will need to be in each JC^machine which has a multipath device a server, whose job it will be to group devices together JC`and control what clusterwide names are used, as well as to allow periodic checking to do timely JC_switching, and a switching intercept driver which will insert itself into the DDTAB entries of JC_the primary path driver chosen and requeue IRPs to the appropriate paths it "knows" about. The JCbserver will know some intimate details of the switching driver controls, and the switching driver JCbwill offer special controls to allow the server to pass commands to individual paths, providing a JCP"back door" opening beyond the abstraction that the main path is one path only. IAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€C\The switching driver can also internally watch for mount verify IRPs and use them to signal JC_itself to switch paths, and will keep track of what activity exists at its subordinate drivers.IAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€C;Since the switching will work via an intercept, the device b€£€²€¢€Cname AC can be one of the original path JC^names, and no VMS data structures above the intercepted driver need be touched. Thus any risk JC^introduced by adding a switching component is isolated therein. The queueing that is added to JC_the path is exactly what is added for DUdriver, or which is used for striping drivers and some JCVother "performance enhancing" VMS components. Thus the overhead should not be a large JCworry.IAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€b€£€²€¢€CSome Internals:IAIC_In order to implement this approach, it is necessary to select a "primary path" from among the JC`paths to the device, so that this path's name can be used clusterwide. (This choice must be the JCasame for all nodes in a cluster.) That done, a switching layer which can exist just ahead of the JC^underlying drivers must control all driver entry points from outside. These are stored in the JCWDDTAB structure. The primary ones are start-io, pending-io, mount-verify-start/finish, JC6altstart-io, i/o cancel, and of course the FDT tables.IAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€C^The switching functions contemplated here should not need to alter FDT entries, but will need JCacontrol to intercept the primary path's driver entries. (Other path drivers should be hidden and JC6set to no-assign status to keep them from being used.)IAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€C[The basic approach considered implies that a new UCB I/O queue will be used instead of the JCprimary driver's queue as the b€£€²€¢€Csystem AC:input for I/O to one or more of the paths. It then is the JCbswitching layer's job to vector this I/O to underlying paths, to keep track of what is active and JC_what idle, and to ensure that on path transfer, all I/O is revectored to the correct place. In JCcaddition it is necessary to provide the ability for specialized software to control path selection.IAJb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€C^This approach does require some additional data over that of, in effect, swapping between two JCZwhole SCSI port drivers, since one switches each device, not each port. Still, where some JC^multipath points may exist via servers and some via SCSI, it provides a single approach which JC6can handle all cases, regardless of the interconnects.IAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€C]Maintaining a separate input queue is facilitated by the DDTAB entries. When a new I/O is to JCfbe initiated, it is added to the device queue by calling the pending_io entry, or is started directly JCbfrom the start-io entry. When mount verify is started, the mount verify entry is called to do the JC]actual requeueing of the IRP back to the device, and the mount verify end entry is called to JCeactually start new I/O after mount verify. When altstart is called, the switch layer will be able to JCcuse internal information to tell where the IRP supplied needs to be sent. Finally, by altering the JCdIRP$L_PID field of each IRP, the switch layer is able to gain control after each I/O so it can tell JC^when I/O is done, and can monitor I/O for purposes of initiating mount verify conditions when JC^the driver just completing the actual work happens to be one of the paths not known as mountedIC^by VMS. (A testbed experiment has validated the feasibility of this "third party" switching , JC-demonstrating it working in both directions.)IAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€C`The treatment of mount verify entries is important here. When mount verify start is called, the JCbunderlying driver's routine must be called (if present) to insert the current IRP on the driver's JCYwait queue, and then the intercept must move it to the multipath input queue. When mount JC^verify ends, the intercept will move the first IRP through its operations and into the path's JC]driver's input queue, and then call the mount verify end routine to actually begin I/O again.IAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€C5It is intended that path switching will occur either b€£€²€¢€Cafter AC)a failed path has gone into mount verify JCCprocessing (so that the I/O system will have been fully idled, and b€£€²€¢€Cafter ACmount verify starts to JC[give SCSI drivers a chance to recover from SCSI RESET before concluding that a path has in JC]fact failed, and so the MSCP/DUdriver code may seek a different served path if possible), or JC^when the switching paths are known to be idle. Idleness in the second case will be determined JC`by counting. The I/O outstanding count is the number of IRPs into the driver less the number of JCZIRPs postprocessed out. When this is zero, the driver is necessarily idle. When paths are JC]switched when idle, the intent is also that packack should be issued on both paths, to force JC_sequential processing at the device and thus guarantee again that no path being abandonned can JC_have any remaining I/O. This is in fact a stronger guarantee than is needed, since during most JC_operations, the paths could perfectly well be shared. Only where there is a need from an upper JCglayer to enforce sequentiality is it necessary that this sequentiality be carried to the lower levels, JCaor when a condition at the device requires only one path to be used for correct recovery (as for JC6example bad block replacement done by a CPU might be).IAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€CSThe approach here is to defer any consideration of performing such synchronization JC^dynamically for a time, but to make path failover work. The approach under consideration does JC]not preclude a much more dynamic style of path sharing, but this is not intended immediately.IIb€£€²€¢€C Mount Verify and /Foreign MountsIAC\The mount verify service functions only with a normally mounted device. It is desirable for JCasimilar service to be optionally available for foreign device pairs, where a database vendor may JC]be handling the disk itself. This cannot be the default, but is sensible as a general matter.IAJb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€CaFortunately, there is a server available which is able to handle much of the complexity here. If JCgthis function is implemented, it is feasible for the switching driver to requeue its I/O to its input, JCaset the mount verify bits in underlying devices, and have the server process perform essentially JCathe same operations that mount verify does. This will allow the same path failover to be offered JC^for foreign mounted devices, should a site so select, that occurs on mounted ones. Since some JC`database vendors operate on non-filestructured disks, this will permit a significant functional JCagain for their support. Again, driver routines can be called even for secondary drivers, so that JC'underlying code will notice no changes.IAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€b€£€²€¢€C Code AssistsIAAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€CYSome simple optimizations will be present to detect whether underlying drivers have such JCZDDTAB entries as mount verify start/end, pending_io, and so on, so that IRPs which can be JC[handled more simply by just requeueing to the multipath input queue need not be queued and JC^then moved. However, an underlying driver may be able to speed up operations if it is able to JCUprovide some kind of assist so that the path switching system might know when purely JCalocal-path processing of a path has completed. This should be possible to add "unobtrusively" in JCbreturn status from a packack, for example, since we are able in the intercept code to look at any JC^IRP field. There need not even be any user visible changes. The initial scheme of waiting for JCUsome number of Mount Verify pack-ack functions (IO$_PACKACK) is usable but crude and JC[might be improved by incorporating some knowledge of the specifics of what was going on at JC`lower levels. (This can mean noting that a bus reset is being handled in SCSI, or noting that a JC]call to MSCP revalidate may be pending, as opposed to complete.) A status bit meaning either JCc"the local processing has failed; try switching if possible" or "more local processing is pending, JC]delay a switch" might be used. The former allows one to expedite switching, while the latter JC[permits one to delay it. The packack count one would use varies accordingly. Alternatively JC*there could be two bits, one per meaning. IAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€C_Underlying driver support is highly desirable, but it is noteworthy that a multipath switching JCdlayer can be constructed with no driver modification at all. This will make retrofit, with at least ICcpartial function, easy. Such a solution will not handle full multipath, but could be used in cases JCYsuch as devices on a shared SCSI bus, permitting failover between MSCP and a direct SCSI JCpath.IAb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€IAIb€‚Include Paragraph Text£€ €£€Ô$P«€ € €!€€‚„…¡€"€«€IAAA