Zend_Gdata_Health.xml 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 15156 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.gdata.health">
  5. <title>Verwenden von Google Health</title>
  6. <para>
  7. Die Google Health Data API wurde entwickelt um es Entwicklern zu erlauben die folgenden 2 Dinge zu tun:
  8. <itemizedlist>
  9. <listitem>
  10. <para>
  11. Das Google Gesundheitsprofil eines Benutzers lesen oder nach medizinischen Einträgen zu
  12. suchen die einem speziellen Kriterium entsprechen und dann die Ergebnisse zu verwenden um
  13. personalisierte Funktionalitäten basierend auf diesen Daten anzubieten.
  14. </para>
  15. </listitem>
  16. <listitem>
  17. <para>
  18. Neue Medizinische Daten zu einem Benutzerprofil hinzuzufügen indem CCR Daten eingefügt
  19. werden wenn eine Notiz an ein Benutzerprofil gesendet wird. Es ist zu beachten das die
  20. CCR Daten als XML Blob im &lt;atom&gt; Eintrag gespeichert werden. Die Bibliothek bietet
  21. keine direkten Zugriffsmethoden zu dem Objektmodell an aber es hat Helfer für das
  22. extrahieren von speziellen Feldern.
  23. </para>
  24. </listitem>
  25. </itemizedlist>
  26. </para>
  27. <para>
  28. Es gibt drei Hauptfeeds, die alle eine Authentifikation benötigen. Anders als andere Google Data APIs
  29. hat jede der Google Health Feeds ein begrenztes Set von HTTP Anweisungen die auf Ihm ausgeführt werden
  30. können, abhängig von der Authentifizierungsmethode die man verwendet (ClientLogin oder AuthSub/OAuth).
  31. Für eine Liste von gestatteten Anweisungen siehe
  32. <ulink url="http://code.google.com/apis/health/reference.html#Authentication">http://code.google.com/apis/health/reference.html#Authentication</ulink>.
  33. <itemizedlist>
  34. <listitem>
  35. <para>
  36. <firstterm>Profil Feed</firstterm>
  37. verwende den Profilfeed um das Gesundheitsprofil eines Benutzers nach speziellen Informationen
  38. zu durchsuchen.
  39. </para>
  40. </listitem>
  41. <listitem>
  42. <para>
  43. <firstterm>Registrierungs Feed</firstterm>
  44. verwende den Registrierungsfeed um neue CCR Daten in ein Profil einzupflegen.
  45. </para>
  46. </listitem>
  47. <listitem>
  48. <para>
  49. <firstterm>Profil Listen Feed</firstterm>
  50. der Profil Listen Feed sollte verwendet werden um festzustellen mit welchem Gesundheitsprofil
  51. eines Benutzer interagiert werden soll. Dieser Feed ist nur vorhanden wenn man ClientLogin
  52. verwendet.
  53. </para>
  54. </listitem>
  55. </itemizedlist>
  56. </para>
  57. <para>
  58. Siehe <ulink url="http://code.google.com/apis/health/">http://code.google.com/apis/health</ulink> für
  59. weitere Informationen über die Google Health API.
  60. </para>
  61. <sect2 id="zend.gdata.health.connect">
  62. <title>Zum Health Service verbinden</title>
  63. <para>
  64. Die Google Health API basiert, wie alle Google Data APIs, auf dem Atom Publishing Protokoll (APP),
  65. einem XML basierenden Format für die Verwaltung von Web-basierenden Ressourcen. Verkehr zwischen
  66. einem Client und dem Google Health Servern findet über HTTP statt und erlaubt authentifizierte
  67. Verbindungen.
  68. </para>
  69. <para>
  70. Bevor eine Transaktion stattfinden kann, muß eine Verbindung erstellt werden. Das Erstellen einer
  71. Verbindung zu den Health Servern beinhaltet zwei Schritte: Erstellung eines HTTP Clients und diesen
  72. Client an eine <classname>Zend_Gdata_Health</classname> Instanz binden.
  73. </para>
  74. <sect3 id="zend.gdata.health.connect.authentication">
  75. <title>Authentifikation</title>
  76. <para>
  77. Die Google Health API erlaubt den programmtechnischen Zugriff auf das Gesundheitsprofil eines
  78. Benutzer. Es gibt drei Authentifizierungsschemata die von Google Health unterstützt werden:
  79. </para>
  80. <itemizedlist>
  81. <listitem>
  82. <para>
  83. <firstterm>ClientLogin</firstterm>
  84. bietet direkte Benutzername/Passwort Authentifikation zu den Health Servern. Da diese
  85. Methoden erwarten das Benutzer Ihr Passwort der Anwendung angeben müssen, wird dieses
  86. Authentifizierungsschema nur für installierte/Desktopanwendungen empfohlen.
  87. </para>
  88. </listitem>
  89. <listitem>
  90. <para>
  91. <firstterm>AuthSub</firstterm>
  92. erlaubt es einen Benutzer seine privaten Daten zu teilen. Das bietet das selbe Level
  93. der bequemlichkeit wir ClientLogin, aber ohne das Sicherheitsrisiko, was es zu einer
  94. idealen Wahl für Web-basierende Anwendungen macht. Für Google Health muß AuthSub in
  95. einem registrierten und sicheren Modus verwendet werden -- was bedeutet das alle
  96. Anfragen zur API digital signiert werden müssen.
  97. </para>
  98. </listitem>
  99. <listitem>
  100. <para>
  101. <firstterm>OAuth</firstterm>
  102. ist eine alternative zu AuthSub. Auch wenn dieses Authentifizierungschema nicht in
  103. diesem Dokument diskutiert wird, können weitere Informationen hier gefunden werden:
  104. <ulink url="http://code.google.com/apis/health/developers_guide_protocol.html#OAuth">Health Data API Developer's Guide</ulink>.
  105. </para>
  106. </listitem>
  107. </itemizedlist>
  108. <para>
  109. Siehe
  110. <ulink url="http://code.google.com/apis/gdata/auth.html">Authentication Overview in the Google Data API documentation</ulink>
  111. für weitere Informationen über jede Authentifizierungsmethode.
  112. </para>
  113. </sect3>
  114. <sect3 id="zend.gdata.health.connect.service">
  115. <title>Erstellen einer Health Service Instanz</title>
  116. <para>
  117. Um mit Google Health zu interagieren, bietet die Client Bibliothek die Serviceklasse
  118. <classname>Zend_Gdata_Health</classname>. Diese Klasse bietet ein übliches Interface zu den Google Data und
  119. Atom Publishing Protokoll Modellen und hilft bei der Durchführung von Anfragen von und zur
  120. Health API.
  121. </para>
  122. <para>
  123. Sobald man sich für ein Authentifizierungsschema entschieden hat, ist der nächste Schritt die
  124. Erstellung einer Instanz von <classname>Zend_Gdata_Health</classname>. Dieser Klasse sollte eine Instanz
  125. von <classname>Zend_Gdata_HttpClient</classname> übergeben werden. Diese bietet ein Interface für-
  126. AuthSub/OAuth und ClientLogin um einen speziell authentifizierten HTTP Client zu erstellen.
  127. </para>
  128. <para>
  129. Um mit dem H9 des Entwicklers (/h9) statt Google Health (/health) nimmt der Konstruktor von
  130. <classname>Zend_Gdata_Health</classname> ein optionales drittes Argument mit dem man den H9 Service Name
  131. 'weaver' spezifizieren kann.
  132. </para>
  133. <para>
  134. Das folgende Beispiel zeigt wie eine Health Service Klasse bei Verwendung der ClientLogin
  135. Authentifizierung erstellt wird:
  136. </para>
  137. <programlisting role="php"><![CDATA[
  138. // Parameter für die ClientLogin Authentifikation
  139. $healthServiceName = Zend_Gdata_Health::HEALTH_SERVICE_NAME;
  140. //$h9ServiceName = Zend_Gdata_Health::H9_SANDBOX_SERVICE_NAME;
  141. $user = "user@gmail.com";
  142. $pass = "pa$$w0rd";
  143. // Erstellt einen authentifizierten HTTP Client
  144. $client = Zend_Gdata_ClientLogin::getHttpClient($user,
  145. $pass,
  146. $healthServiceName);
  147. // Erstellt eine Instanz des Health Services
  148. $service = new Zend_Gdata_Health($client);
  149. ]]></programlisting>
  150. <para>
  151. Ein Health Service der AuthSub verwendet kann ähnlich erstellt werden, im einem etwas längeren
  152. Aussehen. AuthSub ist das empfohlene Interface um mit Google Health zu kommunizieren weil jeder
  153. Token direkt zu einem speziellen Profil im Account des Benutzers verlinkt wird. Anders als
  154. andere Google Data APIs, ist es notwendig das alle Anfragen von der eigenen Anwendung digital
  155. signiert werden.
  156. </para>
  157. <programlisting role="php"><![CDATA[
  158. /*
  159. * Empfängt die aktuelle URL damit der AuthSub Server weiß wohin er den
  160. * Benutzer routen soll nachdem die Authentifizierung komplett ist.
  161. */
  162. function getCurrentUrl() {
  163. $phpRequestUri = htmlentities(substr($_SERVER['REQUEST_URI'],
  164. 0,
  165. strcspn($_SERVER['REQUEST_URI'],
  166. "\n\r")),
  167. ENT_QUOTES);
  168. if (isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on') {
  169. $protocol = 'https://';
  170. } else {
  171. $protocol = 'http://';
  172. }
  173. $host = $_SERVER['HTTP_HOST'];
  174. if ($_SERVER['SERVER_PORT'] != '' &&
  175. (($protocol == 'http://' && $_SERVER['SERVER_PORT'] != '80') ||
  176. ($protocol == 'https://' && $_SERVER['SERVER_PORT'] != '443'))) {
  177. $port = ':' . $_SERVER['SERVER_PORT'];
  178. } else {
  179. $port = '';
  180. }
  181. return $protocol . $host . $port . $phpRequestUri;
  182. }
  183. /*
  184. * Leitet einen Benutzer zu AuthSub um wenn er keinen gültigen Session Token
  185. * hat. Wenn er von AuthSub mit einem einmal-zu-verwendenden Token zurückkommt,
  186. * wird ein neuer HTTP Client initialisiert und der Token mit eine langlebigen
  187. * Sessiontoken getauscht.
  188. */
  189. function setupClient($singleUseToken = null) {
  190. $client = null;
  191. // Einen neuen AuthSub Token holen?
  192. if (!$singleUseToken) {
  193. $next = getCurrentUrl();
  194. $scope = 'https://www.google.com/health/feeds';
  195. $authSubHandler = 'https://www.google.com/health/authsub';
  196. $secure = 1;
  197. $session = 1;
  198. $authSubURL = Zend_Gdata_AuthSub::getAuthSubTokenUri($next,
  199. $scope,
  200. $secure,
  201. $session,
  202. $authSubHandler);
  203. // 1 - Erlaubt es Notizen zu schicken und das Lesen von Profildaten
  204. $permission = 1;
  205. $authSubURL .= '&permission=' . $permission;
  206. echo '<a href="' . $authSubURL . '">Dein Google Health Account</a>';
  207. } else {
  208. $client = new Zend_Gdata_HttpClient();
  209. // Setzen des privaten Schlüssels mit dem nachfolgende Anfragen
  210. // signiert werden
  211. $client->setAuthSubPrivateKeyFile('/path/to/your/rsa_private_key.pem',
  212. null,
  213. true);
  214. $sessionToken =
  215. Zend_Gdata_AuthSub::getAuthSubSessionToken(trim($singleUseToken),
  216. $client);
  217. // Setzt den langlebigen Sessiontoken für nachfolgende Anfragen
  218. $client->setAuthSubToken($sessionToken);
  219. }
  220. return $client;
  221. }
  222. // -> Skriptausführung beginnt hier <-
  223. session_start();
  224. $client = setupClient(@$_GET['token']);
  225. // Erstellt eine Instanz des Health Services
  226. $userH9Sandbox = false;
  227. $healthService = new Zend_Gdata_Health($client,
  228. 'googleInc-MyTestAppName-v1.0',
  229. $userH9Sandbox);
  230. ]]></programlisting>
  231. <para>
  232. Achtung: der Rest dieses Dokument wird annehmen das man AuthSub für die Authentifikation verwendet.
  233. </para>
  234. </sect3>
  235. </sect2>
  236. <sect2 id="zend.gdata.health.profilefeed">
  237. <title>Profil Feed</title>
  238. <para>
  239. Um den Profil Feed des Benutzers abzufragen, muß man sicherstellen das der initiale AuthSub Token mit
  240. gesetztem <code>permission=1</code> Parameter angefragt wurde. Der Prozess des extrahierens von Daten
  241. aus dem Profil benötigt zwei Schritte. Das Senden einer Anfrage und dem durchlaufen des resultierenden
  242. Feeds.
  243. </para>
  244. <sect3 id="zend.gdata.health.profilefeed.query">
  245. <title>Eine strukturierte Anfrage senden</title>
  246. <para>
  247. Man kann strukturierte Anfragen senden um spezielle Einträge von einem Benutzerprofil zu erhalten.
  248. </para>
  249. <para>
  250. Wenn man die Health API verwendet um ein Profil zu empfangen, werden speziell konstruierte
  251. Anfrage URLs verwendet um zu beschreiben welche (CCR) Daten zurückgegeben werden sollen. Die
  252. Klasse <classname>Zend_Gdata_Health_Query</classname> hilft dabei diese Aufgabe zu vereinfachen indem
  253. automatisch eine Abfrage URL erstellt wird basierend auf den Parametern die man gesetzt hat.
  254. </para>
  255. <sect4 id="zend.gdata.health.profilefeed.query.construct">
  256. <title>Den Feed abfragen</title>
  257. <para>
  258. Um eine Abfrage eines Profil Feeds durchzuführen, muß eine neue Instanz von
  259. <classname>Zend_Gdata_Health_Query</classname> erzeugt und die <code>getHealthProfileFeed()</code>
  260. Methode des Services aufgerufen werden:
  261. </para>
  262. <programlisting role="php"><![CDATA[
  263. $healthService = new Zend_Gdata_Health($client);
  264. // Beispielabfrage für die besten 10 Medikationen mit jeweils 2 Elementen
  265. $query = new Zend_Gdata_Health_Query();
  266. $query->setDigest("true");
  267. $query->setGrouped("true");
  268. $query->setMaxResultsGroup(10);
  269. $query->setMaxResultsInGroup(2);
  270. $query->setCategory("medication");
  271. $profileFeed = $healthService->getHealthProfileFeed($query);
  272. ]]></programlisting>
  273. <para>
  274. Wenn man <code>setDigest("true")</code> verwendet werden alle CCR Daten des Benutzers in einem
  275. einzelnen Atom <code>&lt;entry&gt;</code> zurückgegeben.
  276. </para>
  277. <para>
  278. Dem <code>setCategory()</code> Helfer kann ein zusätzlicher Parameter übergeben werden um
  279. spezifischere CCR Informationen zurückzuerhalten. Um zum Beispiel nur die Medikation
  280. Lipitor zurückzugeben verwendet man <code>setCategory("medication", "Lipitor")</code>.
  281. Die selbe Methode kann bei anderen Kategorien wie Konditionen, Allergien, Labor Ergebnisse,
  282. usw. angewendet werden.
  283. </para>
  284. <para>
  285. Eine komplette Liste der unterstützten Abfrageparameter ist im
  286. <ulink url="http://code.google.com/apis/health/reference.html#Parameters">Kapitel der Abfrageparameter</ulink>
  287. des Health API Referenz Guides vorhanden.
  288. </para>
  289. </sect4>
  290. </sect3>
  291. <sect3 id="zend.gdata.health.profilefeed.iterate">
  292. <title>Durch die Profil Einträge iterieren</title>
  293. <para>
  294. Jeder Google Health Eintrag enthält CCR Daten, trotzem führt die Verwendung des Abfrageparameters
  295. <code>digest=true</code> dazu das alle CCR Elemente (die dieser Abfrage entsprechen) in einen
  296. einzelnen Atom <code>&lt;entry&gt;</code> zusammengefügt werden.
  297. </para>
  298. <para>
  299. Um die kompletten CCR Informationen von einem Eintrag zu erhalten, muß ein Aufruf zur
  300. <code>getCcr()</code> Methode der <classname>Zend_Gdata_Health_ProfileEntry</classname> Klasse
  301. durchgeführt werden. Das gibt ein <classname>Zend_Gdata_Health_Extension_CCR</classname> zurück:
  302. </para>
  303. <programlisting role="php"><![CDATA[
  304. $entries = $profileFeed->getEntries();
  305. foreach ($entries as $entry) {
  306. $medications = $entry->getCcr()->getMedications();
  307. //$conditions = $entry->getCcr()->getConditions();
  308. //$immunizations = $entry->getCcr()->getImmunizations();
  309. // Das CCR XML ausgeben (das werden nur die Medikationen des Eintrags sein)
  310. foreach ($medications as $med) {
  311. $xmlStr = $med->ownerDocument->saveXML($med);
  312. echo "<pre>" . $xmlStr . "</pre>";
  313. }
  314. }
  315. ]]></programlisting>
  316. <para>
  317. Hier wird die <code>getCcr()</code> Methode in Verbindung mit einem magischen Helfer verwendet um
  318. nur die Medikationsdaten aufzureißen und aus den CCR des Eintrags zu extrahieren. Der hierbei
  319. erwähnte magische Helfer nimmt das Formular <code>getCATEGORYNAME()</code>, wobei
  320. <code>CATEGORYNAME</code> eine unterstützte Kategorie von Google Health ist. Für mögliche
  321. Kategorien kann in den
  322. <ulink url="http://code.google.com/apis/health/reference.html#CatQueries">Google Health Referenz Guide</ulink>
  323. gesehen werden.
  324. </para>
  325. <para>
  326. Um effizienter zu sein, können auch Kategorie Abfragen verwendet werden um nur die notwendigen
  327. CCRs von den Google Health Servern zu erhalten. Dann muß durch diese Ergebnisse iteriert werden:
  328. </para>
  329. <programlisting role="php"><![CDATA[
  330. $query = new Zend_Gdata_Health_Query();
  331. $query->setDigest("true");
  332. $query->setCategory("condition");
  333. $profileFeed = $healthService->getHealthProfileFeed($query);
  334. // Da die Abfrage digest=true enthält, wird nur der Atom Eintrag zurückgegeben
  335. $entry = $profileFeed->entry[0];
  336. $conditions = $entry->getCcr()->getConditions();
  337. // Die CCR Daten ausgeben (das sind nur die Konditionen des Profils)
  338. foreach ($conditions as $cond) {
  339. $xmlStr = $cond->ownerDocument->saveXML($cond);
  340. echo "<pre>" . $xmlStr . "</pre>";
  341. }
  342. ]]></programlisting>
  343. </sect3>
  344. </sect2>
  345. <sect2 id="zend.gdata.health.profilelist">
  346. <title>Profil Listen Feed</title>
  347. <para>
  348. Beachte: Dieser Feed ist nur vorhanden wenn man ClientLogin verwendet
  349. </para>
  350. <para>
  351. Da ClientLogin bei jedem seiner Feeds eine Profil ID benötigt, sollten Anwendungen diesen Feed als
  352. erstes abfragen um die richtigen Profile auszuwählen. Der Profil Listen Feed gibt Atom Einträge
  353. zurück die jedem Profil im Benutzeraccount von Google Health entsprechen. Die ProfilID wird im
  354. Atom <code>&lt;content&gt;</code> und der Name im <code>&lt;title&gt;</code> Element zurückgegeben.
  355. </para>
  356. <sect3 id="zend.gdata.health.profilelist.query">
  357. <title>Den Feed abfragen</title>
  358. <para>
  359. Um eine Abfrage gegen den Profil Listen Feed durchzuführen muß die
  360. <code>getHealthProfileListFeed()</code> Methode des Services aufgerufen werden:
  361. </para>
  362. <programlisting role="php"><![CDATA[
  363. $client = Zend_Gdata_ClientLogin::getHttpClient('user@gmail.com',
  364. 'pa$$word',
  365. 'health');
  366. $healthService = new Zend_Gdata_Health($client);
  367. $feed = $healthService->getHealthProfileListFeed();
  368. // Jeden Namen und jede ID des Profils ausgeben
  369. $entries = $feed->getEntries();
  370. foreach ($entries as $entry) {
  371. echo '<p>Profil Name: ' . $entry->getProfileName() . '<br>';
  372. echo 'Profil ID: ' . $entry->getProfileID() . '</p>';
  373. }
  374. ]]></programlisting>
  375. <para>
  376. Sobald man sich entschieden hat welches Profil verwendet werden soll, wird
  377. <code>setProfileID()</code> mit der Profil ID als Argument aufgerufen. Das begrenzt die
  378. weiteren API Abfragen auf genau das betreffende Profil:
  379. </para>
  380. <programlisting role="php"><![CDATA[
  381. // Verwende das erste Profil
  382. $profileID = $feed->entry[0]->getProfileID();
  383. $healthService->setProfileID($profileID);
  384. $profileFeed = $healthService->getHealthProfileFeed();
  385. $profileID = $healthService->getProfileID();
  386. echo '<p><b>Abgefragte Profil ID</b>: ' . $profileID . '</p>';
  387. ]]></programlisting>
  388. </sect3>
  389. </sect2>
  390. <sect2 id="zend.gdata.health.notice">
  391. <title>Notizen an des Register Feed versenden</title>
  392. <para>
  393. Individuelle Antworten zum registrierten Feed sind als Notizen bekannt. Notizen werden von
  394. Dritt-Anwendungen gesendet um den Benutzer über ein neues Event zu informieren. Mit AuthSub/OAuth,
  395. sind Notizen einfach etwas womit die eigene Anwendung neue CCR Informationen zu einem Benutzerprofil
  396. hinzufügen kann. Notizen können reinen Text enthalten (inklusive einiger XHTML Elemente), ein
  397. CCR Dokument oder beides. Als Beispiel können Notizen gesendet werden um Benutzer daran zu erinnern
  398. das Sie spezielle Rezepte nehmen sollen, oder sie können Laborergebnisse im CCR Format enthalten.
  399. </para>
  400. <sect3 id="zend.gdata.health.notice.send">
  401. <title>Senden einer Notiz</title>
  402. <para>
  403. Notizen können durch das Verwenden der <code>sendHealthNotice()</code> Methode des
  404. Health Services gesendet werden:
  405. </para>
  406. <programlisting role="php"><![CDATA[
  407. $healthService = new Zend_Gdata_Health($client);
  408. $subject = "Der Titel der Notiz ist hier";
  409. $body = "Der Notizinhalt kann einige <b>html</b> Elemente enthalten";
  410. $ccr = '<ContinuityOfCareRecord xmlns="urn:astm-org:CCR">
  411. <Body>
  412. <Problems>
  413. <Problem>
  414. <DateTime>
  415. <Type><Text>Start Datum</Text></Type>
  416. <ExactDateTime>2007-04-04T07:00:00Z</ExactDateTime>
  417. </DateTime>
  418. <Description>
  419. <Text>Medikament gegen Aorta Verengung</Text>
  420. <Code>
  421. <Value>410.10</Value>
  422. <CodingSystem>ICD9</CodingSystem>
  423. <Version>2004</Version>
  424. </Code>
  425. </Description>
  426. <Status><Text>Aktiv</Text></Status>
  427. </Problem>
  428. </Problems>
  429. </Body>
  430. </ContinuityOfCareRecord>';
  431. $responseEntry = $healthService->sendHealthNotice($subject,
  432. $body,
  433. "html",
  434. $ccr);
  435. ]]></programlisting>
  436. </sect3>
  437. </sect2>
  438. </sect1>