diff options
author | Erlang/OTP <[email protected]> | 2009-11-20 14:54:40 +0000 |
---|---|---|
committer | Erlang/OTP <[email protected]> | 2009-11-20 14:54:40 +0000 |
commit | 84adefa331c4159d432d22840663c38f155cd4c1 (patch) | |
tree | bff9a9c66adda4df2106dfd0e5c053ab182a12bd /lib/cosEvent | |
download | otp-84adefa331c4159d432d22840663c38f155cd4c1.tar.gz otp-84adefa331c4159d432d22840663c38f155cd4c1.tar.bz2 otp-84adefa331c4159d432d22840663c38f155cd4c1.zip |
The R13B03 release.OTP_R13B03
Diffstat (limited to 'lib/cosEvent')
57 files changed, 8779 insertions, 0 deletions
diff --git a/lib/cosEvent/AUTHORS b/lib/cosEvent/AUTHORS new file mode 100644 index 0000000000..624d275f78 --- /dev/null +++ b/lib/cosEvent/AUTHORS @@ -0,0 +1,5 @@ +Original Authors: +Niclas Eklund + +Contributors: + diff --git a/lib/cosEvent/Makefile b/lib/cosEvent/Makefile new file mode 100644 index 0000000000..4fa0b49ab7 --- /dev/null +++ b/lib/cosEvent/Makefile @@ -0,0 +1,41 @@ +# +# %CopyrightBegin% +# +# Copyright Ericsson AB 1999-2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved online at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# %CopyrightEnd% +# +# +include $(ERL_TOP)/make/target.mk +include $(ERL_TOP)/make/$(TARGET)/otp.mk + +# ---------------------------------------------------- +# Application version +# ---------------------------------------------------- +include vsn.mk +VSN=$(COSEVENT_VSN) + +# ---------------------------------------------------- +# Common Macros +# ---------------------------------------------------- + +SUB_DIRECTORIES = src doc/src + +SPECIAL_TARGETS = + +# ---------------------------------------------------- +# Default Subdir Targets +# ---------------------------------------------------- +include $(ERL_TOP)/make/otp_subdir.mk + diff --git a/lib/cosEvent/doc/html/.gitignore b/lib/cosEvent/doc/html/.gitignore new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/lib/cosEvent/doc/html/.gitignore diff --git a/lib/cosEvent/doc/man3/.gitignore b/lib/cosEvent/doc/man3/.gitignore new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/lib/cosEvent/doc/man3/.gitignore diff --git a/lib/cosEvent/doc/man6/.gitignore b/lib/cosEvent/doc/man6/.gitignore new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/lib/cosEvent/doc/man6/.gitignore diff --git a/lib/cosEvent/doc/pdf/.gitignore b/lib/cosEvent/doc/pdf/.gitignore new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/lib/cosEvent/doc/pdf/.gitignore diff --git a/lib/cosEvent/doc/src/CosEventChannelAdmin.xml b/lib/cosEvent/doc/src/CosEventChannelAdmin.xml new file mode 100644 index 0000000000..25f2dc805b --- /dev/null +++ b/lib/cosEvent/doc/src/CosEventChannelAdmin.xml @@ -0,0 +1,81 @@ +<?xml version="1.0" encoding="latin1" ?> +<!DOCTYPE erlref SYSTEM "erlref.dtd"> + +<erlref> + <header> + <copyright> + <year>1997</year> + <year>2007</year> + <holder>Ericsson AB, All Rights Reserved</holder> + </copyright> + <legalnotice> + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + The Initial Developer of the Original Code is Ericsson AB. + </legalnotice> + + <title>CosEventChannelAdmin</title> + <prepared></prepared> + <responsible></responsible> + <docno></docno> + <approved></approved> + <checked></checked> + <date>1997-11-13</date> + <rev>PA1</rev> + <file>CosEventChannelAdmin.xml</file> + </header> + <module>CosEventChannelAdmin</module> + <modulesummary>The CosEventChannelAdmin defines a set if event service interfaces that enables decoupled asynchronous communication between objects and implements generic (untyped) version of the OMG COSS standard event service.</modulesummary> + <description> + <p>The event service defines two roles for objects: the supplier role and + the consumer role. Suppliers supply event data to the event channel and + consumers receive event data from the channel. Suppliers do not need to + know the identity of the consumers, and vice versa. Consumers and + suppliers are connected to the event channel via proxies, which are managed + by ConsumerAdmin and SupplierAdmin objects.</p> + <p>There are four general models of communication. These are: </p> + <list type="bulleted"> + <item>The canonical push model. It allows the suppliers of events to initiate the + transfer of event data to consumers. Event channels play the role of + <c><![CDATA[Notifier]]></c>. Active suppliers use event channel to push data to + passive consumers registered with the event channel.</item> + <item>The canonical pull model. It allows consumers to request events from + suppliers. Event channels play the role of <c><![CDATA[Procure]]></c> since they + procure events on behalf of consumers. Active consumers can explicitly + pull data from passive suppliers via the event channels.</item> + <item>The hybrid push/pull model. It allows consumers request events queued at + a channel by suppliers. Event channels play the role of <c><![CDATA[Queue]]></c>. + Active consumers explicitly pull data deposited by active suppliers via + the event channels.</item> + <item>The hybrid pull/push model. It allows the channel to pull events from + suppliers and push them to consumers. Event channels play the role of + <c><![CDATA[Intelligent agent]]></c>. Active event channels can pull data from + passive suppliers to push it to passive consumers.</item> + </list> + <p>To get access to all definitions, e.g., exceptions, + include necessary <c><![CDATA[hrl]]></c> files by using:<br></br><c><![CDATA[-include_lib("cosEvent/include/*.hrl").]]></c></p> + <p>There are seven different interfaces supported in the service:</p> + <list type="bulleted"> + <item>ProxyPushConsumer</item> + <item>ProxyPullSupplier</item> + <item>ProxyPullConsumer</item> + <item>ProxyPushSupplier</item> + <item>ConsumerAdmin</item> + <item>SupplierAdmin</item> + <item>EventChannel</item> + </list> + <p>IDL specification for CosEventChannelAdmin:</p> + <codeinclude file="../../src/CosEventChannelAdmin.idl" tag="" type="c"></codeinclude> + </description> + +</erlref> + diff --git a/lib/cosEvent/doc/src/CosEventChannelAdmin_ConsumerAdmin.xml b/lib/cosEvent/doc/src/CosEventChannelAdmin_ConsumerAdmin.xml new file mode 100644 index 0000000000..e579d6f6f4 --- /dev/null +++ b/lib/cosEvent/doc/src/CosEventChannelAdmin_ConsumerAdmin.xml @@ -0,0 +1,73 @@ +<?xml version="1.0" encoding="latin1" ?> +<!DOCTYPE erlref SYSTEM "erlref.dtd"> + +<erlref> + <header> + <copyright> + <year>1997</year> + <year>2007</year> + <holder>Ericsson AB, All Rights Reserved</holder> + </copyright> + <legalnotice> + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + The Initial Developer of the Original Code is Ericsson AB. + </legalnotice> + + <title>CosEventChannelAdmin_­ConsumerAdmin</title> + <shorttitle>..._ConsumerAdmin</shorttitle> + <prepared></prepared> + <responsible></responsible> + <docno></docno> + <approved></approved> + <checked></checked> + <date>1997-11-13</date> + <rev>PA1</rev> + <file>CosEventChannelAdmin_ConsumerAdmin.xml</file> + </header> + <module>CosEventChannelAdmin_ConsumerAdmin</module> + <modulesummary>This module implements a ConsumerAdmin interface, which allows consumers to be connected to the event channel.</modulesummary> + <description> + <p>The ConsumerAdmin interface defines the first step for connecting consumers + to the event channel. It acts as a factory for creating proxy suppliers. + Both consumer administration and supplier administration are defined as separate + objects so that the creator of the channel can control the addition of + suppliers and consumers. </p> + <p>To get access to all definitions include necessary <c><![CDATA[hrl]]></c> files by using:<br></br><c><![CDATA[-include_lib("cosEvent/include/*.hrl").]]></c></p> + </description> + <funcs> + <func> + <name>obtain_push_supplier(Object) -> Return</name> + <fsummary>Create a ProxyPushSupplier object</fsummary> + <type> + <v>Object = #objref</v> + <v>Return = #objref</v> + </type> + <desc> + <p>This operation returns a ProxyPushSupplier object reference.</p> + </desc> + </func> + <func> + <name>obtain_pull_supplier(Object) -> Return</name> + <fsummary>Create a ProxyPullSupplier object</fsummary> + <type> + <v>Object = #objref</v> + <v>Return = #objref</v> + </type> + <desc> + <p>This operation returns a ProxyPullSupplier object reference.</p> + </desc> + </func> + </funcs> + +</erlref> + diff --git a/lib/cosEvent/doc/src/CosEventChannelAdmin_EventChannel.xml b/lib/cosEvent/doc/src/CosEventChannelAdmin_EventChannel.xml new file mode 100644 index 0000000000..809bf89762 --- /dev/null +++ b/lib/cosEvent/doc/src/CosEventChannelAdmin_EventChannel.xml @@ -0,0 +1,95 @@ +<?xml version="1.0" encoding="latin1" ?> +<!DOCTYPE erlref SYSTEM "erlref.dtd"> + +<erlref> + <header> + <copyright> + <year>1997</year> + <year>2007</year> + <holder>Ericsson AB, All Rights Reserved</holder> + </copyright> + <legalnotice> + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + The Initial Developer of the Original Code is Ericsson AB. + </legalnotice> + + <title>CosEventChannelAdmin_­EventChannel</title> + <shorttitle>..._EventChannel</shorttitle> + <prepared></prepared> + <responsible></responsible> + <docno></docno> + <approved></approved> + <checked></checked> + <date>1997-11-13</date> + <rev>PA1</rev> + <file>CosEventChannelAdmin_EventChannel.xml</file> + </header> + <module>CosEventChannelAdmin_EventChannel</module> + <modulesummary>This module implements an Event Channel interface, which plays the role of a mediator between consumers and suppliers.</modulesummary> + <description> + <p>An event channel is an object that allows multiple suppliers to communicate + with multiple consumers in a highly decoupled, asynchronous manner. The event + channel is built up incrementally. When an event channel is + created no suppliers or consumers are connected to it. Event Channel can + implement group communication by serving as a replicator, broadcaster, or + multicaster that forward events from one or more suppliers to multiple + consumers.</p> + <p>It is up to the user to decide when an event channel is created and how + references to the event channel are obtained. By representing the event + channel as an object, it has all of the properties that apply to objects. + One way to manage an event channel is to register it in a naming context, + or export it through an operation on an object.</p> + <p>To get access to all definitions include necessary <c><![CDATA[hrl]]></c> files by using:<br></br><c><![CDATA[-include_lib("cosEvent/include/*.hrl").]]></c></p> + <p>Any object that possesses an object reference that supports the ProxyPullConsumer + interface can perform the following operations:</p> + </description> + <funcs> + <func> + <name>for_consumers(Object) -> Return</name> + <fsummary>Return a ConsumerAdmin object</fsummary> + <type> + <v>Object = #objref</v> + <v>Return = #objref</v> + </type> + <desc> + <p>This operation returns a ConsumerAdmin object reference. If ConsumerAdmin + object does not exist already it creates one.</p> + </desc> + </func> + <func> + <name>for_suppliers(Object) -> Return</name> + <fsummary>Return a SupplierAdmin object</fsummary> + <type> + <v>Object = #objref</v> + <v>Return = #objref</v> + </type> + <desc> + <p>This operation returns a SupplierAdmin object reference. If SupplierAdmin + object does not exist already it creates one.</p> + </desc> + </func> + <func> + <name>destroy(Object) -> Return</name> + <fsummary>Destroy the event channel</fsummary> + <type> + <v>Object = #objref</v> + <v>Return = #objref</v> + </type> + <desc> + <p></p> + </desc> + </func> + </funcs> + +</erlref> + diff --git a/lib/cosEvent/doc/src/CosEventChannelAdmin_ProxyPullConsumer.xml b/lib/cosEvent/doc/src/CosEventChannelAdmin_ProxyPullConsumer.xml new file mode 100644 index 0000000000..811c8615b9 --- /dev/null +++ b/lib/cosEvent/doc/src/CosEventChannelAdmin_ProxyPullConsumer.xml @@ -0,0 +1,85 @@ +<?xml version="1.0" encoding="latin1" ?> +<!DOCTYPE erlref SYSTEM "erlref.dtd"> + +<erlref> + <header> + <copyright> + <year>1997</year> + <year>2007</year> + <holder>Ericsson AB, All Rights Reserved</holder> + </copyright> + <legalnotice> + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + The Initial Developer of the Original Code is Ericsson AB. + </legalnotice> + + <title>CosEventChannelAdmin_­ProxyPullConsumer</title> + <shorttitle>..._ProxyPullConsumer</shorttitle> + <prepared></prepared> + <responsible></responsible> + <docno></docno> + <approved></approved> + <checked></checked> + <date>1997-11-13</date> + <rev>PA1</rev> + <file>CosEventChannelAdmin_ProxyPullConsumer.xml</file> + </header> + <module>CosEventChannelAdmin_ProxyPullConsumer</module> + <modulesummary>This module implements a ProxyPullConsumer interface which acts as a middleman between pull supplier and the event channel.</modulesummary> + <description> + <p>The ProxyPullConsumer interface defines the second step for connecting pull + suppliers to the event channel. A proxy consumer is similar to a normal consumer, + but includes an additional method for connecting a supplier to the proxy + consumer.</p> + <p>To get access to all definitions, e.g., exceptions, + include necessary <c><![CDATA[hrl]]></c> files by using:<br></br><c><![CDATA[-include_lib("cosEvent/include/*.hrl").]]></c></p> + <p>Any object that possesses an object reference that supports the ProxyPullConsumer + interface can perform the following operations:</p> + </description> + <funcs> + <func> + <name>connect_pull_supplier(Object, PullSupplier) -> Return</name> + <fsummary>Connect the pull supplier to the proxy pull consumer</fsummary> + <type> + <v>Object = #objref</v> + <v>PullSupplier = #objref of PullSupplier type</v> + <v>Return = ok | {'EXCEPTION', E}</v> + <v>E = #'CosEventChannelAdmin_AlreadyConnected'{} | #'CosEventChannelAdmin_TypeError'{}</v> + </type> + <desc> + <p>This operation connects PullSupplier object to the ProxyPullConsumer object. + If a nil object reference is passed CORBA standard <c><![CDATA[BAD_PARAM]]></c> exception + is raised. If the ProxyPullConsumer is already connected to a PullSupplier, + then the <c><![CDATA[CosEventChannelAdmin_AlreadyConnected]]></c> exception is raised. + Implementations of ProxyPullConsumers may require additional interface + functionality; if these requirements are not met the + <c><![CDATA[CosEventChannelAdmin_TypeError]]></c> exception will be raised.</p> + </desc> + </func> + <func> + <name>disconnect_pull_consumer(Object) -> Return</name> + <fsummary>Disconnect the ProxyPullConsumer object from the event channel.</fsummary> + <type> + <v>Object = #objref</v> + <v>Return = ok</v> + </type> + <desc> + <p>This operation disconnects proxy pull consumer from the event channel and + sends a notification about the loss of the connection to the pull supplier + attached to it.</p> + </desc> + </func> + </funcs> + +</erlref> + diff --git a/lib/cosEvent/doc/src/CosEventChannelAdmin_ProxyPullSupplier.xml b/lib/cosEvent/doc/src/CosEventChannelAdmin_ProxyPullSupplier.xml new file mode 100644 index 0000000000..6c22c5ed39 --- /dev/null +++ b/lib/cosEvent/doc/src/CosEventChannelAdmin_ProxyPullSupplier.xml @@ -0,0 +1,112 @@ +<?xml version="1.0" encoding="latin1" ?> +<!DOCTYPE erlref SYSTEM "erlref.dtd"> + +<erlref> + <header> + <copyright> + <year>1997</year> + <year>2007</year> + <holder>Ericsson AB, All Rights Reserved</holder> + </copyright> + <legalnotice> + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + The Initial Developer of the Original Code is Ericsson AB. + </legalnotice> + + <title>CosEventChannelAdmin_­ProxyPullSupplier</title> + <shorttitle>..._ProxyPullSupplier</shorttitle> + <prepared></prepared> + <responsible></responsible> + <docno></docno> + <approved>Lars Thors</approved> + <checked></checked> + <date>1997-11-13</date> + <rev>PA1</rev> + <file>CosEventChannelAdmin_ProxyPullSupplier.xml</file> + </header> + <module>CosEventChannelAdmin_ProxyPullSupplier</module> + <modulesummary>This module implements a ProxyPullSupplier interface which acts as a middleman between pull consumer and the event channel.</modulesummary> + <description> + <p>The ProxyPullSupplier interface defines the second step for connecting pull consumers to the event channel. A proxy supplier is similar to a normal supplier, + but includes an additional method for connecting a consumer to the proxy + supplier.</p> + <p>To get access to all definitions, e.g., exceptions, + include necessary <c><![CDATA[hrl]]></c> files by using:<br></br><c><![CDATA[-include_lib("cosEvent/include/*.hrl").]]></c></p> + <p>Any object that possesses an object reference that supports the ProxyPullSupplier + interface can perform the following operations:</p> + </description> + <funcs> + <func> + <name>connect_pull_consumer(Object, PullConsumer) -> Return</name> + <fsummary>Connect the pull consumer to the proxy pull supplier</fsummary> + <type> + <v>Object = #objref</v> + <v>PullConsumer = #objref of PullConsumer type</v> + <v>Return = ok | {'EXCEPTION', #'CosEventChannelAdmin_AlreadyConnected'{}}</v> + </type> + <desc> + <p>This operation connects PullConsumer object to the ProxyPullSupplier object. + A nil object reference can be passed to this operation. If so a channel + cannot invoke the disconnect_pull_consumer operation on the consumer; + the consumer may be disconnected from the channel without being + informed. If the ProxyPullSupplier is already connected to a + PullConsumer, then the <c><![CDATA[CosEventChannelAdmin_AlreadyConnected]]></c> + exception is raised.</p> + </desc> + </func> + <func> + <name>disconnect_pull_supplier(Object) -> Return</name> + <fsummary>Disconnect the ProxyPullSupplier object from the event channel.</fsummary> + <type> + <v>Object = #objref</v> + <v>Return = ok</v> + </type> + <desc> + <p>This operation disconnects proxy pull supplier from the event channel. + It sends a notification about the loss of the connection to the pull consumer + attached to it, unless nil object reference was passed at the connection + time.</p> + </desc> + </func> + <func> + <name>pull(Object) -> Return</name> + <fsummary>Transmit data from suppliers to consumers.</fsummary> + <type> + <v>Object = #objref</v> + <v>Return = any</v> + </type> + <desc> + <p>This operation blocks until the event data is available or the + <c><![CDATA[CosEventComm_Disconnected]]></c> exception is raised. + It returns the event data to the consumer.</p> + </desc> + </func> + <func> + <name>try_pull(Object) -> Return</name> + <fsummary>Transmit data from suppliers to consumers.</fsummary> + <type> + <v>Object = #objref</v> + <v>Return = {any, bool()}</v> + </type> + <desc> + <p>This operation does not block: if the event data is available, it returns + the event data and sets the data availability flag to true; otherwise + it returns a long with an undefined value and sets the data availability to + false. If the event communication has already been disconnected, the + <c><![CDATA[CosEventComm_Disconnected]]></c> exception is raised.</p> + </desc> + </func> + </funcs> + +</erlref> + diff --git a/lib/cosEvent/doc/src/CosEventChannelAdmin_ProxyPushConsumer.xml b/lib/cosEvent/doc/src/CosEventChannelAdmin_ProxyPushConsumer.xml new file mode 100644 index 0000000000..2b50f8858a --- /dev/null +++ b/lib/cosEvent/doc/src/CosEventChannelAdmin_ProxyPushConsumer.xml @@ -0,0 +1,99 @@ +<?xml version="1.0" encoding="latin1" ?> +<!DOCTYPE erlref SYSTEM "erlref.dtd"> + +<erlref> + <header> + <copyright> + <year>1997</year> + <year>2007</year> + <holder>Ericsson AB, All Rights Reserved</holder> + </copyright> + <legalnotice> + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + The Initial Developer of the Original Code is Ericsson AB. + </legalnotice> + + <title>CosEventChannelAdmin_­ProxyPushConsumer</title> + <shorttitle>..._ProxyPushConsumer</shorttitle> + <prepared></prepared> + <responsible></responsible> + <docno></docno> + <approved></approved> + <checked></checked> + <date>1997-11-13</date> + <rev>PA1</rev> + <file>CosEventChannelAdmin_ProxyPushConsumer.xml</file> + </header> + <module>CosEventChannelAdmin_ProxyPushConsumer</module> + <modulesummary>This module implements a ProxyPushConsumer interface which acts as a middleman between push supplier and the event channel.</modulesummary> + <description> + <p>The ProxyPushConsumer interface defines the second step for connecting push + suppliers to the event channel. A proxy consumer is similar to a normal consumer, + but includes an additional method for connecting a supplier to the proxy + consumer.</p> + <p>To get access to all definitions, e.g., exceptions, + include necessary <c><![CDATA[hrl]]></c> files by using:<br></br><c><![CDATA[-include_lib("cosEvent/include/*.hrl").]]></c></p> + <p>Any object that possesses an object reference that supports the ProxyPushConsumer + interface can perform the following operations:</p> + </description> + <funcs> + <func> + <name>connect_push_supplier(Object, PushSupplier) -> Return</name> + <fsummary>Connect the push supplier to the proxy push consumer</fsummary> + <type> + <v>Object = #objref</v> + <v>PushSupplier = #objref of PushSupplier type</v> + <v>Return = ok | {'EXCEPTION', #'CosEventChannelAdmin_AlreadyConnected'{}}</v> + </type> + <desc> + <p>This operation connects PushSupplier object to the ProxyPushConsumer object. + A nil object reference can be passed to this operation. If so a channel + cannot invoke the disconnect_push_supplier operation on the supplier; + the supplier may be disconnected from the channel without being + informed. If the ProxyPushConsumer is already connected to a + PushSupplier, then the <c><![CDATA[CosEventChannelAdmin_AlreadyConnected]]></c> + exception is raised.</p> + </desc> + </func> + <func> + <name>disconnect_push_consumer(Object) -> Return</name> + <fsummary>Disconnect the ProxyPushConsumer object from the event channel.</fsummary> + <type> + <v>Object = #objref</v> + <v>Return = ok</v> + </type> + <desc> + <p>This operation disconnects proxy push consumer from the event channel. + Sends a notification about the loss of the connection to the push supplier + attached to it, unless nil object reference was passed at the connection + time.</p> + </desc> + </func> + <func> + <name>push(Object, Data) -> Return</name> + <fsummary>Communicate event data to the consumers.</fsummary> + <type> + <v>Object = #objref</v> + <v>Data = any</v> + <v>Return = ok | {'EXCEPTION', #'CosEventComm_Disconnected'{}}</v> + </type> + <desc> + <p>This operation sends event data to all connected consumers via the + event channel. If the event communication has already been disconnected, + the <c><![CDATA[CosEventComm_Disconnected]]></c> is raised.</p> + </desc> + </func> + </funcs> + +</erlref> + diff --git a/lib/cosEvent/doc/src/CosEventChannelAdmin_ProxyPushSupplier.xml b/lib/cosEvent/doc/src/CosEventChannelAdmin_ProxyPushSupplier.xml new file mode 100644 index 0000000000..cda162f4cd --- /dev/null +++ b/lib/cosEvent/doc/src/CosEventChannelAdmin_ProxyPushSupplier.xml @@ -0,0 +1,85 @@ +<?xml version="1.0" encoding="latin1" ?> +<!DOCTYPE erlref SYSTEM "erlref.dtd"> + +<erlref> + <header> + <copyright> + <year>1997</year> + <year>2007</year> + <holder>Ericsson AB, All Rights Reserved</holder> + </copyright> + <legalnotice> + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + The Initial Developer of the Original Code is Ericsson AB. + </legalnotice> + + <title>CosEventChannelAdmin_­ProxyPushSupplier</title> + <shorttitle>..._ProxyPushSupplier</shorttitle> + <prepared></prepared> + <responsible></responsible> + <docno></docno> + <approved></approved> + <checked></checked> + <date>1997-11-13</date> + <rev>PA1</rev> + <file>CosEventChannelAdmin_ProxyPushSupplier.xml</file> + </header> + <module>CosEventChannelAdmin_ProxyPushSupplier</module> + <modulesummary>This module implements a ProxyPushSupplier interface which acts as a middleman between push consumer and the event channel.</modulesummary> + <description> + <p>The ProxyPushSupplier interface defines the second step for connecting push + consumers to the event channel. A proxy supplier is similar to a normal supplier, + but includes an additional method for connecting a consumer to the proxy + supplier.</p> + <p>To get access to all definitions, e.g., exceptions, + include necessary <c><![CDATA[hrl]]></c> files by using:<br></br><c><![CDATA[-include_lib("cosEvent/include/*.hrl").]]></c></p> + <p>Any object that possesses an object reference that supports the ProxyPushSupplier + interface can perform the following operations:</p> + </description> + <funcs> + <func> + <name>connect_push_consumer(Object, PushConsumer) -> Return</name> + <fsummary>Connect the push consumer to the proxy push supplier</fsummary> + <type> + <v>Object = #objref</v> + <v>PushConsumer = #objref of PushConsumer type</v> + <v>Return = ok | {'EXCEPTION', E}</v> + <v>E = #'CosEventChannelAdmin_AlreadyConnected'{} | #'CosEventChannelAdmin_TypeError'{}</v> + </type> + <desc> + <p>This operation connects PushConsumer object to the ProxyPushSupplier object. + If a nil object reference is passed CORBA standard <c><![CDATA[BAD_PARAM]]></c> exception + is raised. If the ProxyPushSupplier is already connected to a PushConsumer, + then the <c><![CDATA[CosEventChannelAdmin_AlreadyConnected]]></c> exception is raised. + Implementations of ProxyPushSuppliers may require additional interface + functionality; if these requirements are not met the + <c><![CDATA[CosEventChannelAdmin_TypeError]]></c> exception will be raised.</p> + </desc> + </func> + <func> + <name>disconnect_push_supplier(Object) -> Return</name> + <fsummary>Disconnect the ProxyPushSupplier object from the event channel.</fsummary> + <type> + <v>Object = #objref</v> + <v>Return = ok</v> + </type> + <desc> + <p>This operation disconnects proxy push supplier from the event channel and + sends a notification about the loss of the connection to the push consumer + attached to it.</p> + </desc> + </func> + </funcs> + +</erlref> + diff --git a/lib/cosEvent/doc/src/CosEventChannelAdmin_SupplierAdmin.xml b/lib/cosEvent/doc/src/CosEventChannelAdmin_SupplierAdmin.xml new file mode 100644 index 0000000000..abcd7b6c1f --- /dev/null +++ b/lib/cosEvent/doc/src/CosEventChannelAdmin_SupplierAdmin.xml @@ -0,0 +1,73 @@ +<?xml version="1.0" encoding="latin1" ?> +<!DOCTYPE erlref SYSTEM "erlref.dtd"> + +<erlref> + <header> + <copyright> + <year>1997</year> + <year>2007</year> + <holder>Ericsson AB, All Rights Reserved</holder> + </copyright> + <legalnotice> + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + The Initial Developer of the Original Code is Ericsson AB. + </legalnotice> + + <title>CosEventChannelAdmin_­SupplierAdmin</title> + <shorttitle>..._SupplierAdmin</shorttitle> + <prepared></prepared> + <responsible></responsible> + <docno></docno> + <approved></approved> + <checked></checked> + <date>1997-11-13</date> + <rev>PA1</rev> + <file>CosEventChannelAdmin_SupplierAdmin.xml</file> + </header> + <module>CosEventChannelAdmin_SupplierAdmin</module> + <modulesummary>This module implements a SupplierAdmin interface, which allows suppliers to be connected to the event channel.</modulesummary> + <description> + <p>The SupplierAdmin interface defines the first step for connecting suppliers + to the event channel. It acts as a factory for creating proxy consumers. + Both consumer administration and supplier administration are defined as separate + objects so that the creator of the channel can control the addition of + suppliers and consumers.</p> + <p>To get access to all definitions include necessary <c><![CDATA[hrl]]></c> files by using:<br></br><c><![CDATA[-include_lib("cosEvent/include/*.hrl").]]></c></p> + </description> + <funcs> + <func> + <name>obtain_push_consumer(Object) -> Return</name> + <fsummary>Create a ProxyPushConsumer object</fsummary> + <type> + <v>Object = #objref</v> + <v>Return = #objref</v> + </type> + <desc> + <p>This operation returns a ProxyPushConsumer object reference.</p> + </desc> + </func> + <func> + <name>obtain_pull_consumer(Object) -> Return</name> + <fsummary>Create a ProxyPullConsumer object</fsummary> + <type> + <v>Object = #objref</v> + <v>Return = #objref</v> + </type> + <desc> + <p>This operation returns a ProxyPullConsumer object reference.</p> + </desc> + </func> + </funcs> + +</erlref> + diff --git a/lib/cosEvent/doc/src/Makefile b/lib/cosEvent/doc/src/Makefile new file mode 100644 index 0000000000..5136c7cfb5 --- /dev/null +++ b/lib/cosEvent/doc/src/Makefile @@ -0,0 +1,230 @@ +# +# %CopyrightBegin% +# +# Copyright Ericsson AB 1999-2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved online at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# %CopyrightEnd% +# +# +include $(ERL_TOP)/make/target.mk +include $(ERL_TOP)/make/$(TARGET)/otp.mk + +# ---------------------------------------------------- +# Application version +# ---------------------------------------------------- +include ../../vsn.mk +VSN=$(COSEVENT_VSN) +APPLICATION=cosEvent +# ---------------------------------------------------- +# Include dependency +# ---------------------------------------------------- + +ifndef DOCSUPPORT +include make.dep +endif + +# ---------------------------------------------------- +# Release directory specification +# ---------------------------------------------------- +RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN) + +# ---------------------------------------------------- +# Target Specs +# ---------------------------------------------------- +XML_APPLICATION_FILES = ref_man.xml +XML_REF3_FILES = \ + CosEventChannelAdmin.xml \ + CosEventChannelAdmin_ConsumerAdmin.xml \ + CosEventChannelAdmin_SupplierAdmin.xml \ + CosEventChannelAdmin_EventChannel.xml \ + CosEventChannelAdmin_ProxyPullConsumer.xml \ + CosEventChannelAdmin_ProxyPullSupplier.xml \ + CosEventChannelAdmin_ProxyPushConsumer.xml \ + CosEventChannelAdmin_ProxyPushSupplier.xml \ + cosEventApp.xml + +XML_PART_FILES = \ + part.xml \ + part_notes.xml +XML_CHAPTER_FILES = \ + ch_contents.xml \ + ch_introduction.xml \ + ch_event_service.xml \ + notes.xml + +BOOK_FILES = book.xml + +TECHNICAL_DESCR_FILES = + +GIF_FILES = \ + book.gif \ + notes.gif \ + ref_man.gif \ + user_guide.gif \ + e_s_components.gif \ + e_s_models.gif + + +PS_FILES = + + +# ---------------------------------------------------- + +INTERNAL_HTML_FILES = $(TECHNICAL_DESCR_FILES:%.xml=$(HTMLDIR)/%.html) + +HTML_FILES = $(XML_APPLICATION_FILES:%.xml=$(HTMLDIR)/%.html) \ + $(XML_PART_FILES:%.xml=$(HTMLDIR)/%.html) + +INFO_FILE = ../../info +EXTRA_FILES = summary.html.src \ + $(DEFAULT_GIF_FILES) \ + $(DEFAULT_HTML_FILES) \ + $(XML_REF3_FILES:%.xml=$(HTMLDIR)/%.html) \ + $(XML_CHAPTER_FILES:%.xml=$(HTMLDIR)/%.html) + +MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3) + +ifdef DOCSUPPORT + +HTML_REF_MAN_FILE = $(HTMLDIR)/index.html + +TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf + +else + +TEX_FILES_BOOK = \ + $(BOOK_FILES:%.xml=%.tex) +TEX_FILES_REF_MAN = $(XML_REF3_FILES:%.xml=%.tex) \ + $(XML_APPLICATION_FILES:%.xml=%.tex) +TEX_FILES_USERS_GUIDE = \ + $(XML_CHAPTER_FILES:%.xml=%.tex) + +TOP_PDF_FILE = $(APPLICATION)-$(VSN).pdf + +TOP_PS_FILE = $(APPLICATION)-$(VSN).ps + +$(TOP_PDF_FILE): book.dvi ../../vsn.mk + $(DVI2PS) $(DVIPS_FLAGS) -f $< | $(DISTILL) $(DISTILL_FLAGS) > $@ + +$(TOP_PS_FILE): book.dvi ../../vsn.mk + $(DVI2PS) $(DVIPS_FLAGS) -f $< > $@ +endif + +# ---------------------------------------------------- +# FLAGS +# ---------------------------------------------------- +XML_FLAGS += +DVIPS_FLAGS += + +# ---------------------------------------------------- +# Targets +# ---------------------------------------------------- +$(HTMLDIR)/%.gif: %.gif + $(INSTALL_DATA) $< $@ + +ifdef DOCSUPPORT + +docs: pdf html man + +$(TOP_PDF_FILE): $(XML_FILES) + +pdf: $(TOP_PDF_FILE) + +html: gifs $(HTML_REF_MAN_FILE) + +clean clean_docs: + rm -rf $(HTMLDIR)/* + rm -f $(MAN3DIR)/* + rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo) + rm -f errs core *~ + rm -f $(JD_HTML) $(JD_PACK) + +else + +ifeq ($(DOCTYPE),pdf) +docs: pdf +else +ifeq ($(DOCTYPE),ps) +docs: ps +else +docs: html gifs man +endif +endif + +pdf: $(TOP_PDF_FILE) + +ps: $(TOP_PS_FILE) + +html: $(HTML_FILES) $(INTERNAL_HTML_FILES) + +clean clean_docs clean_tex: + rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) $(TEX_FILES_BOOK) + rm -f $(HTML_FILES) $(MAN3_FILES) + rm -f $(TOP_PDF_FILE) $(TOP_PS_FILE) + rm -f errs core *~ *xmls_output *xmls_errs $(LATEX_CLEAN) +endif + +man: $(MAN3_FILES) + +gifs: $(GIF_FILES:%=$(HTMLDIR)/%) + +$(INDEX_TARGET): $(INDEX_SRC) + sed -e 's;%VSN%;$(VSN);' $(INDEX_SRC) > $(INDEX_TARGET) + +debug opt: + +# ---------------------------------------------------- +# Release Target +# ---------------------------------------------------- +include $(ERL_TOP)/make/otp_release_targets.mk + +ifdef DOCSUPPORT + +release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf + $(INSTALL_DIR) $(RELSYSDIR)/doc/html + $(INSTALL_DATA) $(HTMLDIR)/* \ + $(RELSYSDIR)/doc/html + $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) + $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 + $(INSTALL_DATA) $(MAN3DIR)/* $(RELEASE_PATH)/man/man3 + +else + +ifeq ($(DOCTYPE),pdf) +release_docs_spec: pdf + $(INSTALL_DIR) $(RELEASE_PATH)/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELEASE_PATH)/pdf +else +ifeq ($(DOCTYPE),ps) +release_docs_spec: ps + $(INSTALL_DIR) $(RELEASE_PATH)/ps + $(INSTALL_DATA) $(TOP_PS_FILE) $(RELEASE_PATH)/ps +else +release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/html + $(INSTALL_DATA) $(GIF_FILES) $(EXTRA_FILES) $(HTML_FILES) \ + $(RELSYSDIR)/doc/html + $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) + $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 + $(INSTALL_DATA) $(MAN3_FILES) $(RELEASE_PATH)/man/man3 + +endif +endif + +endif + +release_spec: + diff --git a/lib/cosEvent/doc/src/book.gif b/lib/cosEvent/doc/src/book.gif Binary files differnew file mode 100644 index 0000000000..94b3868792 --- /dev/null +++ b/lib/cosEvent/doc/src/book.gif diff --git a/lib/cosEvent/doc/src/book.xml b/lib/cosEvent/doc/src/book.xml new file mode 100644 index 0000000000..68e26be0ea --- /dev/null +++ b/lib/cosEvent/doc/src/book.xml @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="latin1" ?> +<!DOCTYPE book SYSTEM "book.dtd"> + +<book xmlns:xi="http://www.w3.org/2001/XInclude"> + <header titlestyle="normal"> + <copyright> + <year>1999</year><year>2009</year> + <holder>Ericsson AB. All Rights Reserved.</holder> + </copyright> + <legalnotice> + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + </legalnotice> + + <title>cosEvent</title> + <prepared></prepared> + <docno></docno> + <date>1998-04-25</date> + <rev>1.0</rev> + <file>book.xml</file> + </header> + <insidecover> + </insidecover> + <pagetext>cosEvent</pagetext> + <preamble> + <contents level="2"></contents> + </preamble> + <parts lift="no"> + <xi:include href="part.xml"/> + </parts> + <applications> + <xi:include href="ref_man.xml"/> + </applications> + <releasenotes> + <xi:include href="notes.xml"/> + </releasenotes> + <listofterms></listofterms> + <index></index> +</book> + diff --git a/lib/cosEvent/doc/src/ch_contents.xml b/lib/cosEvent/doc/src/ch_contents.xml new file mode 100644 index 0000000000..bc2838b36d --- /dev/null +++ b/lib/cosEvent/doc/src/ch_contents.xml @@ -0,0 +1,70 @@ +<?xml version="1.0" encoding="latin1" ?> +<!DOCTYPE chapter SYSTEM "chapter.dtd"> + +<chapter> + <header> + <copyright> + <year>1999</year> + <year>2007</year> + <holder>Ericsson AB, All Rights Reserved</holder> + </copyright> + <legalnotice> + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + The Initial Developer of the Original Code is Ericsson AB. + </legalnotice> + + <title>The cosEvent Application</title> + <prepared>Niclas Eklund</prepared> + <docno></docno> + <date>1999-09-17</date> + <rev>B</rev> + <file>ch_contents.xml</file> + </header> + + <section> + <title>Content Overview</title> + <p>The cosEvent documentation is divided into three sections: + </p> + <list type="bulleted"> + <item> + <p>PART ONE - The User's Guide + <br></br>Description of the cosEvent Application including + services and a small tutorial demonstrating + the development of a simple service.</p> + </item> + <item> + <p>PART TWO - Release Notes + <br></br>A concise history of cosEvent.</p> + </item> + <item> + <p>PART THREE - The Reference Manual + <br></br> A quick reference guide, including a + brief description, to all the functions available in cosEvent.</p> + </item> + </list> + </section> + + <section> + <title>Brief Description of the User's Guide</title> + <p>The User's Guide contains the following parts:</p> + <list type="bulleted"> + <item> + <p>CosEvent overview</p> + </item> + <item> + <p>CosEvent installation and examples</p> + </item> + </list> + </section> +</chapter> + diff --git a/lib/cosEvent/doc/src/ch_event_service.xml b/lib/cosEvent/doc/src/ch_event_service.xml new file mode 100644 index 0000000000..c65f6767ad --- /dev/null +++ b/lib/cosEvent/doc/src/ch_event_service.xml @@ -0,0 +1,221 @@ +<?xml version="1.0" encoding="latin1" ?> +<!DOCTYPE chapter SYSTEM "chapter.dtd"> + +<chapter> + <header> + <copyright> + <year>1997</year><year>2009</year> + <holder>Ericsson AB. All Rights Reserved.</holder> + </copyright> + <legalnotice> + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + </legalnotice> + + <title>Event Service</title> + <prepared></prepared> + <docno></docno> + <date>97-11-19</date> + <rev>A</rev> + <file>ch_es_intro.xml</file> + </header> + + <section> + <title>Overview of the CosEvent Service</title> + <p>The Event service allows programmers to subscribe to + information channels. Suppliers can generate events without knowing the + consumer identities and the consumer can receive events without knowing + the supplier identity. Both push and pull event delivery are supported. + The Event service will queue information and processes. + </p> + <p>The CORBA Event service provides a flexible model for + asynchronous, decoupled communication between objects. This + chapter outlines communication models and the roles and + relationships of key components in the CosEvent service. It + shows a simple example on use of this service.</p> + </section> + + <section> + <title>Event Service Components</title> + <p>There are five components in the OMG CosEvent service architecture. These + are described below:</p> + <marker id="e_s_components"></marker> + <image file="e_s_components.gif"> + <icaption> +Figure 1: Event service Components</icaption> + </image> + <list type="bulleted"> + <item><em>Suppliers and consumers:</em> Consumers are the ultimate targets of + events generated by suppliers. Consumers and suppliers can both play active + and + passive roles. There could be two types of consumers and suppliers: push + or pull. A PushSupplier object can actively push an event to a passive + PushConsumer object. Likewise, a PullSupplier object can passively + wait for a PullConsumer object to actively pull an event from it.</item> + <item><em>EventChannel:</em> The central abstraction in the CosEvent service is the + EventChannel which plays the role of a mediator between consumers and + suppliers. Consumers and suppliers register their interest with the + EventChannel. It can provide many-to-many communication. The channel + consumes events from one or more suppliers, and supplies events to one + or more consumers. An EventChannel can support consumers and suppliers + using different communication models.</item> + <item><em>ProxySuppliers and ProxyConsumers:</em> ProxySuppliers act as middlemen + between consumers and the EventChannel. A ProxySupplier is similar to + a normal supplier, but includes an additional method for connecting a + consumer to the ProxySupplier. Likewise, ProxyConsumers act as + middlemen between suppliers and the EventChannel. A ProxyConsumer is + similar to a normal consumer, but includes an additional method for + connecting a supplier to the ProxyConsumer.</item> + <item><em>Supplier and consumer administrations:</em> Consumer administration acts as + a factory for creating ProxySuppliers. Supplier administration acts as + a factory for creating ProxyConsumers.</item> + </list> + </section> + + <section> + <title>Event Service Communication Models</title> + <p>There are four general models of component collaboration in the OMG CosEvent service + architecture. The following describes these models: + (Please note that proxies are not shown in the diagrams for simplicity).</p> + <marker id="e_s_models"></marker> + <image file="e_s_models.gif"> + <icaption> +Figure 2: Event service Communication Models</icaption> + </image> + <list type="bulleted"> + <item><em>The Canonical Push Model:</em> The Canonical push model shown in figure 2(A) allows + the suppliers of events to initiate the transfer of event data to consumers. + In this model, suppliers are active initiators and consumers are the passive + targets of the requests. EventChannels play the role of <c><![CDATA[Notifier]]></c>. + Thus, active suppliers use EventChannels to push data to passive consumers that + have registered with the EventChannels.</item> + <item><em>The Canonical Pull Model:</em>The Canonical pull model shown + in figure 2(B) + allows consumers to request events from suppliers. In this model, + Consumers are + active initiators and suppliers are the passive targets of the pull + requests. + EventChannel plays the role of <c><![CDATA[Procurer]]></c> since it procures + events + on behalf of consumers. Thus, active consumers can explicitly pull + data + from passive suppliers via the EventChannels.</item> + <item><em>The Hybrid Push/Pull Model:</em> The push/pull model shown in figure 2(C) is a + hybrid that allows consumers to request events queued at an EventChannel + by suppliers. In this model, both suppliers and consumers are active + initiators of the requests. EventChannels play the role of <c><![CDATA[Queue]]></c>. + Thus, active consumers can explicitly pull data deposited by active + suppliers via the EventChannels.</item> + <item><em>The Hybrid Pull/Push Model:</em> The pull/push model shown in figure 2(D) is another + hybrid that allows the channel to pull events from suppliers and push them + to consumers. In this model, suppliers are passive targets of pull requests + and consumers are passive targets of pushes. EventChannels play the role of + <c><![CDATA[Intelligent Agent]]></c>. Thus, active EventChannels can pull data from + passive suppliers and push that data to passive consumers.</item> + </list> + </section> + + <section> + <title>A Tutorial on How to Create a Simple Service</title> + <p>To be able to use the cosEvent application supplier and consumer objects + must be implemented, which must inherit from the appropriate interface + defined in the <em>CosEventComm.idl</em> specification.</p> + <p>We start by creating an interface which inherits from the correct interface, + e.g., CosEventComm::PushConsumer. Hence, we must also implement all + operations defined in the PushConsumer interface. The IDL-file could look like: + </p> + <code type="c"><![CDATA[ +#ifndef _MYCLIENT_IDL +#define _MYCLIENT_IDL +#include <CosEventComm.idl> + +module myClientImpl { + + interface ownInterface:CosEventComm::PushConsumer { + + void ownFunctions(in any NeededArguments) + raises(OwnExceptions); + + }; +}; + +#endif + ]]></code> + <p>Run the IDL compiler on this file by calling the <c><![CDATA[ic:gen/1]]></c> function. + This will produce the API named <c><![CDATA[myClientImpl_ownInterface.erl]]></c>. + After generating the API stubs and the server skeletons it is time to + implement the servers and if no special options are sent + to the IDl compiler the file name is <c><![CDATA[myClientImpl_ownInterface_impl.erl]]></c>.</p> + </section> + + <section> + <title>How to Run Everything</title> + <p>Below is a short transcript on how to run cosEvent. </p> + <code type="none"><![CDATA[ + +%% Start Mnesia and Orber +mnesia:delete_schema([node()]), +mnesia:create_schema([node()]), +orber:install([node()]), +mnesia:start(), +orber:start(), + +%% Install cosEvent in the IFR. +cosEventApp:install(), + +%% Register the application specific Client implementations +%% in the IFR. +'oe_myClientImpl':'oe_register'(), + +%% Start the cosEvent application. +cosEventApp:start(), + +%% Start a channel using the default configuration +Ch = cosEventApp:start_channel(), +%% ... or use configuration parameters. +Ch = cosEventApp:start_channel([{pull_interval, 10}, {maxEvents, 50}]), + +%% Retrieve a SupplierAdmin and a ConsumerAdmin. +AdminSupplier = 'CosEventChannelAdmin_EventChannel':for_suppliers(Ch), +AdminConsumer = 'CosEventChannelAdmin_EventChannel':for_consumers(Ch), + +%% Use the corresponding Admin object to get access to wanted Proxies + +%% Create a Push Consumer Proxy, which the Client Push Supplier will push +%% events to. +ProxyPushConsumer = + 'CosEventChannelAdmin_SupplierAdmin':obtain_push_consumer(AdminSupplier), + +%% Create a Push Supplier Proxy, which will push events to the registered +%% Push Consumer. +ProxyPushSupplier = + 'CosEventChannelAdmin_ConsumerAdmin':obtain_push_supplier(AdminConsumer), + + +%% Create application Clients. We can, for example, start the Clients +%% our selves or look them up in the naming service. This is application +%% specific. +Consumer = myClientImpl_ownInterface:oe_create(), +Supplier = ... + +%% Connect each Client to the corresponding Proxy. +'CosEventChannelAdmin_ProxyPushConsumer': + connect_push_supplier(ProxyPushConsumer, Supplier), +'CosEventChannelAdmin_ProxyPushSupplier': + connect_push_consumer(ProxyPushSupplier, Consumer), + ]]></code> + <p>The example above, exemplifies a event system, i.e., the <em>Canonical Push Model</em>, where the Supplier client in some way generates event + and pushes them to the proxy. The push supplier proxies will eventually + push the events to each Consumer client.</p> + </section> +</chapter> + diff --git a/lib/cosEvent/doc/src/ch_introduction.xml b/lib/cosEvent/doc/src/ch_introduction.xml new file mode 100644 index 0000000000..8f948a5530 --- /dev/null +++ b/lib/cosEvent/doc/src/ch_introduction.xml @@ -0,0 +1,56 @@ +<?xml version="1.0" encoding="latin1" ?> +<!DOCTYPE chapter SYSTEM "chapter.dtd"> + +<chapter> + <header> + <copyright> + <year>1999</year> + <year>2007</year> + <holder>Ericsson AB, All Rights Reserved</holder> + </copyright> + <legalnotice> + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + The Initial Developer of the Original Code is Ericsson AB. + </legalnotice> + + <title>Introduction to cosEvent</title> + <prepared>Niclas Eklund</prepared> + <docno></docno> + <date>1999-09-17</date> + <rev></rev> + <file>ch_introduction.xml</file> + </header> + + <section> + <title>Overview</title> + <p>The cosEvent application is a Event Service compliant with the <url href="http://www.omg.org">OMG</url> + Event Service CosEvent. + </p> + + <section> + <title>Purpose and Dependencies</title> + <p>CosEvent is dependent on <em>Orber</em>, which provides CORBA functionality in an Erlang environment.</p> + </section> + + <section> + <title>Prerequisites</title> + <p>To fully understand the concepts presented in the + documentation, it is recommended that the user is familiar + with distributed programming and CORBA. + </p> + <p>Recommended reading includes <em>CORBA, Fundamentals and Programming - Jon Siegel</em> and <em>Open Telecom Platform Documentation Set</em>. It is also helpful to have read + <em>Concurrent Programming in Erlang</em>.</p> + </section> + </section> +</chapter> + diff --git a/lib/cosEvent/doc/src/cosEventApp.xml b/lib/cosEvent/doc/src/cosEventApp.xml new file mode 100644 index 0000000000..d83f44acb1 --- /dev/null +++ b/lib/cosEvent/doc/src/cosEventApp.xml @@ -0,0 +1,168 @@ +<?xml version="1.0" encoding="latin1" ?> +<!DOCTYPE erlref SYSTEM "erlref.dtd"> + +<erlref> + <header> + <copyright> + <year>2001</year> + <year>2007</year> + <holder>Ericsson AB, All Rights Reserved</holder> + </copyright> + <legalnotice> + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + The Initial Developer of the Original Code is Ericsson AB. + </legalnotice> + + <title>cosEventApp</title> + <prepared>Niclas Eklund</prepared> + <responsible>Niclas Eklund</responsible> + <docno></docno> + <approved>Niclas Eklund</approved> + <checked></checked> + <date>2000-01-31</date> + <rev>PA1</rev> + <file>cosEventApp.xml</file> + </header> + <module>cosEventApp</module> + <modulesummary>The main module of the cosEvent application.</modulesummary> + <description> + <p>To get access to the record definitions for the structures use:<br></br><c><![CDATA[-include_lib("cosEvent/include/*.hrl").]]></c></p> + <p>This module contains the functions for starting and stopping the application.</p> + </description> + <funcs> + <func> + <name>install() -> Return</name> + <fsummary>Install the cosEvent application</fsummary> + <type> + <v>Return = ok | {'EXCEPTION', E} | {'EXIT', R}</v> + </type> + <desc> + <p>This operation installs the cosEvent application.</p> + </desc> + </func> + <func> + <name>uninstall() -> Return</name> + <fsummary>Uninstall the cosEvent application</fsummary> + <type> + <v>Return = ok | {'EXCEPTION', E} | {'EXIT', R}</v> + </type> + <desc> + <p>This operation uninstalls the cosEvent application.</p> + </desc> + </func> + <func> + <name>start() -> Return</name> + <fsummary>Start the cosEvent application</fsummary> + <type> + <v>Return = ok | {error, Reason}</v> + </type> + <desc> + <p>This operation starts the cosEvent application.</p> + </desc> + </func> + <func> + <name>stop() -> Return</name> + <fsummary>Stop the cosEvent application</fsummary> + <type> + <v>Return = ok | {error, Reason}</v> + </type> + <desc> + <p>This operation stops the cosEvent application.</p> + </desc> + </func> + <func> + <name>start_channel() -> Channel</name> + <fsummary>Start a channel with default settings</fsummary> + <type> + <v>Channel = #objref</v> + </type> + <desc> + <p>This operation creates a new instance of a + <seealso marker="CosEventChannelAdmin_EventChannel">Event Channel</seealso> + using the default settings.</p> + </desc> + </func> + <func> + <name>start_channel(Options) -> Channel</name> + <fsummary>Start a channel with settings defined by the given options</fsummary> + <type> + <v>Options = [Option]</v> + <v>Option = {pull_interval, Seconds} | {typecheck, Boolean} | {maxEvents, Integer} | {blocking, Boolean}</v> + <v>Channel = #objref</v> + </type> + <desc> + <p>This operation creates a new instance of a + <seealso marker="CosEventChannelAdmin_EventChannel">Event Channel</seealso></p> + <p></p> + <list type="bulleted"> + <item><c><![CDATA[{pull_interval, Seconds}]]></c> - determine how often Proxy Pull + Consumers will check for new events with the client application. The + default value is 20 seconds.</item> + <item><c><![CDATA[{typecheck, Boolean}]]></c> - if this option is set to true the + proxies will check if the supplied client object is of correct type. + The default value is false.</item> + <item><c><![CDATA[{maxEvents, Integer}]]></c> - this option determine how many events + the <c><![CDATA[ProxyPullSuppliers]]></c> will store before discarding events. + If the limit is reached events will be discarded in any order. + The default value is 300.</item> + <item><c><![CDATA[{blocking, Boolean}]]></c> - this option determine the behavior of + the channel when handling events internally. If set to <c><![CDATA[true]]></c> the + risk of a single event supplier floods the system is reduced, but + the performance may also be reduced. + The default value is <c><![CDATA[true]]></c>.</item> + </list> + </desc> + </func> + <func> + <name>start_channel_link() -> Channel</name> + <fsummary>Start a channel, which is linked to the invoking process, with default settings</fsummary> + <type> + <v>Channel = #objref</v> + </type> + <desc> + <p>This operation creates a new instance of a + <seealso marker="CosEventChannelAdmin_EventChannel">Event Channel</seealso>, + which is linked to the invoking process, using the default settings.</p> + </desc> + </func> + <func> + <name>start_channel_link(Options) -> Channel</name> + <fsummary>Start a channel, which is linked to the invoking process, with settings defined by the given options</fsummary> + <type> + <v>Options = [Option]</v> + <v>Option = {pull_interval, Seconds} | {typecheck, Boolean} | {maxEvents, Integer} | {blocking, Boolean}</v> + <v>Channel = #objref</v> + </type> + <desc> + <p>This operation creates a new instance of a + <seealso marker="CosEventChannelAdmin_EventChannel">Event Channel</seealso>, + which is linked to the invoking process, with settings defined by the + given options. Allowed options are the same as for + <c><![CDATA[cosEventApp:start_channel/1]]></c>.</p> + </desc> + </func> + <func> + <name>stop_channel(Channel) -> Reply</name> + <fsummary>Terminate the target object</fsummary> + <type> + <v>Channel = #objref</v> + <v>Reply = ok | {'EXCEPTION', E}</v> + </type> + <desc> + <p>This operation stop the target event channel.</p> + </desc> + </func> + </funcs> + +</erlref> + diff --git a/lib/cosEvent/doc/src/e_s_components.gif b/lib/cosEvent/doc/src/e_s_components.gif Binary files differnew file mode 100644 index 0000000000..a448c14ce0 --- /dev/null +++ b/lib/cosEvent/doc/src/e_s_components.gif diff --git a/lib/cosEvent/doc/src/e_s_components.ps b/lib/cosEvent/doc/src/e_s_components.ps new file mode 100644 index 0000000000..c220467916 --- /dev/null +++ b/lib/cosEvent/doc/src/e_s_components.ps @@ -0,0 +1,3595 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: (ImageMagick) +%%Title: (./e_s_components.tmp.eps) +%%CreationDate: (Tue Jun 12 17:30:24 2001) +%%BoundingBox: 0 37 377 162 +%%DocumentData: Clean7Bit +%%LanguageLevel: 1 +%%Pages: 0 +%%EndComments + +%%BeginDefaults +%%PageOrientation: Portrait +%%EndDefaults + +%%BeginProlog +% +% Display a color image. The image is displayed in color on +% Postscript viewers or printers that support color, otherwise +% it is displayed as grayscale. +% +/buffer 512 string def +/byte 1 string def +/color_packet 3 string def +/pixels 768 string def + +/DirectClassPacket +{ + % + % Get a DirectClass packet. + % + % Parameters: + % red. + % green. + % blue. + % length: number of pixels minus one of this color (optional). + % + currentfile color_packet readhexstring pop pop + compression 0 gt + { + /number_pixels 3 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add 3 mul def + } ifelse + 0 3 number_pixels 1 sub + { + pixels exch color_packet putinterval + } for + pixels 0 number_pixels getinterval +} bind def + +/DirectClassImage +{ + % + % Display a DirectClass image. + % + systemdict /colorimage known + { + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { DirectClassPacket } false 3 colorimage + } + { + % + % No colorimage operator; convert to grayscale. + % + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { GrayDirectClassPacket } image + } ifelse +} bind def + +/GrayDirectClassPacket +{ + % + % Get a DirectClass packet; convert to grayscale. + % + % Parameters: + % red + % green + % blue + % length: number of pixels minus one of this color (optional). + % + currentfile color_packet readhexstring pop pop + color_packet 0 get 0.299 mul + color_packet 1 get 0.587 mul add + color_packet 2 get 0.114 mul add + cvi + /gray_packet exch def + compression 0 gt + { + /number_pixels 1 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add def + } ifelse + 0 1 number_pixels 1 sub + { + pixels exch gray_packet put + } for + pixels 0 number_pixels getinterval +} bind def + +/GrayPseudoClassPacket +{ + % + % Get a PseudoClass packet; convert to grayscale. + % + % Parameters: + % index: index into the colormap. + % length: number of pixels minus one of this color (optional). + % + currentfile byte readhexstring pop 0 get + /offset exch 3 mul def + /color_packet colormap offset 3 getinterval def + color_packet 0 get 0.299 mul + color_packet 1 get 0.587 mul add + color_packet 2 get 0.114 mul add + cvi + /gray_packet exch def + compression 0 gt + { + /number_pixels 1 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add def + } ifelse + 0 1 number_pixels 1 sub + { + pixels exch gray_packet put + } for + pixels 0 number_pixels getinterval +} bind def + +/PseudoClassPacket +{ + % + % Get a PseudoClass packet. + % + % Parameters: + % index: index into the colormap. + % length: number of pixels minus one of this color (optional). + % + currentfile byte readhexstring pop 0 get + /offset exch 3 mul def + /color_packet colormap offset 3 getinterval def + compression 0 gt + { + /number_pixels 3 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add 3 mul def + } ifelse + 0 3 number_pixels 1 sub + { + pixels exch color_packet putinterval + } for + pixels 0 number_pixels getinterval +} bind def + +/PseudoClassImage +{ + % + % Display a PseudoClass image. + % + % Parameters: + % class: 0-PseudoClass or 1-Grayscale. + % + currentfile buffer readline pop + token pop /class exch def pop + class 0 gt + { + currentfile buffer readline pop + token pop /depth exch def pop + /grays columns 8 add depth sub depth mul 8 idiv string def + columns rows depth + [ + columns 0 0 + rows neg 0 rows + ] + { currentfile grays readhexstring pop } image + } + { + % + % Parameters: + % colors: number of colors in the colormap. + % colormap: red, green, blue color packets. + % + currentfile buffer readline pop + token pop /colors exch def pop + /colors colors 3 mul def + /colormap colors string def + currentfile colormap readhexstring pop pop + systemdict /colorimage known + { + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { PseudoClassPacket } false 3 colorimage + } + { + % + % No colorimage operator; convert to grayscale. + % + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { GrayPseudoClassPacket } image + } ifelse + } ifelse +} bind def + +/DisplayImage +{ + % + % Display a DirectClass or PseudoClass image. + % + % Parameters: + % x & y translation. + % x & y scale. + % label pointsize. + % image label. + % image columns & rows. + % class: 0-DirectClass or 1-PseudoClass. + % compression: 0-RunlengthEncodedCompression or 1-NoCompression. + % hex color packets. + % + gsave + currentfile buffer readline pop + token pop /x exch def + token pop /y exch def pop + x y translate + currentfile buffer readline pop + token pop /x exch def + token pop /y exch def pop + currentfile buffer readline pop + token pop /pointsize exch def pop + /Helvetica findfont pointsize scalefont setfont + x y scale + currentfile buffer readline pop + token pop /columns exch def + token pop /rows exch def pop + currentfile buffer readline pop + token pop /class exch def pop + currentfile buffer readline pop + token pop /compression exch def pop + class 0 gt { PseudoClassImage } { DirectClassImage } ifelse + grestore +} bind def +%%EndProlog +%%Page: 1 1 +%%PageBoundingBox: 0 37 377 162 +userdict begin +%%BeginData: +DisplayImage +0 37 +377.000000 125.000000 +12 +599 199 +1 +1 +1 +8 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 +000000000000000000000000000000000000000000ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffff0000000000000000eaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaea0000000000000000ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 +00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaea0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea000000ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea000000ffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffff000000eaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaea000000ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffff0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +ea0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffff0000eaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000ffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaea0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffff000000000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +ea00000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000eaea00eaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00eaea00eaeaea00 +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00eaeaea00eaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaea00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffff00eaeaea00eaeaea00eaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff00eaeaea00eaeaea00ea0000ea00ea000000eaea0000ea0000ea000000ea00000000ea +eaeaeaea0000ea0000ea0000ea0000ea0000ea0000eaea00ea0000eaeaea0000eaea0000 +ea00eaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff00eaeaea00000000eaeaea00 +00ea00eaeaea00eaea00ea00eaeaea00eaeaea00eaea0000eaeaeaea00eaea00eaea0000 +eaea00ea0000eaea00ea00eaea00eaea00eaea00eaea0000eaeaeaeaeaeaeaeaeaeaeaea +ea00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffff00eaeaea00eaeaeaeaeaea00eaea00eaeaea00eaeaea00eaea +eaea00eaea00eaeaeaeaea00eaeaea00eaea00eaea00eaeaea00ea00eaeaea00ea00eaea +00eaea00000000eaea00eaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ea +eaea00eaeaeaeaeaea00eaea00eaeaea00eaeaea00eaeaeaeaea00ea00eaeaeaeaea00ea +eaea00eaea00eaea00eaeaea00ea00eaeaea00ea00eaea00eaea00eaeaeaeaea00eaeaea +eaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffff00000000000000ffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffff00eaeaea00eaeaeaeaeaea00eaea00 +eaeaea00eaea00ea00eaeaeaea00ea00ea00eaeaea00eaeaea00eaea00eaea0000eaea00 +ea0000eaea00ea00eaea00eaea00eaea00eaea00eaeaeaeaeaeaeaeaeaeaeaeaeaea00ff +ffffffffffffffffff0000ffffff00ffffffffffffffffffffffffffffffffffffffffff +ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffff00ea000000eaeaeaea000000eaea000000eaea0000ea0000eaeaea +ea00eaea00000000eaeaeaeaea00000000ea00ea0000eaea00ea0000ea000000000000ea +ea0000eaea000000eaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffff0000ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00eaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00eaeaeaeaeaeaeaeaeaeaea +eaeaeaeaea00eaeaeaeaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaea00ffffffffffffffffffffffff0000ff00ffffff000000ff0000ffffff00 +0000ffff000000ff0000ff00000000ffff00000000ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffff00eaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00eaeaeaeaea00ea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffff +ffffffffffff00000000ffffffff0000ff00ffffff0000ff0000ffff0000000000ffff00 +00ffff0000ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffff0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000eaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaea000000eaeaea000000eaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaea0000ffffffffffffffffffffffffff0000ff00ffffff +ff0000ff00ffffff0000000000ffff0000ff0000ffff0000ffff000000ffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff00000000000000000000000000000000000000000000ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00eaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +00ffffffff0000ffffffffffffffffff0000ffffffffffff0000ff00ffffff0000ffffff +ffff0000ff0000ffff0000ffffffff000000ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000000000000000ffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffff0000eaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000ffffffffffffff00000000ffff +ffffff0000ffffff00ffffff0000ffffffff0000ffff00ffff0000ff0000ffff0000ffff +00ffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffff0000000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000000000ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffff0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaea0000ffffffffffffffffffffffffff000000ff00000000000000ffffff00 +00ffffffffff000000ffff000000ff000000ff000000ff00000000ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000eaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaea000000ffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffffffff00 +0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea000000ffffffffffffff +ffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffff000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000 +00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffff00000000000000000000ffffffffffffffffff000000eaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaea000000ffffffffffffffffffffffffffffffffffffffffffffff +ff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea000000ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000 +0000ffffffffffffffffffffffffff000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea000000ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaea0000ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffffff +ffffffffff0000000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaea0000000000ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff0000000000000000000000000000000000000000ffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaea0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffff00000000000000ffffffffffffffffffffffffffffffffffffffffffff000000 +0000000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000000000000000ff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff00000000000000eaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaea00000000000000ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffff00eaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000 +0000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 +0000ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff +ff00000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaea00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffff0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffff0000ffff00000000ffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffff +ff000000ffffffffffffffffffffffffffffffffff000000eaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea000000ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00eaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaea00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff +ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff00000000ffffffffff00000000ffffffffffffffff +ffffffffff000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea000000ffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff0000000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaea000000ea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffff0000ffffffffffffff0000ffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffff000000ff000000000000ffffffffffffffffffff0000eaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaea0000ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffff00ffffffff +ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff +ffffffff0000eaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00eaea +ea0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 +00000000ffffffffffffff0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00 +00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffff00ffffffffffffffffffffffffffffffffffffff00eaeaea00eaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00eaeaeaeaea00eaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaea00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffff0000000000000000ffffffffff00eaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +0000ff00ffffff000000ff0000ffffff000000ffff000000ff0000ff00000000ffff0000 +0000ffffffffffffffffffffffff00eaeaea000000ea00ea000000eaea0000ea0000ea00 +0000ea00000000eaeaeaeaeaeaeaea000000eaea0000ea00eaeaea0000000000ea0000ea +0000ea00eaea00eaeaeaea0000eaea0000ea00eaeaeaeaeaeaeaea00ffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffff00000000000000000000ffffff00eaeaeaea000000ea00eaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff0000ff00ff +ffff0000ff0000ffff0000000000ffff0000ffff0000ffff00ffffffffffffffffffffff +ff00000000eaea0000ea00eaeaea00eaea00ea00eaeaea00eaeaea00ea00eaeaeaeaeaea +ea00eaeaea00eaea0000ea00ea00eaea00ea00eaea00eaea0000ea0000ea00eaea00eaea +00eaea0000eaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000 +00000000ff00eaeaeaea00eaeaea0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffff0000ff00ffffffff0000ff00ffffff0000000000ffff0000ff00 +00ffff0000ffff000000ffffffffffffffffffffffffffff00eaeaeaeaea00eaea00eaea +ea00eaeaea00eaeaeaea00eaea00eaea00eaeaeaeaeaeaea00eaeaea00eaea00eaea00ea +0000eaeaea00eaea00eaea00eaea00eaea00eaea00000000eaea00eaeaeaeaeaeaeaeaea +ea00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff00000000ffffffffffffffff00eaeaeaea00eaeaea +eaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff +ffffffffff0000ff00ffffff0000ffffffffff0000ff0000ffff0000ffffffff000000ff +ffffffffffffffffffffff00eaeaeaeaea00eaea00eaeaea00eaeaea00eaeaeaeaea00ea +00eaea00eaeaeaeaea00ea00eaeaea00eaea00eaea00eaeaea0000ea00eaea00eaea00ea +ea00eaea00eaea00eaeaeaeaea00eaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 +00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffff00eaeaeaea00eaeaeaeaeaeaeaea000000eaea0000ea +00eaeaea0000000000ea0000ea0000ea00eaea00eaeaeaea0000eaea0000ea00eaeaeaea +eaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffff0000ffffff00ffffff0000ffffffff00 +00ffff00ffff0000ff0000ffff0000ffff00ffff0000ffffffffffffffffffffffff00ea +eaeaeaea00eaea00eaeaea00eaea00ea00eaeaeaea00ea00eaeaea00eaeaea00eaea00ea +eaea00eaea00eaea00ea00eaea00ea00eaea00eaea00eaea00eaea00eaea00eaea00eaea +00eaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff00eaeaeaea00eaeaeaeaeaeaea00eaeaea00eaea0000ea00ea00eaea00ea00eaea00ea +ea0000ea0000ea00eaea00eaea00eaea0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffff00000000000000ffffff0000ffffffffff000000ffff000000ff000000ff +000000ff00000000ffffffffffffffffffffffff000000eaeaea000000eaea000000eaea +0000ea0000eaeaeaea00eaeaeaeaea000000eaeaeaea000000eaea000000ea0000000000 +eaeaea00000000000000ea0000ea0000eaea0000eaea000000eaeaeaeaeaeaeaea00ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff00eaeaeaea00eaeaeaeaeaea +ea00eaeaea00eaea00eaea00ea0000eaeaea00eaea00eaea00eaea00eaea00eaea000000 +00eaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffff00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00eaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffff00eaeaeaea00eaeaeaeaea00ea00eaeaea00eaea00eaea00ea +eaea0000ea00eaea00eaea00eaea00eaea00eaea00eaeaeaeaea00eaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00eaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaea00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ea +eaeaeaea00eaeaea00eaea00eaeaea00eaea00eaea00ea00eaea00ea00eaea00eaea00ea +ea00eaea00eaea00eaea00eaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffff0000000000000000ffff0000eaeaeaeaeaeaeaeaeaeaeaeaea +eaeaea0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000ffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffff00eaeaeaeaea000000eaeaeaea00 +0000eaea000000ea0000000000eaeaea00000000000000ea0000ea0000eaea0000eaea00 +0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 +000000000000000000ff00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffff00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaea00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000 +000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff0000 +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 +000000000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00000000000000ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffff0000000000000000ffffffffffff0000eaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffff0000eaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaea0000ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff00000000eaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00000000ffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 +000000ffffffffffffffffff000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaea000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffff0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaea000000ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffff00000000ff0000000000ffffffffffffffffffffffff +ffff000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea000000ffffffffffff0000ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaea000000ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffff000000eaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +ea000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 +00ffffffffff00000000ffffffffffffffffffffffffffffffffffff000000eaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaea000000ffffffffffffffffffffff0000ffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffff000000eaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00 +0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffff0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000ffffffffffffff +ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff0000ffffffff +ffffffffffffffffffffffffffffffffffff0000000000eaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000000000ffffffffffff +ffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff00000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00000000ffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000eaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000ffffffffffffffffffffffffffffffffffff +ff00000000ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffff0000000000000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaea0000000000000000ffffffffffffffffffffffffffffffffffffffffffffff00 +00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffff00000000000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000 +0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffff00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaea00ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffff00000000000000000000000000000000000000000000ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff0000000000000000000000000000000000000000ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +00eaeaeaeaeaeaea00000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000eaea +00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffff +ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffff00eaeaeaeaeaeaea00eaeaea00ea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffff00000000ffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffff00eaeaeaeaeaeaeaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaea00ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00eaeaeaea +eaeaeaeaea00eaeaeaeaea0000ea0000ea0000ea0000ea0000ea0000eaea00ea0000eaea +ea0000eaea0000ea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea000000ffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff00eaeaeaeaeaeaeaeaeaea0000eaeaeaea00 +eaea00eaea0000eaea00ea0000eaea00ea00eaea00eaea00eaea00eaea0000eaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffff00eaeaeaeaeaeaeaeaeaeaeaea00eaeaea00eaea00eaea00eaeaea00ea00ea +eaea00ea00eaea00eaea00000000eaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaea00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00eaeaeaeaeaeaea +eaeaeaeaea00eaeaea00eaea00eaea00eaeaea00ea00eaeaea00ea00eaea00eaea00eaea +eaeaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff00ffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff00eaeaeaeaeaeaeaea00eaeaea00eaeaea00eaea00 +eaea0000eaea00ea0000eaea00ea00eaea00eaea00eaea00eaea00eaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffff0000ffffffffffff0000ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff00eaeaeaeaeaeaea00000000eaeaeaeaea00000000ea00ea0000eaea00ea0000ea +000000000000eaea0000eaea000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff +ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff00eaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaea00eaeaeaeaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffff0000ff0000000000ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 +0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00 +eaeaeaeaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaea00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffff00000000000000ffffffffffffffffffffffffffffffffff00 +00000000000000000000000000000000000000eaeaeaeaeaeaeaeaea000000000000ffff +ffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea000000eaeaea000000eaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000ffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 +0000000000ffffffffffffffffffffffffff00000000eaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea000000000000ffffffffffffffffff +ffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000eaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaea0000ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffff0000000000000000ffffffffffffff +ffffff0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaea00000000000000ffffffffffffffff00ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffff000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea000000ff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffff00000000000000000000ffffffffffffff0000eaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaea000000ffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffff000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea000000ffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 +00000000ffffffffffff00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 +00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00 +000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000eaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000ffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff00000000000000eaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaea00000000000000ffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffff00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaea000000ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000 +0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaea0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffff00eaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffff0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +ea000000000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00eaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00eaeaea00eaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +ea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea000000ffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffff00000000000000000000000000000000000000000000 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffff00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00 +eaea00ea000000eaea0000ea0000eaeaea0000ea00eaea000000eaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000 +00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000000000000000ffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffff00eaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00000000eaea00eaeaea00ea00ea +ea00eaeaea0000ea00eaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaea0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffff0000000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000000000ffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaea00eaea00eaeaea00ea00eaea00000000eaeaea00eaea00eaea00ea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea000000ffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000eaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaea000000ffffffffffffffffffffffffffffffffffffffff000000 +00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00eaeaea +eaeaea00ea00eaea00eaeaeaeaeaea00eaea00eaea00eaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +000000ffffffffffffffffffffffffffffffffffff0000ffffff00ffffffffffffffffff +ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00eaeaeaea00eaea00eaeaea00eaea00ea +eaea00eaea00eaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaea0000ffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 +0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea000000ffffffffffffff +ffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffff0000000000000000000000000000000000000000ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffff00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaea000000000000eaeaea00eaeaeaea0000eaeaea000000ea0000ea0000eaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000ff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffff0000eaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000ffffffffffffffffffffffffff0000ff00ff +ffff000000ff0000ffffff000000ffff000000ff0000ff00000000ffff00000000ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000eaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea000000000000ffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff00eaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000ffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffff0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaea0000ffffffffffffffffffffff00000000ffffffff0000ff00ffffff0000ff +0000ffff0000000000ffff0000ffff0000ffff00ffffffffffffffffffffffffffffffff +ffffffffffffffffff0000000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaea0000000000ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffff00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaea000000ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff00eaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffff +ffffffffff0000ff00ffffffff0000ff00ffffff0000000000ffff0000ff0000ffff0000 +ffff000000ffffffffffffffffffffffffffffffffffffffffffffffff000000eaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaea000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000ffffffffffffffff0000ffffffffffff +0000ff00ffffff0000ffffffffff0000ff0000ffff0000ffffffff000000ffffffffffff +ffffffffffffffffffffffffffff0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff00eaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffff00ea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaea00ffffffffffffff0000ffffff00ffffff0000ffffffff0000ffff00ff +ff0000ff0000ffff0000ffff00ffff0000ffffffffffffffffffffffffffffffffffff00 +00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000ffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffff00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffff00000000ffffffffffffffff000000000000eaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaea0000eaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffff +ff00000000000000ffffff0000ffffffffff000000ffff000000ff000000ff000000ff00 +000000ffffffffffffffffffffffffffffffffff0000eaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaea0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00eaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 +0000ffffffffff00eaea00eaeaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaea00eaeaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00eaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffff +ffffffffffff00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea000000ea00ea0000eaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff0000000000000000ffff00eaeaea00eaea +ea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00eaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaea00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff00000000ffffffffffffffffff00eaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffff00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaea00eaeaea0000eaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaea00ffff000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000eaeaea00eaeaea00ea0000ea00ea000000eaea +0000ea0000ea000000ea00000000eaeaeaeaea0000ea0000ea0000ea0000ea0000ea0000 +eaea00ea0000eaeaea0000eaea0000ea00eaeaeaeaeaeaeaeaeaeaeaea00ffffffff0000 +000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff0000000000ffffffffffffff00eaeaeaea000000ea00eaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaea00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00eaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00eaeaeaeaea00eaea00 +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00eaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000 +00ffff00eaeaea00000000eaeaea0000ea00eaeaea00eaea00ea00eaeaea00eaeaea00ea +ea0000eaeaeaea00eaea00eaea0000eaea00ea0000eaea00ea00eaea00eaea00eaea00ea +ea0000eaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffff00000000 +00000000000000000000000000000000ffffffffffffffffff00000000000000ffffffff +00eaeaeaea00eaeaea0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaea00eaeaeaeaeaeaeaea00ea00eaeaea0000eaea0000ea00 +eaea0000ea00eaeaea0000eaeaeaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff000000000000ffffffff00eaeaea00eaeaeaeaea +ea00eaea00eaeaea00eaeaea00eaeaeaea00eaea00eaeaeaeaea00eaeaea00eaea00eaea +00eaeaea00ea00eaeaea00ea00eaea00eaea00000000eaea00eaeaeaeaeaeaeaeaeaeaea +eaeaea00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff000000000000000000000000000000000000ff00eaeaeaea00eaeaeaeaea00eaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +00eaeaeaeaeaeaeaea0000ea00ea00eaea00eaea0000ea00eaea0000ea00ea00eaea00ea +eaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaea00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff0000000000ffffffffff00eaeaea00eaeaeaeaeaea00eaea00eaeaea00eaeaea00 +eaeaeaeaea00ea00eaeaeaeaea00eaeaea00eaea00eaea00eaeaea00ea00eaeaea00ea00 +eaea00eaea00eaeaeaeaea00eaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 +00000000000000000000eaeaeaea00eaeaeaeaeaeaeaea000000eaea0000ea00eaeaea00 +00000000ea0000ea0000ea00eaea00eaeaeaea0000eaea0000ea00eaeaeaeaeaeaeaeaea +eaeaeaeaeaea00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffff00eaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00eaeaeaeaeaeaeaea00eaea00 +eaea000000eaea00eaea00eaea00eaea00ea00000000eaeaea00eaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffff +00eaeaea00eaeaeaeaeaea00eaea00eaeaea00eaea00ea00eaeaeaea00ea00ea00eaeaea +00eaeaea00eaea00eaea0000eaea00ea0000eaea00ea00eaea00eaea00eaea00eaea00ea +eaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffff0000000000000000ffffff00eaeaea +ea00eaeaeaeaeaeaea00eaeaea00eaea0000ea00ea00eaea00ea00eaea00eaea0000ea00 +00ea00eaea00eaea00eaea0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffff00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaea00eaeaeaeaea00eaea00eaea00ea00eaea00eaea00eaea00eaea +00eaea00ea00eaeaeaeaeaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffff00ffffffffffffffffffff00ea000000eaeaeaea000000 +eaea000000eaea0000ea0000eaeaeaea00eaea00000000eaeaeaeaea00000000ea00ea00 +00eaea00ea0000ea000000000000eaea0000eaea000000eaeaeaeaeaeaeaeaeaeaeaea00 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffff000000000000ffffffffff00eaeaeaea00eaeaeaeaeaeaea00eaeaea +00eaea00eaea00ea0000eaeaea00eaea00eaea00eaea00eaea00eaea00000000eaea00ea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ea +eaea00eaeaea00eaea00ea00eaea00eaea00eaea00eaea00eaea00ea00eaea00eaeaea00 +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaea00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00eaeaeaeaea00eaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff +ffffffffffff00eaeaeaea00eaeaeaeaea00ea00eaeaea00eaea00eaea00eaeaea0000ea +00eaea00eaea00eaea00eaea00eaea00eaeaeaeaea00eaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaea00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff00eaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea000000eaeaea000000ea0000ea00 +000000000000ea0000000000ea0000ea0000eaeaea000000eaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00eaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaea00eaeaeaeaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffff00eaeaeaea00 +eaeaea00eaea00eaeaea00eaea00eaea00ea00eaea00ea00eaea00eaea00eaea00eaea00 +eaea00eaea00eaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff0000eaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaea0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea000000eaeaea00 +0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000ffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff00eaeaeaea000000eaeaeaea000000eaea00 +0000ea0000000000eaeaea00000000000000ea0000ea0000eaea0000eaea000000eaeaea +eaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea000000 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffff00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff0000eaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00eaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffff0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaea00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffff0000eaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000ffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaea0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 +0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000ffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffff000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaea000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffff0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffff00000000000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000000000 +0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000eaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaea0000ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffff000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea000000ffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000eaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaea0000ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff00000000eaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00000000ffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffff0000000000000000ffff000000000000000000eaeaeaeaeaeaeaea +eaeaeaeaeaeaea00000000000000000000000000000000eaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00eaea0000 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000eaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaea000000ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffff000000eaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea000000ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffff000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea000000ffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 +00000000ffffffffffffffffffffff000000000000000000000000000000ffffffffffff +ffffffffffffffffffff00000000000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea000000ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffff0000000000eaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000000000ffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffff0000000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaea0000000000ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000eaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaea000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffff0000000000000000eaeaeaeaeaeaeaeaeaeaeaeaea0000000000000000000000 +000000000000ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff0000000000000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaea0000000000000000ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff000000000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea000000000000ff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffff00000000000000ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 +000000000000000000000000ffffffffffffffffffffffffffffffffffffffff00ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffff00000000000000000000000000000000000000000000ffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 +00000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000ffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff00ff00000000ffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffff00eaeaeaeaeaeaea00000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +ea0000eaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff00ffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff00eaeaeaeaeaeaea00 +eaeaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00eaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff000000ffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffff00eaeaeaeaeaeaeaea00eaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffff00ffffffffffff00ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +00eaeaeaeaeaeaeaeaea00eaeaeaeaea0000ea0000ea0000ea0000ea0000ea0000eaea00 +ea0000eaeaea0000eaea0000ea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffff +ffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff00eaeaeaeaeaeaeaeaeaea0000 +eaeaeaea00eaea00eaea0000eaea00ea0000eaea00ea00eaea00eaea00eaea00eaea0000 +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffff0000ffffffff00ff +ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffff00eaeaeaeaeaeaeaeaeaeaeaea00eaeaea00eaea00eaea00eaea +ea00ea00eaeaea00ea00eaea00eaea00000000eaea00eaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaea00ffffffffffffff0000ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00eaea +eaeaeaeaeaeaeaeaeaea00eaeaea00eaea00eaea00eaeaea00ea00eaeaea00ea00eaea00 +eaea00eaeaeaeaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffff +ffff0000ffff00ffffff00000000ff000000ffffffffff000000ff0000ffff0000000000 +ffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffff00eaeaeaeaeaeaeaea00eaeaea00eaea +ea00eaea00eaea0000eaea00ea0000eaea00ea00eaea00eaea00eaea00eaea00eaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffff0000000000ffffffff0000 +ffffff00ff000000ffffff000000ff0000ffff0000ffffff0000ffff00ffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffff00eaeaeaeaeaeaea00000000eaeaeaeaea00000000ea00ea0000eaea +00ea0000ea000000000000eaea0000eaea000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaea00ffffffffffffffff0000ffff00ffffffffff0000ff00ff0000ff0000ffff0000 +ffff0000ffff0000ffffff000000ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00eaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00eaeaeaeaea00eaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffff00 +00ffffffffffffffff0000ff00ff0000000000ffff0000ffff0000ffff0000ffffffff00 +0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffff00eaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaea00eaeaeaeaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffff0000ffffffffffffffff000000ff +ff0000ffffffffff0000ffff0000ffff0000ffffffffff000000ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffff0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea000000eaeaea000000ea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000ffff +ffffffffffffffffff0000ffffffff00ffffffff0000ffff0000ffff00ffff0000ffff00 +00ffff0000ff00ff00ffff0000ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000ff0000ffffffffffffffffff0000000000 +000000ffffffff0000ffffff000000ffff00000000ff000000ffff0000ffff00000000ff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffff000000eaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +ea000000ffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea000000ffffffffffffffffffff0000 +00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff00000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaea00000000ffffffffffffffffffffffffffffffff0000ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000 +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00000000000000ffffffffffffffffff +ffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000 +00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff000000000000000000000000000000000000000000 +00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 +0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000000000000000ffffffff +ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff0000000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000000000ffffffffffffffffffffffff +ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ff +ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff000000ea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaea000000ffffffffffffffffffffffffffffffff00ffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffff0000000000000000000000000000000000000000ffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffff000000ffffff +ffffffffffffffffffffffffffffffff000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +ea000000ffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff00000000000000eaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaea00000000000000ffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffff000000ffffff00000000ffffffffffffffffffffffffffffff +000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea000000ffffffffffff +ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffff00000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaea00000000ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff0000000000000000ffffffffffffffffffffffff0000eaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000ffffffff00ffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000eaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff +ffffffffffff0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaea0000ff00ffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffff000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea000000ffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffff00000000000000ffffffffffffffff00eaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000eaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 +0000000000000000ffffffffff0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ea0000ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffff00ffffffff +ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffff0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaea0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffff00000000000000000000ffffff00 +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffff000000000000000000000000ffff00eaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +0000ff00ffffff000000ff0000ffffff000000ffff000000ff0000ff00000000ffff0000 +0000ffffffffffffffffffffffffffffffffffffffffffffff00eaeaeaea000000ea00ea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffff00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff0000ff00ff +ffff0000ff0000ffff0000000000ffff0000ffff0000ffff00ffffffffffffffffffffff +ffffffffffffffffffffff00eaeaeaea00eaeaea0000eaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaea00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea000000ea00eaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaea00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffff0000ff00ffffffff0000ff00ffffff0000000000ffff0000ff00 +00ffff0000ffff000000ffffffffffffffffffffffffffffffffffffffffffffff00eaea +eaea00eaeaeaeaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffff0000eaeaea00eaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaea00eaeaea0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff +ffffffffff0000ff00ffffff0000ffffffffff0000ff0000ffff0000ffffffff000000ff +ffffffffffffffffffffffffffffffffffffffff00eaeaeaea00eaeaeaeaeaeaeaea0000 +00eaea0000ea00eaeaea0000000000ea0000ea0000ea00eaea00eaeaeaea0000eaea0000 +ea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffff0000eaeaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00eaea +eaeaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffff0000ffffff00ffffff0000ffffffff00 +00ffff00ffff0000ff0000ffff0000ffff00ffff0000ffffffffffffffffffffffffffff +ffffffffffffff00eaeaeaea00eaeaeaeaeaeaea00eaeaea00eaea0000ea00ea00eaea00 +ea00eaea00eaea0000ea0000ea00eaea00eaea00eaea0000eaeaeaeaeaeaeaeaeaeaeaea +eaeaeaea00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000eaeaea000000ea +00ea000000eaea0000ea0000ea000000ea00000000eaeaeaeaeaeaeaea000000eaea0000 +ea00eaeaea0000000000ea0000ea0000ea00eaea00eaeaeaea0000eaea0000ea00eaeaea +eaeaeaea00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 +00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffff00000000000000ffffff0000ffffffffff000000ffff000000ff000000ff +000000ff00000000ffffffffffffffffffffffffffffffffffffffffffff00eaeaeaea00 +eaeaeaeaeaeaea00eaeaea00eaea00eaea00ea0000eaeaea00eaea00eaea00eaea00eaea +00eaea00000000eaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffff0000000000eaea0000ea00eaeaea00eaea00ea00eaea +ea00eaeaea00ea00eaeaeaeaeaeaea00eaeaea00eaea0000ea00ea00eaea00ea00eaea00 +eaea0000ea0000ea00eaea00eaea00eaea0000eaeaeaeaeaeaeaea00ffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff0000ffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffff00eaeaeaea00eaeaeaeaea00ea00eaeaea00ea +ea00eaea00eaeaea0000ea00eaea00eaea00eaea00eaea00eaea00eaeaeaeaea00eaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff0000eaeaeaeaea00eaea00eaeaea00eaeaea00eaeaeaea00eaea00eaea00eaeaeaeaea +eaea00eaeaea00eaea00eaea00ea0000eaeaea00eaea00eaea00eaea00eaea00eaea0000 +0000eaea00eaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff00ffffff0000ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffff00eaeaeaeaea00eaeaea00eaea00eaeaea00eaea00eaea00ea00eaea00ea00ea +ea00eaea00eaea00eaea00eaea00eaea00eaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +ea00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffff00eaeaeaeaea00eaea00ea +eaea00eaeaea00eaeaeaeaea00ea00eaea00eaeaeaeaea00ea00eaeaea00eaea00eaea00 +eaeaea0000ea00eaea00eaea00eaea00eaea00eaea00eaeaeaeaea00eaeaeaeaeaeaeaea +00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff0000000000000000ffffffff00eaeaeaeaea0000 +00eaeaeaea000000eaea000000ea0000000000eaeaea00000000000000ea0000ea0000ea +ea0000eaea000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff0000eaeaeaea00eaea00eaeaea00eaea00ea00eaeaeaea00 +ea00eaeaea00eaeaea00eaea00eaeaea00eaea00eaea00ea00eaea00ea00eaea00eaea00 +eaea00eaea00eaea00eaea00eaea00eaeaeaeaeaeaea00ffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffff +ffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000 +0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff0000000000000000000000ffff00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 +00eaeaea000000eaea000000eaea0000ea0000eaeaeaea00eaeaeaeaea000000eaeaeaea +000000eaea000000ea0000000000eaeaea00000000000000ea0000ea0000eaea0000eaea +000000eaeaeaeaeaea00ffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffff00000000000000ffffffffffffffffffffffffffffffffff0000 +000000000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000000000000000 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 +ffffffff00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff0000eaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000ffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 +0000000000ffffffffffffffffffffff0000000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000000000ffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffff0000000000000000ffffffffffff0000eaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffff00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00eaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff +000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaea000000ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 +0000000000000000ffffffffffffffffff0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +ea0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff0000eaeaeaeaeaeaeaeaeaeaeaeaeaea0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +ea0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffff0000000000000000000000ffffffff000000eaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaea000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff00000000ffff0000000000ffffffffffffff +ffffffffffff000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea000000ffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffff0000eaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000ffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +000000ff000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea000000ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +0000000000ffffffffffff00000000ffffffffffffffffffffffffffffffffff000000ea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaea000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaea000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffff0000eaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000ffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff00 +00ffffffffffffffffffffffffffffffffffffffffff00000000eaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00000000ffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffff000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea000000ffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffff0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaea0000ffffffffffffffffffffffffffffffffffffffffffffffff +ff0000000000ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff +ffffffffffffffffffffffffff00000000000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaea00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000eaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaea000000ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00eaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00 +ffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffff0000000000000000000000000000000000000000ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffff0000000000eaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000000000ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffff0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000ffffffffffffffffffffff +ffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffff0000000000000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaea0000000000000000ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffff0000000000ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffff00000000000000000000000000000000000000000000ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000eaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00000000eaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaea0000eaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00 +ffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff00eaea00eaeaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaea00eaeaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00eaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00000000ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ea +eaea00eaeaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00eaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffff00eaeaea00eaeaea00ea0000ea00ea +000000eaea0000ea0000ea000000ea00000000eaeaeaeaea0000ea0000ea0000ea0000ea +0000ea0000eaea00ea0000eaeaea0000eaea0000ea00eaeaeaeaeaeaeaeaeaeaeaea00ff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffff00eaeaea00000000eaeaea0000ea00eaeaea00eaea00ea00eaeaea00 +eaeaea00eaea0000eaeaeaea00eaea00eaea0000eaea00ea0000eaea00ea00eaea00eaea +00eaea00eaea0000eaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00eaeaea00 +eaeaeaeaeaea00eaea00eaeaea00eaeaea00eaeaeaea00eaea00eaeaeaeaea00eaeaea00 +eaea00eaea00eaeaea00ea00eaeaea00ea00eaea00eaea00000000eaea00eaeaeaeaeaea +eaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff00eaeaea00eaeaeaeaeaea00eaea00eaeaea +00eaeaea00eaeaeaeaea00ea00eaeaeaeaea00eaeaea00eaea00eaea00eaeaea00ea00ea +eaea00ea00eaea00eaea00eaeaeaeaea00eaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffff00eaeaea00eaeaeaeaeaea00eaea00eaeaea00eaea00ea00eaeaeaea00ea00 +ea00eaeaea00eaeaea00eaea00eaea0000eaea00ea0000eaea00ea00eaea00eaea00eaea +00eaea00eaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ea000000eaea +eaea000000eaea000000eaea0000ea0000eaeaeaea00eaea00000000eaeaeaeaea000000 +00ea00ea0000eaea00ea0000ea000000000000eaea0000eaea000000eaeaeaeaeaeaeaea +eaeaeaea00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffff00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00eaeaeaeaea00eaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffff00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00eaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaea00eaeaeaeaea00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000eaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000 +00eaeaea000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffff00eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffff0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaea0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000eaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea0000ffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff000000eaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaea000000ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffff000000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea000000ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 +0000eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaea000000ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffff0000000000eaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea00000000 +00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffff0000000000000000eaeaeaeaeaeaeaeaeaeaea +eaeaeaeaeaeaeaeaeaeaea0000000000000000ffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff00000000000000000000000000000000000000000000ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffff +%%EndData +end +%%PageTrailer +%%Trailer +%%BoundingBox: 0 37 377 162 +%%EOF diff --git a/lib/cosEvent/doc/src/e_s_models.gif b/lib/cosEvent/doc/src/e_s_models.gif Binary files differnew file mode 100644 index 0000000000..329b0858d1 --- /dev/null +++ b/lib/cosEvent/doc/src/e_s_models.gif diff --git a/lib/cosEvent/doc/src/e_s_models.ps b/lib/cosEvent/doc/src/e_s_models.ps new file mode 100644 index 0000000000..3e2a8dd9a2 --- /dev/null +++ b/lib/cosEvent/doc/src/e_s_models.ps @@ -0,0 +1,1007 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: /clearcase/otp/libraries/orber/doc/src/e_s_models.ps +%%Creator: XV Version 3.10a Rev: 12/29/94 - by John Bradley +%%BoundingBox: 6 176 605 495 +%%Pages: 1 +%%DocumentFonts: +%%EndComments +%%EndProlog + +%%Page: 1 1 + +% remember original state +/origstate save def + +% build a temporary dictionary +20 dict begin + +% define string to hold a scanline's worth of data +/pix 75 string def + +% define space for color conversions +/grays 599 string def % space for gray scale line +/npixls 0 def +/rgbindx 0 def + +% lower left corner +6 176 translate + +% size of image (on paper, in 1/72inch coords) +598.96800 319.03200 scale + +% dimensions of data +599 319 1 + +% mapping matrix +[599 0 0 -319 0 319] + +{currentfile pix readhexstring pop} +image +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +c00000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +00003e +dfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffbe +dfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffbe +dfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffbe +dfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffbe +dfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffbe +dfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffbe +dfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffbe +dfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffbe +dfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffbe +dfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffbe +dffffffffffffffffffffffffe000000000000000000001fffffffffffffffffffffffff +ff9ffffffffffffffffffffffffe000000000000000000001fffffffffffffffffffffff +ffffbe +dffffffffffffffffffffffffeffffffffffffffffffffdfffffffffffffffffffffffff +ff9ffffffffffffffffffffffffeffffffffffffffffffffdfffffffffffffffffffffff +ffffbe +dffffffffffffffffffffffffeffffffffffffffffffffdfffffffffffffffffffffffff +ff9ffffffffffffffffffffffffeffffffffffffffffffffdfffffffffffffffffffffff +ffffbe +dffffffffffffffffffffffffeffffffffffffffffffffdfffffffffffffffffffffffff +ff9ffffffffffffffffffffffffeffffffffffffffffffffdfffffffffffffffffffffff +ffffbe +dffffffffffffffffffffffffeffffffffffffffffffffdfffffffffffffffffffffffff +ff9ffffffffffffffffffffffffeffffffffffffffffffffdfffffffffffffffffffffff +ffffbe +dffffff000003ffffffffffffefffffffffc1ffe7ef7ffdfffffffffffffffffffffffff +ff9ffffff000003ffffffffffffeffffffffff07f33bdfffdfffffffffffffffffffffff +ffffbe +dffff80fffffc07ffffffffffeffff3ffffeefff7dfbffdffffffffffffffc00000fffff +ff9ffff80fffffc07ffffffffffefffe7fffffbbfbb7efffdffffffffffffffc00000fff +ffffbe +dfff87ffffffff87fffffffffeffff0ffffeefff7dfbffdffffffffffffe03fffff01fff +ff9fff87ffffffff87fffffffffefff87fffffbbfbb7efffdffffffffffffe03fffff01f +ffffbe +dff87ffffffffff87ffffffffeffff03fe06e2635bfdffdfffffffffffe1ffffffffe1ff +ff9ff87ffffffffff87ffffffffeffe07fff81b89baff7ffdfffffffffffe1ffffffffe1 +ffffbe +dfc7ffffffffffff8ffffffffeffff00fffe1b5b2bfdffdffffffffffe1ffffffffffe1f +ff9fc7ffffffffffff8ffffffffeff807fffff86dbaff7ffdffffffffffe1ffffffffffe +1fffbe +df3ffffffffffffff3fffffffefe00003e06fb4f6bfdffdffffffffff1ffffffffffffe3 +ff9f3ffffffffffffff3fffffffefe00401f81bedbaff7ffdffffffffff1ffffffffffff +e3ffbe +defffffffffffffffdfffffffeffff00fffefb736bfdffdfffffffffcffffffffffffffc +ff9efffffffffffffffdfffffffeff807fffffbedbaff7ffdfffffffffcfffffffffffff +fcffbe +d9fffffffffffffffe7ffffffeffff03fffefb5b6bfdffdfffffffffbfffffffffffffff +7f99fffffffffffffffe7ffffffeffe07fffffbedbaff7ffdfffffffffbfffffffffffff +ff7fbe +d7ffffffffffffffffbffffffeffff0ffffc7c0625fbbfdffffffffe7fffffffffffffff +9f97ffffffffffffffffbffffffefff87fffff1f0117eeffdffffffffe7fffffffffffff +ff9fbe +cfff8bfffff77fffffdffffffeffff3ffffffffffdfbffdffffffffdffffffffffffffff +ef8fff8bfffff77fffffdffffffefffe7ffffffffff7efffdffffffffdffffffffffffff +ffefbe +cfff73ffffe7ffffffdffffffefffffffffffffffef7ffdffffffffbff17ffffffffffff +f78fff73ffffe7ffffffdffffffefffffffffffffffbdfffdffffffffbff17ffffffffff +fff7be +dfff7bfffff7ffffffeffbfffeffffffffffffffffffffdffffffffbfee7ffffffffffff +f79fff7bfffff7ffffffeffffffeffffffffffffffffffffdffffffffbfee7ffffffffff +fff7be +dfff9e669a7773afffeffcfffeffffffffffffffffffffdffffffff7fdf7ffffffffffff +fb9fff9e669a7773afffeffc007effffffffffffffffffffdffcfffff7fdf7ffffffffff +fffbbe +dfffe77461b66d1fffefff3e7e000000000000000000001ffc007ff7fdff8e9c19a5f3af +fb9fffe77461b66d1fffeffc00fe000000000000000000001ffcff3ff7fdff8e9c19a5f3 +affbbe +dffffb76ebb761bfffefffdc7ffffffffffffffffffffffffe00fff7fdff746b5d12ed1f +fb9ffffb76ebb761bfffeffe01fffffffffffffffffffffffff878fff7fdff746b5d12ed +1ffbbe +cfff7b76ebb76fbfffdfffe03ffffffffffffffffffffffffe01fff7fdff76e9ddb6e1bf +fb8fff7b76ebb76fbfffdffe01fffffffffffffffffffffffff067fff7fdff76e9ddb6e1 +bffbbe +cfff3b6269b76dbfffd7fff83ffffffffc07ffffffffffffff01ffebfdf776ee5db6efbf +f78fff3b6269b76dbfffd7ff03fffffffffc07fffffffffffff01fffebfdf776ee5db6ef +bff7be +d7ff47969a62331fffb9fff01ffffffff3f807fffffffffffe03ff9bfeef76eb58b6edbf +f797ff47969a62331fffb9ff04fffffffff3f807ffffffffffe03fff9bfeef76eb58b6ed +bff7be +d9fffffefbfffffffe7effe01fffffff8ffff81ffffffffff907fe7dff1f8c40e512731f +ef99fffffefbfffffffe7eff8f7fffffff8ffff81fffffffffc01ffe7dff1f8c40e51273 +1fefbe +defffffefbfffffffdff3fc00ffffffc7fffffe0ffffffffe78ff9fe7fffffffffffffff +9f9efffffefbfffffffdff3f8fbffffffc7fffffe0ffffffff801ff9fe7fffffffffffff +ff9fbe +df3ffffc71fffffff3ffdf800ffffff3ffffffff03ffffff9f8fe7ffbfffffffffffffff +7f9f3ffffc71fffffff3ffdfdfcffffff3ffffffff03ffffff800fe7ffbfffffffffffff +ff7fbe +dfc7ffffffffffff8fffefff87ffff0ffffffffffc0fffff7fdf9fffcffffffffffffffc +ff9fc7ffffffffffff8fffeffff7ffff0ffffffffffc0fffffffff9fffcfffffffffffff +fcffbe +dff87ffffffffff87ffff3fffffffcfffffffffffff0fffffffe7ffff1ffffffffffffe3 +ff9ff87ffffffffff87ffff3fffbfffcfffffffffffff0fffffffe7ffff1ffffffffffff +e3ffbe +dfff87ffffffff87fffffdfffffff3ffffffffffffff3ffffff9fffffe1ffffffffffe1f +ff9fff87ffffffff87fffffdfffffff3ffffffffffffff3ffffff9fffffe1ffffffffffe +1fffbe +dffff80fffffc07ffffffe7fffffcfffffffffffffffc7ffffe7ffffffe1ffffffffe1ff +ff9ffff80fffffc07ffffffe7fffffcfffffffffffffffc7ffffe7ffffffe1ffffffffe1 +ffffbe +dffffff000003fffffffffbfffff3ffffffffffffffffbffff9ffffffffe03fffff01fff +ff9ffffff000003fffffffffbfffff3ffffffffffffffffbffff9ffffffffe03fffff01f +ffffbe +dfffffffffffffffffffffcffffefffffffffffffffffbfffe7ffffffffffc00000fffff +ff9fffffffffffffffffffffcffffefffffffffffffffffbfffe7ffffffffffc00000fff +ffffbe +dffffffffffffffffffffff7fffdfffffffffffffffffcfff9ffffffffffffffffffffff +ff9ffffffffffffffffffffff7fffdfffffffffffffffffcfff9ffffffffffffffffffff +ffffbe +dffffffffffffffffffffffbfffbffffffffffffffffff7fe7ffffffffffffffffffffff +ff9ffffffffffffffffffffffbfffbffffffffffffffffff7fe7ffffffffffffffffffff +ffffbe +dffffffffffffffffffffffcffe7ffffffffffffffffff7f9fffffffffffffffffffffff +ff9ffffffffffffffffffffffcffe7ffffffffffffffffff7f9fffffffffffffffffffff +ffffbe +dfffffffffffffffffffffff7f9fffffffffffffffffffbe7fffffffffffffffffffffff +ff9fffffffffffffffffffffff7f9fffffffffffffffffffbe7fffffffffffffffffffff +ffffbe +dfffffffffffffffffffffff9e7fffffffffffffffffffb9ffffffffffffffffffffffff +ff9fffffffffffffffffffffff9e7fffffffffffffffffffb9ffffffffffffffffffffff +ffffbe +dffffffffffffffffffffffffdffffffffffffffffffffb7ffffffffffffffffffffffff +ff9ffffffffffffffffffffffffdffffffffffffffffffffb7ffffffffffffffffffffff +ffffbe +dffffffffffffffffffffffffb81fffffff8bbfffffffbdfffffffffffffffffffffffff +ff9ffffffffffffffffffffffffb81fffffff8bbfffffffbdfffffffffffffffffffffff +ffffbe +dffffffffffffffffffffffff7ddfffffbf733fffffff3efffffffffffffffffffffffff +ff9ffffffffffffffffffffffff7ddfffffbf733fffffff3efffffffffffffffffffffff +ffffbe +dfffffffffffffffffffffffcfdffffffbefbbfffffffbefffffffffffffffffffffffff +ff9fffffffffffffffffffffffcfdffffffbefbbfffffffbefffffffffffffffffffffff +ffffbe +dfffffffffffffffffffffff3fdb88ce91effa79d3a73bf7ffffefffffffffffffffffff +ff9fffffffffffffffffffffff3fdb88ce91effa79d3a73bf7fff807ffffffffffffffff +ffffbe +dffffffffffffffffffffffcffc3ddb46beff9b68d1adbf7ff9fc7ffffffffffffffffff +ff9ffffffffffffffffffffffcffc3ddb46beff9b68d1adbf7ff800fffffffffffffffff +ffffbe +dfffffffffffffffffffffe3ffdbeb86ebeffbb8ddba1bf7ffe3c3ffffffffffffffffff +ff9fffffffffffffffffffffe3ffdbeb86ebeffbb8ddba1bf7ffc00fffffffffffffffff +ffffbe +dfffffffffffffffffffff1fffdfebbeebefbbb6ddbafbeffffc40ffffffffffffffffff +ff9fffffffffffffffffffff1fffdfebbeebefbbb6ddbafbefffe00fffffffffffffffff +ffffbe +dffffffffffffffffffff8ffffdef7b6eaf77bb6ddbadbe1ffff807ffffffc00000fffff +ff9ffffffffffffffffffff8ffffdef7b6eaf77bb6ddbadbe1fff007fffffffc00000fff +ffffbe +dffffffffffffffffffff7ffff81f7cc41f8f118081131de1fff803ffffe03fffff01fff +ff9ffffffffffffffffffff7ffff81f7cc41f8f118081131de1ffc18fffffe03fffff01f +ffffbe +dffffffffffffffffffff7ffffffffffffffffffffffffdfe1ff801fffe1ffffffffe1ff +ff9ffffffffffffffffffff7ffffffffffffffffffffffffdfe1fe1f3fffe1ffffffffe1 +ffffbe +dffffffffffffffffffff7ffffffffffffffffffffffffbffe1f800ffe1ffffffffffe1f +ff9ffffffffffffffffffff7ffffffffffffffffffffffffbffe1f1fcffe1ffffffffffe +1fffbe +dffffffffffffffffffff7ffffffffffffffffffffffffbfffe10ffff1ffffffffffffe3 +ff9ffffffffffffffffffff7ffffffffffffffffffffffffbfffe1bffff1ffffffffffff +e3ffbe +dffffffffffffffffffff7ffffffffffffffffffffffff7ffffe1fffcffffffffffffffc +ff9ffffffffffffffffffff7ffffffffffffffffffffffff7ffffe1fffcfffffffffffff +fcffbe +dffffffffffffffffffff7ffffffffffffffffffffffff7fffffe1ffbfffffffffffffff +7f9ffffffffffffffffffff7ffffffffffffffffffffffff7fffffe1ffbfffffffffffff +ff7fbe +dfffffffffffffffffffeffffffffffffffffffffffffefffffffe1e7fffffffffffffff +9f9fffffffffffffffffffeffffffffffffffffffffffffefffffffe1e7fffffffffffff +ff9fbe +dfffffffffffffffffffeffffffffffffffffffffffffeffffffffedffffffffffffffff +ef9fffffffffffffffffffeffffffffffffffffffffffffeffffffffedffffffffffffff +ffefbe +dfffffffffffffffffffefffffffffc71fff717ffbfffdfffffffffbff17ffffffffffff +f79fffffffffffffffffffefffffffff03fffffffffdfffdfffffffffbff17ffffffffff +fff7be +dffffffffffffffffffff7ffffffffb7bff7edfffdfff3fffffffffbfee7ffffffffffff +f79ffffffffffffffffffff7fffffffeddfffffffffefff3fffffffffbfee7ffffffffff +fff7be +dffffffffffffffffffffbffffffff73bff7effffeffeffffffffff7fdf7ffffffffffff +fb9ffffffffffffffffffffbfffffffdddffffffffff7feffffffffff7fdf7ffffffffff +fffbbe +dffffffffffffffffffffbfffffffef5bc634373af7f9ffffffffff7fdff8e9c19a5f3af +fb9ffffffffffffffffffffbfffffffbddd63c4cae75bf9ffffffffff7fdff8e9c19a5f3 +affbbe +dffffffffffffffffffffdfffffffef6bbb66e6d1f7c7ffffffffff7fdff746b5d12ed1f +fb9ffffffffffffffffffffdfffffffbc38ddb6e1da3bc7ffffffffff7fdff746b5d12ed +1ffbbe +dffffffffffffffffffffefffffffef6bbb76f61bf03fffffffffff7fdff76e9ddb6e1bf +fb9ffffffffffffffffffffefffffffbdfdddbeebc3703fffffffffff7fdff76e9ddb6e1 +bffbbe +dffffffffffffffffffffefffffffef73bb76f6f807ffffffffffffbfdf776ee5db6efbf +f79ffffffffffffffffffffefffffffbdfdddbeebdc0bffffffffffffbfdf776ee5db6ef +bff7be +dfffffffffffffffffffff3ffffffef7bbb56f6d3f7bfffffffffffbfeef76eb58b6edbf +f79fffffffffffffffffffff3ffffffbdfdddb6c3d37bbfffffffffffbfeef76eb58b6ed +bff7be +dfffffffffffffffffffffc0000002e3bc7206321f7cfffffffffffdff1f8c40e512731f +ef9fffffffffffffffffffffc00000038f8e3cf21e63bcfffffffffffdff1f8c40e51273 +1fefbe +dfffffffffffffffffffffffbffffc7ffffffffdfeff7ffffffffffe7fffffffffffffff +9f9fffffffffffffffffffffffbffffc7ffffffffdff7f7ffffffffffe7fffffffffffff +ff9fbe +dfffffffffffffffffffffff7fffff9ffffffffdfdffbfffffffffffbfffffffffffffff +7f9fffffffffffffffffffffff7ffffe9ffffffffdfeffbfffffffffffbfffffffffffff +ff7fbe +dffffffffffffffffffffffeffffffcffffffffbfbffcfffffffffffcffffffffffffffc +ff9ffffffffffffffffffffefeffffff6ffffffffbfdffcfffffffffffcfffffffffffff +fcffbe +dffffffffffffffffffe01fdffffffeffffffff7fffff7fffffffffff1ffffffffffffe3 +ff9ffffffffffffffffffff9fdffffffeffffffff7fffff7fffffffffff1ffffffffffff +e3ffbe +dffffffffffffffffff003fbfffffff7ffffffeffffff9ffbffffffffe1ffffffffffe1f +ff9ffffffffffffffffffbf7fbfffffff7ffffffeffffff9fffffffffffe1ffffffffffe +1fffbe +dffffffffffffffffff803f7fffffffbffffffdffffffeffdfffffffffe1ffffffffe1ff +ff9ffffffffffffffffff1eff7fffffffbffffffdffffffeffc1ffffffffe1ffffffffe1 +ffffbe +dffffffffffffffffffc07effffffffc3fffffbfffffff3feffffffffffe03fffff01fff +ff9ffffffffffffffffff19feffffffffc3fffffbfffffff3fe01ffffffffe03fffff01f +ffffbe +dffffffffffffffffffc07dfffffffffc7ffff7fffffffdff3cffffffffffc00000fffff +ff9fffffffffffffffffe0ffdfffffffffc7ffff7fffffffdfe007fffffffffc00000fff +ffffbe +dffffffffffffffffffe0fbffffffffff87ffeffffffffeffdcfffffffffffffffffffff +ff9fffffffffffffffffe07fbffffffffff87ffeffffffffefe00fffffffffffffffffff +ffffbe +dffffffffffffffffffc0f7fffffffffff83e1fffffffff3fe87ffffffffffffffffffff +ff9fffffffffffffffffc03f7fffffffffff83e1fffffffff3f01fffffffffffffffffff +ffffbe +dffffffffffffffffff39efffffffffffffc1ffffffffffdff07ffffffffffffffffffff +ff9fffffffffffffffffc03efffffffffffffc1ffffffffffdf03fffffffffffffffffff +ffffbe +dfffffffffffffffffef9dfffffffffffffffffffffffffe7e03ffffffffffffffffffff +ff9fffffffffffffffff801dfffffffffffffffffffffffffe781fffffffffffffffffff +ffffbe +dfffffffffffffffff9ffbffffffffffffffffffffffffffbe03ffffffffffffffffffff +ff9fffffffffffffffff9ffbffffffffffffffffffffffffffb86fffffffffffffffffff +ffffbe +dfffffffffffffffff7ff7ffffffffffffffffffffffffffcc01ffffffffffffffffffff +ff9ffffffffffffffffffff7ffffffffffffffffffffffffffc8f3ffffffffffffffffff +ffffbe +dffffff000003fffffffeffffffffffffffffffffffffffff001ffffffffffffffffffff +ff9ffffff000003fffffffeffffffffffffffffffffffffffff5fdffffffffffffffffff +ffffbe +dffff80fffffc07fffffdffffffffffffffffffffffffffffbf8ffffffffffffffffffff +ff9ffff80fffffc07fffffdffffffffffffffffffffffffffffbfeffffffffffffffffff +ffffbe +dfff87ffffffff87ffffbffffffffffffffffffffffffffffcffffffffffffffffffffff +ff9fff87ffffffff87ffffbffffffffffffffffffffffffffffcff7fffffffffffffffff +ffffbe +dff87ffffffffff87fff7fffffffffffffffffffffffffffff7fffffffffffffffffffff +ff9ff87ffffffffff87fff7fffffffffffffffffffffffffffff7fffffffffffffffffff +ffffbe +dfc7ffffffffffff8ffeffffffffffffffffffffffffffffff9fffffffffffffffffffff +ff9fc7ffffffffffff8ffeffffffffffffffffffffffffffffff9fffffffffffffffffff +ffffbe +df3ffffffffffffff3fdffffffffffffffffffffffffffffffefffffffffffffffffffff +ff9f3ffffffffffffff3fdffffffffffffffffffffffffffffffefffffffffffffffffff +ffffbe +defffffffffffffffdfbfffffffffffffffffffffffffffffff3ffffffffffffffffffff +ff9efffffffffffffffdfbfffffffffffffffffffffffffffffff3ffffffffffffffffff +ffffbe +d9fffffffffffffffe77fffffffffffffffffffffffffffffffdfffffffffc00000fffff +ff99fffffffffffffffe77fffffffffffffffffffffffffffffffdfffffffffc00000fff +ffffbe +d7ffffffffffffffffbffffffffffffffffffffffffffffffffefffffffe03fffff01fff +ff97ffffffffffffffffbffffffffffffffffffffffffffffffffefffffffe03fffff01f +ffffbe +cfff8bfffff77fffffdfffffffffffffffffffffffffffffffff3fffffe1ffffffffe1ff +ff8fff8bfffff77fffffdfffffffffffffffffffffffffffffffff3fffffe1ffffffffe1 +ffffbe +cfff73ffffe7ffffffdfffffffffffffffffffffffffffffffffdffffe1ffffffffffe1f +ff8fff73ffffe7ffffffdfffffffffffffffffffffffffffffffffdffffe1ffffffffffe +1fffbe +dfff7bfffff7ffffffefffffffffffffffffffffffffffffffffe7fff1ffffffffffffe3 +ff9fff7bfffff7ffffffefffffffffffffffffffffffffffffffffe7fff1ffffffffffff +e3ffbe +dfff9e669a7773afffeffffffffffffffffffffffffffffffffffbffcffffffffffffffc +ff9fff9e669a7773afffeffffffffffffffffffffffffffffffffffbffcfffffffffffff +fcffbe +dfffe77461b66d1fffeffffffffffffffffffffffffffffffffffcffbfffffffffffffff +7f9fffe77461b66d1fffeffffffffffffffffffffffffffffffffffcffbfffffffffffff +ff7fbe +dffffb76ebb761bfffefffffffffffffffffffffffffffffffffff7e7fffffffffffffff +9f9ffffb76ebb761bfffefffffffffffffffffffffffffffffffffff7e7fffffffffffff +ff9fbe +cfff7b76ebb76fbfffdfffffffffffffffffffffffffffffffffffbdffffffffffffffff +ef8fff7b76ebb76fbfffdfffffffffffffffffffffffffffffffffffbdffffffffffffff +ffefbe +cfff3b6269b76dbfffdfffffffffffffffffffffffffffffffffffcbff17ffffffffffff +f78fff3b6269b76dbfffdfffffffffffffffffffffffffffffffffffcbff17ffffffffff +fff7be +d7ff47969a62331fffbffffffffffffffffffffffffffffffffffffbfee7ffffffffffff +f797ff47969a62331fffbffffffffffffffffffffffffffffffffffffbfee7ffffffffff +fff7be +d9fffffefbfffffffe7ffffffffffffffffffffffffffffffffffff7fdf7ffffffffffff +fb99fffffefbfffffffe7ffffffffffffffffffffffffffffffffffff7fdf7ffffffffff +fffbbe +defffffefbfffffffdfffffffffffffffffffffffffffffffffffff7fdff8e9c19a5f3af +fb9efffffefbfffffffdfffffffffffffffffffffffffffffffffffff7fdff8e9c19a5f3 +affbbe +df3ffffc71fffffff3fffffffffffffffffffffffffffffffffffff7fdff746b5d12ed1f +fb9f3ffffc71fffffff3fffffffffffffffffffffffffffffffffffff7fdff746b5d12ed +1ffbbe +dfc7ffffffffffff8ffffffffffffffffffffffffffffffffffffff7fdff76e9ddb6e1bf +fb9fc7ffffffffffff8ffffffffffffffffffffffffffffffffffffff7fdff76e9ddb6e1 +bffbbe +dff87ffffffffff87ffffffffffffffffffffffffffffffffffffffbfdf776ee5db6efbf +f79ff87ffffffffff87ffffffffffffffffffffffffffffffffffffffbfdf776ee5db6ef +bff7be +dfff87ffffffff87fffffffffffffffffffffffffffffffffffffffbfeef76eb58b6edbf +f79fff87ffffffff87fffffffffffffffffffffffffffffffffffffffbfeef76eb58b6ed +bff7be +dffff80fffffc07ffffffffffffffffffffffffffffffffffffffffdff1f8c40e512731f +ef9ffff80fffffc07ffffffffffffffffffffffffffffffffffffffffdff1f8c40e51273 +1fefbe +dffffff000003ffffffffffffffffffffffffffffffffffffffffffe7fffffffffffffff +9f9ffffff000003ffffffffffffffffffffffffffffffffffffffffffe7fffffffffffff +ff9fbe +dfffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffffffffffff +7f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffffffffff +ff7fbe +dfffffffffffffffffffffffffffffffffffffffffffffffffffffffcffffffffffffffc +ff9fffffffffffffffffffffffffffffffffffffffffffffffffffffffcfffffffffffff +fcffbe +dffffffffffffffffffffffffffffffffffffffffffffffffffffffff1ffffffffffffe3 +ff9ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1ffffffffffff +e3ffbe +dffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1ffffffffffe1f +ff9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1ffffffffffe +1fffbe +dfffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1ffffffffe1ff +ff9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1ffffffffe1 +ffffbe +dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03fffff01fff +ff9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03fffff01f +ffffbe +dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00000fffff +ff9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00000fff +ffffbe +dfffffffffffffffffffdff007fff17fffffffff3e1fff3fcf9fe7f3ffffffffffffffff +ff9fffffffffffffffffff07fc01fffc5fffffffffcf87fc9f3e7f9fcfffffffffffffff +ffffbe +dfffffffffffffffffff9ff6d7ffee7fffffdfffbf6fffbfef3ff7fbffffffffffffffff +ff9fffffffffffffffffffbbfdb5fffb9ffffff7ffefdbfedfbcffdfefffffffffffffff +ffffbe +dfffffffffffffffffff5ffeefffdeffffffffff7eefff7fce7feff7ffffffffffffffff +ff9fffffffffffffffffff7bffbbfff7bfffffffffdfbbfdbf39ffbfdfffffffffffffff +ffffbe +dfffffffffffffffffff5dfde9cfbfc49cc939e37ee3794fd6678e77ffffffffffffffff +ff9fffffffffffffffffff777f7a73eff127324e78dfba6dbf599e39dfffffffffffffff +ffffbe +dffffffffffffffffffedffde5afbfb65b65b5db7e1b772fd55b6d77ffffffffffffffff +ff9fffffffffffffffffff0fff796befed96d96d76df876dbf556db5dfffffffffffffff +ffffbe +dffffffffffffffffffc1ffded6fbf76d76dafbb7efb7b6fd53aeb77ffffffffffffffff +ff9fffffffffffffffffff77ff7b5befddb5db6beedfbf6dbf54ebaddfffffffffffffff +ffffbe +dffffffffffffffffffddffded1fbf6ed76dafb6fef6fd6fd33ac8efffffffffffffffff +ff9ffffffffffffffffffef7ff7b47efdbb5db6bedbfbedb7f4ceb23bfffffffffffffff +ffffbe +dffffffffffffffffffbdffbdb6fde4db6db6da6fdf6ecdfb6b69b6fffffffffffffffff +ff9ffffffffffffffffffef7fef6dbf7936db6db69bf7edb7edada6dbfffffffffffffff +ffffbe +dffffffffffffffffff18bf1d91fe12599d9339278f062cf144e48e7ffffffffffffffff +ff9ffffffffffffffffffc0efc7647f84966764ce49e3e093c5139239fffffffffffffff +ffffbe +dfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffbe +dfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffbe +dfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffbe +dfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffbe +dfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffbe +c00000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +00003e +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +c00000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +00003e +dffffffffffffffffffffffffeffffffffff83f99deffdffffffffffffffffffffffffff +ff9ffffffffffffffffffffffffeffffffffff83f99deffdffffffffffffffffffffffff +ffffbe +dffffffffffffffffffffffffeffff1fffffddfddbf7fdffffffffffffffffffffffffff +ff9ffffffffffffffffffffffffeffff1fffffddfddbf7fdffffffffffffffffffffffff +ffffbe +dffffffffffffffffffffffffefffc1fffffddfddbf7fdffffffffffffffffffffffffff +ff9ffffffffffffffffffffffffefffc1fffffddfddbf7fdffffffffffffffffffffffff +ffffbe +dffffffffffffffffffffffffefff01fffc0dc4dd7fbfdffffffffffffffffffffffffff +ff9ffffffffffffffffffffffffefff01fffc0dc4dd7fbfdffffffffffffffffffffffff +ffffbe +dffffffffffffffffffffffffeffc01fffffc36dd7fbfdffffffffffffffffffffffffff +ff9ffffffffffffffffffffffffeffc01fffffc36dd7fbfdffffffffffffffffffffffff +ffffbe +dffffffffffffffffffffffffeff00000fc0df6dd7fbfdffffffffffffffffffffffffff +ff9ffffffffffffffffffffffffeff00000fc0df6dd7fbfdffffffffffffffffffffffff +ffffbe +dffffffffffffffffffffffffeffe01fffffdf6dd7fbfdffffffffffffffffffffffffff +ff9ffffffffffffffffffffffffeffe01fffffdf6dd7fbfdffffffffffffffffffffffff +ffffbe +dffffffffffffffffffffffffefff81fffffdf6dd7fbfdffffffffffffffffffffffffff +ff9ffffffffffffffffffffffffefff81fffffdf6dd7fbfdffffffffffffffffffffffff +ffffbe +dffffffffffffffffffffffffefffe1fffff8f808bf77dffffffffffffffffffffffffff +ff9ffffffffffffffffffffffffefffe1fffff8f808bf77dffffffffffffffffffffffff +ffffbe +dffffffffffffffffffffffffeffff9ffffffffffbf7fdffffffffffffffffffffffffff +ff9ffffffffffffffffffffffffeffff9ffffffffffbf7fdffffffffffffffffffffffff +ffffbe +dffffffffffffffffffffffffefffffffffffffffdeffdffffffffffffffffffffffffff +ff9ffffffffffffffffffffffffefffffffffffffffdeffdffffffffffffffffffffffff +ffffbe +dffffffffffffffffffffffffefffffffffffffffffffdffffffffffffffffffffffffff +ff9ffffffffffffffffffffffffefffffffffffffffffffdffffffffffffffffffffffff +ffffbe +dffffffffffffffffffffffffefffffffffc1ffe7ef7fdffffffffffffffffffffffffff +ff9ffffffffffffffffffffffffefffffffffc1ffe7ef7fdffffffffffffffffffffffff +ffffbe +dffffffffffffffffffffffffefffffffffeefff7dfbfdffffffffffffffffffffffffff +ff9ffffffffffffffffffffffffefffffffffeefff7dfbfdffffffffffffffffffffffff +ffffbe +dffffffffffffffffffffffffeffff1ffffeefff7dfbfdffffffffffffffffffffffffff +ff9ffffffffffffffffffffffffeffff1ffffeefff7dfbfdffffffffffffffffffffffff +ffffbe +dffffff000003ffffffffffffeffff07fe06e2635bfdfdffffffffffffffffffffffffff +ff9ffffff000003ffffffffffffeffff07fe06e2635bfdfdffffffffffffffffffffffff +ffffbe +dffff80fffffc07ffffffffffeffff01fffe1b5b2bfdfdfffffffffffffffc00000fffff +ff9ffff80fffffc07ffffffffffeffff01fffe1b5b2bfdfdfffffffffffffffc00000fff +ffffbe +dfff87ffffffff87fffffffffeffff007e06fb4f6bfdfdfffffffffffffe03fffff01fff +ff9fff87ffffffff87fffffffffeffff007e06fb4f6bfdfdfffffffffffffe03fffff01f +ffffbe +dff87ffffffffff87ffffffffefe00001ffefb736bfdfdffffffffffffe1ffffffffe1ff +ff9ff87ffffffffff87ffffffffefe00001ffefb736bfdfdffffffffffffe1ffffffffe1 +ffffbe +dfc7ffffffffffff8ffffffffeffff00fffefb5b6bfdfdfffffffffffe1ffffffffffe1f +ff9fc7ffffffffffff8ffffffffeffff00fffefb5b6bfdfdfffffffffffe1ffffffffffe +1fffbe +df3ffffffffffffff3fffffffeffff03fffc7c0625fbbdfffffffffff1ffffffffffffe3 +ff9f3ffffffffffffff3fffffffeffff03fffc7c0625fbbdfffffffffff1ffffffffffff +e3ffbe +defffffffffffffffdfffffffeffff0ffffffffffdfbfdffffffffffcffffffffffffffc +ff9efffffffffffffffdfffffffeffff0ffffffffffdfbfdffffffffffcfffffffffffff +fcffbe +d9fffffffffffffffe7ffffffeffff3ffffffffffef7fdffffffffffbfffffffffffffff +7f99fffffffffffffffe7ffffffeffff3ffffffffffef7fdffffffffffbfffffffffffff +ff7fbe +d7ffffffffffffffffbffffffefffffffffffffffffffdfffffffffe7fffffffffffffff +9f97ffffffffffffffffbffffffefffffffffffffffffffdfffffffffe7fffffffffffff +ff9fbe +cfff8bfffff77fffffdffffffefffffffffffffffffffdfffffffffdffffffffffffffff +ef8fff8bfffff77fffffdffffffefffffffffffffffffffdfffffffffdffffffffffffff +ffefbe +cfff73ffffe7ffffffdffbfffefffffffffffffffffffdfffffffffbff17ffffffffffff +f78fff73ffffe7ffffffdffffffefffffffffffffffffffdfffffffffbff17ffffffffff +fff7be +dfff7bfffff7ffffffeffcfffefffffffffffffffffffdfffffffffbfee7ffffffffffff +f79fff7bfffff7ffffffeff807fefffffffffffffffffffdfffffffffbfee7ffffffffff +fff7be +dfff9e669a7773afffefff7ffefffffffffffffffffffdfffcff3ff7fdf7ffffffffffff +fb9fff9e669a7773afffeffc007efffffffffffffffffffdfffc007ff7fdf7ffffffffff +fffbbe +dfffe77461b66d1fffefffbe7e00000000000000000001fffcfcfff7fdff8e9c19a5f3af +fb9fffe77461b66d1fffeffc00fe00000000000000000001fffc00fff7fdff8e9c19a5f3 +affbbe +dffffb76ebb761bfffefffcc7ffffffffffffffffffffffff873fff7fdff746b5d12ed1f +fb9ffffb76ebb761bfffeffe01fffffffffffffffffffffffffe00fff7fdff746b5d12ed +1ffbbe +cfff7b76ebb76fbfffdffff03ffffffffffffffffffffffff04ffff7fdff76e9ddb6e1bf +fb8fff7b76ebb76fbfffdffe01fffffffffffffffffffffffffe01fff7fdff76e9ddb6e1 +bffbbe +cfff3b6269b76dbfffd7fff83ffffffffc07fffffffffffff03fffebfdf776ee5db6efbf +f78fff3b6269b76dbfffd7ff03fffffffffc07ffffffffffffff03ffebfdf776ee5db6ef +bff7be +d7ff47969a62331fffb9fff01ffffffff3f807ffffffffffe03fff9bfeef76eb58b6edbf +f797ff47969a62331fffb9ff04fffffffff3f807fffffffffffe03ff9bfeef76eb58b6ed +bff7be +d9fffffefbfffffffe7effe01fffffff8ffff81fffffffffc01ffe7dff1f8c40e512731f +ef99fffffefbfffffffe7eff8f7fffffff8ffff81ffffffffff907fe7dff1f8c40e51273 +1fefbe +defffffefbfffffffdff3fc00ffffffc7fffffe0ffffffff801ff9fe7fffffffffffffff +9f9efffffefbfffffffdff3f8fbffffffc7fffffe0ffffffffe78ff9fe7fffffffffffff +ff9fbe +df3ffffc71fffffff3ffdf800ffffff3ffffffff03ffffff800fe7ffbfffffffffffffff +7f9f3ffffc71fffffff3ffdfdfcffffff3ffffffff03ffffff9f9fe7ffbfffffffffffff +ff7fbe +dfc7ffffffffffff8fffefff87ffff0ffffffffffc0fffffffff9fffcffffffffffffffc +ff9fc7ffffffffffff8fffeffff7ffff0ffffffffffc0fffff7fdf9fffcfffffffffffff +fcffbe +dff87ffffffffff87ffff3fffffff8fffffffffffff0fffffffe7ffff1ffffffffffffe3 +ff9ff87ffffffffff87ffff3fffbfff8fffffffffffff0fffffffe7ffff1ffffffffffff +e3ffbe +dfff87ffffffff87fffffdffffffe7ffffffffffffff3ffffff9fffffe1ffffffffffe1f +ff9fff87ffffffff87fffffdffffffe7ffffffffffffff3ffffff9fffffe1ffffffffffe +1fffbe +dffff80fffffc07ffffffe7fffff9fffffffffffffffc7ffffe7ffffffe1ffffffffe1ff +ff9ffff80fffffc07ffffffe7fffff9fffffffffffffffc7ffffe7ffffffe1ffffffffe1 +ffffbe +dffffff000003fffffffffbffffe7ffffffffffffffffbffff9ffffffffe03fffff01fff +ff9ffffff000003fffffffffbffffe7ffffffffffffffffbffff9ffffffffe03fffff01f +ffffbe +dfffffffffffffffffffffcffffdfffffffffffffffffbfffe7ffffffffffc00000fffff +ff9fffffffffffffffffffffcffffdfffffffffffffffffbfffe7ffffffffffc00000fff +ffffbe +dffffffffffffffffffffff7fffbfffffffffffffffffcfff9ffffffffffffffffffffff +ff9ffffffffffffffffffffff7fffbfffffffffffffffffcfff9ffffffffffffffffffff +ffffbe +dffffffffffffffffffffffbfffbffffffffffffffffff7fe7ffffffffffffffffffffff +ff9ffffffffffffffffffffffbfffbffffffffffffffffff7fe7ffffffffffffffffffff +ffffbe +dffffffffffffffffffffffcffe7ffffffffffffffffffbf9fffffffffffffffffffffff +ff9ffffffffffffffffffffffcffe7ffffffffffffffffffbf9fffffffffffffffffffff +ffffbe +dfffffffffffffffffffffff7f9fffffffffffffffffffbe7fffffffffffffffffffffff +ff9fffffffffffffffffffffff7f9fffffffffffffffffffbe7fffffffffffffffffffff +ffffbe +dfffffffffffffffffffffff9e7fffffffffffffffffffb9ffffffffffffffffffffffff +ff9fffffffffffffffffffffff9e7fffffffffffffffffffb9ffffffffffffffffffffff +ffffbe +dffffffffffffffffffffffffd81fffffff8bbfffffffbd7ffffffffffffffffffffffff +ff9ffffffffffffffffffffffffd81fffffff8bbfffffffbd7ffffffffffffffffffffff +ffffbe +dffffffffffffffffffffffffbddfffffbf733fffffff3dfffffffffffffffffffffffff +ff9ffffffffffffffffffffffffbddfffffbf733fffffff3dfffffffffffffffffffffff +ffffbe +dffffffffffffffffffffffff7dffffffbefbbfffffffbefffffffffffffffffffffffff +ff9ffffffffffffffffffffffff7dffffffbefbbfffffffbefffffffffffffffffffffff +ffffbe +dfffffffffffffffffffffffcfdb88ce91effa79d3a73befffffffffffffffffffffffff +ff9fffffffffffffffffffffffcfdb88ce91effa79d3a73befffffffffffffffffffffff +ffffbe +dffffffffffffffffffffffc3fc3ddb46beff9b68d1adbf7fff807ffffffffffffffffff +ff9ffffffffffffffffffffffc3fc3ddb46beff9b68d1adbf7ffffefffffffffffffffff +ffffbe +dfffffffffffffffffffffe3ffdbeb86ebeffbb8ddba1bf7ff800fffffffffffffffffff +ff9fffffffffffffffffffffe3ffdbeb86ebeffbb8ddba1bf7ff9fc7ffffffffffffffff +ffffbe +dfffffffffffffffffffff1fffdfebbeebefbbb6ddbafbf7ffc00fffffffffffffffffff +ff9fffffffffffffffffffff1fffdfebbeebefbbb6ddbafbf7ffe3c3ffffffffffffffff +ffffbe +dffffffffffffffffffffcffffdef7b6eaf77bb6ddbadbefffe00fffffffffffffffffff +ff9ffffffffffffffffffffcffffdef7b6eaf77bb6ddbadbeffffc41ffffffffffffffff +ffffbe +dffffffffffffffffffffbffff81f7cc41f8f118081131e1fff007fffffffc00000fffff +ff9ffffffffffffffffffffbffff81f7cc41f8f118081131e1ffff80fffffffc00000fff +ffffbe +dffffffffffffffffffff7ffffffffffffffffffffffffde1ffc18fffffe03fffff01fff +ff9ffffffffffffffffffff7ffffffffffffffffffffffffde1fff807ffffe03fffff01f +ffffbe +dffffffffffffffffffff7ffffffffffffffffffffffffdfe1fe1f3fffe1ffffffffe1ff +ff9ffffffffffffffffffff7ffffffffffffffffffffffffdfe1ff803fffe1ffffffffe1 +ffffbe +dffffffffffffffffffff7ffffffffffffffffffffffffbffe1f1fcffe1ffffffffffe1f +ff9ffffffffffffffffffff7ffffffffffffffffffffffffbffe1f801ffe1ffffffffffe +1fffbe +dffffffffffffffffffff7ffffffffffffffffffffffffbfffe1bffff1ffffffffffffe3 +ff9ffffffffffffffffffff7ffffffffffffffffffffffffbfffe11ffff1ffffffffffff +e3ffbe +dffffffffffffffffffff7ffffffffffffffffffffffff7ffffe1fffcffffffffffffffc +ff9ffffffffffffffffffff7ffffffffffffffffffffffff7ffffe1fffcfffffffffffff +fcffbe +dffffffffffffffffffff7ffffffffffffffffffffffff7fffffe1ffbfffffffffffffff +7f9ffffffffffffffffffff7ffffffffffffffffffffffff7fffffe1ffbfffffffffffff +ff7fbe +dfffffffffffffffffffeffffffffffffffffffffffffefffffffe1e7fffffffffffffff +9f9fffffffffffffffffffeffffffffffffffffffffffffefffffffe1e7fffffffffffff +ff9fbe +dfffffffffffffffffffeffffffffffb0fffffff7ffffeffffffffedffffffffffffffff +ef9fffffffffffffffffffeffffffffffefbffffff7ffffeffffffffedffffffffffffff +ffefbe +dffffffffffffffffffff7fffffffff6f7ffffffbffffdfffffffffbff17ffffffffffff +f79ffffffffffffffffffff7fffffffffdfbfffffebffffdfffffffffbff17ffffffffff +fff7be +dffffffffffffffffffff7ffffffffedfbffffffdffff3fffffffffbfee7ffffffffffff +f79ffffffffffffffffffff7fffffffffbf5fffffedffff3fffffffffbfee7ffffffffff +fff7be +dffffffffffffffffffffbffffffffddfb339999efffcffffffffff7fdf7ffffffffffff +fb9ffffffffffffffffffffbfffffffff7f5f0674c6fffcffffffffff7fdf7ffffffffff +fffbbe +dffffffffffffffffffffbffffffffddfbbb6dd6efff3ffffffffff7fdff8e9c19a5f3af +fb9ffffffffffffffffffffbfffffffff7eeeeda36efff3ffffffffff7fdff8e9c19a5f3 +affbbe +dffffffffffffffffffffdffffffffddfbbb0dd0effcfffffffffff7fdff746b5d12ed1f +fb9ffffffffffffffffffffdfffffffff7e0eec376effcfffffffffff7fdff746b5d12ed +1ffbbe +dffffffffffffffffffffeffffffffddfbbb7dd7ef03fffffffffff7fdff76e9ddb6e1bf +fb9ffffffffffffffffffffefffffffff7df71df76ef03fffffffffff7fdff76e9ddb6e1 +bffbbe +dffffffffffffffffffffeffffffffdef7b16d86c0fffffffffffffbfdf776ee5db6efbf +f79ffffffffffffffffffffefffffffff7df6fdb7680fffffffffffffbfdf776ee5db6ef +bff7be +dfffffffffffffffffffff3fffffffdf0fcb9e592ffbfffffffffffbfeef76eb58b6edbf +f79fffffffffffffffffffff3ffffffff78e20e6222ffbfffffffffffbfeef76eb58b6ed +bff7be +dfffffffffffffffffffffc0000000efdffffffe5ffcfffffffffffdff1f8c40e512731f +ef9fffffffffffffffffffffc0000000fbffef7ffe5ffcfffffffffffdff1f8c40e51273 +1fefbe +dfffffffffffffffffffffffbfffff37e3fffffdbfff7ffffffffffe7fffffffffffffff +9f9fffffffffffffffffffffffbfffff3dffef7ffdbfff7ffffffffffe7fffffffffffff +ff9fbe +dfffffffffffffffffffffff7fffffdbfffffffd7fffbfffffffffffbfffffffffffffff +7f9fffffffffffffffffffffff7fffffdefff0fffd7fffbfffffffffffbfffffffffffff +ff7fbe +dffffffffffffffffffffffeffffffeffffffffbffffcfffffffffffcffffffffffffffc +ff9ffffffffffffffffffffefeffffffeffffffffbffffcfffffffffffcfffffffffffff +fcffbe +dffffffffffffffffffe01fdffffffeffffffff7fffff7fffffffffff1ffffffffffffe3 +ff9ffffffffffffffffffff9fdffffffeffffffff7fffff7fffffffffff1ffffffffffff +e3ffbe +dffffffffffffffffff003fbfffffff7ffffffeffffff9fffffffffffe1ffffffffffe1f +ff9ffffffffffffffffffbf7fbfffffff7ffffffeffffff9ffdffffffffe1ffffffffffe +1fffbe +dffffffffffffffffff803f7fffffff8ffffffdffffffeffc1ffffffffe1ffffffffe1ff +ff9ffffffffffffffffff1eff7fffffff8ffffffdffffffeffefffffffffe1ffffffffe1 +ffffbe +dffffffffffffffffffc07efffffffff3fffff3fffffff3fe01ffffffffe03fffff01fff +ff9ffffffffffffffffff19fefffffffff3fffff3fffffff3ff7fffffffffe03fffff01f +ffffbe +dffffffffffffffffffc07dfffffffffc7fffeffffffffdfe007fffffffffc00000fffff +ff9fffffffffffffffffe0ffdfffffffffc7fffeffffffffdffbeffffffffffc00000fff +ffffbe +dffffffffffffffffffc0fbffffffffff87ffeffffffffeff00fffffffffffffffffffff +ff9fffffffffffffffffe07fbffffffffff87ffeffffffffeffdc7ffffffffffffffffff +ffffbe +dffffffffffffffffffb0f7fffffffffff83e1fffffffff3f01fffffffffffffffffffff +ff9fffffffffffffffffc03f7fffffffffff83e1fffffffff3fe87ffffffffffffffffff +ffffbe +dfffffffffffffffffe79efffffffffffffc1ffffffffffdf03fffffffffffffffffffff +ff9fffffffffffffffffc03efffffffffffffc1ffffffffffdff03ffffffffffffffffff +ffffbe +dfffffffffffffffffdf9dfffffffffffffffffffffffffe785fffffffffffffffffffff +ff9fffffffffffffffff801dfffffffffffffffffffffffffe7e03ffffffffffffffffff +ffffbe +dfffffffffffffffffbffbffffffffffffffffffffffffffb8efffffffffffffffffffff +ff9fffffffffffffffff9ffbffffffffffffffffffffffffffbc03ffffffffffffffffff +ffffbe +dfffffffffffffffff7ff7ffffffffffffffffffffffffffcdf3ffffffffffffffffffff +ff9ffffffffffffffffffff7ffffffffffffffffffffffffffc801ffffffffffffffffff +ffffbe +dffffff000003fffffffeffffffffffffffffffffffffffff7fdffffffffffffffffffff +ff9ffffff000003fffffffeffffffffffffffffffffffffffff7c1ffffffffffffffffff +ffffbe +dffff80fffffc07fffffdffffffffffffffffffffffffffffbfeffffffffffffffffffff +ff9ffff80fffffc07fffffdffffffffffffffffffffffffffffbfcffffffffffffffffff +ffffbe +dfff87ffffffff87ffffbffffffffffffffffffffffffffffcff7fffffffffffffffffff +ff9fff87ffffffff87ffffbffffffffffffffffffffffffffffcffffffffffffffffffff +ffffbe +dff87ffffffffff87fff7fffffffffffffffffffffffffffff7fffffffffffffffffffff +ff9ff87ffffffffff87fff7fffffffffffffffffffffffffffff7fffffffffffffffffff +ffffbe +dfc7ffffffffffff8ffeffffffffffffffffffffffffffffff9fffffffffffffffffffff +ff9fc7ffffffffffff8ffeffffffffffffffffffffffffffffff9fffffffffffffffffff +ffffbe +df3ffffffffffffff3fdffffffffffffffffffffffffffffffefffffffffffffffffffff +ff9f3ffffffffffffff3fdffffffffffffffffffffffffffffffefffffffffffffffffff +ffffbe +defffffffffffffffdfbfffffffffffffffffffffffffffffff3ffffffffffffffffffff +ff9efffffffffffffffdfbfffffffffffffffffffffffffffffff3ffffffffffffffffff +ffffbe +d9fffffffffffffffe77fffffffffffffffffffffffffffffffdfffffffffc00000fffff +ff99fffffffffffffffe77fffffffffffffffffffffffffffffffdfffffffffc00000fff +ffffbe +d7ffffffffffffffffbffffffffffffffffffffffffffffffffefffffffe03fffff01fff +ff97ffffffffffffffffbffffffffffffffffffffffffffffffffefffffffe03fffff01f +ffffbe +cfff8bfffff77fffffdfffffffffffffffffffffffffffffffff3fffffe1ffffffffe1ff +ff8fff8bfffff77fffffdfffffffffffffffffffffffffffffffff3fffffe1ffffffffe1 +ffffbe +cfff73ffffe7ffffffdfffffffffffffffffffffffffffffffffdffffe1ffffffffffe1f +ff8fff73ffffe7ffffffdfffffffffffffffffffffffffffffffffdffffe1ffffffffffe +1fffbe +dfff7bfffff7ffffffefffffffffffffffffffffffffffffffffe7fff1ffffffffffffe3 +ff9fff7bfffff7ffffffefffffffffffffffffffffffffffffffffe7fff1ffffffffffff +e3ffbe +dfff9e669a7773afffeffffffffffffffffffffffffffffffffffbffcffffffffffffffc +ff9fff9e669a7773afffeffffffffffffffffffffffffffffffffffbffcfffffffffffff +fcffbe +dfffe77461b66d1fffeffffffffffffffffffffffffffffffffffcffbfffffffffffffff +7f9fffe77461b66d1fffeffffffffffffffffffffffffffffffffffcffbfffffffffffff +ff7fbe +dffffb76ebb761bfffefffffffffffffffffffffffffffffffffff7e7fffffffffffffff +9f9ffffb76ebb761bfffefffffffffffffffffffffffffffffffffff7e7fffffffffffff +ff9fbe +cfff7b76ebb76fbfffdfffffffffffffffffffffffffffffffffffbdff17ffffffffffff +ef8fff7b76ebb76fbfffdfffffffffffffffffffffffffffffffffffbdff17ffffffffff +ffefbe +cfff3b6269b76dbfffdfffffffffffffffffffffffffffffffffffcbfee7ffffffffffff +f78fff3b6269b76dbfffdfffffffffffffffffffffffffffffffffffcbfee7ffffffffff +fff7be +d7ff47969a62331fffbffffffffffffffffffffffffffffffffffffbfdf7ffffffffffff +f797ff47969a62331fffbffffffffffffffffffffffffffffffffffffbfdf7ffffffffff +fff7be +d9fffffefbfffffffe7ffffffffffffffffffffffffffffffffffff7fdff8e9c19a5f3af +fb99fffffefbfffffffe7ffffffffffffffffffffffffffffffffffff7fdff8e9c19a5f3 +affbbe +defffffefbfffffffdfffffffffffffffffffffffffffffffffffff7fdff746b5d12ed1f +fb9efffffefbfffffffdfffffffffffffffffffffffffffffffffffff7fdff746b5d12ed +1ffbbe +df3ffffc71fffffff3fffffffffffffffffffffffffffffffffffff7fdff76e9ddb6e1bf +fb9f3ffffc71fffffff3fffffffffffffffffffffffffffffffffffff7fdff76e9ddb6e1 +bffbbe +dfc7ffffffffffff8ffffffffffffffffffffffffffffffffffffff7fdf776ee5db6efbf +fb9fc7ffffffffffff8ffffffffffffffffffffffffffffffffffffff7fdf776ee5db6ef +bffbbe +dff87ffffffffff87ffffffffffffffffffffffffffffffffffffffbfeef76eb58b6edbf +f79ff87ffffffffff87ffffffffffffffffffffffffffffffffffffffbfeef76eb58b6ed +bff7be +dfff87ffffffff87fffffffffffffffffffffffffffffffffffffffbff1f8c40e512731f +f79fff87ffffffff87fffffffffffffffffffffffffffffffffffffffbff1f8c40e51273 +1ff7be +dffff80fffffc07ffffffffffffffffffffffffffffffffffffffffdffffffffffffffff +ef9ffff80fffffc07ffffffffffffffffffffffffffffffffffffffffdffffffffffffff +ffefbe +dffffff000003ffffffffffffffffffffffffffffffffffffffffffe7fffffffffffffff +9f9ffffff000003ffffffffffffffffffffffffffffffffffffffffffe7fffffffffffff +ff9fbe +dfffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffffffffffff +7f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffffffffff +ff7fbe +dfffffffffffffffffffffffffffffffffffffffffffffffffffffffcffffffffffffffc +ff9fffffffffffffffffffffffffffffffffffffffffffffffffffffffcfffffffffffff +fcffbe +dffffffffffffffffffffffffffffffffffffffffffffffffffffffff1ffffffffffffe3 +ff9ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1ffffffffffff +e3ffbe +dffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1ffffffffffe1f +ff9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1ffffffffffe +1fffbe +dfffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1ffffffffe1ff +ff9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1ffffffffe1 +ffffbe +dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03fffff01fff +ff9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03fffff01f +ffffbe +dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00000fffff +ff9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00000fff +ffffbe +dffffffffffffffffff8bfc03fff18f9fffcf87ffcfd0ff93e7cff3f9fffffffffffffff +ff9fffffffffffffffffe0ffc03fff18f9fffcf87f93d0fff9fe7cff3f9fffffffffffff +ffffbe +dffffffffffffffffff73fdb3fffbdfdff7efdbffefbb7fdbf79ffbfdfffffffffffffff +ff9ffffffffffffffffff77fdb3fffbdfdff7efdbfdbbb7ffdff79ffbfdfffffffffffff +ffffbe +dfffffffffffffffffef7ffb7fff7bfbfffdfbbffdfb77fb7e73ff7fbfffffffffffffff +ff9fffffffffffffffffefbffb7fff7bfbfffdfbbfb7b77ffbfe73ff7fbfffffffffffff +ffffbe +dfffffffffffffffffdff7f74e7f78ba48f1fb8dcd3774db7eb33c73bfffffffffffffff +ff9fffffffffffffffffefb7f74e7f78ba48f1fb8db7771bca7eb33c73bfffffffffffff +ffffbe +dfffffffffffffffffdffff72d7f02b962edf86dbcb70edb7eaadb6bbfffffffffffffff +ff9fffffffffffffffffefbff72d7f02b962edf86db770dbb97eaadb6bbfffffffffffff +ffffbe +dfffffffffffffffffdffff76b7f7abb6eddfbedddb77edb7ea9d75bbfffffffffffffff +ff9fffffffffffffffffefbff76b7f7abb6eddfbedb777dbdb7ea9d75bbfffffffffffff +ffffbe +dfffffffffffffffffdffff768ff7ab76ed9fbdbedaf7db6fe99d6477fffffffffffffff +ff9fffffffffffffffffef7ff768ff7ab76ed9fbdb6ef7b7eb7e99d6477fffffffffffff +ffffbe +dfffffffffffffffffef7feedb7ef676ddd3f7db6b6efdb6fdb5b4db7fffffffffffffff +ff9fffffffffffffffffdeffeedb7ef676ddd3f7db6eefb766fdb5b4db7fffffffffffff +ffffbe +dffffffffffffffffff0efc6c8fc62f9dcc9e3c11b1c7c1278a272473fffffffffffffff +ff9fffffffffffffffff81efc6c8fc62f9dcc9e3c125c7831678a272473fffffffffffff +ffffbe +dffffffffffffffffffffffffffffdffffffffffffffffffffffffffffffffffffffffff +ff9ffffffffffffffffffffffffffffdffffffffffffffffffffffffffffffffffffffff +ffffbe +dffffffffffffffffffffffffffff5ffffffffffffffffffffffffffffffffffffffffff +ff9ffffffffffffffffffffffffffff5ffffffffffffffffffffffffffffffffffffffff +ffffbe +dffffffffffffffffffffffffffff3ffffffffffffffffffffffffffffffffffffffffff +ff9ffffffffffffffffffffffffffff3ffffffffffffffffffffffffffffffffffffffff +ffffbe +dfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffbe +dfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffbe +c00000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +00003e +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffe + + +showpage + +% stop using temporary dictionary +end + +% restore original state +origstate restore + +%%Trailer diff --git a/lib/cosEvent/doc/src/fascicules.xml b/lib/cosEvent/doc/src/fascicules.xml new file mode 100644 index 0000000000..0678195e07 --- /dev/null +++ b/lib/cosEvent/doc/src/fascicules.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="latin1" ?> +<!DOCTYPE fascicules SYSTEM "fascicules.dtd"> + +<fascicules> + <fascicule file="part" href="part_frame.html" entry="no"> + User's Guide + </fascicule> + <fascicule file="ref_man" href="ref_man_frame.html" entry="yes"> + Reference Manual + </fascicule> + <fascicule file="part_notes" href="part_notes_frame.html" entry="no"> + Release Notes + </fascicule> + <fascicule file="" href="../../../../doc/print.html" entry="no"> + Off-Print + </fascicule> +</fascicules> + diff --git a/lib/cosEvent/doc/src/make.dep b/lib/cosEvent/doc/src/make.dep new file mode 100644 index 0000000000..b8a95c2d58 --- /dev/null +++ b/lib/cosEvent/doc/src/make.dep @@ -0,0 +1,34 @@ +# ---------------------------------------------------- +# >>>> Do not edit this file <<<< +# This file was automaticly generated by +# /home/otp/bin/docdepend +# ---------------------------------------------------- + + +# ---------------------------------------------------- +# TeX files that the DVI file depend on +# ---------------------------------------------------- + +book.dvi: CosEventChannelAdmin.tex CosEventChannelAdmin_ConsumerAdmin.tex \ + CosEventChannelAdmin_EventChannel.tex CosEventChannelAdmin_ProxyPullConsumer.tex \ + CosEventChannelAdmin_ProxyPullSupplier.tex \ + CosEventChannelAdmin_ProxyPushConsumer.tex \ + CosEventChannelAdmin_ProxyPushSupplier.tex \ + CosEventChannelAdmin_SupplierAdmin.tex book.tex \ + ch_contents.tex ch_event_service.tex ch_introduction.tex \ + cosEventApp.tex part.tex ref_man.tex + +# ---------------------------------------------------- +# Source inlined when transforming from source to LaTeX +# ---------------------------------------------------- + +CosEventChannelAdmin.tex: ../../src/CosEventChannelAdmin.idl + +book.tex: ref_man.xml + +# ---------------------------------------------------- +# Pictures that the DVI file depend on +# ---------------------------------------------------- + +book.dvi: e_s_components.ps e_s_models.ps + diff --git a/lib/cosEvent/doc/src/notes.gif b/lib/cosEvent/doc/src/notes.gif Binary files differnew file mode 100644 index 0000000000..e000cca26a --- /dev/null +++ b/lib/cosEvent/doc/src/notes.gif diff --git a/lib/cosEvent/doc/src/notes.xml b/lib/cosEvent/doc/src/notes.xml new file mode 100644 index 0000000000..afd1247b42 --- /dev/null +++ b/lib/cosEvent/doc/src/notes.xml @@ -0,0 +1,172 @@ +<?xml version="1.0" encoding="latin1" ?> +<!DOCTYPE chapter SYSTEM "chapter.dtd"> + +<chapter> + <header> + <copyright> + <year>1999</year><year>2009</year> + <holder>Ericsson AB. All Rights Reserved.</holder> + </copyright> + <legalnotice> + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + </legalnotice> + + <title>cosEvent Release Notes</title> + <prepared>Niclas Eklund</prepared> + <responsible>Niclas Eklund</responsible> + <docno></docno> + <approved></approved> + <checked></checked> + <date>99-02-12</date> + <rev>A</rev> + <file>notes.xml</file> + </header> + + <section> + <title>cosEvent 2.1.7</title> + + <section> + <title>Improvements and New Features</title> + <list type="bulleted"> + <item> + <p> + The documentation is now built with open source tools (xsltproc and fop) + that exists on most platforms. One visible change is that the frames are removed.</p> + <p> + Own Id: OTP-8201 Aux Id:</p> + </item> + </list> + </section> + </section> + + <section> + <title>cosEvent 2.1.6</title> + + <section> + <title>Improvements and New Features</title> + <list type="bulleted"> + <item> + <p>Obsolete guards, e.g. record vs is_record, has been changed + to avoid compiler warnings.</p> + <p>Own id: OTP-7987</p> + </item> + </list> + </section> + </section> + + <section> + <title>cosEvent 2.1.5</title> + + <section> + <title>Improvements and New Features</title> + <list type="bulleted"> + <item> + <p>Updated file headers.</p> + <p>Own id: OTP-7837</p> + </item> + </list> + </section> + </section> + + <section> + <title>cosEvent 2.1.4</title> + + <section> + <title>Improvements and New Features</title> + <list type="bulleted"> + <item> + <p>Documentation source included in open source releases.</p> + <p>Own id: OTP-7595</p> + </item> + </list> + </section> + </section> + + <section> + <title>cosEvent 2.1.3</title> + + <section> + <title>Improvements and New Features</title> + <list type="bulleted"> + <item> + <p>Updated file headers.</p> + <p>Own id: OTP-7011</p> + </item> + </list> + </section> + </section> + + <section> + <title>cosEvent 2.1.2</title> + + <section> + <title>Improvements and New Features</title> + <list type="bulleted"> + <item> + <p>The documentation source has been converted from SGML to XML.</p> + <p>Own id: OTP-6754</p> + </item> + </list> + </section> + </section> + + <section> + <title>cosEvent 2.1.1</title> + + <section> + <title>Improvements and New Features</title> + <list type="bulleted"> + <item> + <p>Minor Makefile changes.</p> + <p>Own id: OTP-6701</p> + </item> + </list> + </section> + </section> + + <section> + <title>cosEvent 2.1</title> + + <section> + <title>Improvements and New Features</title> + <list type="bulleted"> + <item> + <p>The stub/skeleton-files generated by IC have been improved, + i.e., depending on the IDL-files, reduced the size of the + erl- and beam-files and decreased dependencies off Orber's + Interface Repository. It is necessary to re-compile all IDL-files + and use COS-applications, including Orber, compiled with + IC-4.2.</p> + <p>Own id: OTP-4576</p> + </item> + </list> + </section> + </section> + + <section> + <title>cosEvent 2.0</title> + + <section> + <title>Fixed Bugs and Malfunctions</title> + <list type="bulleted"> + <item> + <p>This version is a completely new version of the cosEvent + application; older versions was <em>not</em> compliant with the OMG + specification. The <c><![CDATA[look and feel]]></c> have been changed + to be more uniform with the other COS-services.</p> + </item> + </list> + </section> + </section> +</chapter> + diff --git a/lib/cosEvent/doc/src/part.xml b/lib/cosEvent/doc/src/part.xml new file mode 100644 index 0000000000..a17821cadc --- /dev/null +++ b/lib/cosEvent/doc/src/part.xml @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="latin1" ?> +<!DOCTYPE part SYSTEM "part.dtd"> + +<part xmlns:xi="http://www.w3.org/2001/XInclude"> + <header> + <copyright> + <year>1999</year><year>2009</year> + <holder>Ericsson AB. All Rights Reserved.</holder> + </copyright> + <legalnotice> + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + </legalnotice> + + <title>cosEvent User's Guide</title> + <prepared></prepared> + <docno></docno> + <date>1998-04-26</date> + <rev>1.0</rev> + <file>part.xml</file> + </header> + <description> + <p>The <em>cosEvent</em> application is an Erlang implementation of a + CORBA Service CosEvent.</p> + </description> + <xi:include href="ch_contents.xml"/> + <xi:include href="ch_introduction.xml"/> + <xi:include href="ch_event_service.xml"/> +</part> + diff --git a/lib/cosEvent/doc/src/part_notes.xml b/lib/cosEvent/doc/src/part_notes.xml new file mode 100644 index 0000000000..92324ce227 --- /dev/null +++ b/lib/cosEvent/doc/src/part_notes.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="latin1" ?> +<!DOCTYPE part SYSTEM "part.dtd"> + +<part xmlns:xi="http://www.w3.org/2001/XInclude"> + <header> + <copyright> + <year>1999</year><year>2009</year> + <holder>Ericsson AB. All Rights Reserved.</holder> + </copyright> + <legalnotice> + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + </legalnotice> + + <title>cosEvent Release Notes</title> + <prepared></prepared> + <docno></docno> + <date>1999-04-20</date> + <rev>1.0</rev> + <file>part_notes.xml</file> + </header> + <description> + <p>The cosEvent Application is an Erlang implementation of a CORBA Service + CosEvent.</p> + </description> + <xi:include href="notes.xml"/> +</part> + diff --git a/lib/cosEvent/doc/src/ref_man.gif b/lib/cosEvent/doc/src/ref_man.gif Binary files differnew file mode 100644 index 0000000000..b13c4efd53 --- /dev/null +++ b/lib/cosEvent/doc/src/ref_man.gif diff --git a/lib/cosEvent/doc/src/ref_man.xml b/lib/cosEvent/doc/src/ref_man.xml new file mode 100644 index 0000000000..7088c2ef92 --- /dev/null +++ b/lib/cosEvent/doc/src/ref_man.xml @@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="latin1" ?> +<!DOCTYPE application SYSTEM "application.dtd"> + +<application xmlns:xi="http://www.w3.org/2001/XInclude"> + <header> + <copyright> + <year>1999</year><year>2009</year> + <holder>Ericsson AB. All Rights Reserved.</holder> + </copyright> + <legalnotice> + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + </legalnotice> + + <title>cosEvent Reference Manual</title> + <prepared></prepared> + <docno></docno> + <date>1998-05-05</date> + <rev>2.0</rev> + <file>ref_man.xml</file> + </header> + <description> + <p>The <em>cosEvent</em> application is an Erlang implementation of + a CORBA Service CosEvent.</p> + </description> + <xi:include href="cosEventApp.xml"/> + <xi:include href="CosEventChannelAdmin.xml"/> + <xi:include href="CosEventChannelAdmin_ConsumerAdmin.xml"/> + <xi:include href="CosEventChannelAdmin_SupplierAdmin.xml"/> + <xi:include href="CosEventChannelAdmin_EventChannel.xml"/> + <xi:include href="CosEventChannelAdmin_ProxyPullConsumer.xml"/> + <xi:include href="CosEventChannelAdmin_ProxyPushConsumer.xml"/> + <xi:include href="CosEventChannelAdmin_ProxyPullSupplier.xml"/> + <xi:include href="CosEventChannelAdmin_ProxyPushSupplier.xml"/> +</application> + diff --git a/lib/cosEvent/doc/src/summary.html.src b/lib/cosEvent/doc/src/summary.html.src new file mode 100644 index 0000000000..6196223480 --- /dev/null +++ b/lib/cosEvent/doc/src/summary.html.src @@ -0,0 +1 @@ +Orber OMG Event Service
\ No newline at end of file diff --git a/lib/cosEvent/doc/src/user_guide.gif b/lib/cosEvent/doc/src/user_guide.gif Binary files differnew file mode 100644 index 0000000000..e6275a803d --- /dev/null +++ b/lib/cosEvent/doc/src/user_guide.gif diff --git a/lib/cosEvent/ebin/.gitignore b/lib/cosEvent/ebin/.gitignore new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/lib/cosEvent/ebin/.gitignore diff --git a/lib/cosEvent/example/.gitignore b/lib/cosEvent/example/.gitignore new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/lib/cosEvent/example/.gitignore diff --git a/lib/cosEvent/include/.gitignore b/lib/cosEvent/include/.gitignore new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/lib/cosEvent/include/.gitignore diff --git a/lib/cosEvent/info b/lib/cosEvent/info new file mode 100644 index 0000000000..dc9f7b7404 --- /dev/null +++ b/lib/cosEvent/info @@ -0,0 +1,2 @@ +group: orb +short: Orber OMG Event Service diff --git a/lib/cosEvent/src/CosEventChannelAdmin.cfg b/lib/cosEvent/src/CosEventChannelAdmin.cfg new file mode 100644 index 0000000000..0de579bd6f --- /dev/null +++ b/lib/cosEvent/src/CosEventChannelAdmin.cfg @@ -0,0 +1,6 @@ +{this, "CosEventChannelAdmin::SupplierAdmin"}. +{{handle_info, "CosEventChannelAdmin::SupplierAdmin"}, true}. +{this, "CosEventChannelAdmin::ProxyPushConsumer"}. +{{handle_info, "CosEventChannelAdmin::ProxyPushConsumer"}, true}. +{this, "CosEventChannelAdmin::ProxyPullConsumer"}. +{{handle_info, "CosEventChannelAdmin::ProxyPullConsumer"}, true}. diff --git a/lib/cosEvent/src/CosEventChannelAdmin.idl b/lib/cosEvent/src/CosEventChannelAdmin.idl new file mode 100644 index 0000000000..d5cb92c4e0 --- /dev/null +++ b/lib/cosEvent/src/CosEventChannelAdmin.idl @@ -0,0 +1,66 @@ +#ifndef _COSEVENTCHANELADMIN_IDL +#define _COSEVENTCHANELADMIN_IDL + +#include "CosEventComm.idl" + +#pragma prefix "omg.org" + +module CosEventChannelAdmin +{ + exception AlreadyConnected{}; + exception TypeError{}; + + interface ProxyPushConsumer: CosEventComm::PushConsumer + { + void connect_push_supplier(in CosEventComm:: + PushSupplier push_supplier) + raises (AlreadyConnected); + }; + + interface ProxyPullSupplier: CosEventComm::PullSupplier + { + void connect_pull_consumer(in CosEventComm:: + PullConsumer pull_consumer) + raises (AlreadyConnected); + }; + + interface ProxyPullConsumer: CosEventComm::PullConsumer + { + void connect_pull_supplier(in CosEventComm:: + PullSupplier pull_supplier) + raises (AlreadyConnected, TypeError); + }; + + interface ProxyPushSupplier: CosEventComm::PushSupplier + { + void connect_push_consumer(in CosEventComm:: + PushConsumer push_consumer) + raises (AlreadyConnected, TypeError); + }; + + interface ConsumerAdmin + { + ProxyPushSupplier obtain_push_supplier(); + ProxyPullSupplier obtain_pull_supplier(); + }; + + interface SupplierAdmin + { + ProxyPushConsumer obtain_push_consumer(); + ProxyPullConsumer obtain_pull_consumer(); + }; + + interface EventChannel + { + ConsumerAdmin for_consumers(); + SupplierAdmin for_suppliers(); + void destroy(); + }; + +}; + +#endif + + + + diff --git a/lib/cosEvent/src/CosEventChannelAdmin_ProxyPullConsumer_impl.erl b/lib/cosEvent/src/CosEventChannelAdmin_ProxyPullConsumer_impl.erl new file mode 100644 index 0000000000..26269ad4f7 --- /dev/null +++ b/lib/cosEvent/src/CosEventChannelAdmin_ProxyPullConsumer_impl.erl @@ -0,0 +1,205 @@ +%%-------------------------------------------------------------------- +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2001-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +%% +%%---------------------------------------------------------------------- +%% File : CosEventChannelAdmin_ProxyPullConsumer_impl.erl +%% Description : +%% +%%---------------------------------------------------------------------- +-module('CosEventChannelAdmin_ProxyPullConsumer_impl'). + +%%---------------------------------------------------------------------- +%% Include files +%%---------------------------------------------------------------------- +-include("CosEventChannelAdmin.hrl"). +-include("CosEventComm.hrl"). +-include("cosEventApp.hrl"). + +%%---------------------------------------------------------------------- +%% External exports +%%---------------------------------------------------------------------- +%% Mandatory +-export([init/1, + terminate/2, + code_change/3, + handle_info/2]). + +%% Interface functions +-export([connect_pull_supplier/3]). + +%% Exports from "CosEventComm::PullConsumer" +-export([disconnect_pull_consumer/2]). + + +%%---------------------------------------------------------------------- +%% Internal exports +%%---------------------------------------------------------------------- + +%%---------------------------------------------------------------------- +%% Records +%%---------------------------------------------------------------------- +-record(state, {admin, admin_pid, channel, client, + typecheck, pull_interval, timer_ref}). + +%%---------------------------------------------------------------------- +%% Macros +%%---------------------------------------------------------------------- + +%%====================================================================== +%% External functions +%%====================================================================== +%%---------------------------------------------------------------------- +%% Function : init/1 +%% Returns : {ok, State} | +%% {ok, State, Timeout} | +%% ignore | +%% {stop, Reason} +%% Description: Initiates the server +%%---------------------------------------------------------------------- +init([Admin, AdminPid, Channel, TypeCheck, PullInterval]) -> + process_flag(trap_exit, true), + Secs = timer:seconds(PullInterval), + timer:start(), + {ok, #state{admin = Admin, admin_pid = AdminPid, channel = Channel, + typecheck = TypeCheck, pull_interval = Secs}}. + +%%---------------------------------------------------------------------- +%% Function : terminate/2 +%% Returns : any (ignored by gen_server) +%% Description: Shutdown the server +%%---------------------------------------------------------------------- +terminate(_Reason, #state{client = undefined}) -> + ?DBG("Terminating ~p; no client connected.~n", [_Reason]), + ok; +terminate(_Reason, #state{client = Client} = State) -> + stop_timer(State), + ?DBG("Terminating ~p~n", [_Reason]), + cosEventApp:disconnect('CosEventComm_PullSupplier', + disconnect_pull_supplier, Client), + ok. + +%%---------------------------------------------------------------------- +%% Function : code_change/3 +%% Returns : {ok, NewState} +%% Description: Convert process state when code is changed +%%---------------------------------------------------------------------- +code_change(_OldVsn, State, _Extra) -> + {ok, State}. + +%%---------------------------------------------------------------------% +%% function : handle_info +%% Arguments: +%% Returns : {noreply, State} | +%% {stop, Reason, State} +%% Effect : If the Parent Admin or the Channel terminates so must this object. +%%---------------------------------------------------------------------- +handle_info({'EXIT', Pid, Reason}, #state{admin_pid = Pid} = State) -> + ?DBG("Parent Admin terminated ~p~n", [Reason]), + orber:dbg("[~p] CosEventChannelAdmin_ProxyPullConsumer:handle_info(~p);~n" + "My Admin terminated and so will I.", [?LINE, Reason], ?DEBUG_LEVEL), + {stop, Reason, State}; +handle_info(try_pull_event, State) -> + try_pull_event(State); +handle_info(_Info, State) -> + ?DBG("Unknown Info ~p~n", [_Info]), + {noreply, State}. + +%%---------------------------------------------------------------------- +%% Function : connect_pull_supplier +%% Arguments : +%% Returns : +%% Description: +%%---------------------------------------------------------------------- +connect_pull_supplier(_OE_This, #state{client = undefined, + typecheck = TypeCheck} = State, NewClient) -> + case corba_object:is_nil(NewClient) of + true -> + ?DBG("A NIL client supplied.~n", []), + orber:dbg("[~p] CosEventChannelAdmin_ProxyPullConsumer:connect_pull_supplier(..);~n" + "Supplied a NIL reference which is not allowed.", + [?LINE], ?DEBUG_LEVEL), + corba:raise(#'BAD_PARAM'{completion_status = ?COMPLETED_NO}); + false -> + cosEventApp:type_check(NewClient, 'CosEventComm_PullSupplier', TypeCheck), + NewState = start_timer(State), + {reply, ok, NewState#state{client = NewClient}} + end; +connect_pull_supplier(_, _, _) -> + corba:raise(#'CosEventChannelAdmin_AlreadyConnected'{}). + + +%%---------------------------------------------------------------------- +%% Function : disconnect_pull_consumer +%% Arguments : +%% Returns : +%% Description: +%%---------------------------------------------------------------------- +disconnect_pull_consumer(_OE_This, State) -> + NewState = stop_timer(State), + ?DBG("Disconnect invoked ~p~n", [NewState]), + {stop, normal, ok, NewState#state{client = undefined}}. + +%%====================================================================== +%% Internal functions +%%====================================================================== +%% Start timer which send a message each time we should pull for new events. +start_timer(State) -> + case catch timer:send_interval(State#state.pull_interval, try_pull_event) of + {ok,PullTRef} -> + ?DBG("Started timer: ~p~n", [State#state.pull_interval]), + State#state{timer_ref = PullTRef}; + _ -> + corba:raise(#'INTERNAL'{completion_status=?COMPLETED_NO}) + end. +stop_timer(#state{timer_ref = undefined} = State) -> + ?DBG("No timer to stop~n",[]), + State; +stop_timer(State) -> + ?DBG("Stopped timer~n",[]), + timer:cancel(State#state.timer_ref), + State#state{timer_ref = undefined}. + + +try_pull_event(State) -> + case catch 'CosEventComm_PullSupplier':try_pull(State#state.client) of + {_,false} -> + ?DBG("Client did not supply event~n", []), + {noreply, State}; + {Any, true} -> + 'oe_CosEventComm_Channel':send_sync(State#state.channel, Any), + ?DBG("Received Event ~p and forwarded it successfully.~n", [Any]), + {noreply, State}; + {'EXCEPTION', #'CosEventComm_Disconnected'{}} -> + ?DBG("Client claims we are disconnectedwhen trying to pull event.~n", []), + orber:dbg("[~p] CosEventChannelAdmin_ProxyPullConsumer:try_pull_event();~n" + "Client claims we are disconnected when trying to pull event so I terminate.", + [?LINE], ?DEBUG_LEVEL), + {stop, normal, State#state{client = undefined}}; + What -> + orber:dbg("[~p] CosEventChannelAdmin_ProxyPullConsumer:try_pull_event(~p);~n" + "My Client behaves badly so I terminate.", + [?LINE, What], ?DEBUG_LEVEL), + {stop, normal, State} + end. + + +%%====================================================================== +%% END OF MODULE +%%====================================================================== diff --git a/lib/cosEvent/src/CosEventChannelAdmin_ProxyPushConsumer_impl.erl b/lib/cosEvent/src/CosEventChannelAdmin_ProxyPushConsumer_impl.erl new file mode 100644 index 0000000000..969beb1d04 --- /dev/null +++ b/lib/cosEvent/src/CosEventChannelAdmin_ProxyPushConsumer_impl.erl @@ -0,0 +1,169 @@ +%%-------------------------------------------------------------------- +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2001-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +%% +%%---------------------------------------------------------------------- +%% File : CosEventChannelAdmin_ProxyPushConsumer_impl.erl +%% Description : +%% +%%---------------------------------------------------------------------- +-module('CosEventChannelAdmin_ProxyPushConsumer_impl'). + +%%---------------------------------------------------------------------- +%% Include files +%%---------------------------------------------------------------------- +-include("CosEventChannelAdmin.hrl"). +-include("CosEventComm.hrl"). +-include("cosEventApp.hrl"). + +%%---------------------------------------------------------------------- +%% External exports +%%---------------------------------------------------------------------- +%% Mandatory +-export([init/1, + terminate/2, + code_change/3, + handle_info/2]). + +%% Exports from "CosEventChannelAdmin::ProxyPushConsumer" +-export([connect_push_supplier/3]). + +%% Exports from "CosEventComm::PushConsumer" +-export([push/3, + disconnect_push_consumer/2]). + +%%---------------------------------------------------------------------- +%% Internal exports +%%---------------------------------------------------------------------- + +%%---------------------------------------------------------------------- +%% Records +%%---------------------------------------------------------------------- +-record(state, {admin, admin_pid, channel, client, typecheck}). + +%%---------------------------------------------------------------------- +%% Macros +%%---------------------------------------------------------------------- + +%%====================================================================== +%% External functions +%%====================================================================== +%%---------------------------------------------------------------------- +%% Function : init/1 +%% Returns : {ok, State} | +%% {ok, State, Timeout} | +%% ignore | +%% {stop, Reason} +%% Description: Initiates the server +%%---------------------------------------------------------------------- +init([Admin, AdminPid, Channel, TypeCheck]) -> + process_flag(trap_exit, true), + {ok, #state{admin = Admin, admin_pid = AdminPid, channel = Channel, + typecheck = TypeCheck}}. + +%%---------------------------------------------------------------------- +%% Function : terminate/2 +%% Returns : any (ignored by gen_server) +%% Description: Shutdown the server +%%---------------------------------------------------------------------- +terminate(_Reason, #state{client = undefined}) -> + ?DBG("Terminating ~p; no client connected.~n", [_Reason]), + ok; +terminate(_Reason, #state{client = Client} = _State) -> + ?DBG("Terminating ~p~n", [_Reason]), + cosEventApp:disconnect('CosEventComm_PushSupplier', + disconnect_push_supplier, Client), + ok. + +%%---------------------------------------------------------------------- +%% Function : code_change/3 +%% Returns : {ok, NewState} +%% Description: Convert process state when code is changed +%%---------------------------------------------------------------------- +code_change(_OldVsn, State, _Extra) -> + {ok, State}. + +%%---------------------------------------------------------------------% +%% function : handle_info +%% Arguments: +%% Returns : {noreply, State} | +%% {stop, Reason, State} +%% Effect : If the Parnet Admin or the Channel terminates so must this object. +%%---------------------------------------------------------------------- +handle_info({'EXIT', Pid, Reason}, #state{admin_pid = Pid} = State) -> + ?DBG("Parent Admin terminated ~p~n", [Reason]), + orber:dbg("[~p] CosEventChannelAdmin_ProxyPushConsumer:handle_info(~p);~n" + "My Admin terminated and so will I.", + [?LINE, Reason], ?DEBUG_LEVEL), + {stop, Reason, State}; +handle_info(_Info, State) -> + ?DBG("Unknown Info ~p~n", [_Info]), + {noreply, State}. + +%%---------------------------------------------------------------------- +%% Function : connect_push_supplier +%% Arguments : +%% Returns : +%% Description: +%%---------------------------------------------------------------------- +connect_push_supplier(_OE_This, #state{client = undefined, + typecheck = TypeCheck} = State, NewClient) -> + case corba_object:is_nil(NewClient) of + true -> + ?DBG("A NIL client supplied.~n", []), + {reply, ok, State}; + false -> + cosEventApp:type_check(NewClient, 'CosEventComm_PushSupplier', TypeCheck), + ?DBG("Connected to client.~n", []), + {reply, ok, State#state{client = NewClient}} + end; +connect_push_supplier(_, _, _) -> + corba:raise(#'CosEventChannelAdmin_AlreadyConnected'{}). + + +%%---------------------------------------------------------------------- +%% Function : push +%% Arguments : +%% Returns : +%% Description: +%%---------------------------------------------------------------------- +push(_OE_This, State, Any) -> + %% We should not use corba:reply here since if we block incoming + %% events this will prevent producers to flood the system. + ?DBG("Received Event ~p and forwarded it successfully.~n", [Any]), + 'oe_CosEventComm_Channel':send_sync(State#state.channel, Any), + {reply, ok, State}. + +%%---------------------------------------------------------------------- +%% Function : disconnect_push_consumer +%% Arguments : +%% Returns : +%% Description: +%%---------------------------------------------------------------------- +disconnect_push_consumer(_OE_This, State) -> + ?DBG("Disconnect invoked ~p~n", [State]), + {stop, normal, ok, State#state{client = undefined}}. + +%%====================================================================== +%% Internal functions +%%====================================================================== + +%%====================================================================== +%% END OF MODULE +%%====================================================================== diff --git a/lib/cosEvent/src/CosEventChannelAdmin_SupplierAdmin_impl.erl b/lib/cosEvent/src/CosEventChannelAdmin_SupplierAdmin_impl.erl new file mode 100644 index 0000000000..c7cf0bd869 --- /dev/null +++ b/lib/cosEvent/src/CosEventChannelAdmin_SupplierAdmin_impl.erl @@ -0,0 +1,159 @@ +%%-------------------------------------------------------------------- +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +%% +%%---------------------------------------------------------------------- +%% File : CosEventChannelAdmin_SupplierAdmin_impl.erl +%% Created : 21 Mar 2001 +%% Description : +%% +%%---------------------------------------------------------------------- +-module('CosEventChannelAdmin_SupplierAdmin_impl'). + + +%%---------------------------------------------------------------------- +%% Include files +%%---------------------------------------------------------------------- +-include("cosEventApp.hrl"). + + +%%---------------------------------------------------------------------- +%% External exports +%%---------------------------------------------------------------------- +%% Mandatory +-export([init/1, + terminate/2, + code_change/3, + handle_info/2]). + +%% Exports from "CosEventChannelAdmin::SupplierAdmin" +-export([obtain_push_consumer/2, + obtain_pull_consumer/2]). + +%%---------------------------------------------------------------------- +%% Internal exports +%%---------------------------------------------------------------------- + +%%---------------------------------------------------------------------- +%% Records +%%---------------------------------------------------------------------- +-record(state, {channel, channel_pid, typecheck, pull_interval, server_options}). + +%%---------------------------------------------------------------------- +%% Macros +%%---------------------------------------------------------------------- + +%%====================================================================== +%% External functions +%%====================================================================== +%%---------------------------------------------------------------------- +%% Function : init/1 +%% Returns : {ok, State} | +%% {ok, State, Timeout} | +%% ignore | +%% {stop, Reason} +%% Description: Initiates the server +%%---------------------------------------------------------------------- +init([Channel, ChannelPid, TypeCheck, PullInterval, ServerOpts]) -> + process_flag(trap_exit, true), + {ok, #state{channel = Channel, channel_pid = ChannelPid, typecheck = TypeCheck, + pull_interval = PullInterval, server_options = ServerOpts}}. + +%%---------------------------------------------------------------------- +%% Function : terminate/2 +%% Returns : any (ignored by gen_server) +%% Description: Shutdown the server +%%---------------------------------------------------------------------- +terminate(_Reason, _State) -> + ?DBG("Terminating ~p~n", [_Reason]), + ok. + +%%---------------------------------------------------------------------- +%% Function : code_change/3 +%% Returns : {ok, NewState} +%% Description: Convert process state when code is changed +%%---------------------------------------------------------------------- +code_change(_OldVsn, State, _Extra) -> + {ok, State}. + +%%---------------------------------------------------------------------% +%% function : handle_info +%% Arguments: +%% Returns : {noreply, State} | +%% {stop, Reason, State} +%% Effect : Functions demanded by the gen_server module. +%%---------------------------------------------------------------------- +handle_info({'EXIT', Pid, Reason}, #state{channel_pid = Pid} = State) -> + ?DBG("Parent Channel terminated ~p~n", [Reason]), + orber:dbg("[~p] CosEventChannelAdmin_SupplierAdmin:handle_info(~p);~n" + "My Channel terminated and so will I.", + [?LINE, Reason], ?DEBUG_LEVEL), + {stop, Reason, State}; +handle_info(_Info, State) -> + ?DBG("Unknown Info ~p~n", [_Info]), + {noreply, State}. + + +%%---------------------------------------------------------------------- +%% Function : obtain_push_consumer +%% Arguments : +%% Returns : +%% Description: +%%---------------------------------------------------------------------- +obtain_push_consumer(OE_This, #state{channel = Channel, + channel_pid = _ChannelPid, + typecheck = TypeCheck, + server_options = ServerOpts} = State) -> + ?DBG("Starting a new CosEventChannelAdmin_ProxyPushConsumer.~n", []), + {reply, + 'CosEventChannelAdmin_ProxyPushConsumer':oe_create_link([OE_This, + self(), + Channel, + TypeCheck], + ServerOpts), + State}. + +%%---------------------------------------------------------------------- +%% Function : obtain_pull_consumer +%% Arguments : +%% Returns : +%% Description: +%%---------------------------------------------------------------------- +obtain_pull_consumer(OE_This, #state{channel = Channel, + channel_pid = _ChannelPid, + typecheck = TypeCheck, + pull_interval= PullInterval, + server_options = ServerOpts} = State) -> + ?DBG("Starting a new CosEventChannelAdmin_ProxyPullConsumer.~n", []), + {reply, + 'CosEventChannelAdmin_ProxyPullConsumer':oe_create_link([OE_This, + self(), + Channel, + TypeCheck, + PullInterval], + ServerOpts), + State}. + +%%====================================================================== +%% Internal functions +%%====================================================================== + +%%====================================================================== +%% END OF MODULE +%%====================================================================== diff --git a/lib/cosEvent/src/CosEventComm.idl b/lib/cosEvent/src/CosEventComm.idl new file mode 100644 index 0000000000..bb0c107394 --- /dev/null +++ b/lib/cosEvent/src/CosEventComm.idl @@ -0,0 +1,37 @@ + +#ifndef _COSEVENTCOMM_IDL +#define _COSEVENTCOMM_IDL + +#pragma prefix "omg.org" + +module CosEventComm +{ + exception Disconnected{}; + + interface PushConsumer + { + void push(in any data) raises (Disconnected); + void disconnect_push_consumer(); + }; + + + interface PushSupplier + { + void disconnect_push_supplier(); + }; + + interface PullSupplier + { + any pull() raises(Disconnected); + any try_pull(out boolean has_event) raises(Disconnected); + void disconnect_pull_supplier(); + }; + + interface PullConsumer + { + void disconnect_pull_consumer(); + }; +}; + +#endif + diff --git a/lib/cosEvent/src/Makefile b/lib/cosEvent/src/Makefile new file mode 100644 index 0000000000..a62d47ce74 --- /dev/null +++ b/lib/cosEvent/src/Makefile @@ -0,0 +1,214 @@ +# +# %CopyrightBegin% +# +# Copyright Ericsson AB 1997-2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved online at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# %CopyrightEnd% +# +# +include $(ERL_TOP)/make/target.mk +ifeq ($(TYPE),debug) +ERL_COMPILE_FLAGS += -Ddebug -W +endif +EBIN=../ebin +include $(ERL_TOP)/make/$(TARGET)/otp.mk + +# ---------------------------------------------------- +# Application version +# ---------------------------------------------------- +include ../vsn.mk +VSN=$(COSEVENT_VSN) + +# ---------------------------------------------------- +# Release directory specification +# ---------------------------------------------------- +RELSYSDIR = $(RELEASE_PATH)/lib/cosEvent-$(VSN) +# ---------------------------------------------------- +# Target Specs +# ---------------------------------------------------- + +MODULES = \ + CosEventChannelAdmin_ProxyPullConsumer_impl \ + CosEventChannelAdmin_ProxyPushConsumer_impl \ + CosEventChannelAdmin_SupplierAdmin_impl \ + oe_CosEventComm_CAdmin_impl \ + oe_CosEventComm_Channel_impl \ + oe_CosEventComm_PullerS_impl \ + oe_CosEventComm_PusherS_impl \ + cosEventApp + + + +ERL_FILES = $(MODULES:%=%.erl) +HRL_FILES = cosEventApp.hrl + + +GEN_ERL_FILES1 = \ + oe_CosEventChannelAdmin.erl \ + CosEventChannelAdmin_ConsumerAdmin.erl \ + CosEventChannelAdmin_EventChannel.erl \ + CosEventChannelAdmin_ProxyPullConsumer.erl \ + CosEventChannelAdmin_ProxyPullSupplier.erl \ + CosEventChannelAdmin_ProxyPushConsumer.erl \ + CosEventChannelAdmin_ProxyPushSupplier.erl \ + CosEventChannelAdmin_SupplierAdmin.erl \ + CosEventChannelAdmin_AlreadyConnected.erl \ + CosEventChannelAdmin_TypeError.erl + +GEN_ERL_FILES2 = \ + oe_CosEventComm_CAdmin.erl \ + oe_CosEventComm_Channel.erl \ + oe_CosEventComm_Event.erl \ + oe_CosEventComm_PullerS.erl \ + oe_CosEventComm_PusherS.erl \ + oe_cosEventApp.erl + +GEN_ERL_FILES3 = \ + oe_CosEventComm.erl \ + CosEventComm_Disconnected.erl \ + CosEventComm_PullConsumer.erl \ + CosEventComm_PullSupplier.erl \ + CosEventComm_PushConsumer.erl \ + CosEventComm_PushSupplier.erl + +GEN_ERL_FILES = \ + $(GEN_ERL_FILES1) $(GEN_ERL_FILES2) $(GEN_ERL_FILES3) + +EXTERNAL_INC_PATH = ../include + +GEN_HRL_FILES1 = \ + oe_CosEventChannelAdmin.hrl \ + CosEventChannelAdmin.hrl \ + CosEventChannelAdmin_ConsumerAdmin.hrl \ + CosEventChannelAdmin_EventChannel.hrl \ + CosEventChannelAdmin_ProxyPullConsumer.hrl \ + CosEventChannelAdmin_ProxyPullSupplier.hrl \ + CosEventChannelAdmin_ProxyPushConsumer.hrl \ + CosEventChannelAdmin_ProxyPushSupplier.hrl \ + CosEventChannelAdmin_SupplierAdmin.hrl + +EXTERNAL_GEN_HRL_FILES1 = $(GEN_HRL_FILES1:%=$(EXTERNAL_INC_PATH)/%) + +GEN_HRL_FILES2 = \ + oe_CosEventComm_PullerS.hrl \ + oe_CosEventComm_CAdmin.hrl \ + oe_CosEventComm_PusherS.hrl \ + oe_CosEventComm_Channel.hrl \ + oe_cosEventApp.hrl \ + oe_CosEventComm_Event.hrl + +GEN_HRL_FILES3 = \ + oe_CosEventComm.hrl \ + CosEventComm.hrl \ + CosEventComm_PullConsumer.hrl \ + CosEventComm_PullSupplier.hrl \ + CosEventComm_PushConsumer.hrl \ + CosEventComm_PushSupplier.hrl + +EXTERNAL_GEN_HRL_FILES3 = $(GEN_HRL_FILES3:%=$(EXTERNAL_INC_PATH)/%) + +GEN_HRL_FILES = \ + $(EXTERNAL_GEN_HRL_FILES1) $(GEN_HRL_FILES2) $(EXTERNAL_GEN_HRL_FILES3) + +TARGET_FILES = \ + $(GEN_ERL_FILES:%.erl=$(EBIN)/%.$(EMULATOR)) \ + $(MODULES:%=$(EBIN)/%.$(EMULATOR)) + +GEN_FILES = $(GEN_HRL_FILES) $(GEN_ERL_FILES) + +IDL_FILES = \ + CosEventChannelAdmin.idl \ + CosEventComm.idl \ + cosEventApp.idl + +APPUP_FILE = cosEvent.appup +APPUP_SRC = $(APPUP_FILE).src +APPUP_TARGET = $(EBIN)/$(APPUP_FILE) + +APP_FILE = cosEvent.app +APP_SRC = $(APP_FILE).src +APP_TARGET = $(EBIN)/$(APP_FILE) + +# ---------------------------------------------------- +# FLAGS +# ---------------------------------------------------- +ERL_IDL_FLAGS += -pa $(ERL_TOP)/lib/cosEvent/ebin -pa $(ERL_TOP)/lib/ic/ebin +# The -pa option is just used temporary until erlc can handle +# includes from other directories than ../include . +ERL_COMPILE_FLAGS += \ + $(ERL_IDL_FLAGS) \ + -I$(ERL_TOP)/lib/orber/include \ + -I$(ERL_TOP)/lib/cosEvent/include \ + +'{parse_transform,sys_pre_attributes}' \ + +'{attribute,insert,app_vsn,"cosEvent_$(COSEVENT_VSN)"}' + +YRL_FLAGS = + +# ---------------------------------------------------- +# Targets +# ---------------------------------------------------- +opt: $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) + +debug: + @${MAKE} TYPE=debug opt + +clean: + rm -f $(TARGET_FILES) $(GEN_FILES) $(APP_TARGET) $(APPUP_TARGET) + rm -f errs core *~ + +$(APP_TARGET): $(APP_SRC) + sed -e 's;%VSN%;$(VSN);' $(APP_SRC) > $(APP_TARGET) +$(APPUP_TARGET): $(APPUP_SRC) + sed -e 's;%VSN%;$(VSN);' $(APPUP_SRC) > $(APPUP_TARGET) + +docs: + +# ---------------------------------------------------- +# Special Build Targets +# ---------------------------------------------------- +$(GEN_ERL_FILES1) $(EXTERNAL_GEN_HRL_FILES1): CosEventChannelAdmin.idl + erlc $(ERL_IDL_FLAGS) +'{cfgfile,"CosEventChannelAdmin.cfg"}' CosEventChannelAdmin.idl + mv $(GEN_HRL_FILES1) $(EXTERNAL_INC_PATH) + +$(GEN_ERL_FILES2) $(GEN_HRL_FILES2): cosEventApp.idl + erlc $(ERL_IDL_FLAGS) +'{cfgfile,"cosEventApp.cfg"}' cosEventApp.idl + +$(GEN_ERL_FILES3) $(EXTERNAL_GEN_HRL_FILES3): CosEventComm.idl + erlc $(ERL_IDL_FLAGS) CosEventComm.idl + mv $(GEN_HRL_FILES3) $(EXTERNAL_INC_PATH) + +# ---------------------------------------------------- +# Release Target +# ---------------------------------------------------- +include $(ERL_TOP)/make/otp_release_targets.mk + + +release_spec: opt + $(INSTALL_DIR) $(RELSYSDIR) + $(INSTALL_DATA) ../info $(RELSYSDIR) + $(INSTALL_DIR) $(RELSYSDIR)/ebin + $(INSTALL_DATA) $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) $(RELSYSDIR)/ebin + $(INSTALL_DIR) $(RELSYSDIR)/src + $(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) $(GEN_ERL_FILES) $(IDL_FILES) $(RELSYSDIR)/src + $(INSTALL_DIR) $(RELSYSDIR)/include + $(INSTALL_DATA) $(GEN_HRL_FILES) $(RELSYSDIR)/include + + +release_docs_spec: + + + + + + diff --git a/lib/cosEvent/src/cosEvent.app.src b/lib/cosEvent/src/cosEvent.app.src new file mode 100644 index 0000000000..c1cb9e0cc9 --- /dev/null +++ b/lib/cosEvent/src/cosEvent.app.src @@ -0,0 +1,45 @@ +{application, cosEvent, + [{description, "The Erlang CosEvent application"}, + {vsn, "%VSN%"}, + {modules, + [ + 'CosEventChannelAdmin_ProxyPullConsumer_impl', + 'CosEventChannelAdmin_ProxyPushConsumer_impl', + 'CosEventChannelAdmin_SupplierAdmin_impl', + 'oe_CosEventComm_CAdmin_impl', + 'oe_CosEventComm_Channel_impl', + 'oe_CosEventComm_PullerS_impl', + 'oe_CosEventComm_PusherS_impl', + 'cosEventApp', + 'oe_CosEventChannelAdmin', + 'CosEventChannelAdmin_AlreadyConnected', + 'CosEventChannelAdmin_ConsumerAdmin', + 'CosEventChannelAdmin_EventChannel', + 'CosEventChannelAdmin_ProxyPullConsumer', + 'CosEventChannelAdmin_ProxyPullSupplier', + 'CosEventChannelAdmin_ProxyPushConsumer', + 'CosEventChannelAdmin_ProxyPushSupplier', + 'CosEventChannelAdmin_SupplierAdmin', + 'CosEventChannelAdmin_TypeError', + 'oe_CosEventComm_CAdmin', + 'oe_CosEventComm_Channel', + 'oe_CosEventComm_Event', + 'oe_CosEventComm_PullerS', + 'oe_CosEventComm_PusherS', + 'oe_cosEventApp', + 'oe_CosEventComm', + 'CosEventComm_PushSupplier', + 'CosEventComm_PushConsumer', + 'CosEventComm_PullSupplier', + 'CosEventComm_PullConsumer', + 'CosEventComm_Disconnected' + ] + }, + {registered, []}, + {applications, [orber, stdlib, kernel]}, + {env, []}, + {mod, {cosEventApp, []}} +]}. + + + diff --git a/lib/cosEvent/src/cosEvent.appup.src b/lib/cosEvent/src/cosEvent.appup.src new file mode 100644 index 0000000000..d69b2ef20c --- /dev/null +++ b/lib/cosEvent/src/cosEvent.appup.src @@ -0,0 +1,6 @@ +{"%VSN%", + [ + ], + [ + ] +} diff --git a/lib/cosEvent/src/cosEventApp.cfg b/lib/cosEvent/src/cosEventApp.cfg new file mode 100644 index 0000000000..bbacd134f7 --- /dev/null +++ b/lib/cosEvent/src/cosEventApp.cfg @@ -0,0 +1,15 @@ +{this, "oe_CosEventComm::Event"}. +{from, "oe_CosEventComm::Event"}. +{{handle_info, "oe_CosEventComm::Event"}, true}. +{this, "oe_CosEventComm::Channel"}. +{from, "oe_CosEventComm::Channel"}. +{{handle_info, "oe_CosEventComm::Channel"}, true}. +{this, "oe_CosEventComm::CAdmin"}. +{from, "oe_CosEventComm::CAdmin"}. +{{handle_info, "oe_CosEventComm::CAdmin"}, true}. +{this, "oe_CosEventComm::PullerS"}. +{from, "oe_CosEventComm::PullerS"}. +{{handle_info, "oe_CosEventComm::PullerS"}, true}. +{this, "oe_CosEventComm::PusherS"}. +{from, "oe_CosEventComm::PusherS"}. +{{handle_info, "oe_CosEventComm::PusherS"}, true}. diff --git a/lib/cosEvent/src/cosEventApp.erl b/lib/cosEvent/src/cosEventApp.erl new file mode 100644 index 0000000000..084490f845 --- /dev/null +++ b/lib/cosEvent/src/cosEventApp.erl @@ -0,0 +1,290 @@ +%%-------------------------------------------------------------------- +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2001-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +%% +%%---------------------------------------------------------------------- +%% File : cosEventApp.erl +%% Description : +%% +%%---------------------------------------------------------------------- +-module(cosEventApp). + +%%--------------- INCLUDES ----------------------------------- +-include_lib("orber/include/corba.hrl"). +-include("cosEventApp.hrl"). + + +%%--------------- EXPORTS------------------------------------- +%% cosEvent API external +-export([start/0, stop/0, install/0, uninstall/0, start_channel/0, start_channel/1, + start_channel_link/0, start_channel_link/1, stop_channel/1]). + +%% cosEvent API internal +-export([create_link/3, get_option/2, type_check/3, disconnect/3, do_disconnect/3]). + +%% Application callbacks +-export([start/2, init/1, stop/1]). + +%%--------------- DEFINES ------------------------------------ +-define(IDL_MODULES, ['oe_CosEventComm', + 'oe_CosEventChannelAdmin', + 'oe_cosEventApp']). + +-define(SUPERVISOR_NAME, oe_cosEventSup). +-define(SUP_FLAG, {simple_one_for_one,50,10}). + +-define(SUP_SPEC(Name, Args), + ['CosEventChannel_EventChannel',Args, + [{sup_child, true}, {regname, {global, Name}}]]). +-define(SUP_CHILD, + {"oe_EventChild", + {cosEventApp,create_link, []}, + transient,100000,worker, + ['CosEventChannel_EventChannel']}). + + +%%-----------------------------------------------------------% +%% function : install +%% Arguments: - +%% Returns : ok | EXIT | EXCEPTION +%% Effect : Install necessary data in the IFR DB +%%------------------------------------------------------------ +install() -> + install_loop(?IDL_MODULES, []). + +install_loop([], _) -> + ok; +install_loop([H|T], Accum) -> + case catch H:'oe_register'() of + {'EXIT',{unregistered,App}} -> + ?write_ErrorMsg("Unable to register '~p'; application ~p not registered. +Trying to unregister ~p~n", [H,App,Accum]), + uninstall_loop(Accum, {exit, register}); + {'EXCEPTION',_} -> + ?write_ErrorMsg("Unable to register '~p'; propably already registered. +You are adviced to confirm this. +Trying to unregister ~p~n", [H,Accum]), + uninstall_loop(Accum, {exit, register}); + ok -> + install_loop(T, [H|Accum]); + _ -> + ?write_ErrorMsg("Unable to register '~p'; reason unknown. +Trying to unregister ~p~n", [H,Accum]), + uninstall_loop(Accum, {exit, register}) + end. + +%%-----------------------------------------------------------% +%% function : uninstall +%% Arguments: - +%% Returns : ok | EXIT | EXCEPTION +%% Effect : Remove data related to cosEvent from the IFR DB +%%------------------------------------------------------------ +uninstall() -> + uninstall_loop(lists:reverse(?IDL_MODULES), ok). + +uninstall_loop([],ok) -> + ok; +uninstall_loop([],{exit, register}) -> + exit({?MODULE, "oe_register failed"}); +uninstall_loop([],{exit, unregister}) -> + exit({?MODULE, "oe_unregister failed"}); +uninstall_loop([],{exit, both}) -> + exit({?MODULE, "oe_register and, for some of those already registered, oe_unregister failed"}); +uninstall_loop([H|T], Status) -> + case catch H:'oe_unregister'() of + ok -> + uninstall_loop(T, Status); + _ when Status == ok -> + ?write_ErrorMsg("Unable to unregister '~p'; propably already unregistered. +You are adviced to confirm this.~n",[H]), + uninstall_loop(T, {exit, unregister}); + _ -> + ?write_ErrorMsg("Unable to unregister '~p'; propably already unregistered. +You are adviced to confirm this.~n",[H]), + uninstall_loop(T, {exit, both}) + end. + +%%-----------------------------------------------------------% +%% function : start/stop +%% Arguments: +%% Returns : +%% Effect : Starts or stops the cosTime application. +%%------------------------------------------------------------ + +start() -> + application:start(cosEvent). +stop() -> + application:stop(cosEvent). + +%%-----------------------------------------------------------% +%% function : start +%% Arguments: Type - see module application +%% Arg - see module application +%% Returns : +%% Effect : Module callback for application +%%------------------------------------------------------------ + +start(_, _) -> + supervisor:start_link({local, ?SUPERVISOR_NAME}, cosEventApp, app_init). + + +%%-----------------------------------------------------------% +%% function : stop +%% Arguments: Arg - see module application +%% Returns : +%% Effect : Module callback for application +%%------------------------------------------------------------ + +stop(_) -> + ok. + +%%-----------------------------------------------------------% +%% function : start_channel +%% Arguments: - +%% Returns : +%% Effect : +%%------------------------------------------------------------ +start_channel() -> + start_channel(?DEFAULT_OPTIONS). + +start_channel(Options) when is_list(Options) -> + ServerOpts = get_option(?SERVER, Options), + 'oe_CosEventComm_Channel':oe_create([Options, ServerOpts], ServerOpts); +start_channel(Options) -> + orber:dbg("[~p] cosEventApp:start_channel(~p);~n" + "Options not correct.", [?LINE, Options], ?DEBUG_LEVEL), + corba:raise(#'BAD_PARAM'{completion_status=?COMPLETED_NO}). + +%%-----------------------------------------------------------% +%% function : start_channel +%% Arguments: - +%% Returns : +%% Effect : +%%------------------------------------------------------------ +start_channel_link() -> + start_channel_link(?DEFAULT_OPTIONS). + +start_channel_link(Options) when is_list(Options) -> + ServerOpts = get_option(?SERVER, Options), + 'oe_CosEventComm_Channel':oe_create_link([Options, ServerOpts], ServerOpts); +start_channel_link(Options) -> + orber:dbg("[~p] cosEventApp:start_channel_link(~p);~n" + "Options not correct.", [?LINE, Options], ?DEBUG_LEVEL), + corba:raise(#'BAD_PARAM'{completion_status=?COMPLETED_NO}). + +%%-----------------------------------------------------------% +%% function : stop_factory +%% Arguments: ChannelObj +%% Returns : +%% Effect : +%%------------------------------------------------------------ +stop_channel(ChannelObj) -> + corba:dispose(ChannelObj). + +%%-----------------------------------------------------------% +%% function : init +%% Arguments: +%% Returns : +%% Effect : +%%------------------------------------------------------------ + +%% Starting using create_factory/X +init(own_init) -> + {ok,{?SUP_FLAG, [?SUP_CHILD]}}; +%% When starting as an application. +init(app_init) -> + {ok,{?SUP_FLAG, [?SUP_CHILD]}}. + +%%-----------------------------------------------------------% +%% function : create_link +%% Arguments: Module - which Module to call +%% Env/ArgList - ordinary oe_create arguments. +%% Returns : +%% Exception: +%% Effect : Necessary since we want the supervisor to be a +%% 'simple_one_for_one'. Otherwise, using for example, +%% 'one_for_one', we have to call supervisor:delete_child +%% to remove the childs startspecification from the +%% supervisors internal state. +%%------------------------------------------------------------ +create_link(Module, Env, ArgList) -> + Module:oe_create_link(Env, ArgList). + + +%%-----------------------------------------------------------% +%% function : get_option +%% Arguments: +%% Returns : +%% Exception: +%% Effect : +%%------------------------------------------------------------ +get_option(Key, OptionList) -> + case lists:keysearch(Key, 1, OptionList) of + {value,{Key,Value}} -> + Value; + _ -> + case lists:keysearch(Key, 1, ?DEFAULT_OPTIONS) of + {value,{Key,Value}} -> + Value; + _-> + {error, "Invalid option"} + end + end. + +%%-----------------------------------------------------------% +%% function : type_check +%% Arguments: Obj - objectrefernce to test. +%% Mod - Module which contains typeID/0. +%% Returns : 'ok' or raises exception. +%% Effect : +%%------------------------------------------------------------ +type_check(_Obj, _Mod, false) -> + ok; +type_check(Obj, Mod, _) -> + case catch corba_object:is_a(Obj, Mod:typeID()) of + true -> + ok; + _ -> + orber:dbg("[~p] cosEventApp:type_check(~p) failed; Should be ~p", + [?LINE, Obj, Mod], ?DEBUG_LEVEL), + corba:raise(#'BAD_PARAM'{completion_status=?COMPLETED_NO}) + end. + +%%-----------------------------------------------------------% +%% function : disconnect +%% Arguments: Module - one of the interfaces defined in CosEventComm. +%% Function - the appropriate disconnect function. +%% Object - the client object reference. +%% Returns : ok +%% Exception: +%% Effect : If the process would try to diconnect itself it could +%% result in a deadlock. Hence, we spawn a new process to do it. +%%------------------------------------------------------------ +disconnect(Module, Function, Object) -> + spawn(cosEventApp, do_disconnect, [Module, Function, Object]), + ok. + +do_disconnect(Module, Function, Object) -> + catch Module:Function(Object), + ?DBG("Disconnect ~p:~p(..).~n", [Module, Function]), + ok. + +%%--------------- END OF MODULE ------------------------------ + + diff --git a/lib/cosEvent/src/cosEventApp.hrl b/lib/cosEvent/src/cosEventApp.hrl new file mode 100644 index 0000000000..ef72277bd6 --- /dev/null +++ b/lib/cosEvent/src/cosEventApp.hrl @@ -0,0 +1,62 @@ +%%---------------------------------------------------------------------- +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2001-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +%% +%%---------------------------------------------------------------------- +%% File : cosEventApp.hrl +%% Description : +%% +%%---------------------------------------------------------------------- + +%%--------------- INCLUDES ----------------------------------- +%% External +-include_lib("orber/include/corba.hrl"). +-include_lib("orber/include/ifr_types.hrl"). + +-define(write_ErrorMsg(Txt, Arg), +error_logger:error_msg("================ CosEvent =================~n" + Txt + "===========================================~n", + Arg)). + + +-define(PULL_INTERVAL, pull_interval). +-define(TYPECHECK, typecheck). +-define(MAXEVENTS, maxEvents). +-define(BLOCKING, blocking). +-define(SERVER, server_options). +-define(DEFAULT_OPTIONS, [{?PULL_INTERVAL, 20}, + {?BLOCKING, true}, + {?TYPECHECK, false}, + {?MAXEVENTS, 300}, + {?SERVER, []}]). + +-define(DEBUG_LEVEL, 3). + +-ifdef(debug). +-define(DBG(F,A), + io:format("[~p (~p)] "++F,[?MODULE, ?LINE]++A)). +-else. +-define(DBG(F,A), ok). +-endif. + + + + +%%--------------- END OF MODULE ---------------------------------------- diff --git a/lib/cosEvent/src/cosEventApp.idl b/lib/cosEvent/src/cosEventApp.idl new file mode 100644 index 0000000000..e5a134685f --- /dev/null +++ b/lib/cosEvent/src/cosEventApp.idl @@ -0,0 +1,26 @@ +#ifndef _COS_EVENT_APP_IDL_ +#define _COS_EVENT_APP_IDL_ + +#include<CosEventChannelAdmin.idl> + + +module oe_CosEventComm { + + + interface Event { + oneway void send(in any event); + void send_sync(in any event); + }; + + interface Channel : CosEventChannelAdmin::EventChannel, Event {}; + + interface CAdmin : CosEventChannelAdmin::ConsumerAdmin, Event {}; + + interface PullerS : CosEventChannelAdmin::ProxyPullSupplier, Event {}; + + interface PusherS : CosEventChannelAdmin::ProxyPushSupplier, Event {}; + +}; + + +#endif diff --git a/lib/cosEvent/src/oe_CosEventComm_CAdmin_impl.erl b/lib/cosEvent/src/oe_CosEventComm_CAdmin_impl.erl new file mode 100644 index 0000000000..976c6dbab5 --- /dev/null +++ b/lib/cosEvent/src/oe_CosEventComm_CAdmin_impl.erl @@ -0,0 +1,233 @@ +%%-------------------------------------------------------------------- +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2001-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +%% +%%---------------------------------------------------------------------- +%% File : oe_CosEventComm_CAdmin_impl.erl +%% Description : +%% +%%---------------------------------------------------------------------- +-module(oe_CosEventComm_CAdmin_impl). + +%%---------------------------------------------------------------------- +%% Include files +%%---------------------------------------------------------------------- +-include_lib("orber/include/corba.hrl"). +-include("cosEventApp.hrl"). + +%%---------------------------------------------------------------------- +%% External exports +%%---------------------------------------------------------------------- +-export([init/1, + terminate/2, + code_change/3, + handle_info/2]). + +%% Exports from "CosEventChannelAdmin::ConsumerAdmin" +-export([obtain_push_supplier/3, + obtain_pull_supplier/3]). + + +%%---------------------------------------------------------------------- +%% Internal exports +%%---------------------------------------------------------------------- +%% Exports from "oe_CosEventComm::Event" +-export([send/3, send_sync/4]). + +%%---------------------------------------------------------------------- +%% Records +%%---------------------------------------------------------------------- +-record(state, {channel_pid, typecheck, maxevents, proxies = [], + server_options}). + +%%---------------------------------------------------------------------- +%% Macros +%%---------------------------------------------------------------------- + + +%%====================================================================== +%% External functions +%%====================================================================== +%%---------------------------------------------------------------------- +%% Function : init/1 +%% Returns : {ok, State} | +%% {ok, State, Timeout} | +%% ignore | +%% {stop, Reason} +%% Description: Initiates the server +%%---------------------------------------------------------------------- +init([ChannelPid, TypeCheck, MaxEvents, ServerOpts]) -> + process_flag(trap_exit, true), + {ok, #state{channel_pid = ChannelPid, typecheck = TypeCheck, + maxevents = MaxEvents, server_options = ServerOpts}}. + +%%---------------------------------------------------------------------- +%% Function : terminate/2 +%% Returns : any (ignored by gen_server) +%% Description: Shutdown the server +%%---------------------------------------------------------------------- +terminate(_Reason, _State) -> + ?DBG("Terminating ~p~n", [_Reason]), + ok. + +%%---------------------------------------------------------------------- +%% Function : code_change/3 +%% Returns : {ok, NewState} +%% Description: Convert process state when code is changed +%%---------------------------------------------------------------------- +code_change(_OldVsn, State, _Extra) -> + {ok, State}. + +%%---------------------------------------------------------------------% +%% function : handle_info +%% Arguments: +%% Returns : {noreply, State} | +%% {stop, Reason, State} +%% Effect : Functions demanded by the gen_server module. +%%---------------------------------------------------------------------- +handle_info({'EXIT', Pid, Reason}, #state{channel_pid = Pid} = State) -> + ?DBG("Parent Channel terminated ~p~n", [Reason]), + orber:dbg("[~p] oe_CosEventComm_PullerS_impl:handle_info(~p);~n" + "My Channel terminated and so will I which will cause" + " my children to do the same thing.", + [?LINE, Reason], ?DEBUG_LEVEL), + {stop, Reason, State}; +handle_info({'EXIT', Pid, _Reason}, #state{proxies = Proxies} = State) -> + %% A child terminated which is normal. Hence, no logging. + ?DBG("Probably a child terminated ~p~n", [_Reason]), + {noreply, State#state{proxies = lists:keydelete(Pid, 2, Proxies)}}; +handle_info(_Info, State) -> + ?DBG("Unknown Info ~p~n", [_Info]), + {noreply, State}. + +%%---------------------------------------------------------------------- +%% Function : obtain_push_supplier +%% Arguments : +%% Returns : +%% Description: +%%---------------------------------------------------------------------- +obtain_push_supplier(_, _, #state{server_options = ServerOpts} = State) -> + case catch 'oe_CosEventComm_PusherS':oe_create_link([self(), + State#state.typecheck], + [{sup_child, true}|ServerOpts]) of + {ok, Pid, Proxy} -> + ?DBG("Started a new oe_CosEventComm_PusherS.~n", []), + {reply, Proxy, State#state{proxies = [{Proxy, Pid}|State#state.proxies]}}; + Other -> + orber:dbg("[~p] oe_CosEventComm_CAdmin:obtain_push_supplier();~nError: ~p", + [?LINE, Other], ?DEBUG_LEVEL), + corba:raise(#'INTERNAL'{completion_status=?COMPLETED_NO}) + end. + +%%---------------------------------------------------------------------- +%% Function : obtain_pull_supplier +%% Arguments : +%% Returns : +%% Description: +%%---------------------------------------------------------------------- +obtain_pull_supplier(_, _, #state{server_options = ServerOpts} = State) -> + case catch 'oe_CosEventComm_PullerS':oe_create_link([self(), + State#state.typecheck, + State#state.maxevents], + [{sup_child, true}|ServerOpts]) of + {ok, Pid, Proxy} -> + ?DBG("Started a new oe_CosEventComm_PullerS.~n", []), + {reply, Proxy, State#state{proxies = [{Proxy, Pid}|State#state.proxies]}}; + Other -> + orber:dbg("[~p] oe_CosEventComm_CAdmin:obtain_pull_supplier();~nError: ~p", + [?LINE, Other], ?DEBUG_LEVEL), + corba:raise(#'INTERNAL'{completion_status=?COMPLETED_NO}) + end. + + +%%---------------------------------------------------------------------- +%% Function : send +%% Arguments : +%% Returns : +%% Description: +%%---------------------------------------------------------------------- +send(_, #state{proxies = Proxies} = State, Any) -> + ?DBG("Received Event ~p~n", [Any]), + case send_helper(Proxies, Any, [], false) of + ok -> + ?DBG("Received Event and forwarded it successfully.~n", []), + {noreply, State}; + {error, Dropped} -> + ?DBG("Received Event but forward failed to: ~p~n", [Dropped]), + RemainingProxies = delete_proxies(Dropped, Proxies), + {noreply, State#state{proxies = RemainingProxies}} + end. + +%%---------------------------------------------------------------------- +%% Function : send_sync +%% Arguments : +%% Returns : +%% Description: +%%---------------------------------------------------------------------- +send_sync(_, OE_From, #state{proxies = Proxies} = State, Any) -> + ?DBG("Received Event ~p~n", [Any]), + corba:reply(OE_From, ok), + case send_helper(Proxies, Any, [], true) of + ok -> + ?DBG("Received Event and forwarded (sync) it successfully.~n", []), + {noreply, State}; + {error, Dropped} -> + ?DBG("Received Event but forward (sync) failed to: ~p~n", [Dropped]), + RemainingProxies = delete_proxies(Dropped, Proxies), + {noreply, State#state{proxies = RemainingProxies}} + end. + + +%%====================================================================== +%% Internal functions +%%====================================================================== +send_helper([], _, [], _) -> + ok; +send_helper([], _, Dropped, _) -> + {error, Dropped}; +send_helper([{ObjRef, Pid}|T], Event, Dropped, false) -> + case catch 'oe_CosEventComm_Event':send(ObjRef, Event) of + ok -> + send_helper(T, Event, Dropped, false); + What -> + orber:dbg("[~p] oe_CosEventComm_CAdmin:send_helper(~p, ~p);~n" + "Bad return value ~p. Closing connection.", + [?LINE, ObjRef, Event, What], ?DEBUG_LEVEL), + send_helper(T, Event, [{ObjRef, Pid}|Dropped], false) + end; +send_helper([{ObjRef, Pid}|T], Event, Dropped, Sync) -> + case catch 'oe_CosEventComm_Event':send_sync(ObjRef, Event) of + ok -> + send_helper(T, Event, Dropped, Sync); + What -> + orber:dbg("[~p] oe_CosEventComm_CAdmin:send_helper(~p, ~p);~n" + "Bad return value ~p. Closing connection.", + [?LINE, ObjRef, Event, What], ?DEBUG_LEVEL), + send_helper(T, Event, [{ObjRef, Pid}|Dropped], Sync) + end. + +delete_proxies([], RemainingProxies) -> + RemainingProxies; +delete_proxies([{_,Pid}|T], Proxies) -> + Rest = lists:keydelete(Pid, 2, Proxies), + delete_proxies(T, Rest). + +%%====================================================================== +%% END OF MODULE +%%====================================================================== diff --git a/lib/cosEvent/src/oe_CosEventComm_Channel_impl.erl b/lib/cosEvent/src/oe_CosEventComm_Channel_impl.erl new file mode 100644 index 0000000000..531edaa0af --- /dev/null +++ b/lib/cosEvent/src/oe_CosEventComm_Channel_impl.erl @@ -0,0 +1,246 @@ +%%-------------------------------------------------------------------- +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2001-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +%% +%%---------------------------------------------------------------------- +%% File : oe_CosEventComm_Channel_impl.erl +%% Description : +%% +%%---------------------------------------------------------------------- +-module(oe_CosEventComm_Channel_impl). + +%%---------------------------------------------------------------------- +%% Include files +%%---------------------------------------------------------------------- +-include_lib("orber/include/corba.hrl"). +-include("cosEventApp.hrl"). + + +%%---------------------------------------------------------------------- +%% External exports +%%---------------------------------------------------------------------- +%% Mandatory +-export([init/1, + terminate/2, + code_change/3, + handle_info/2]). + +%% Exports from "CosEventChannelAdmin::EventChannel" +-export([for_consumers/3, + for_suppliers/3, + destroy/3]). + + +%%---------------------------------------------------------------------- +%% Internal exports +%%---------------------------------------------------------------------- +%% Exports from "oe_CosEventComm::Event" +-export([send/3, send_sync/4]). + +%%---------------------------------------------------------------------- +%% Records +%%---------------------------------------------------------------------- +-record(state, {typecheck, pull_interval, maxevents, blocking, cadmins = [], + server_options}). + +%%---------------------------------------------------------------------- +%% Macros +%%---------------------------------------------------------------------- + +%%====================================================================== +%% External functions +%%====================================================================== +%%---------------------------------------------------------------------- +%% Function : init/1 +%% Returns : {ok, State} | +%% {ok, State, Timeout} | +%% ignore | +%% {stop, Reason} +%% Description: Initiates the server +%%---------------------------------------------------------------------- +init([Options, ServerOpts]) -> + process_flag(trap_exit, true), + PullI = cosEventApp:get_option(?PULL_INTERVAL, Options), + TC = cosEventApp:get_option(?TYPECHECK, Options), + Max = cosEventApp:get_option(?MAXEVENTS, Options), + Blocking = cosEventApp:get_option(?BLOCKING, Options), + {ok, #state{typecheck = TC, pull_interval = PullI, maxevents = Max, + blocking = Blocking, server_options = ServerOpts}}. + +%%---------------------------------------------------------------------- +%% Function : terminate/2 +%% Returns : any (ignored by gen_server) +%% Description: Shutdown the server +%%---------------------------------------------------------------------- +terminate(_Reason, _State) -> + ?DBG("Terminating ~p~n", [_Reason]), + ok. + +%%---------------------------------------------------------------------- +%% Function : code_change/3 +%% Returns : {ok, NewState} +%% Description: Convert process state when code is changed +%%---------------------------------------------------------------------- +code_change(_OldVsn, State, _Extra) -> + {ok, State}. + +%%---------------------------------------------------------------------% +%% function : handle_info +%% Arguments: +%% Returns : {noreply, State} | +%% {stop, Reason, State} +%% Effect : Functions demanded by the gen_server module. +%%---------------------------------------------------------------------- +handle_info({'EXIT', Pid, _Reason}, #state{cadmins = CAdmins} = State) -> + ?DBG("Probably a child terminated with Reason: ~p~n", [_Reason]), + {noreply, State#state{cadmins = lists:keydelete(Pid, 2, CAdmins)}}; +handle_info(_Info, State) -> + ?DBG("Unknown Info ~p~n", [_Info]), + {noreply, State}. + + +%%---------------------------------------------------------------------- +%% Function : for_consumers +%% Arguments : +%% Returns : +%% Description: +%%---------------------------------------------------------------------- +for_consumers(_, _, #state{server_options = ServerOpts} = State) -> + case catch 'oe_CosEventComm_CAdmin':oe_create_link([self(), + State#state.typecheck, + State#state.maxevents, + ServerOpts], + [{sup_child, true}|ServerOpts]) of + {ok, Pid, AdminCo} -> + ?DBG("Created a new oe_CosEventComm_CAdmin.~n", []), + {reply, AdminCo, + State#state{cadmins = [{AdminCo, Pid}|State#state.cadmins]}}; + Other -> + orber:dbg("[~p] oe_CosEventComm_Channel:for_consumers(); Error: ~p", + [?LINE, Other], ?DEBUG_LEVEL), + corba:raise(#'INTERNAL'{completion_status=?COMPLETED_NO}) + end. + +%%---------------------------------------------------------------------- +%% Function : for_suppliers +%% Arguments : +%% Returns : +%% Description: +%%---------------------------------------------------------------------- +for_suppliers(OE_This, _, #state{server_options = ServerOpts} = State) -> + case catch 'CosEventChannelAdmin_SupplierAdmin':oe_create_link([OE_This, self(), + State#state.typecheck, + State#state.pull_interval, + ServerOpts], + [{sup_child, true}|ServerOpts]) of + {ok, _Pid, AdminSu} -> + ?DBG("Created a new CosEventChannelAdmin_SupplierAdmin.~n", []), + {reply, AdminSu, State}; + Other -> + orber:dbg("[~p] oe_CosEventComm_Channel:for_suppliers();~nError: ~p", + [?LINE, Other], ?DEBUG_LEVEL), + corba:raise(#'INTERNAL'{completion_status=?COMPLETED_NO}) + end. + +%%---------------------------------------------------------------------- +%% Function : destroy +%% Arguments : +%% Returns : +%% Description: +%%---------------------------------------------------------------------- +destroy(_, _, State) -> + ?DBG("Destroy invoked.", []), + {stop, normal, ok, State}. + +%%---------------------------------------------------------------------- +%% Function : send +%% Arguments : +%% Returns : +%% Description: +%%---------------------------------------------------------------------- +send(_OE_This, #state{cadmins = CAdmins} = State, Any) -> + ?DBG("Received Event ~p~n", [Any]), + case send_helper(CAdmins, Any, [], false) of + ok -> + ?DBG("Received Event and forwarded it successfully.~n", []), + {noreply, State}; + {error, Dropped} -> + ?DBG("Received Event but forward failed for: ~p~n", [Dropped]), + RemainingAdmins = delete_cadmin(Dropped, CAdmins), + {noreply, State#state{cadmins = RemainingAdmins}} + end. + +%%---------------------------------------------------------------------- +%% Function : send_sync +%% Arguments : +%% Returns : +%% Description: +%%---------------------------------------------------------------------- +send_sync(_OE_This, OE_From, #state{cadmins = CAdmins, blocking = BL} = State, Any) -> + ?DBG("Received Event ~p~n", [Any]), + corba:reply(OE_From, ok), + case send_helper(CAdmins, Any, [], BL) of + ok -> + ?DBG("Received Event and forwarded (sync) it successfully.~n", []), + {reply, ok, State}; + {error, Dropped} -> + ?DBG("Received Event but forward (sync) failed for: ~p~n", [Dropped]), + RemainingAdmins = delete_cadmin(Dropped, CAdmins), + {reply, ok, State#state{cadmins = RemainingAdmins}} + end. + + +%%====================================================================== +%% Internal functions +%%====================================================================== +send_helper([], _, [], _) -> + ok; +send_helper([], _, Dropped, _) -> + {error, Dropped}; +send_helper([{ObjRef, Pid}|T], Event, Dropped, false) -> + case catch 'oe_CosEventComm_CAdmin':send(ObjRef, Event) of + ok -> + send_helper(T, Event, Dropped, false); + What -> + orber:dbg("[~p] oe_CosEventComm_Channel:send_helper(~p, ~p);~n" + "Bad return value ~p. Closing connection.", + [?LINE, ObjRef, Event, What], ?DEBUG_LEVEL), + send_helper(T, Event, [{ObjRef, Pid}|Dropped], false) + end; +send_helper([{ObjRef, Pid}|T], Event, Dropped, Sync) -> + case catch 'oe_CosEventComm_CAdmin':send_sync(ObjRef, Event) of + ok -> + send_helper(T, Event, Dropped, Sync); + What -> + orber:dbg("[~p] oe_CosEventComm_Channel:send_helper(~p, ~p);~n" + "Bad return value ~p. Closing connection.", + [?LINE, ObjRef, Event, What], ?DEBUG_LEVEL), + send_helper(T, Event, [{ObjRef, Pid}|Dropped], Sync) + end. + + +delete_cadmin([], RemainingAdmins) -> + RemainingAdmins; +delete_cadmin([{_,Pid}|T], CAdmins) -> + Rest = lists:keydelete(Pid, 2, CAdmins), + delete_cadmin(T, Rest). + +%%====================================================================== +%% END OF MODULE +%%====================================================================== diff --git a/lib/cosEvent/src/oe_CosEventComm_PullerS_impl.erl b/lib/cosEvent/src/oe_CosEventComm_PullerS_impl.erl new file mode 100644 index 0000000000..5f2733e72d --- /dev/null +++ b/lib/cosEvent/src/oe_CosEventComm_PullerS_impl.erl @@ -0,0 +1,280 @@ +%%-------------------------------------------------------------------- +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2001-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +%% +%%---------------------------------------------------------------------- +%% File : oe_CosEventComm_PullerS_impl.erl +%% Description : +%% +%%---------------------------------------------------------------------- +-module(oe_CosEventComm_PullerS_impl). + +%%---------------------------------------------------------------------- +%% Include files +%%---------------------------------------------------------------------- +-include_lib("orber/include/corba.hrl"). +-include("CosEventChannelAdmin.hrl"). +-include("CosEventComm.hrl"). +-include("cosEventApp.hrl"). + +%%---------------------------------------------------------------------- +%% External exports +%%---------------------------------------------------------------------- +-export([init/1, + terminate/2, + code_change/3, + handle_info/2]). +%% Exports from "CosEventChannelAdmin::ProxyPullSupplier" +-export([connect_pull_consumer/4]). + +%% Exports from "CosEventComm::PullSupplier" +-export([pull/3, + try_pull/3, + disconnect_pull_supplier/3]). + +%%---------------------------------------------------------------------- +%% Internal exports +%%---------------------------------------------------------------------- +%% Exports from "oe_CosEventComm::Event +-export([send/3, send_sync/4]). + +%%---------------------------------------------------------------------- +%% Records +%%---------------------------------------------------------------------- +-record(state, {admin_pid, client, db, respond_to, typecheck, maxevents}). + +%%---------------------------------------------------------------------- +%% Macros +%%---------------------------------------------------------------------- + +%%====================================================================== +%% External functions +%%====================================================================== +%%---------------------------------------------------------------------% +%% Function : init/1 +%% Returns : {ok, State} | +%% {ok, State, Timeout} | +%% ignore | +%% {stop, Reason} +%% Description: Initiates the server +%%---------------------------------------------------------------------- +init([AdminPid, TypeCheck, MaxEvents]) -> + process_flag(trap_exit, true), + {ok, #state{admin_pid = AdminPid, + db = ets:new(oe_ets, [set, private, ordered_set]), + typecheck = TypeCheck, maxevents = MaxEvents}}. + +%%---------------------------------------------------------------------% +%% function : handle_info +%% Arguments: +%% Returns : {noreply, State} | +%% {stop, Reason, State} +%% Effect : Functions demanded by the gen_server module. +%% The CosEvent specification states: +%% "A nil object reference may be passed to the connect_pull_consumer operation; +%% if so a channel cannot invoke a disconnect_pull_consumer operation on the +%% consumer; the consumer may be disconnected from the channel without being +%% informed." +%% If we would invoke the disconnect_pull_consumer operation +%% at the same time as the client tries to pull an event it +%% would cause a dead-lock. We can solve this by spawning a process +%% but as is the client will discover that the object no longer exists +%% the next time it tries to pull an event. +%%---------------------------------------------------------------------- +handle_info({'EXIT', Pid, Reason}, #state{admin_pid = Pid} = State) -> + orber:dbg("[~p] oe_CosEventComm_PullerS_impl:handle_info(~p);~n" + "My Admin terminated and so will I.", + [?LINE, Reason], ?DEBUG_LEVEL), + {stop, Reason, State}; +handle_info(_Info, State) -> + ?DBG("Unknown Info ~p~n", [_Info]), + {noreply, State}. + +%%---------------------------------------------------------------------% +%% Function : terminate/2 +%% Returns : any (ignored by gen_server) +%% Description: Shutdown the server +%%---------------------------------------------------------------------- +terminate(_Reason, #state{client = undefined, respond_to = undefined, db = DB}) -> + ?DBG("Terminating ~p; no client connected and no pending pull's.~n", [_Reason]), + ets:delete(DB), + ok; +terminate(_Reason, #state{client = undefined, respond_to = ReplyTo, db = DB}) -> + ?DBG("Terminating ~p; no client connected but a pending pull.~n", [_Reason]), + corba:reply(ReplyTo, {'EXCEPTION', #'CosEventComm_Disconnected'{}}), + ets:delete(DB), + ok; +terminate(_Reason, #state{client = Client, respond_to = undefined, db = DB}) -> + ?DBG("Terminating ~p; no pending pull~n", [_Reason]), + cosEventApp:disconnect('CosEventComm_PullConsumer', + disconnect_pull_consumer, Client), + ets:delete(DB), + ok; +terminate(_Reason, #state{client = Client, respond_to = ReplyTo, db = DB}) -> + ?DBG("Terminating ~p; pending pull~n", [_Reason]), + corba:reply(ReplyTo, {'EXCEPTION', #'CosEventComm_Disconnected'{}}), + cosEventApp:disconnect('CosEventComm_PullConsumer', + disconnect_pull_consumer, Client), + ets:delete(DB), + ok. + +%%---------------------------------------------------------------------% +%% Function : code_change/3 +%% Returns : {ok, NewState} +%% Description: Convert process state when code is changed +%%---------------------------------------------------------------------- +code_change(_OldVsn, State, _Extra) -> + {ok, State}. + +%%---------------------------------------------------------------------% +%% Function : connect_pull_consumer +%% Arguments : +%% Returns : +%% Description: +%%---------------------------------------------------------------------- +connect_pull_consumer(_OE_This, _OE_From, #state{client = undefined, + typecheck = TypeCheck} = State, + NewClient) -> + case corba_object:is_nil(NewClient) of + true -> + ?DBG("A NIL client supplied.~n", []), + {reply, ok, State}; + false -> + cosEventApp:type_check(NewClient, 'CosEventComm_PullConsumer', TypeCheck), + ?DBG("Connected to client.~n", []), + {reply, ok, State#state{client = NewClient}} + end; +connect_pull_consumer(_, _, _, _) -> + corba:raise(#'CosEventChannelAdmin_AlreadyConnected'{}). + + +%%---------------------------------------------------------------------% +%% Function : pull +%% Arguments : +%% Returns : +%% Description: +%%---------------------------------------------------------------------- +pull(_OE_This, OE_From, State) -> + case get_event(State#state.db) of + false -> + ?DBG("pull invoked but no event stored; put the client on hold.~n", []), + {noreply, State#state{respond_to = OE_From}}; + Event -> + ?DBG("pull invoked and returned: ~p~n", [Event]), + {reply, Event, State} + end. + +%%---------------------------------------------------------------------% +%% Function : try_pull +%% Arguments : +%% Returns : +%% Description: +%%---------------------------------------------------------------------- +try_pull(_OE_This, _OE_From, State) -> + case get_event(State#state.db) of + false -> + ?DBG("try_pull invoked but no event stored.~n", []), + {reply, {any:create(orber_tc:long(), 0), false}, State}; + Event -> + ?DBG("try_pull invoked and returned: ~p~n", [Event]), + {reply, {Event, true}, State} + end. + +%%---------------------------------------------------------------------% +%% Function : disconnect_pull_supplier +%% Arguments : +%% Returns : +%% Description: +%%---------------------------------------------------------------------- +disconnect_pull_supplier(_OE_This, _OE_From, State) -> + ?DBG("Disconnect invoked ~p ~n", [State]), + {stop, normal, ok, State#state{client = undefined}}. + + +%%====================================================================== +%% Internal functions +%%====================================================================== +%%---------------------------------------------------------------------% +%% Function : send +%% Arguments : +%% Returns : +%% Description: +%%---------------------------------------------------------------------- +send(_OE_This, #state{respond_to = undefined} = State, Any) -> + ?DBG("Received event ~p and stored it.~n", [Any]), + store_event(State#state.db, State#state.maxevents, Any), + {noreply, State}; +send(_OE_This, State, Any) -> + ?DBG("Received event ~p and sent it to pending client.~n", [Any]), + corba:reply(State#state.respond_to, Any), + {noreply, State#state{respond_to = undefined}}. + +%%---------------------------------------------------------------------% +%% Function : send_sync +%% Arguments : +%% Returns : +%% Description: +%%---------------------------------------------------------------------- +send_sync(_OE_This, _OE_From, #state{respond_to = undefined} = State, Any) -> + ?DBG("Received event ~p and stored it (sync).~n", [Any]), + store_event(State#state.db, State#state.maxevents, Any), + {reply, ok, State}; +send_sync(_OE_This, _OE_From, State, Any) -> + ?DBG("Received event ~p and sent it to pending client (sync).~n", [Any]), + corba:reply(State#state.respond_to, Any), + {reply, ok, State#state{respond_to = undefined}}. + + +%%---------------------------------------------------------------------% +%% Function : store_event +%% Arguments : DB - ets reference +%% Event - CORBA::Any +%% Returns : true +%% Description: Insert the event in FIFO order. +%%---------------------------------------------------------------------- +store_event(DB, Max, Event) -> + case ets:info(DB, size) of + CurrentSize when CurrentSize < Max -> + ets:insert(DB, {now(), Event}); + _ -> + orber:dbg("[~p] oe_CosEventComm_PullerS:store_event(~p); DB full drop event.", + [?LINE, Event], ?DEBUG_LEVEL), + true + end. + +%%---------------------------------------------------------------------% +%% Function : get_event +%% Arguments : DB - ets reference +%% Event - CORBA::Any +%% Returns : false | Event (CORBA::Any) +%% Description: Lookup event in FIFO order; return false if no event exists. +%%---------------------------------------------------------------------- +get_event(DB) -> + case ets:first(DB) of + '$end_of_table' -> + false; + Key -> + [{_, Event}] = ets:lookup(DB, Key), + ets:delete(DB, Key), + Event + end. + +%%====================================================================== +%% END OF MODULE +%%====================================================================== diff --git a/lib/cosEvent/src/oe_CosEventComm_PusherS_impl.erl b/lib/cosEvent/src/oe_CosEventComm_PusherS_impl.erl new file mode 100644 index 0000000000..c64b01ea1d --- /dev/null +++ b/lib/cosEvent/src/oe_CosEventComm_PusherS_impl.erl @@ -0,0 +1,217 @@ +%%-------------------------------------------------------------------- +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2001-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +%% +%%---------------------------------------------------------------------- +%% File : oe_CosEventComm_PusherS_impl.erl +%% Description : +%% +%%---------------------------------------------------------------------- +-module(oe_CosEventComm_PusherS_impl). + +%%---------------------------------------------------------------------- +%% Include files +%%---------------------------------------------------------------------- +-include_lib("orber/include/corba.hrl"). +-include("CosEventChannelAdmin.hrl"). +-include("CosEventComm.hrl"). +-include("cosEventApp.hrl"). + + +%%---------------------------------------------------------------------- +%% External exports +%%---------------------------------------------------------------------- +-export([init/1, + terminate/2, + code_change/3, + handle_info/2]). + +%% Exports from "CosEventChannelAdmin::ProxyPushSupplier" +-export([connect_push_consumer/4]). + +%% Exports from "CosEventComm::PushSupplier" +-export([disconnect_push_supplier/3]). + + +%%---------------------------------------------------------------------- +%% Internal exports +%%---------------------------------------------------------------------- +%% Exports from "oe_CosEventComm::Event" +-export([send/3, send_sync/4]). + +%%---------------------------------------------------------------------- +%% Records +%%---------------------------------------------------------------------- +-record(state, {admin_pid, client, typecheck}). + +%%---------------------------------------------------------------------- +%% Macros +%%---------------------------------------------------------------------- + +%%====================================================================== +%% External functions +%%====================================================================== +%%---------------------------------------------------------------------- +%% Function : init/1 +%% Returns : {ok, State} | +%% {ok, State, Timeout} | +%% ignore | +%% {stop, Reason} +%% Description: Initiates the server +%%---------------------------------------------------------------------- +init([AdminPid, TypeCheck]) -> + process_flag(trap_exit, true), + {ok, #state{admin_pid = AdminPid, typecheck = TypeCheck}}. + +%%---------------------------------------------------------------------- +%% Function : terminate/2 +%% Returns : any (ignored by gen_server) +%% Description: Shutdown the server +%%---------------------------------------------------------------------- +terminate(_Reason, #state{client = undefined}) -> + ?DBG("Terminating ~p; no client connected.~n", [_Reason]), + ok; +terminate(_Reason, #state{client = Client} = _State) -> + ?DBG("Terminating ~p~n", [_Reason]), + cosEventApp:disconnect('CosEventComm_PushConsumer', + disconnect_push_consumer, Client), + ok. + +%%---------------------------------------------------------------------- +%% Function : code_change/3 +%% Returns : {ok, NewState} +%% Description: Convert process state when code is changed +%%---------------------------------------------------------------------- +code_change(_OldVsn, State, _Extra) -> + {ok, State}. + +%%---------------------------------------------------------------------% +%% function : handle_info +%% Arguments: +%% Returns : {noreply, State} | +%% {stop, Reason, State} +%% Effect : Functions demanded by the gen_server module. +%%---------------------------------------------------------------------- +handle_info({'EXIT', Pid, Reason}, #state{admin_pid = Pid} = State) -> + ?DBG("Parent Admin terminated ~p~n", [Reason]), + orber:dbg("[~p] oe_CosEventComm_PusherS_impl:handle_info(~p);~n" + "My Admin terminated and so will I.", + [?LINE, Reason], ?DEBUG_LEVEL), + {stop, Reason, State}; +handle_info(_Info, State) -> + ?DBG("Unknown Info ~p~n", [_Info]), + {noreply, State}. + +%%---------------------------------------------------------------------% +%% Function : connect_push_consumer +%% Arguments : +%% Returns : +%% Description: +%%---------------------------------------------------------------------- +connect_push_consumer(_OE_This, _, #state{client = undefined, + typecheck = TypeCheck} = State, NewClient) -> + case corba_object:is_nil(NewClient) of + true -> + orber:dbg("[~p] oe_CosEventComm_PusherS_impl:connect_push_consumer(..);~n" + "Supplied a NIL reference which is not allowed.", + [?LINE], ?DEBUG_LEVEL), + corba:raise(#'BAD_PARAM'{completion_status = ?COMPLETED_NO}); + false -> + cosEventApp:type_check(NewClient, 'CosEventComm_PushConsumer', TypeCheck), + ?DBG("Connected to client.~n", []), + {reply, ok, State#state{client = NewClient}} + end; +connect_push_consumer(_, _, _, _) -> + corba:raise(#'CosEventChannelAdmin_AlreadyConnected'{}). + + +%%---------------------------------------------------------------------% +%% Function : disconnect_push_supplier +%% Arguments : +%% Returns : +%% Description: +%%---------------------------------------------------------------------- +disconnect_push_supplier(_OE_This, _, State) -> + ?DBG("Disconnect invoked ~p ~n", [State]), + {stop, normal, ok, State#state{client = undefined}}. + +%%====================================================================== +%% Internal functions +%%====================================================================== +%%---------------------------------------------------------------------- +%% Function : send +%% Arguments : +%% Returns : +%% Description: +%%---------------------------------------------------------------------- +send(_OE_This, #state{client = undefined} = State, _Any) -> + %% No consumer connected. + ?DBG("Received event ~p but have no client.~n", [_Any]), + {noreply, State}; +send(_OE_This, #state{client = Client} = State, Any) -> + %% Push Data + case catch 'CosEventComm_PushConsumer':push(Client, Any) of + ok -> + ?DBG("Received event ~p and delivered it client.~n", [Any]), + {noreply, State}; + {'EXCEPTION', #'CosEventComm_Disconnected'{}} -> + ?DBG("Received event ~p but failed to deliver it since the client claims we are disconnected.~n", [Any]), + {stop, normal, State#state{client = undefined}}; + Other -> + ?DBG("Received event ~p but failed to deliver it to client.~n", [Any]), + orber:dbg("[~p] oe_CosEventComm_PusherS_impl:send(~p);~n" + "My Client behaves badly, returned ~p, so I will terminate.", + [?LINE, Any, Other], ?DEBUG_LEVEL), + {stop, normal, State} + end. + + +%%---------------------------------------------------------------------- +%% Function : send_sync +%% Arguments : +%% Returns : +%% Description: +%%---------------------------------------------------------------------- +send_sync(_OE_This, _OE_From, #state{client = undefined} = State, _Any) -> + %% No consumer connected. + ?DBG("Received event ~p but have no client.~n", [_Any]), + {reply, ok, State}; +send_sync(_OE_This, OE_From, #state{client = Client} = State, Any) -> + corba:reply(OE_From, ok), + %% Push Data + case catch 'CosEventComm_PushConsumer':push(Client, Any) of + ok -> + ?DBG("Received event ~p and delivered (sync) it client.~n", [Any]), + {noreply, State}; + {'EXCEPTION', #'CosEventComm_Disconnected'{}} -> + ?DBG("Received event ~p but failed to deliver (sync) it since the client claims we are disconnected.~n", [Any]), + {stop, normal, State#state{client = undefined}}; + Other -> + ?DBG("Received event ~p but failed to deliver (sync) it to client.~n", [Any]), + orber:dbg("[~p] oe_CosEventComm_PusherS_impl:send_sync(~p);~n" + "My Client behaves badly, returned ~p, so I will terminate.", + [?LINE, Any, Other], ?DEBUG_LEVEL), + {stop, normal, State} + end. + + +%%====================================================================== +%% END OF MODULE +%%====================================================================== + diff --git a/lib/cosEvent/vsn.mk b/lib/cosEvent/vsn.mk new file mode 100644 index 0000000000..953e5fc8c9 --- /dev/null +++ b/lib/cosEvent/vsn.mk @@ -0,0 +1,10 @@ + +COSEVENT_VSN = 2.1.7 + +TICKETS = OTP-8201 + +TICKETS_2.1.6 = OTP-7987 + +TICKETS_2.1.5 = OTP-7837 + +TICKETS_2.1.4 = OTP-7595 |