Range Types

Started by Jeff Davisover 14 years ago79 messages
#1Jeff Davis
pgsql@j-davis.com
1 attachment(s)

Attached is the latest version of the Range Types patch. I will get it
into better shape before the commitfest, but wanted to put up a draft in
case anyone had comments on the TODO items.

Changes:

* Uses BTree opclass rather than compare function.
* Collation specified at type definition time.
* Various fixes.

TODO:

* Should the catalog hold the opclass or the opfamily? This doesn't
affect much, but I wasn't sure which to actually store in the catalog.

* Use Robert Haas' suggestion for auto-generating constructors with
the same name as the range type, e.g. "int8range(1,10,'[]')", where the
third argument defaults to '[)'. This allows better type inference for
constructors, especially when there are multiple range types over the
same base type (and collation is a common case of this). I believe this
was the best idea after significant discussion:
http://archives.postgresql.org/pgsql-hackers/2011-06/msg02046.php
http://archives.postgresql.org/pgsql-hackers/2011-07/msg00210.php

* Send/recv functions

* cleanup

* documentation updates

Regards,
Jeff Davis

Attachments:

rangetypes-20110822.gzapplication/x-gzip; name=rangetypes-20110822.gzDownload
��SN�=kw�6���+P��DJ(Y��$uo�D��\�Nm�v��=>��h(R�������wf� H�m%q���v-`����G�1w���q����M�M��z�����V��F�<�����v�����a����������6<f��^�:{�?��W�GC�����`��S�Z?0�2� 
�p��9>yLO�`������^��I�	����d+��>�e{�H|�<������DL����m��8@)R�O����F���j��7'���|z�&I$Fi�%�O�����F����?'<��k���y�����<�������H���z�
�	��M�D��������Y�%P�]:�R��l=u�w�{����
������#GNg��G��q��3�C,,b��m��M�'�n�c�\�	s�$
�$��x��I�#8����s��>G|�||�R#�Z$��y�_��h~!�����������~��8gE���,�X @n��6
Z���j,�������T^�t@��tV��<�k&q�"J�VO">#�a�S?�����Oc-���N�<��W<���"fi�=	G�l�;
g��~*Pq:��Q�,�
!�)&�0�+�(������P_Y�tFO2L��nk����k���I�I�c+�4-�$oHm*?Z\C�RT����2������u��K�=9q�&L#&��TGNX<�c��L�����/%���H�R�DRWC�^�X���a��Dn���6Q�26�����HF�<>����C�%�,v��������V
�!�H0F���L
(��'(
�����d���F���	)Q|���F���F��q����5u� �9NR �5��1* %� �N�82hxH�����x�V@J�Jg�(Q��o(Q����Lk���&M
Y��2
e��UJ��_W��R���F����6�=��Z�Vf�z�����u�����9��^��[� z����4��Lh%��,tV�D?����K�,9En
��EUC�(CQ��In3w>�n�" ��f6V[�m�b&�j���������f�2�(��S�A��{�A��C3���4+v�-��!I�#	+�p�'X���Q@mK"��1�P�������(x�;2��bI
����"c4�\�_���E(�A��kPFn(�-[�'������5?��TMv����$���Ud�G�����r<V�:��t��6�A�X��{2	!��Z�G%�?�<`����n�c���@I��8{T\��p���u|$����QI���
��6{���q,o5���R��������.Gg���7�K�O��6@�y�a���m��~?C�c�������}��v8������jK@mg��v�1�2��cZL�(��P����rk�$0m��g+qG>����J��y'���.8h�@�,;�L�F�D�{��+3Mfe��V�(L����/6��������~1�^����w^�x��\���?������P�$��?��KF�w���X�]������U��cW��@#65��N��`?t��?�����Vk�nXV��u���T�����y-�����68-�^��q��|�y���B��1��,�vw;k�q��sl��yJ�Bt+�-���={����/����`��w��z��_��"	:wL�_j=��	x�q�Y>���t�����?���&X�$�+8���v��3�a��{���I jPT����<��m��S���U����S���G�;g��nB��-�b�p6�fmJl�,[��;7
��]� �3�|��pr�E�Z�������a@��m"1��v:��,ZKc�1�]�����!�$��6�q�cM���@$z��L<���A��DA�����S����8w� ��j���t���
D@�0�V�6��w<���Y�4�-�q�cc�n,�vVu�w�	��6/��K�m���
��
��j�;�dn�������t��J�A�����9f|6O�������q���B_k#��1j#��T���������������o��34�7��x��L��_)��r
� ��i����j2�L��D�����K�s������tS B�u�	E��>nVJ8/[I�1+����T�\���HR�iU{�2�6��Y��ic{@I�*l]�t�t��h��[�OGB�@x|��a5�p�K��Xl�@d�>��l �1]��M$��QJ�]�X`�����������t����$e�.%���;����R
,C6��W�#�R��0���)�n2�P��"1�:���;�����Q`tNT"����
Hi�q����u�3qUL�����yz�8	��(O#~��!&���@.��Y���Bg�������w�L�I��Yr�\�bW\�a��*�(a�l�U
�1n�d�!���*���$�t���}���m"L��T-T����5��aVjMib"��,&&�;�?��%�$�3����r���,�[�R��� ����N�{�C�J��Y��S��C������
A�A�=�������i�~(8��1J��B���i�]�?92k�g�|]D�s�����0�<&_`���y0M.��}����l��������-��o���*���'i�������d�����i�����nT��x����Y2�����`��m_�qv���n��0f�����/�\��S�)�n��_�B��c���\��"�����r���v������R�Uy	+�����������z�q������^����\/�y��^�[�����K��������`�/�2�s7�����gU�������m�*�z���d*p�n��v)��*�m=��������L�������m�H��6\	�l�~Cn��'LuZI?�����7�����W[���-y�	���Z�����j�������#i�jg���Z���~����W ��w��2�FG:k1��o�+������d�1�v��k���w���2qK������e�o���tjo�5��CN�c�pw���-�������%�S�E�{�"������������*6�D�.([-�"���������4L��;_�x$�.}�v�����4�S�2U�M��������V��>�����_y�=�������Nw{�*L�q�sK��@�?��O�)����7�rOXN��HBUy,+���H�����ZVV
)�RZlF�)-/�j����zd�p�t�eI�����]���X;P�����,<�S*�"����L���@E��4�UPH��%iO�j�����U(P��Ue���]QK��{�a</S��N���<��-~���=;x�g
�s���n������y��T���Ud?5P��qF��x\Q^XebO�����e����������b���d���*K��`
�8%���=y��'ZM1���c�	��_�4Q2��h4=k�j$����=F�\g�A�+r��2�J����� �K���t��`�0�:[�gR��|<Y
��������sG��v������3�D��i�����a����8�R�����#�D�����Q	���Ml�3yB?NGDt�a\Sw���� N�`�uR�z4Uf3��O��#���#.l�rkf�������e_g����H 1�.Q>��(�n��u�����T�=��@QB�6�4�6��K��.���`y$�rg���������M%�i�~cv)���r�ZJlk��O�#�p��i�"������"{`�F�0������]������t�dn��8�7N#2hCCG�v��(�;@�'��C���%1,�
jM��5�Q*|`x�f�K|�
���M`���>�+a����q�����+��vd�zp4�>���%���V!����b���bzP`1�5)��'�������Ej���|��~d��@���-�����[�
���^i\����+f0�����g�
�?>2|��y|������F���z}0���6�+����h$�r�������Vy����/���)xh4�`��^���lx����=y�����
V*�cM������2���\��>8<���p
F�t:���n�nuf?��'��"��y%��(��j��K*��������K��7�YOV/z`�s����i�X�!����A�e�w�N37������������TiP��[����������Z��D���{wR��W��w�W��j������<�J���{���J�o&�:�#�������oN��������X�F����]*oG;)wQ<���rm��4������*��T�����A^��������	���*=�
��$����U��Fv\���;)W�������cd�X�|�E��=*1	+�[D�A�,0� (%3��E=r��6;����#����o��t��sk�t���X�X���2Zf%Ks�����B�*����-��Q$GP�. 7.�����!~[%������m�4�a���Kt����:�Sq����MF�+������g����=��[��di���zB��%�{d�(W�/�����I
&��EI��bIoi�$�{\Y3>���\�r�m�����N�W�wB;���o"�aQda��<N��e2*7�&���M�0����:UsK�2���A8�E�lL���9%���:�i�`N�!���a��@��~�*s��Pq����iS���0���"�|�&�FF��n��E~��im@�M	mC'@���V�[s�6� �$���FE��
������0�DxF0������/���3u�G�/:��T�R�/T���DS�7z�D�Sj�CV�����v{�2b
/L�j8��(��?�q%�#��e��
���aT"��Y_�c�4�V�y��d�������`���0��c������5F��c���E���bJ=�L�cw�����E�z���\~�!���Eu�L���E����k|�UeI�Q��L�9������c��r�D~��.�2�;�����T��[�����P��
!l<��SU�R_�B�R���k7xGa �.Uy�=���Q2���A���m��
�^�[�?�`�����aY�X-���i���;"��L&�sA��mA�����B�a�
�����X��*Q�e�i_����59�HS������Nf~n�, �8��Wh�R��K54�����)������UQ�syK� P�9�m��-���vS>n���$�IaWo�-nr��������z_�"7`c�:��(�j�A@k � ����	c6�2�j�I�G@�k\���7�������q1y��-=�F����\�y{�.�-dI_{�t��R<����#��7�����`�u>e�S��j ����iV�K"�4h`��D�q7����'�pO��$';����j�}J�w��*.Y���Y��������_�����vM�����H�TF]O�g��
�+�����v���?��}�})O���:�rg���IR�������@�/��S��qdnVm\��8�����Iv*:��V�+���
����������-�
���`T�Sv���6��Y�O��J�������w����_
N�G
�
Cg~�go��r�����?4������+Bw�������6�d��n�l<����c��C����v�N���g�	jL(U;	/W��H0������\*�G2�s�����������-I?D�����Zt���	��gE5���L�
i�wa�����P�x�����t~
�*V
%�R�B�N�oR'����"`�XN6o�����u�v��\x���Q.uv:8z�O��(������?�;-#����4���_������>?@m�K1�z�u��
���+���I?&�2�����\���5�6��B�!�/%s�;z����23�4����7��7�>;�z��/S`,]p"�_��GV\�l(�����/=��/��q*���y�f�Qq=d���d<���#0L`�����Q�rU�TKCV��L����xux��������6~+��58o�S�F��m��M+��_��L�T��L�D���m�"��)J%�s\��?���Y*�b�
�>8�O�����k�D�6�C,�jPk���y@A1xn�x���-�A{a��\�Q��d��%�u�*�n�"�.���v;&E�g(����;�{���w�w����������''�'�i9���������})B�>�^*�����;���k��!@�/��m���V�1cq���5�ff�9���?f����1�:%c�C�}�-< 0B��2v���&�.����Y����>��7)�t2��b�����	�|���o����`�;���MZ��c�������i��������`#��nv�],a����(�y�#i��lk79���K_gz�A���w�`����������J	}��6���%�-9L��b9[r�fc�2����*P�gKVQ	j���.k��?s	�F��e��ICy5']�������'��L��jS�v�f������!������)�){+M���A��*��*�`Xmh^�zhl��#�mO��s\Mr���{�x�]�s�sf��-�k|W��T��,�=�^������;qiv8��n�Q��/�
�k��^\(�h?Yd���G6�'��eR�~���8/���27��6{	0�x��W����x>H=���tzv����WV��P�6m�S��1���<>9n4���V�<p�����_��'���?�,��KxW�,
Vl��� $�IS��bN���`����6�����W�V��af��<�x������Do_���m%��#���/�
�L^���t�W��n���>R$�jt��x���}"=)m��������pa����'_Dxh������ 0���5�}e�D3�lN��v�1�59�H�fh��+]��q������xx;�,���;���vjnm���L��Y�6lm������9�}��6"���M��0D�����yEjS��7�f����;v)�o�	@�t�S�E��<�,/�w�n� ��pf������[��n����S���3�E��%�8���eU������q�PV6O�Jx<1NWeq�)7?	�O\�!��$\��9����Ov��E�9Zj�q�p"��}��2�����G��6w� �E��0�R����T��q���3[����S��2�8*
/��C0
���� �'�����c &���	��a�=0������Z�V�<�~�u �M�Gq���^/���</��9��8��l�&%'oG8��.R�U�=���[�M&����������Zo�~�y����4�}�fh���+��s2�����>��'��JR}����H+Z�SK�ic,Ob�3{���+Sr�)p���n�7��gG���B=�fV�|��p ��F�,�sXC-xvO��e��U�s�1���U�~�x�T��wA�4�A)@i�)�0������+A ~���8����!�d�+I
T��;�7*6��Y"V"-�$�9n��d��)�|�?�L��:qE4�6���� ��f� ���bJ�a������,��.�0�SGZX���`#��~<��2;���0��u���)�+�����;k�5Z�����n����i�����>�Ae��.Q=���^-�W�}����=%��D�g560�_Mg������7��%�Cx���$��V$���_�����O��I����3��l$W���)��.��w���a�^m�r	=:Af����5�6#��y�]���	�a0+L	c�j^P`������^z��M�	L�U�c�����������Y�O6�X�D�
�����T�/��h�������UO�����p4�
��)��o�'��E.������?��1�W>#�L�R���t��r�����Eo��^��;)=����I���E�)<������z��/�7��R{�)r������1����ClO=F@�G[��#�:�|1�`���>�`:u���+���t�o�Z�4���`s�]�!���>�)[Mp1���(#����j$n��=�9��S<��$gi��=Y�\Mz���q��KDu�Flt���zc�p!z������=`=��:v��_��o�k��k�����Jr�05�T�w#�b��4I_���d�A��s��)Ww��w��?\����I:����T�;�)]f�Fu��S(�NM����Q�]��{�>|n�8>9n��5H���^z��|J�p������'�hc���a�_�����X�%qv�<"���W������~�
uw���w?��)H��$��b���E71�R�����6V��j}[F��z�q_�����><�]@��L�.VE��C����`���"���&(�#��(������+J^�R��@���w��6��[���C��?
�dH~���5��>�������;>������K�-��/�Q����z�����<�h�?���w��$_��ZKJ	-���m��Z&��i5�����B���'�!�8lm]��fa0L��o�x6�~5�G��[�M��@�o>-�At�QXn<�S������v�$��u�G�SO:��.U��I�2P�^��	������ ��<C����31�����E���e{��x���r.��Le.�p�EP&�K||�]LG>��/������&+���������L�R(|� <��Q����m��Y�QE,:
��kaa��A'-�e$��2t��/��1�JR�	��*��M���`�@��2Pb�������W4������,�`�lXjb2�4X���b�xi/57.AN��e#'�-E�Nw�2�c��#
�(YLzsd���!��{��l�TV��w�(@��A	&���U������)F�l�%W9Ff����|���������n�1�bk�A�D���G	�D��F�P����,�,�k�TE���������&'�KZ����j�:�3�e���[�[��cX�~����k���}"6��pU���.�.��{���(�$�S��
������ZJa��w�i����*����jW�bwe�w��z���&>ogI�
Fa����h�qM����B;�����5�N����nBK�C�6��u�/��!��~���Xe��s�\-���$����4�~{������B�+����u���ngr���9�� e�Mv����R������n"2��.�+X���9��&03.v�+�������u&�it����e��"EU���(�/���+>�?��U��1C�Uy�c��{P6^�{��6O*����#,�Z�cV����f0�=����(���7��������me�v�����4)�*��Z�����KiBn�2^�.'��bC'���`{��}q�a��n�
���E�mdd���T"�v�wbs��#�����v����a0IYz�U-\�W��d?��xf��0���Z�n���h�h,��X����x(��|/P�3r��C_q&Q�A<B�o�ap0�&&n
�Jo���������6�G'ywr��F0�a��8*��?x�x��C��fB�w���6z�X|��r��+v�I��������Y����Y����%-�9�-���n
HE�U1�cfM5���'S���@��0|����q��,h-�C<�����A��z�{")����\����nC��u������h�	�a�Q-�n+OR���7������mu;����.��J�L�LiO��%z��u����-�����P(&[��
?��x)n��-wx^��jK@����@�p�dN.���]���8|T59�_�1S�� (3��B�����*��a��M.�%�������
L-���H6�u|�<P��1�.���\c�����:�j��r�&o�Q����f7������"�77j���j]r�o��H�d g��=i��SMwic���QY��B��A��8�
��g���o���z�4(Y�fz�E(6���"w�8����E�
P�xE�"��`�4*<
����/�A;��������T�]Lm2�L��fvC+p�������0t�N���.k�H������ZY��V�r�W� 1��Q�zD��f��x3��E0��7.���Z�y�+W^\$����Y�&�jX3���O �8�
Ez�8}����s���?Q�(�]8���<��[����_���\JN~,��9F���e�,����/�e�=�N�VIA�\�M��:��K��DhtM�P��<��G�
:CcV���1��xc�����h%�� ��@V@�o���?��Z�z�(r�a�Sh0�;F���'��~|���wZ�L�:!���H@�#�3�kF'v?���G
�"��
�(��������[��������7o���q�wz���}���A�Go�qtU\�N�z4L���u�T2����^�F��p�I]FP��KX���+������C���|���Y�z��Un`�w��
.����8,2~�b2��h�\�5*�}����
�����}�7�zt�I����3Ot�?�h�/-o�9��E��d8,@w*����Q��by����!>z��k��w��
	����3]�a��}|�;n�kuN�-EN�p�nk��������\��j�t�����K��o8A�Q�,�}�9�o�����p^�Pm�yi��c�r[2�/�@N��T_@,����`��;�����C���AE1�Y(avqt>�K>�`|�7eIz�'_��|
0��A����d��6�i��v
Oy��(&�$��R�����)~���a���(fH�����re����X��B���E�7'Q@@�.
4�e)J���2�q�h��q^���D��Chx�$H�pc���2I ��dm@<�3���{k*��CA�UH��w��c��:�z��p�F��p�����XE�\��������S��t���N��.S��`'���@����8�����C��������S=%mP�{+N(�f����%��/��p1�XW�)H���dE���+`r	<<?=B��V������z��������7�O�1<�5?���`x�{rx��#�:S3b���
�Rq4([�����-i�@7{
���P���@����Hp��=?�!
��"��xx��.���KH�
��[H;�����c
!����p�m��G����hF�!G�!��� I��I����]����$�����#��_��Sr�z-��:�("Y��>��;/�bG[�#�&@��h�IfiT�ne����F/�~�]#�%z��~��pz���6t�R�r����<%���[g�QL����0��	 l���3q|�C�������:�e���O����BfGs.�n����?����3K>��x�~5��������m���706]-Yq�3�[~Z��ld�;v���)���(((���K�Z����W�C��aCa������5��_�B��:�Q>����N��
m��jj�^����bu`�g�=�{ b.�Zm��zPbr�\��3<��){	��A^.%b�&�2fu
&���7�(���z#-c�6����5�����6�~��P(6�?DM|L�	�.��B�Y���*T����"���L���c���-N��d ,YU*�*�����|�%-K���O"/������+���U�:R���Em�+�+���������`	g7��i�2��������@_�R��f����������Q�5��qKO��1��*�a{��2�bJ	��+����y��rp�%��Z�� �b�cj������!�(1��l�w��]�(��irsT
-��L��I*�@�������b�#n&���N)!
��f�Hcq�}����T(D�H�x����������iM��W�gs�!rW�&h7���t�Q�L�B�� �9�J��'�=�1��%���|�e�'�Ns��3���A��t`�����-�hL�a0�����N��C��hv'b��T��@E/��wz��y����! �78���\�����+�����_��k�R���
�{:g���B���0�:���yc�KN:���V�[�vD����q�_r�s�~�	�g��,�|��-~T���)�N�~E1!>�g#��@���u��X���PK!]>,k!��UO�[�e/��]i�!�h�Z���f��FaZ���Q���B�����k`j��5�Q+�
�\%m��b�W��|���bt/~l@s���a���`�vF9�P�\��
���gg/mze#��������{b"�H�5���=��5S��]�b}s/j�5-}Q��=��-xMzX[<tqj�`.�o�,����m�[�t�>�Q��Q��n�����2|���m�T�5k�V/W�i�Yoq�#��<a���3rIF=Lp�]��������"T$_�:�&[5��p"0��K{���t�X�"wYQ�`��E�A��G��V������6�>�>��_������Y��k��K�B�"��e������B�Ko�������cQ0�����Z��W�M�/o�u��Q���4�����%m��W���G1J��.�0�(rE3������_�\�f��p.��/�����)QP�h�T5�����>��1/H#�p�FPHM�ON���zS>"!�]����q�0�D�m���&�!?���!_<=�l��Y��cr�Sv���%���������je���?f;���5z8�� CKr�$����5�<�9�\�V�MmCfS�H�g�����"]L�8��S��l��C�&��c���r6��e��j�N��\��<�NU��>Q��Ot����,i�����P������6����lTe*?��Y��(
/���mct���' ��#�<iJ6k%�6=�dp���Vy�|iC,-����B=�6a�4�����^�4W])�l�h�&�O8�Ug��J�"�Pf���������=�f��A�K[3��6;M���b��SZ�����0=Hr���g'��5��#���w�����$(�x��\��BA\c�<��_�R�������A��p#z�D7<uu�q��?��c��K��}��3��b��+z�/Og�[�8}"�B�O�l��
U��(/W�GVH��Z>D�k�JK!����e��b0��t��m���^��]S���Z��QF�c*���s�k�I]j�����/��U�P���]?�%�9S����UV���t������9lB*���.��y�0@�����������]��a�?��B�b�~��$x��������c��
[sS06�[��8K�3�� �Z���%�����d7�)�����������f�����;�z����|���v�'q�Jv���������HFJ1��P��_$��2�#�Z������w6��Lf�h����j�Ef�������}�	""���"���"}i'����k���7�����3B�I�9m�UG�W�� exM[��J�bng"�9/}JVT%b[o������E�V)�����1�Kv1���,x�Sn�c�,��J�x @�5�7�B��$���z��>/L=,o��L\��,�%��*������!
�J�'nj�+�M�"y��[r>�V4(���?be�>89��)�9o���C}o����p��i�B�P����W����Y���B�3z��Fm�^������,�Exc4����7��R��n�A/���|�]cNPE�L7�Y�"����T@|f@40�H�D�&���YBI��M�����������P�zTa�D�����a~gh�q���"Topb�d�����BO��w���V�'
�����*=����f�9�{r�l�-��5 ���N��Wz�y1%�!�"�
����>��;1\��/n?3�#*@�jj8���0978j�&���qL��S0�1�m���8r�~�oE��l���#��wU`���o4������&�1[�����z�x���1������X��%���2�l��HJ�CD���x����&��l�[���V���;���:��1:��N�h����/J#L@�������rN�S)Wwv�B�%i�[<���9yrMQ.���@��qM��)�&y/�[�&�gm��d h��_1�x�QD���P!L*����~����g`�}�g�U ����["��������$���F���?��o� ]to�Z/���4�������L������
����s?=@�
D"$N��@���������%.�z��9���.��'�gs�u���������{:gzN�������Q��k7��+|�����1����V��%�*��o.���Yx����h�V��u������o��d�ZE�*�7^�0I&$�,:~�B����&�G"��|/��I����&)��R�n���O��s�tB���NbN�e��& <������2���Q�@uC�I�o*`R������y��)�n��4g�������]��#a���d�	V��L�.m�����I@7����ax0	8&
��&�n�y�c���GV�*�K(����1Q�,9m����z��c�a���
�3��0.��l������\�����<�����5"���]��=��O��v�]���Q:��!\
&Y��>�<��
����(���2��b�>�I�(��Z�$KJJ�(e���������.���#�1J1S������&���M����^��"�s�����}4
?�0�.R�&�p��(�	���Z����'���AL�U	����wO��&����;�������Y��N���i]����
�S�NF#�2}���.�r����7���"���LG)#Z]�.�����)sp'���=����;;��9������)(��7
A���UM�K$�E�<����J�����/�a�&H)���?NK���f�\��s��i}�ni��/r�WCi�����0�x`/M�O�;2s��d�n����=S&	�XAVW����d�B=�Mre��_-��"BM#�P��Z�9��D&a��/WC�+�J��f����o��i��w#
Ock%��\����d�Pi?�:��	��m4�U���v`����&�s	2��,$EA�9J(���Y8�Q
"����*��y:��f��S���q��-�~�;����`+c[:�a�7x�k��[������w�^�[G�3?
Gl��(�r���g��i��?�{V�����U!����5L[�<w�"W���X�3M������B�5I]po����#�c��'n&5�U<�Ss���V����w%���k{�����,l�9���;���#�e� �J�35@/�kh������B��U;��F�����i�
����z���E�6��=��Z�����|���_�Ye�}���gz^-��������kcz��������i���?�+��7�l�:G
%1����yG�@��k�'}@g�C�n��l� �l:�e�M�}����K����o�
qk��L��($��)��
���#qx�W��u����R��sr���(=K��4�8JxG7�������uprvhh[6V�Z	&,�����Q��>ON�A8���������+��Z�V�Uv���O��=
�.��s� ��p�Z{).C�Yp��q�+I�.t'�6�k�,����v�o���������9�p�c��}y�������G�����)'	���j��_3���$��V�4Emo$��l�)3�G���������&��Q�u����8�J��R/K���0�+�*����������<T���0�_���n84��N'��$��������E�F�b��Q��G��&O�F��:T�1�R#��L8y����=<Z���`	II������F
�F�C9
�%R�&���;t�0�Y)b/T�����'����E��)�5"�[��W�������)��o��O�&s���?x����{��j��h�'��h�}��@����I�~B�6��5�A���3�f��_C����Y�Q~�:3���4����-F��k`MX��	D���}��.�9�+?�
�7�B��'�H0&��c8{��)WDVg��<����tNu��,��a���������E��-~����WC�w��./,8�r6�Q��c�G�7������?�Ys�9��D�����+���Y\`��"L����?�k�������})J����g��n�]��m�;-r���qC�n��_j���;��r(�7�T�{�D��o[](����+V��H#�7��E�_��E��F�|�Qi�tf����O�������.����zE����d��Qp1�ek�3K<��h�����"�E�������T{-+���A��Q���y
U��j���$�Z�tQ0�G�3�{�^0)6D�����!h1f�r\6�[��C%`�����N�����tNW�������Y���)j+wB�d����B��F`c��L�=ll��t�
�{���n	����"��Z,��� �	%����������|��;��`������zl�c.��5�(�)��
Ark�oq�1�y���\\�����5�?lM�Q��4�=9��Y�-�HK������8X���j/��L^A���D�h��ibD�5���JG�%�*;�J�Z�i�:=����������S2�jO5��>lw�o0w
���5������%��"��;������G�qa(^M(YF�dqY3O������^_��f�g ��8TN
�����8�`{0�R�����<+F�}vm�h��"�(���i��/D�M��Q������@E�!��Ih���f�z�<�>)I)��kW�iM6�A�[�N�?
�O�j����^����\��b6�l�+��w{�w�h��z'���/h�bS�_��@�'���E�l�+>�o�c�ht���O���Y}�~-��8{����|����g7~n4�L���P��K	�:}���D��r����!�����:u8wv?�aN>?<9n�������9	%`�����WE��)D��/M�F/){�	������OG,���G��L�/���/��gZ�O�sC#%@���jI
�(M�7�0�����'���J]:[��*e���@:�w���&s��[���?�'*!"~]��ff�LQ��� -��W)��K)�Dp
���Y[
�l�����7XF&�����
}6��'�
H�6�#�4����6�#���J�t��K�P@��,����"�T8���"K��>�6���=k��L�n��FY%����W�rs�.�9�u��q�^+������z!���qAd~a��'��ta=����~��HQ��Sz*G]=}31��S��*��{�M`�3
�C�6}���h*9�������W�ec%��9��%�f���gf"����T|l
��1Y(��f���K���CGx},���`C
�����E���������u_�����Z����n�I�=g��(}
�}b�t\�u*.�Y2
�s�U��KI�GSt$fQ���g����������1���3_[Y��7E?���\M/VjZ�_��XJ����U�4�����|\�>&z G#reItSav�-�-�(���m��i
0w���^[�/.�N���X�?�QD����%���[4������m2������t~��%/���k
,�yQ�`���cj�
 f��A�Y�s3�ac��!�����z.�k7h���Q�<
��4�OU��1�U*����y�s1��*,�b5��j����r���-�b5t#b@���Z-�a��?��B��c�P��/���&;��q�$��h�R4��[	��%k����`��\�e��m����Z3�j��2m�>���a7
&���������[g����	KO�:e�p!�f�����]��I����/���?����i:�$�����J��\��C}d����W����
��9E�����C��v���C���D8�!��,��bt.AL�h�5	%����z�����F����������2M4��j�N��J~��3u��B������1����1&i��C�5uN�������;�Y�����n�<��:q�s�����;���4��W��*i�`U�����x��	�W/�r����WK��`�{d��_�����;���+W�\��eu�����+S��L�G?�*�W`���K|�iy/9&H�shSmuh����7�|�����XFq�s�abWS���Lua����Vq�mt����VN�Y5���umO��,�jR1�0E�_w�����-���A��n�����4�i�'����1�dx}rrT�/��6	'�F�}����K��Eo�'1����������}�o�����t��=z[����C����4|9�G��XU�!~�\Gv�8�wUq�V3I4������UI��$�p�rT��J5Y�&+����!'O��G��J��$���$�p��o�z����q���hV��w�U�,�:x�`<��B� p�)U_����H2irCK��{���s�<�1v���IQM&��H_�IoW��b���R�3d�g&��Y$- ��uY@���e��I���OL =S^��-5mH��j���E�x-s�r�D�t;[J��B)���I�F	S���%�Uc<���q�`�-g��Yg%�f.,wG������wq�[b|�1���������,��YH���D���������L������n�����i���y�C�m~��jmW�4MU ������F~������
����{�O�����$������u�Z�<����b_y�ay�#�{O�7���r"�W�9��Q|�8�?���Q��* �}��A��
u��BQ�1��������0�)H].���!����'�cL�����0��\��M� �t)���?�cV����x0�9~Y`��������M|(�`);7�+ �)��,���7�����F��e��}Q26�t������K�&�i�V3��ca��TEj����^+�����}�e��E����O�5�iM�T��wB��33���)��
�}#/�$���bE�WSB��Q�g;�������6��>����=���	^���4��b�%m���j[�c5o���C����:�u}�9�8*x(��`F_9�+g�I���3�����q�;&��$��=���:>�o�m��-��WF�F^�zh%����,n�k,���[�X��7�5R���f�Uw�%�G��6�$�����0��c����<�C"��9l�	R[�	�L#�Z�A�p�����R(`�����4[��-���^�%�^ �WP�"���[i?n!�.�4�X���4�X�-h:%�#G?�J���^�%e?��)����$O7������������i��AAo	g���
�����a�>K����x����\E��Oy��~]��u����&�[R�b.<��7]�v8�(��ti�{@Waeo��S��\r2���$�9j�B��m?w��e���D�������fg�v�b��6Q-{&k��/e�k�����]&���(�A��uK�J���6]��7�%�X|_cp]��d�H��}�����Iu����}4��/�\v��*��^�Q?���r��2H��0!���38�A�#�����b7e`Q\������M[/�����Ec���_*���I�]?���D�����X��p%�
v�mp�E��|���z�w|������aO0�wk2��xOQ�7�H���@���": bV�Q8�! S�c��T���������E�?���7�[K���C�{	��g��f���������
�^
(���E�1e�D���0�#t$V�M���M����[D�z" s��r."� E�U�~��xM����w���c���������I���#L�@C��W���@�b|z�<;��� �Y_m2uu7�:�|���|��e��5eB1ZF�/�"g:"�
b0����w�������A�
�	�Dd1�8�7������{�s����fd�R'-u���xpy��c���%�	v��X�RI$��4��8Zo��b��y�9��&y�J���2�lQ�U���H,��"�����]�c��Um��.�YT�$b�P����=��C{�1�c�iI�� ��0)����~�����7��v�fm�b���Q"��@!��X����<��
���r`������V�w����u�Z\o�Zy!~����"�-��/�����y�~�UK�����W^�j���������k��,3��S�5��A����}�<z���@��P#e�|j_��6��9���������vM��i+)��{Wu�)�Q�>$�=�������(�e��L
"r�*�v�
���y���Vo�����S�{	v�\*v�6�9�tq3B���@eD��-�w{_���|�������w{I�sa�y�SN}����%����/U�i���wO
��>� ��L���������|��3�y
��f�G�9��]@o��IuvSF�f)g�>�p6�]p(�~O"�UH@9��o�J���tI���}20�-�4h����������Y$q�;����.���
��o����M��M1M%��ZL���7&D��#���0t
N���\�h.�,=���\���k�?�02��������Q��\�D�$��'��(����u0���V��N]���:6z�p>�k�$�P���L��nps�_0��^4B�I4��F	���s���� .�A��2���}AH���Q,�~~��;$P��P���
��kv�����
���/�rh�o�2	���������I�@h0jq_M���QOK ��xO�02	��!*��A�T\8'x$�03Yo^(���9SX�0)���&�X*�����2�(c�w�-uM�m�d����fQz�R�r����AJa��Q\��M�+����2�=_{8[�>:J��. dJY�i�o]��@I�t�O<��03��s��a�\i�c���Wz��r����0�z^N����%Vcg;�1����g��u�����K�����nE{Cx��H��V������e�xoM��!���	�j��h9R�v��T��8���$���
7o�6{:��T�+�:����v��`zS�$��cs�l!7 ��zh����dg�#�L�����pZ2�������Y �Hf��
Zc!������/:�n���B/{s8�tSG��Z:������`s-������f����Y �<lv�R�.�<������[�M���:�I��'�D�L�{�������\S*j�4Q����B�H/�e1����j�e�T���?���Jd�������?|��0�N���`=���f���B���L9'En�rN�J���)�+K���\�&����,������kK�=�����#0	�)M���N���T-���%c-������T��%QR��e�LrndG�
�xUj���I�����/����T�n%B��[����/�����]�Sv�JY���KWJY&�v�TI�����F":�J�vR�j���.��,K��Z�.�{I`����X>�
y�xJ�,l��V
l�}�����"�_[�s�,�6��WDS�t:�#X38x�'��Y;u������!�8���,Jn�
������t��t�,���fk�&[N���J<n�0�����B�p�P��	��v��.(n-:�St=��k�����H\T������u�sLc�B���EU�6Z�/j��S\YT8R��r�����x���|�+��w�
���-�<6��,�`=Z�5
�f�BP�X�v��<��<��^���a��&!�����DC��.MO)�4A�s�2$M���	��$��R�),���&G
,�JS.��/��3-;��P���$<��K��B:��X7����Z����m������b?�aO��}���r�<���^W�3>���oG����|D�>�A/��G�u��i+2�����V����.��f�����t���L@�:�,B�
&�����_/+��d�?s�%.��j����g�%A|E����c4=}�����?�5��n�?�kT�(x�#
TA�gB��u����:���?�a*H(n��:G��?��,�PQ������}4b<���w>�%�k2���G<������`��E?�Y?�w]X+;�
l3
g0�����������'b��?�&��{����<�{n1��oq���1�)� �I�!���yU��bI1�*�*�
��_=������T�7���d
��L�`��h�"��Y��xh�r��b�{f�B����/X���;��H��7��UY-?E�����5�������D/�����o���(
���8����b�1��������
�>�����Ki����5��<�����������'���d����<d��N��'�-Ud��6]���s(����=�S�'�1��-n�r%}����"��bs���<vH���.��a�Y������i��@��a��_����m�2�l>�a����k�@K��A��'����qR���
MU��>�3��i��"�����_i=����w�-T�?�d��:����b-�5�J[�����O�I]��2��3�V\�3V��{�#G��$��m�dn��z�%��n��X� $=Ze���ner�1���*�.��:��>���Nx�?��s��s��������:�q��L��$�..~\|�9�Ps~q�9o��*���0�65E��nM�<��`)?����=5 r#�3�����D�P��;�����~Z/��P^���}K`�[k������������O�'li�M>�7�[A�G�:L�={���{`;
{yza;�[��(�������I
���M���H�D����{����
����L�����
&4�7y�_K�x(p��P���E��V������/����y���y�i�����^�x: �������B�6�p&,lX������-c�aKO&�YD�z�1J�)�O��i������
M"p�� ��y�8�L�0�g�����a$��v��������^��=����+������T���/�HH��d>��@uj��&��k���Z��g���q��*��$`	k��S��k�3����&���,DZ�'�]�������/���y?������+:���^���_�(W�����C�@'�`���3NatB��
��zB�0�	�}[�O^14����O�����0����<�s"j.�\�Y�N%�@��GUW����X=yp��h����Dh�����x'n�T��L;���+G����Xz,-d�f��U
,+�T�<���3�DT���3�h���%*�CI%BH}�����~�Z�_;CC�B�>9o�6G���;[c!���\n��%:3��K$�����.��k_�������	�^^�Qo�����uGL��_{�B�x����"	�����I#�1����o���,%}��DD*c(�^��;m�����Ut��� ��7���n��y�{��K���������7�"�#�G����'x�S�S�lGA�|�gsq���K�9^������ ���=q���+��"s��{v�CTak�AO�lO=99�������y�:��V e��W�K���=�QLz"�i`b��qP6���Q8)�E��1����4�G�s�\>vC���j����8��E7�,�R�^���t����W!��SP������.�TF�������ph�]��
g��2��tM�~c�E((	L��	����n���y�<H�-�����Q��NtT�s��������������pB����y����Z��X�$o��������������U����s�LH2��k	��
���]L�HF���$���n�A��������
x� A�X�.�����
�o��o7+��|�N��5{v�������&x���W�����F�&�K����SH�9�x/�v	���������{�E$���
i%%g>e��MR��#	e���x�~�_q��,H�v�E�r���1M��'�_����*��S��)W'6.
�t0z�m�4�obWMt���8����c����$�����m��z"<'}���	g���J�	C��K��>�.��i1�[M��p���������U�G���!P���`����%���V�����p��"�������A7y;(���#�Z�8z�,�Uu�S���s�������IK��V��=;?��P=��c�Jo��/��7��#�G��������P������%W0�P�E�+j����$��������(������C�/J�x�L[�m�������������6`����f�-���'���<E[��|����c�
��9���?�U��+������p�������tM�{�p����yt�:@����{_3��A8��LW #K^�R���U�U����f~��G��Qx��!��pJ+��Y��j0�}�:�����hD���%��s�t�e���[���{m^�3��W�����-���&^E����+��(��(������n�4Sq�
s�����Js��~{���5��P����,Rw���l�J}�zW(4R����(��?���a�;�EL���.������:��.�|�9����{�M��WI/s�~���P�y�?��`�S����%c�^W��dZ�^�Y�C�m�������bG�F9^�/0��b�.Bx��_��&g� �/o�bf��:����2����9�i/t��RJK�Ts�)�pY��zI�g���h:
����_�CmM�I#)����1Jn�Dy���P;�p��B�u�o�Q4���m���:�)�����PQ=G�T������c�J��!;�`��BA�(6g�4[<��;E�b�nD����A���Z�i��I:@�
�S��6��?��Q����$��"�,pT#B�����W�I���1���o�YA�
��}�;��cd���7wR���9A��Y$!��C*u}4v6��K��@��$��u
�:�&���g�%��<5��Eql�#&g�)����*I~"2�i�}Z�����/od��m�� 	��Q���gP"
e�X�@�
���G~h���s�L@Kr���2��{���3)Q?��Q{�)X�b�����AH���F��Zc\�(�E������7�p�m��wQ�{������>b��M��0.�Q"qj@]2�x��3�����{����[5^�sz6JC�Dj�O���M��i���2jO��\9Gm�L\��>p�S�$����Z-�j�(�Q}��Tw�k<��VSv�]1�9@u�3[-{�p�B���G���q��27I���!����yFy��yA�<'�V��?�&���<�2O�E���fE���������t�o�k���V���B�<r�/���7Xf��T`��\��g��buX�w,��������m��	"�L
�R�\K��$r�w$r��\K����5��J�IIWj��b�V�����J�i`x;�v�b�
s�ztst~~=�.��C������'���pj�����0����zfX��ct�P�H�&:qp��{�]�����<E��Kq�X��@������Q���T/-*��r{����^������up>�v\=�\O./#�6�ARIEc�C���"�0�m���o��^N(��"]O^w�_>UX��kb���O��������'*<�����6p��ff���a�D���|�[�S�E�D���
:O�F�f�8��i�`��Ue���u�t���4	����#�S�oYz��ifk������������4/��U��1��y��@��|���t�����-'A`E�,�,�H�6��������z[�Rv���h�D��eI�9~ViY���7��������2J����NjRW���]�l���q�Y@�!��={������9��31Jj��m�X��{ p�������~"/U�^���	��f!��c�j�p7J&G@T��@��39jz&�Bb�2�:n:_e8\}r���}��Y��D�!��@�b^��/b��$�1�/�%���-��8���`~�m9��!����+��%;��?��r)���y|�W6�X
_���m�*���wTOq�(K�+��������N&fuP���T=h�"Oz ��8�| ��I4���}	WP	3Z��j�������|s�U\�0��}V5��peO��1�.
y"�������y0�����)��OI�C���`^�t�9��c�Gj7�0s�:R-R�1��+9b���^�u��^��'��/>E]))�=}�56���b�� ���M�'�_��o\d�0����wt�����~gLHM�B*�p�h*A���_���%}S������?��z�sMY��M9Mi�<A]�2��"j����N��xz/T((���>y���y�o[�u��s�>��['������sZ�[R^�%Gs��;����j)ei�����?�kJ����Z�v�ee�An)���s�N�3���c�IU�n���Hbm�*	�M5�N����#-�mu�O����k��\�\�V_����Y�$C�����Y5'�\�>�b�9�:W�����Y�h���K�����W���3��,m��[co����US�x�����X��V
sWs�D�*;�;���^�.����������J��f@������/�M7����G��W��u
L��,���1����&��D<]��M����Xb�������RP���oDs(�.��'�AJ�PZ�pb�T���
�tT�KL	�E���������!`C�8���&uZV�@�Et�q�6���i��4mR12�����VOT�\|�����o6Ri�aV��2R�� z\���M9V�qi`/3���O4Kq�9��
��R�pH�������*��*Z�P.u?��X=��+�������:��w6��$'�6����m��L5��Q!�l��e����F!��O����0�b�s�e�<���>(e������~�>��5<k)l�~��
.��|���4��m�DXk�$;��<��� �Q$������Qw�W3D���b�#X��+:������1������<��|��D,AM��ag\�?e�GY��9+X,�f������X���m��i ��������'����J����?�^]��v�%�c��1��*#�#�)W!��t��x�9��2i�s]�l��+e���K��*>�g����u����Z��[���n����w������x��j�=���O��dA���
uk�kv�L?���/���w��1�}w�������E�:�+iK��w�itz���|A��%G�T��5H��������I���8H����$|@�/���&xkY�gI�?=,��
�%��0
�%=�)�H�d�g���~��KY�u�4������tL�t1am�\��[���&9K��	��W[�B4��L-�w�3��%~[�xM�4�:�y��d�����@��8��5���{���^���H������<Ql,�/q	�v�Ep1�6$�c6L���5����
0�������>�B��Fw�\�T���,m=-�O�
9c</��L*n�b���Z:b��v�;B�
��?�f��@��m�u�1*r�)�O��k�r���TF�@�������3L|�v�Hi51�O������\�?�R��v�4����Z����9@��Q(�e���$��~���'��nI����8����{��e���L1��9�3}��N"={;�rmO�(qnaK�'�yB�7��(�>91H��[��b<�:�P5���@
��C�C15e��I�S3
_�1c@�=��Z�
z�aP�����^"�Y�[�oO>`7D��J���i���~&j[1e�{��'y��u
�
�_��+����f���4��C�?/��;N�����>��V�o����z�0���.��--�,5�����,���%���[!���vK3�B|�u?�I�9�b��i{�Q���g�S&D ;;�zDZ�>�7�C�#f���6���{j�Y(�F��B����/�������
�C�@{X�pxj>��w����2��q��0���Q��S1��e%����&�Tj
��e8��B��Rw�d���P�5�U���q�]��s��!�p�=���q4U���S������4��\�b��U�+7�b��?}�{�pt3g��`����u�$��������������������� �y*.�M���Ua��0Wq�#�I���Er�
#��d����t*Q�Y���e�@d���"���^�H6p�lL�ic�����%�]�9��)��Qn��b��;�F��I�8��V���|���<���7��e���5��`'Pun������;@��m�D����l�F�$J%8uX�Gv���SR�'��{:�V�%sa�,N��d�

��C��~y�b��t��M�r�5��Z�] #�Zj})L�I�l
�����Cv����3�*R�j<���Y��|m���U��(�s�+�,���l1�N���2�L����@��
���O��gg��"�Q���X[�~)�}�fHz�	�'�S��W����^�r��K]�+a�*jV+��I�����J5pjs�XI,$��6��C5�3��B����o�74��b5RY�m��W�E�l����m����cQ3`Q���������1M���zy{�7IX�����w�oZ����P$GH/	4����4����`�'�]<�w��bv���Z�i+���N�^���==w���;;��IO��,�?&^$YL��J{0�-�p1������|��qug�\��Y{<���:�Os��o������2\���z����Os�����Z��@��V^��Oj~# %+��������Y�Y���ov���q?H�0WU��#����qr��\��b����ny�^�{<�1��V6��d'��#3	�Sx�������;�Y>`|H���n�h�I�F�Z��M��l�k����j-�(���&NR�4�;�<�.���/�[���g�0��-"����1[+l����Z<6�j3A�@O���4}����g�/ ��m��Hzi����E��9��[��xt���R6,d�\�>�6i������v���!��t��@/\����I����2�2{�u���*T\i,lp:M��4q�G�;�t���Jo��u�S�}^@��M������3Z5��`<-{�)�.����������+����k����O�Y<Y7����6/��	�������6��;��?���^������$+"�c�^��H���S�������V��=?=�?'Q
������!�dL����So�)�.|��r�a�B�@���U5x�tz8t�Y�oJ	X��A��%|�1��D���r����Y9�Op$G"�g��I��:���>���-�H�E�`��
������L��-��'Y2��6�py���h���60~���T��D/~���[��������$�^��fX�x���������&���^������V���������u=��K����VS��w��of��q�OO��9a��2K�!�P7��0?�����;v����gu��	
t��y$:��������J�u�����l
��3\��ah�`��7q�W%Q�&������z���]���)����aY���/Rt�����-pw|$�?�m�C�H�r`,]�@
Z�=�� ����7�Q��$!@�k��5&K�K�T�n�����/�Q�\`�|,tw��Pq��FzO�v���1��qrg6��F������,�I���
2Qz5t;��f�����.�$|d]�#]Ro]�Q��<�����%7��lf1����-�r�I�)#�
����c|�H%�8�ixt���}���S����	c*{��*C��d�A#�T��63�����v�jzS:%q�:,����Et���N:=)������Q�E�z�^�W����up�<�O������a��EPv|i���=�X��{��!iC����.�3�/���PU6��m��2�f7O'RG����D�5Iee�@��8%���>a��������n�$2���(�i$1������b4���F����L����}�-���I��Q����)���L�x#�#E�Y0�?�.��c�^��X����E���y���}t�}j�:�D1���;�q8��g]�����w��dA9�	�P�����^�r}����^w��F��U���i�������Vj�]�_�v�$��u��N����/��0����H��c`�+U�W��G���5��,�S�:����s��*u\gg�:�\g��c���]��R�E%�~���/�Z�wC�C����}}�:��{9��vww$�������������u*����:+�m���D�}��X�N����W������R%f��]��R<���o{�w'�����,���u�L��RN���S�7*n9��������1)?��~���W���������U��S����	w,���O����T����sX�v^aew�
(���l���!Vv����� RrOr([�����1�e�V���[sqv�Z/�����8L>�QF|���S�������!r��`�9�i���Z���5P&���+��m'w������!�@ ���St��T��5��ja��9E�=O�z��f��/�O]H��<g�w���)(��N.^�����M�sq[ug�Z�������G~DA&n�G���:P�����x	����j���=o���uth0�p�]��j5��Q���5���>�
{�`��!u�������Hr#zE;�YW��*�����I�DI��;@zv�������;\��$�@D�_L��I��)M3��}�B�x�uF@F��&��$�u�m��c��;��<����2������'��@B���l�b�Dv��8��6�N��[�H*�������D���T����J{����9Q�)W���<G�\��x��H�8��$��{K���AkJ���r4@����C��������&�X�;��q@��M�l<���0�{�C��\"���v������e,3_��
�����G�s
db�b�qn��w�OP4�c�dXt>�M/?ILl�j:,=7~�����8B"d^~�d�DX�>[����G)�R���m��l�`�*��h��������8�,���@a��g�d��6�_a1�4gO���)8�`7�l_����~��~��D�3�x�YJ#�&����h��p�FP���D#�p���Ut�"!Ng�<$w�e;y�o��@�s����j������&��5I ��k'}�@�K�4�]�e��3We�Q�����)�]u�8sV�;6���V���do]��7�w��rl,���2s�Zu�\���iT�����_D���>���2�B���[�^@�`���D���Nj����J�lv=�-;���+��������zmo��M�Q���S0�\�Kk[���K���Y`��ER�,f3\��w���J�����
���z�Zmd�2,�����
���vF7v�������$�-���]zU��e�j;��;��l�I�8g�oF=�z�%������2B�D��r��Gs:���j9���������m��T�]��Q�W��a[�8����C�Y����I�T�-7�N_�aZ#E&������sk�j�=}�Y�g��c0�{���Pw�f��3i���(��^��j�i�N{Vu#+��wT�v�6���AGw������
��h���t��^�0�<(�����#�9�E���bK|����7�nk\���G����|X������*��3�������%=7Y����Sx.G��YE�\���`�|�c�R��a��`r5��id���+��f��������
�:Dx5����c���p6*��z��^���^M<��m{T5���(Cr����0P5���*Xq���~u���`���x����,���e��Z]��[	<�*QE�q+;��g��>�����x�/���F�b6H���{�s���Fxe�o�5s��]{������p|�u���0�+T4oWyw�W�b,�w��=L�D9;@z
Q�a:��Ur��6�%d�����N~�9��r����6��{x�=��rkI��
�p�{�(���E�NlW�$���!:����D�6
���SFojjF<To��{c��\���cs��csy��a�����94���C��3�6���W��}�r�_n5�_����z3���]��<��d�}����H����r��MG?��RD����A��<�
�0<��z��\��������ud�bt������4��+'i/�u�1k���W����6CD�<`��B8=Xg���m:���F���z�g��q�}���6O'h�'�����M^����ja�/�������\c�#;Bf��	���+����N�{�jf����������<=�3,���{���n���yzD+>�8>`?���V�7Gv���x�����k�x��x�b��0l���'!�����l�q!V3{�m��������G|+#�D�s!f�*\=�P^�>��~�*����E�7���-ub<:�=���\�M��@����,��Z�/����q�����J+�R�	�����������t�f���
C�M<|��b����{�����~��S��3>���������{�x'�����?�T
=|��>b���2������!�{�Ed�Z������J���
#�3��i�}�!t5�p���
�>��w4��#����A�
�������9��f�'��w�>�P����}�7�r�V�c������8R+K��hf�>�3���H�k�O����^5�j������_����}K�$����`Ge<�� |�"����q��;~���{�V�m��!u���/����v�Z��v~��l_��/����t�����_�#������?��BL���A8Z�'�qm�(4_������><��1'��;[C����}%�0K��V�i�e�/l���5�F����Oa
i�!=���c������5���X�u�{�+q����%�D2�!��`��M�#rNo��Y��Z���Q�T1s��f~��G��Qx0��(���{;S�z���'�VG�MI�����`s:�����	d���-}��	�eu�G���(���h��(���.C��������(w	�o�
���7�
���(���#� �f\9�9FK�G^4����M����$�NL�on�//����
.'�;x����[�A2��k����������s�T(� ��Q7=o0�z�%%�&��
�K��a&�ChS%�dvH���S�����UFU��U����J����{kw�;9��@�"��kMeGP��)%
`�l��	��
F��P���L�nV�>2Hi��NE�u�/sD*�ZC�TT��+��$��l���h���"<���N
A-�_�?�B��g#�z3���@t8�/.�yE���,1�����bCY�}�B3hoN������(��%@ '�� O~EJ��%�%�3����Bki'�DBj�if�(;h![�����y������;K,�f�V(��J)�,�K��A��LhzO��q�sM�-�a��:�D��o���8����)���]�f����Igq��	���Lq*��Y��'Y��D���Tu��P�
��t��!�`�JKY,��������s������������������m���
�h}���n#����W���v
��rw���#K��\�_����W���}�>��G���u^������7�dXL�_;>�XJ�G@�]A�q)�������NZh��>���1P@4�O���� nTap���N�'�?v�����J";_��S��# DOBL}@`�^�j�s4�4�'�+�m���_���LW<� ����
����@*k'w"�v�^K#%��;�e*��o/3�3��&T�!�o�xQ�x�W�`�Z2���
�x��qZi�����{�����i~�e�?��vZ��	���H����?>gQ~'
q<Z�ea�$���^bn�}7
}4��������d�v,�����R&�$����o���i�Z�����P�Z}P�w��I�j%
�*�=����������}����!+� /��H{��e����:Z�{��'i_{P�+�-����;����B��C
yX��L����|mW����'h_{X1�p7i_�]{f�Q�����
�8U��z��Sw����H|����X�1���;���"C�E���2�*����l����RI�+�����c��?�b>�i����O�
��j/�#%�o����y|x�:c�����z�I���t�)V������3��k>l`OO���.h�s�����`6��q.P�jO�5����������h�\y�!��1�Q9	��T��l���*�����	T�R%c��;�.��=�7*{�Y������z����G0O~�<A���a�Gx2����*��$�Th�C��'�����w��r�����}��)$�[������������d�9��f��u�>(<9~�V�G��=9}UJ�Y*�N��}��tR�t��Z���q�I7��y�u@�S�b��n�����
�"��J���J��I���]B�i��L�\�Q���%g\H�d� F��.c 9�(�'�i��X\��'�a��-����0%M����Uj�rM0
�}�M�=���C`T<����|<��b2�����(�Uw��7�!���h=$����4�?��>S�`�nQ�Z��9��yST��-4G��P���� �����������3L�=�?�ge�(��O�f����5�(�� �&�d�����:'�`��?��o�w�|����A4������C�n���a�m5��n����''�)S�����0�AZ>TC!�Z7�u;�Y�������pr\-fd%��i��g��.��U�9i������M<q�h��'�o������T�����2�3�8�lG��u���mkO9X��FB�E
�CR�T�^�� ~�,�|��3ySv�"26�������H0�����$��#�PP*=������5���/�l�����g��������{��z.����h��N��^����)W����=��a�(��[�����cNn�<{�r�!�b��a��9���l���sT��S�x�����������PI�������(����u��e��X����kQ�_�s�T�z*�1��#��4~Ts76~f]�?:�j���kXQdI��}0I)i��_��<K@��a6_M��m����,D"-��h0�Wwd���������*�$|
�W�	���{*�V��hn"��jPq/Fw��H�4yX��,���$�e��37@�M��H��	 o�z����f&�iA��'�����~J����Q�����T
/g��Co��Q4
����E�����K	):�3�)��a��7?T��&P�QJ�J�s5���2�b�>df:�:���'Y���A����e5!�gV�22�^�fd�b�X���#�xy�j ����r�����;���G/�6�c0DX��X z���|�G����t��������P$-�\,�Y��,��+��q�D�!4������N}������"�7"�M/+�pKz���mqW����b�-�����L9���>���P��d����.&uA������>B��n ��xD�V}��s��k��U�������,���������N�����\�����Y,���n�[��f��;lv��A�Rt>%@K��NN�S f�N�m�x�f�C���
����k�}����RF�@�;��Y�{~v,p�D8��s�N~*�t��'OUxX�S L�'��VA��:�j�s_��`��%wa<�qf��X�*�o��$E>�]z�Ri������sC��m����0������+�a�EG����t�"O���4J�s7�(�g�p���TCE�[��������V4�x����O�q�%����f���V����1�r��E�K��S���n�
��j-�U�UF����x*�t�P	+,�"N���xY �������m�r����g������w�����Wg��
HQ�Ot�|sPJ%d,�G�>��$V���4�Vo5f3#%�XIX�����}�X����N���nh�x�<����<WFus�85����N���o��K��z3�=������h%-�ZD�A������J���-��j�F��I������D��R+���+��������E��n F ��)O��
v��+C������u����#���^�/������%��Jyw[����s`��d�2S���L�x�>$�����q�]y��s���{����s��@�����5��|v~�o]G��CuB�A�����F����8��y�z���)��I��?v���0E_����\c�A���z�������A���3���?��~����m��M-���~���#;{��]�������=����	f;9V�6�T������hq��Q����RR}�]v�%^H����j��v@y�K�x![CXx^�]h�����.Vnh& ����?^��� \���G�[Dt_R���I���������/�h�G�}�J���]���?��!�k�s��v��_�iU�m��1�>`#�^7;�����)�x��?'�Z���\O�7^��<�G�o;=�u�X��y�<���/�M��;=����I���n�V��7��<���C������{�K��9h;E0�����d���ib�>��i8��azz�Z�|�JjI+3���\����?�[�}1�t�@��Z���Y����]�_{���r;��+��(�n����5GQXF��
�����t%3��f�l����Ia=~2�}��Kl�g����cHPX���L"�!�b�����������G��"5�1+�����\�wN�F�Z�q�|�mTaen��#O"��|���pq���������q)��3������N�����FO.��������^N���n�|<����O�ls�Ng�K���MX���5Wq�hU+��r�Ri�O�[g��<P�ke��|,�P�!GC�kT�����o~������l�E����Q`w��,���xh�Ub)�?�9�D
~>�lK|�*�|�8�DK��jK�9������`�W�0v��X��^f��]��������f��[��>���Y��/#H��������YV������g����wY�_�{�����F,�k6*����
��H�F�v%M�( ��F-9��lN�d�z�)�%$y�F�AG�d���?x�+1�d*�J��g�kN;���0L$�
>���|���w�I�t��V3�G7����f>h��s��1n
��(���]���tE�N5&J�.��/�.OS|R���q����Y�)�B��������m�>j�{�=l�+Nf��5m���L��'�lOD����U����O��E�/�`��_�@g�_�����x�E��Y��#x�>����� �����yt���l�X��9�Y+=��Zgg'g�A����������@v)��Qk�L�^������G���W}~��s���\}c���GG���#�!2+�g���p	��?\�3����3�5P��xc���54��V�L21���`�S�9�h�)C�7��U�T��������
��[����l�}�$��Q����md����wvM	N�HdVNz�����V����E3�3�*�O�����,����o���Z�O��<>�'�7�|�������Z�,.�H}��R�J��O�r�Ha��������V�9���AA�0���j��2�W-�V9�gwG�]��<�J��m���'��~��!	������z�����"i5��]"����[����=��@�U��
��Mf_�p��@�>�C ��6V'�r�A}R�+�b�6�
J��	
�d�H�e6��B������gf/�x�@������`LC.o��u�R�V(�?����h�������)q]�+��Xe�����.��e����|�wg����Q2a�-�izA�8�H���<�:PE���p~���~��B�����a[Kg����F�;��R��M�����j�v����� �<�b0�$6j0<��V����`�)"_���y?���x������%�|����mXk6�K������v��=��o��'9�������A�� ���������#-Y�[��{���*�M���!�%��;L3��T|���"~��jfS�b�Y�8`=_���f�?u�+}2���mh��O�'��}�.<�������G��Lr,�!R��u����;���5��Z����$�0��������zx��v�����kg�n����=�)�\��`��puB��3��3f(�e���)�.���kh6�O���k�$������'�1�v���v���i�QK.�+��v�������]����u��y^��n�n���k9�5��R.�o��e�Fa8}9a�@�GL^^�^����o�I�O��|1�
=��c�����qq���Dk���S�������n�������������%�#���%!bEg� �[o��G]�qvr�:G�zWg�DW;=9���1��i�*�Q�(N`�\
��%&�$� Zu94���q�q�.7O�qK�VuC� ����$��JV6*UP�`Y��eO=��g��85�_Rot,�
���A����1�=���P���"0������<T����P��@Q�,��+�4�����^��NqlGoM\�}PiS� >�Qv�R��W*�+lO���^��K@�� �h9�X��^��M����p1���R5���.�R%%��Wo��DI���Z��_#���s ��w��W���;�J�}C������}�F�f�|n�������]=q����7GW��$1���]��I*��P��U@Zh2)P�_�"����VW��!1��*�����},������Q\9�/����E0���X�1<�E��p1��
����R@g����<��1����J�9S��
��������%�V���@�~��h_�e}�R��;4��G�7��w���1`�pFS��N�*�����T�"
uVQ��,������!��UnD����%��y��"�J�)�8?E��H����I<o;�����w��
"�-W���"�����DtzS �S{Q�>^ N�{������E�/�����=�W��U�~��_��W����N��������1���3��%q,S���F
��DQ�	����3ESx6��%�2�A�=����)y�}o��:���:��^�s
vSb�f�C��D�Y����,�����,�x��\2Q)?��
}k�!����eY�~>~\J�%M��hX�O����s������~pt~�����Z%��Q0�b�\������z��$&b���s����4�b+��DU&/�������h1����ss�~R%[u�Avy;�D;�D;�{h���O5��j%v�
�����[��o��!G0`����D��3��a��lA����}K/�?z�>���������H�
� �������+��B`��`��~��b%�������������v&c.FpM�/�B��~�
�4�'�F���$p\��J/�����D�i�{|re=�_ M��.;��n��_�l'���L��Q
c��B�d������|�������~���^�YG��~���rY��Rb�?�U�z�	�z�����W����f0o�!���Nj�����k/�^�	z��E.y��.�mnn&G��c��H%������m�,�%�r$0��p*��r����Q��_������l�������&�-���m�����U�X���#,\����e/@���z��'��M���%�&H��f���}����%3;>�E������i�LM�z�:�2�w���2$�'�-�'��t0"7L�#DZ����/���"�3���5�i�k�m0,#r�]�eW?[�W�.��N>����L�Ac|Y�^��������#�a@A���x���$��,�|8�+�[D9���;KI��X�0�.�	��8i��7�7�"�%*8�Uw���H6(.%����*���~D�3<C�U�:oz����q0��	��x=�}����8_��Ab��`������3��,��i�#��t���^_�)&���v�i{�\�i,'��Em�����n��$�k��.!^�XE�Y�:�~�����q�"�u����1�� o��&�A����Qx���_��I5#"��l���m5��������D��V�;/����j�����2��.�E��Hrp�b�{����Q�:��W�N�D4�"���[|��?��G/a�u<���#5�69��T�~������RI7�1F�������RBj�/���!��D�h��W&S,�I!1~R1����'������C�����tG#��0�����6���_/We�h����)E1u��6���5�y�4��Y���V/���Q��#���}���
9C�**x5��(�G�(9e$+�������`�	^/�A!�����a���CD���
#��Qau���i�[��CM�Rd5f�%����Qa(��K�\��0��F`~.�W���7��~��xk���nn�61�,���He�#���V�%[��X^w��u�q�V�j�Z������e��������|���Va�V��j��[�@J���h�hEN���zV�"�Z�;���u�$�����3g�88���I���5���IG�]f��0��wI/����J$�UB�$�����r�P&w�9r�>����!3��_#c<dd��!��q��wV��E����E|���X��B-��9�BZ���i��1�����p�k���]oPd�{��u�������&y|��y�>�����W��^���_�=n���w�[0w��r�+w��r��%w�3�����
�_l~���}	Y���?���v����N��.y����{��u������5�>����S����:u�}��^h\�C�i����q�5��s�^����c_�-��i+�[�������
������v�{8k��U�?���%7]������]����.q���X�>�M��[#��|��#�_A�H�}"3�'�E]��5�Rw������:����mi���c��c
#2Jeff Davis
pgsql@j-davis.com
In reply to: Jeff Davis (#1)
1 attachment(s)
Re: Range Types

Updated patch attached.

Changes:

1. Now supports new constructor scheme. If you define a range foorange,
you get the following constructors:
* foorange() -- produces empty foorange
* foorange(S) -- produces singleton range [S]
* foorange(L,B) -- produces range [L,B)
* foorange(L,B,'(]') -- produces range (L,B]

Actually, the two-argument form uses a special "default_flags" that can
be specified at creation time, and that defaults to '[)'.

The way I accomplish this is by generating 4 functions at definition
time -- a little ugly, and I am open to suggestions. I ran into a
problem using the default argument as Robert suggested because
pg_node_tree doesn't have a working input function (intentionally so),
so I couldn't get the built-in range types to work with initdb. The
constructors all essentially point to the same C function, aside from
some indirection that I did to avoid excessive complaining from the
opr_sanity test. Again, suggestions welcome.

2. Documentation has been updated.

3. Now there's support for multiple range types over a single base type,
e.g. two text ranges using different collations.

TODO:

There is still some cleanup to do, e.g. pg_dump. I'd like to get some
feedback to stabilize the user-facing behavior before I put too much
effort into the code cleanup (which shouldn't take long, but I just
don't want to work toward a moving target).

Regards,
Jeff Davis

Attachments:

rangetypes-20110831.gzapplication/x-gzip; name=rangetypes-20110831.gzDownload
#3Jeff Davis
pgsql@j-davis.com
In reply to: Jeff Davis (#2)
1 attachment(s)
Re: Range Types

Another updated patch is attached.

Changes:

* support for send/recv
* significant cleanup and fixes
* test improvements

TODO:

* pg_dump support. This requires outputting collation names and
opclass names (because those are part of the range type definition).
Currently, that's only done for indexes through special functions in
ruleutils.c. Should I define such functions there as well, or is there a
simpler approach? Also, I have to filter out the generated constructor
functions because those are created internally when defining a new range
type.
* some error messages should be improved
* Originally, I wasn't sure whether to define a RangeCoerceExpr
(similar to ArrayCoerceExpr), because the only use I had was for typmod.
But that is necessary for casts as well, so I'll go ahead and do that
and we'll get both casts and typmod for range types.
* I think I should avoid some syscache lookups for some of the generic
range functions. Right now they are done for every invocation, but it
would be pretty simple to avoid lookups when looking up the same range
type as last time.

Review questions:

* Do we like the new constructor behavior from the users' standpoint?
* Right now, the patch accomplishes that behavior by generating
several constructor functions every time a new range type is defined. Is
that acceptable? Is there a better way?

Regards,
Jeff Davis

Attachments:

rangetypes-20110912.gzapplication/x-gzip; name=rangetypes-20110912.gzDownload
�QoN�=kW�����+���`'��
$�Npr�.���#��%[c�F�\I�����~�cF��- -�9iB�4�g�s�cf���3ao9�h+
��d�m9vl���l��'�FCW5x�����N���?�>���<��Y������gG��{��/qtv:����
����|j<�
�4nq��>yNOl"����� ���-\����d#p��Cz+b7�����7h&���cw��P����
��?��N#u�;�g����{1�\�q��y,����zwW���o��#?�2�j��A�L�����,�s'��?��������������~�-2���p=x�3@���>���?v��g�����3��#�S��#z�<�|�� 1���r����#;�����X�b<�G$��h$gq$� 8�#��I)>�r,<��$}0���4H��[L�pv��6�c�!�/���zsy���)D
1G?��0�&
�ZW��j,�)������X^�@�w�����B0�,�Dh�$�� �g��e4�b�����y�����D����Z�@�R���<��Q-�M!.���
T4���0�	��L�	�4��'�3���S��2��)=I1�����sf��aT�#+�w�h/Z����G�r�p0y�@*S����JQ�����T�����i�I1V,z<q�6����:���"���k{�����@�CYH(
e���$���&��r,���F���r��H��
���
���1Y�2�VP�`�ar���N*�����vb(ug�l
G�1
�f�k@�L�`8Ai�m����@K?Nmdd�[7�&!%��V���5����;'����pA�RH`��9�i!fv��H�1�v��hd����M-
9�4�KTg�3��(��_(Q����Tk���$MY+�2
e���J��_U��R���G�X��6�=��J�Vd�:�����`s����t��v'��-K=�h�<M��	�D.-5K��0�G�u��2���"�|��:���"�!
��jO���������e�L�jj�����@5oa	w�}ANQV�Y%-/��Q�A��{�A��B3�jM��;���L�`�E�!��4��,�D�(�����p��(y�t@;*�;
���v����84Pd���
��]a�X�!�����
��E+�����Fq���mP�&��v�P���*r�
�����bz3�I]�|1�����R,��{2 �3Z�G����{`4V�t����XJl?t��Qp������������QA���
��6}��q,o9�����Y�z~�he������������%6k ���Y�f�W`������*��(�N��C��0��/� :���Jg��v�M�e�g��a��P�����(L������C��:�eJ�q����ag�	��%��A$�J�JM��Y.��$�3\���;iwxs-m�0A/�4������F�;���Q��=�y���9�P+b}�17��x8��x���E��_l�_E�|��`��_'��D��jmk�.^���mk������M:^x�������>��WO'��JX�I��98�
�&�.�N]��D��v��IP	}OF��Y!���o�y�>�X��uU�O�y���$�8�������'�`�&���B�yl*L�R���	1) D��	�}eE�7�7�0����V��h�_���_�`����yWl�v��s�2�a)||
��I �PT���N��c��n|�!�/[/����G%72����]���	\��!n�i���d����E:�H��X�G��xW](!8t)���8��NdH�K�f����n?��@��l2B�������mY/�
�WQ����@��	A�ZU$��^���=��0 �t��E�������=|�5����Fi������KV`0n~d�4���D�����UP_�1`����'�����+�}�����Q�BD����Zw����������_��G+��"�Hh72��}�^����Y%��X���T5~�1�@��O{uv���G5�#!��xQE�7f�D�#<�WF7�TF�0`-
��,��l.>S�O?���CL�b&:9�N-<s#����������a0��HP-�k��G�3
�L��l��k���K����!�:
��?��&H��FJ��8�3�B+;�rmX�0g�e�i$���������s�%k� �H}�H��C���:%���7��Y�JN�����������\�4s���b@	r�������N�IZ*a�`�52�S�if_�������6������OB�������~�PD�+�=����1��XCw�W4�D>1W������{T4�&�
�������O[^��e�I�����f�V��s���]���*��bY+�"=�.;h�T��k&u�e����P�������2r_����.��n�=���i����C{�^�+{���A��^��Z�'�X]�R�����<�q8���`x(_r�@���7��Y�5	�7���W���2qO�$�����Pu�Y�6c�����5��f��?}k�?�r:X2Fh��Y�B}��(A�QXt���H���i���{�d�	�]��SqaW?.�
��]~���M����M���������;����=�yxJ�����lr��	��M��Vu<��;����q����er��l_�x�v�w����s�����:F�b�l��#{�����������7v��0��6x@YC���Ev�h4�]��_��\�����1�n�@��
�=q����)���m6U��l���3w��8�8����H�w[-k���7)��8�������	�U��t2��Q��<�=�`��2	2�&P�3��(�9����Z��h��Y`p�W^X�)8;9��P1]h�m���w
�)�~��$�b�O[dif���s	$7����"$\F���c%��i��g�S�d4�3����9.���b����{@��r���?�
����Bb�Fi[�upO���U���J�^P�Z�����a����,}Z�����F��<�&�A,c9�,�H$V���'������Q0��S�|HD��b�Z:2l�� s���?��@S'��m�|jJ�����J�r��&���lE`��>�?��& @.b�������kG2{����������gR�(�����L�'����0�%<��"3�,���������3�4t7��h3k�������2�
��q�&)���A
=</�f�pD|��y��C�j�~E��@�F�l��yH�`h����O����%d<jZ��Y�aUPk:9�i����y�@�b=2	�45�������C:xB-	n��0�!�������`�������Z��&�w���;��r�<(�����%
��0������Fj���|g�~d�� ���Z�
p9�|�h�;�i\��kf0���]��?����]>������Y
~�����Iw�5��&�%w����������L���Z0UG�V���L�C���|tt�:�A��IO-z���&�9�=VR'�x5T���w>��
�D��wO.{4\M���z�����%�'������/����(����g�@]|(��Ng��>J{���03,:|������P�������m�Y��(�*��v�y�����L�\cS��*\���d
�_\X*�����}�<��)e;~J�Y�kR�L+�����C��a�*M��0��eXq�������/������YzC����B���������6P������,-M����������VRT�g���k����p�#a2@���L����G�G��zz��H�q$�1Z.*;���:�s,���G�6����H�pgz���4	��
�L*�F�����tkj2n������x5^S�����I�=J
�L��J'�����0%����[E��\�r�2W� �]��Wct��^%��#l��1�frJ��n�����b���\��k0?��O�J���w����X:��nPcKz��mJ�8|�p,�yZ��c��L����)b�xe�&	!��r��1�d�(s3�����I����H&�k��6@L~��/�#"O����lV��������;����Np������u6���d��Q���p�n��I-z�������|
&���"7B5q&��G��d�k��;�2_+���P����@��~�S�����\)	�eRZ�� ��D�"�|Qv�X�qBj���`t�]="Z��SB[������a�U�V_�M(H	1���������S���L�1q�D0�L�������U���h�E����Jj�\u*�2�����kQ�}h���:;H��fs�0b5'��ng�A�S]��v�jGRe 9�@��`�f0*�]��G���������K*�V�����;&~��\��1����}�<;���SDE	��hd�d:��b;�P�R�X�u\)��6��xV7��'OT�7�Q��d�F	�3�|��|g-��~�|^����=2�_P�a�0��������o5[��e)��>�`�pB)��3�*1�_�Cl9�^
����ozO��rZ*�qC'��P�����0y��}`�O*>���w��f��M#���R�b�@�`��Y:jDSTNO���$3�g�/`E��X3\�hM�3�1>�GG������I����2������3<H������X��������E��X�6�b�N�"�4o7��4~9j�OO���V<�%Y<���L��XC�3���c��c2�PC�2��>n�Myx�dU�8����F.74��p����UI���#�^��bIi�4��$;��E ��\�q��.�H�v"��b��0��[��a-
&��d���=a����b9�`@6'���DZ36s�k]�*��������$9���swH]gl������Gj�����i����+Z�P��H���H}Y�q�����F��
';��$��Y)hi��(��$/��2�JE�����n�L�Jb��rz�N0�U�H/���/
2����F���������K8}T�1�q���������!����|��*���]��+���Y�I�T���n�ET���
�������������;�K�����T�V1,b(���C�)�����+�=�������Q��v��(q,t!��=����;��A�B�/5����j�Z���k��(#�����l����|�ro�{��zXj��(����L��J�`i�-���=	uJ�UV����.tI/~8i0�{�����������	@KF�y�������=DX4���&��>�����>�*�J�R��u>��?����~�8��6��������?=��d���\��8;���./����	q��V��\���:+'��>���*���M&�+�<����=QD|�7��tJ��K���@�C���2�l5�Pa�����X�yHD�w�~)�S~}e�;Jf@��5�����O�}y�����]����%d/4�--6�Op�~[t�7~�_�=���^�
�F���A����������a����a��cu�4o[CV�,�6z?�\�a1�����l��]�=��>��H��a���d�iE��
n�[�����D�\�m�*���J%�3\��?���*�:P��z��ui�=>�Hh3o2x�t�V�Zs�M���@p�n0"mKq�n��`��X��t���W�B�����!v�z{�����JJ������}
�%��igg7_���]�?�;??;�H���r:��\(���
<���B��0
5��
nh�� ����_Q�����"?c ������������A'4Ci��cl�
���0F�J���IG�t���a.����](���!��������oRlv2���t>ec������7�hM�gv�f�F��d�^+5i�L�L���1�v�Jf3&��CLn&QN�^=�of��WY��>(A�~���������u#���9Kc8������S�vg��i-)����M��7��=:_Z�s���
6��ED,q'E��1�4^�h��a���7�fMV ���J���Or�w�_��]vL��]��3���;|����b�yv��Hlb^<Ww�^��;��v�/@y(D���]��7������P6�G��_��:���eF�f�����,<KA�(,
�����I���2�+M\Q���j~�
T�O��U��?�����g�����z�I�^n��{��/hl����CV����Iw���t�\a)���;���^����wXk�
�HkO�8����U��������)s[B:}���rP	�tJ������vk����� ����f��I����%����`|�%}�G���o����8�����6�1�������;��@8��o�������Q4�m6����u�9�3q8��y�0LwWWWWWWw��v�[����_�����*�W}�u��.����`��H�OV���hj%0�����1>�2 �!A�p,���^�/P��}<��A4����uOv
��q��{3����TE����\��<^���/0gn.�L�/�T���*n���
6����6���H ��99�a�������bfLJ���L���v�}���I@��o(3��S�G��2Q��BD#�B��k!�_T������y�a��tHvz�~@J�N����e)c����w���` �i���GX����|qr�Y19t�-�.�i�'�n����#�X�|�x�4��;�2�����L��7��Y�����=�Apyv�`�M���j2�;�14���=Q���F��,/��R9*�����(�Dy �l{F�.��Y��F����yp.���s�<ir;�Y>�HK�kv+�c|���fX����X	��_G�^���z�f3�1��I�G�`4�\���.[E�a�n���=�����_��zc����vX�[n
�Hy�i?�L���x&������/���}Me�$;?����~�O�j�Y�%%����j��Ol��i��������&��B=GV\3��K9���6�)sbKdi_ily���I��S��4��e���>�*:FXl�6F6w�����+Me1���R���IQ���cX^M�s��17S�U�=�lm�I��J� �V�q�R|���Xn/9���#����4	%/:MfX��t���";v��P#U��)�p�iV��@�/�`���i�W�7h&"q(Z�XbP�rh�#oa�yd:��P��[QF����7�����������z�Y[s�C�N��������x}~�CF0q�f���Ay�PpU���Bug{5�\���2����=z������4�
(���nm_���
H��AP�ad'N�������������w��	�	v��?�L����,��n��K�Z�v@���V���|�R'��� �f�!�'+���'��M��+S�X��G���������d��#�����:#����_4����E^(+�u���;��GRID��NC�i�P4�j�H���>�?����t���-�P�(r5�0�-�vNdg�$�F�?����Ya����zp���o���8��8`�_�_���Y�� X�+�����������z�`�
�{��W.�����I`>b�3�`�8�R@|����c��t�y}����[UDT���9�;mCw������e������\������_�*���#���F�1�Z���`0��y�@r���Z�6 `��j��PW�c����U�<��7<c�l��B�Q��1}WGp`=n�>v�����
�I�zF�
S_k6������K�������${R+����:��i��%_���V����:��I6���x:Re����|��$�u=M BJ���������sS������|?
{���*��*�����A:�P��(��J�Z*���
�SL�t���$QcI�P�L
F�F��F9wf#�jx���K�;����x3��C�����~�a�Q��m�j��kk�����/=#Hc=mtE����&	���1�^��������q�(����d: ��
>F�~������x*���yDTz�uD}yW�|�}���X���
��V�a/.N�a�z3^��}����r�����	���!:����
��G��+���
�@�h�>��*���5h�$���`��<�"E�'A8epV"�n���w���
�
��.~��*��T8�k�P�	+9��i���)N��.�;�{��y�nq��w+\3	R&���XHL�����#��hx��Z�ef���al�m���N�^��oL��U�������l�l��vlQ����~���(��L$��Q�WJ��8�*o����q'�����\1��~�%�	�yK+��dp]��I��Zl���!��B�x}�(���������?{d}.KW����������7� wL������<�wx�.8<:4M�d�����K&M<8�CF����.����%E�������!�A�}�Io��i_+^AoT�+�PD�1���p���n��{���E�0j�!��C�a���������RRo]G��"��B����h ]8������)��B]���_��fO�v�l�V�6�	��s�P�I��<�'*)�wm1'G�'o����1.��'�����X���V%k��N8��X ��C��������\�5I�%�������i���j��2�P,��UyA^��W7��o��b�\���}������.?w��e��;��"����*���+e����{���Dr�0� M��������(O�n(g�#���������w�������z�p��F��n���������=�C-%�$����3>Nh��>����������O+�N�������A��[������������+-��6�|o���\�������QFX����������n��!�����4���4dI
V�q������i�g
D������9*/�Dj.lc+@��@z�����S��<�	�Qr���0�l:�bF�^�wA��:}X�����X��6�7�����@�AZs����Q��'gA��_$�/v������Z��t���C���CX���%���N��J<������h��o���%[�V��~��N4�S^�r�
Lm}�i� h�v�����^E�n�h>��y������z����2�WX� �n~�4�����7�}�|���`S�o�q�z��@��2|,H��X�
5���������#��sj�%dv���,���(���2!@�o.�\����Q:A�D�8��Y�LD��;�v�i��#
������e�������c�.�=6C�T��r:�8#�(�eGM����RSW?b�c|L�`G�|f�z��U�2�����5Z���Kg��&Q^�Q��v�]`�<>�L��^V���I-�P��k|�{6��5����=m�l�7%�W2(��!T:	>�53*=9
|`�P��I��
ew��N�����OS�2M��>��I�A��>���t�A0�}��Y �����?�O]��":��"��p:�u���0:�;H��p4/�{���J�m��,�4*'`9�$���2f�-�f������9J��3�������j3�#cI��h	�n$�U
,yH�%����D���\"e���$���JU�� dt�#4�	
���c�AUD�����|�	a�9���#3�E}���� u���g���r���Z�+4��=�l�6���[�"Ii�gsz���G�M�+#fvgU�t)����m�������a�	cYOL[t�;�;d����������,����~��l>�P�9�������$������+'�9c��YFew�w�z��W�����sW���W�������D]���%�{�z�J��������I0���A�E�r�mS�aZs��S������������:�W�71��n����	�Kj\�������������-���*}u������\pusH�B��u�Nk��Z�
����ob��h_W���G{eK`f��pTx/�z"�t��a}r}���)���|eMD�$x��]_�!���{�^!�����6�=(�/'m�Y�'5`�mVH���O��$���Ygw%�1���������Z�����6@��VF%i��]�������7�1T��	���y�d}��@B�qs�eN
57�I���oj67�[�V=��]<_�.���K���=�0l��#Y� :��e6���R��?�z�0$]�e6���9�m��]�,Y f��8��-��4�{�������WM�IJdA�t����x{��p�������^�Cw�=�q]$���@�G;���T�����IT�~��8B�N#7�����[k�L��)��]���;&}����,--j
����@ce�@S0�{�W�o#h�R������!���3z�0a�2�������;��'��?���J�]��������K���Zu�%�������~�ls
Qe���n��{yz,��3��6�f�����|��}��nF�Bx��1����;���r�;:�JM��R>-�O�����N����M1�/�3j=� ���� O�E��L�uK���b2��~%J�i���t���2�/�]�
WZU
�mC��zl�w�@���#�����5#��4����.��������F��P�(�p�ST�KH��t2������������U�o��H�e '**$��"���%�X�t\��D�e���Tt�5�����zn}#��.�K��R������A�_u����pT����#m�����~�i�k7L�:����i!O������h�0t����H�xO��z��U���`%����q��7���5���%_�{����v���f$�?����i8��1�2~�=g9�N�����"`^�B�������5b���R��	��������A�*����\4�1@�s�|�&�V1��"��U4p����KT����� Fg�}h��_0�Hb���	���!��_=2NY2�G$�a�Z�),���y��n���a�.��O0-�����!�_o��+z�S���F`j[~�����^�\����}~���D�)?c���=�9V'w����~�X�W��g tz��������Y��d����=�$R�A������F�j+����qI0r >������u�
�t��8rV��p&�8�N�$���:e������C�U�p�Kx	|�)/��iQq���a�/��"�*|/����6):8+�7�>~���+�hL��'��4I
���K[���R���f�!JU�P�*U��s�f_>�#?��_`��o�v��>�����(cS�a�c�p�}��v��x{gO��*�9��E���/����IAw��<��d���EZp��X�Q�L\9�:c����0�T% � �;'������V�5�{,�(�4���2jB8���c��e�������f�R���3��Z���nh4UE*���gDN"�J�^��I��.�����Z3 �H������e2�q�^w��U�Y�Al��>��R�r������H�)�)���d��@S_U�
��WY��=
�`]��PFuAhhi�E��m�)Y�&�E=��@<����1zg)JW���O�H�))���3!�Y�K���>!�0�:����3$�N,��N��D:�
���'SR�6E���`�����������fd��^���8��l@� ���85'��b���Y�7n�����L��@��0�����^��������%�w?���_�?.$�X0� w>����b���V���58���ACm1������V����A/������Q�j/c">�/��B	P��K����:5J:e*M��������j�`4�Vg���a�g��M���R�-,<��������D��p	���r�F���:N?&Y:�>�A�(��g�#�4&���}7(;b�9��[U;oG?u���_��H��z)�~�spz!�	t���jE�Jvw��xH���X��QB��.�e�f�q=����%��os�}���{����'y�t�r��eQH��i����*�9 ��RP�����2�	tz1�h�(h�p5���E����x�i�m��3t��\/0"��G�>=�Nq�����`<(��oq4\��U�����B�N���n��RL|
!����W�[q�k�����p�����;Lg��*SO<�q�JisoifR���t��K����i�$����~��9r-��m�c�z�i;!������������e�������!yxr/Es�R6'�*B����v�g::�C����@�M��N���I�N{��/��@@=-	��<\��j�iRxN�w0u@�p2����]��h���H�g�.!�<�h'�Tq���9�e���V���p�����d�.�E�������r�
�0���m�0v��L����w������%�.���C�:
_3����*������������U����O�v��I��&�h���O�w�zL)\�u�3��V�e��a�F������<3I�"m�R�ts��]��lh���RV�~�6i��4�&��pd�������M?2!be���VlY��I�t^���=x������o�U����-I!��g�Dr=�N|��c1\4Y����Dl��GU��h��L���Og��)�t`[QfC�9��L�}�*�A����I�F�r&8��*�%*f����O������h;��^{�&]}R�=��oO����q\�}l�W����j�0:�]�{;l�h�����^T����/�x���J(��{�0No�����	��wL,�"��b���`b��}P3zz,����3���Z����OS���'�zS�8��gW�����N�W��o���i"�h;��������Ve�K���U�v�R�n�����af�������^�/��I�>�������"��V��=��{����q���g��[V�M�mPx�Kpv�&g�8";np��)����u�t}i�a�m�����l�St{K����%w���m�~_eW��G��c���o��])�����F5����~`&�c&G3����$V�����!v;d-��EY������|��3��A���!� �F��|��j���4���pJ��&���4����� t'��Z��oY&3�W��q4��M
���!�I���K�|���1/O �#�3L��[������Y����U&����_�;/�����n{|����d��+Y*����g��\��������>��T/R���0�-(A��d�����/�`���Tz������;���V���E�C���=wh!z���j[}��7 l�N�@�F�:�����m�pO���iS�T���<�q��kR�e����Z�����'�e>�S�o	� �q��,$S�H|�I���sU^�{�~���I[UoS��3]cW�.��.���?QE�K��1��NqfL��+���73� ����tm��V���O��;���{���o�)�U|���9o����&<��G{�����#���t��mA��h@[�����[��jO!�����24�R_�������R�<������m����
[���Ng�7��&C�%3'I�#J�D�^�,�&P	��b)p����dN�i�9�gz�z]����v~;�S��k�Q�0������<��,�@F+�z
+M�C���������`����[2t�m���;`�^�6j�V�w��P��&�C���4��J���Zd�������w1>Hm�L/���;�����>�T��sDZL����1CU���0?<��
K�mJn�X�-!��<�Y������^{�-z����#A�8/���3�H�iPy�����������q�Z�e���o�������tpT���e��U�d�,��h]��b�MGp2������=���WS����S���e3Z�G���p%�P�F:P��	��FL�z����9�Z����\��oR<|V=?���{��&o:���*V��2I�MMS�_�m})HM�4F����,�����A����WI�8�R��	Jl�</n<�t��w������P%%G/9����>�J�A�6�T�^�����yj��y.�-QJ(��X,j[�E}�* _������5p������?Z;~Tu��!�h~����C���t^�
	�]��T[IXs�8nW�=����n���<Z��fq1Vj��0�q��hN�(H�C�$��K������giJj��C���U>��weG��s@!{���lm�������;R��K��We�=I�i8�)]��$q���p+~>��/���/w����V����n�m�a�\�x��Sw���j���]�tBJ���w.<���h����������jQA8������2�S�j7�����R�u|��f�Y���9���]����6�YWd�Aj�Z����HpH�������X)�k(���i�l�U��T��P�"W%��y�9:��K�o���v���s_���H0��dsB������\NT��	�?���V�����{�������Vc�57��:��������CyO�9'��������6<MZ�r��L���dA�0tH�E�%���U`x�Y������h5���VKNC��X(��H~��wm�����\�A:qaX��������,�����'{y���gz�=B�=W!q��s�3����^���7!���z������P�rI@G���6�Z������7����+�;��������k�s��^a����p���������nd����,v�)|:���u��������

m��2T��^���l�>� ��S����>�6��������
B!��m��4J�y]N��$�.�{�:�O��Ov����{'f4� ����!lSP��a�$h0�^����������F�5IS)c��	�P.�&��@������)�&��w���)*��������~�������t@�a���sX���~B#����x���#��XM��?��J� C�Nocc�Za�Np�FW�hXt��z$}����sM+�Xb(JE��8ze��3{SE��/;������h�:��� y�|E�]b.+���H�jG���|Iq�lx��O��%E� H�<�7����H��S�FE&��U:�{�0�9�VE1�'*�@��m�v��G������_�s��y��GKz;��
4g���z����W���q��>N��
{AF{�[x�8�I�"���G�XG6���?;Cas��g(���4C��p�8�7U�kn�7F��\�������:s�A�����b�Y��)u���C��������l���{O�Xm����ZX�z5L�\��CN�z�@����(\�Y��l.�m��Cmu�Z\\m��3����h������ �M���-���k���z�	��|CR�0���*��A�)�XB��'U���i@X����G�<4)U��%�>>l��A)mH��k��S��b���Ks6U.�wIa�2H��r*0�g�����C;��������*@��h���N�JF}��o�6�|��N���WY�
�P���?@����^i���I�����8@���3>�����.t��*���E�1�IB���kz`=�3	8�����	&U!�w�J�on����sG�%D�Rz�$�v��C�I�
�b��O���V���ff�7��m�d�N�NFpT�4?�����w�g�c�V�� ;������x��������z��F(T��[*gN��^��"@1v*������������h�.(#��O����a1-�K���I������x��^M,)�Eh�G�W�i����P�VF����n����o�!�QnB���������P�p�r��Qb�$���� �KT��}M��I��V�o�:k�PI�RI�I2����ycd���D���>��?/����9�"��kc�:�e�{�T����cB�T/�I�x��7(����l2�is������a4	�a�`�`4P��h�0�������I-��Q��K�D���N:6	ZI+?~�=*u���j�(CN�]����e�P��,r��� W��Y�������Z��-�y�-R�.{		ye�<�J1{��-Y�� ����Y������@���o����9�b�y�ak~~�/���'��������pp�Q��\�FHr0��5)����0v��1'���/ES^��R@���}�+�XLu'��W��1YU�fc��;p��<�	�_�V��Ry�b�O��r�8��od���}�}�A'����|G��4��bi<����}h�b��H�-�0.���-V���8GG���C�n98�����dDn�%U�Md���Q�>3&�`v(�R�`If�5JA$��w�\n�1�Fa@sr��]$�F������FRC
cr��5|Xk�Di���tH��c�n�>������0���,mr�<K}�
/����xxth����TV	�kM$r�^�kcS�4�F)�uc���9���<��h�Y��X�G	e���9L���7�Y�O�_�I8*n�5�C&�Jz�T��G��r*v��q�&E��n�m��������g;����=�?.�b�n1���s����PA������W1���X|;��iFt��_5���y"�X�[�7[�����u}c-���q^4������^���+P����,���U1�$e�dITs�0�-��/�P�|��*��TT�V��?.,�=�@��O��j��	k�e3�6�s���_&������v2i��^�o�9z��D-)��F?�]�l]@��)�,����;[D�ed��f�g�x.����.M�t�U$�rZ���6Ud�592)h�S�&���-�?������o����ml6S�����X����h���F�q4�tq�/�nF�����:l��W�zXb�P���o�����lj���$e�S!�
m����S���6��l�.Cp��2��w����*6'u�0���?'m�f��J�5H`�xv��[Y���/m2��{?�!K��d&u�PE��|�#v
�h��'J}�6��,�U��cw�����H�
�u2�[w��Eg�[1��0�\E|�/<gl��'��7��J��y��s�l�h��7�L;���L����^��G��UIjU�LI����rus���s��u�d�����m�5�u�p�0��n����������m��>��.�BK�:�\k3���������!�LhB���]�$�X�V�_;k��-k��s��{WY�CL)ih(�m����?#~��T�N,�����V+��h���%l����I�\I�06W���N�v�Nv-u�����d�
����z��/��)��I7�N9����.Q�7��Z���m���������BIgC����e���Ze����+�B����63]�p�]JY�������0������N'�p��[�fu�.OI������L/����I�������[
���@�r��CQ��V���/������va/Y�����#�>8�;���e\��Y��e���
X�5�&162��Y���?X���&�+�U,���)�R��	4����jU���H3����}��XF��&4[��P��{ms����-p����D����3pHK"�1�j�7Y����a?�H#O%�D�6�<�c�)]��W"��8p�����3�/����r������iE�q��_���WA��F��`�f8���M��&����N�S�Aw��a�"����~�@���S���Jm���h�k���0����M�5�>�_��8�
>�� ���0���(������@�@�
�����"��/��C�D�-c�u��#5$�`�!��?�.S���q{8�F���hBm��8lO`��8��v�?8D��,����~�����-o,8�j5�Q��c���UO�t������<���U^RU|�bss���%���^[�|�FG�jo��9e��-�jf��Z'{g�'�����{�g�o��lQ��
Q�P�����u�2
T�w��4���g@�7{gP	�-{PV����A�c��������2����6����D�`�������"�������`�p�t�5�"|���'^���&�_�a�?��p�^�~^����r�����P���0�9pX��K�Rk
RkE�U��H��v4�d�P}s����BQ�V�]|���G��S��v8,��e��1�A�f�1f�rnuZ1��Z`���w�N�_��tN�p������G'g{��(mn�;C:(��L�	9���r�0�wp�)��*���`D�%�����i���'B�i�P2�M1J=R�$0���>dZ��>P����CL�;�X��3��b6��\!I���N�0�WT��~�rW{�������]�����0���re"����?k|��jp��d�������S��4�?.�� G����D����'�����P[_n����8����88��@��G �wQ�Ft��=2`����������m�����q��[u���$��S���W�;�uR��!EOvag�GW��s���95h�9���$�/W��7������4�'�E{��'e�[�����hG���������N�.�o

�R� �I����i�x{����@���B1,��UP�
��,����:x�h��8Z�(�*(��d-����{{|�}�T�X���^��w���+�<X��7|�e���s�^��I�
o!m�\�q�7�������n�[����x"��`�� ���y�?gL��RV1 P�T��?/���y~��V��t�9)j�Z����a����j���	�!����t����S��
�9�}��pwEA���I*��tLr7��Nd#8m�W�*�"����?�_D�a���OS��vg�!r��@����,O��C�[�s�L�H�����i�g��2�����a9���=TC��9��&L,���?UVQ�F�������<"L��2����TX%TT��,2�����8�C��6BA��[L �����rHo��|�dA�A�����l�;���C�,:��
�qO�Y2�����;���x������(c](�u�1��\����VwN�N�����|�D�8a���z~��7�D�2���x�l�����
{.���v��?�p4���:u����|c�f�>��H��b����B?�(��J�vU��D�(XAi
4dSc��yy*�:�xv���r��*����$��R"[R���Ol��$!%8>�08�?�t��1O����r:��P�k����afQ�D3���D��a����`@���F�l�NM��bL����cU�����S@��g�rnpQ5�p97�pU�����x4Ceb��p�W&�<���a�l��*���X�r��R���]���f�u=��k�~q0a�O@N�?X,.C����'D�hD���n����*e[;��+�s/l�@be�)�7��)���~Gt���Y�?�j
����'�uF��h��_��S�W;������hr���%�*�5�k,�{Y�J�����B��<P�Y�s;�uU!z����B!��v����Q�<����OU�e���������x&�1���P��k_��<2M�3;q�]���DN���svf��v��q�P���1t%��+������yR<)� �-*����e�Y�nm�6WG�a���g�6�L���7�1��g`6jR��a�
q����fH�~u���+lK�D�l�@���"CIA���R�a�+�@V�[�� ��OU[{���,
c�.G%���2�	,t5��A��~�Cv����Cg������~;*$��K)���9eZ�E0��r#V)��]tj�����gW!1��
��|�X����ht�|-�2t|8!5�����4|�#!��z=R�����
�9���
�<b�;�����m�0����&���La�5zh�j�N=$;pH����jZD��M�TR����FM#�9���hI#s��&7�����bn�a��7��+X�1�ec��a�O��UA�U} ��R�#��I�
`{p��������f:I�HZ����%���e
�2qZ��.����d�l}�w�*��Ti��P���q����x����;���W��S�q����^�+&���Z��Cx��7y�8"/�`=�`�:0���Cp�E��f'�.��?�Q������3�%���y���U����� �������(���`�S�*)e;sl�����������������"���7�'��OnC�����sB���_�Zod���Y�q�-�����^��\��G&����?��n�@���-[��;��������y�P�BLs�'��%��!�M=��3�Z�`4���=��X/��d�������t�&�MR�8�S����wa�r�8y$OpK����P��d���m��q>L�0�j7�Xh�9�6�^W)�%�
U+%����i���� :�p���i����������>��P��)�h��#�5���vQ�g6�P*���'�����i�o?���d�����14�_�ib�l5�.�T�T�W��\��
�
��-��d��/�(]�_����1��-��{���Q��H�������]���'����9�������)�2�����x�h	H���h�G�|��_3���q�l_�W;�#�����Q'6�$��?{1�Eer��V�cH>?�����$ ��.��
��D(�EZW�+���O��j�P��Q���r�5������a{jrEj2
w{"���4���G���Q>dS���.I����=�I!��fx�Y�54=�L����������5A�(�����	&��KY/&y�����=��q+��((��%`�������M h�����Z���v���/������f_���]&�u��
����
)���_�RbYf�$�yQ�e>�d�F)U���$�bI=���k�-�x�d�j��5N���l|?��b������S�8�"��/n$���
��]��/���*��UH���D�����%+����Yt�_uM0_,����u�zh�]m5��@z�s9)t��?����4��//��?w���������5�j�z�G��l;�=������2G�O�kL��!R��8Q���j�����K
�O
$����`�	�b�������������0~{�(�R��X�����H�1>VS�!�P?7�0	��,���������Ej|�y�A	?����@����`��(N/��Y~0�h(�o�����#�^ux���LL=����x�z]&��(��Y�=0V�%OM�v��ve�
���]��R��*�D�Ta4�J���,�f�A�\)���}#/�$���bN��S0OW�3*r��E��z�z��/�=��'��V�u���f�}���[�c�h��XC���:�e
}�5�z*x(���I_8�g�I���3y~���� N���p8H�~�|��M�oS�m
��0��0��P1S���c����i1��BJn�b��G���j��Grw�����5)>��eM����dXNl����G���L���OjfA�� �	��S>D$���A���.1l�>�<N~{n������,��$/8J)d�M�;@���n�N���9�fS���������8���]S���2�i���9��}�tXu:���Ao����J��T��,�g:�������=Ddn""���
��
n{��T��&��w	�/)	������x�Y���2iQg@_e}��*gn>�3��d�IKL{���dM���[���c��2�#K�j��=�ut�9K�F�*l0�"�.Jzc�a�Y����4z�Vhe���=�1��-���]~�6�W�WGH�����������}�:�d��rL��y��[2�]��*gv�e�O���v��y��l�
��"��`$����.v����[yv_9�@���E^gyV���e~g�K��n_ �������S`��y�K�S~�.Nl	��C�`1����T;u��x��G��a������x�������
vj?/��.����.O��!yR����g
jq�P������#�H����w0t"'������~t�

Nw���
��c��8�(��>���1��z�xt&�b��D�@&2�=�rNc8 )������\�A��:�06���v@������3��>�2AX�%�0TPryT���K~W�����d���L��CR����-�$�fm����B�zF�OG2}:"`�b�����o(��7������k��#<�t��s�o��}I)��$��;w������t^b|:�u���8!7��"�N��E�-
�
s������=��y=��}�Z%�-�����_���1�`�����2L��j��O~�����1�����s}����"��OG���%�;^���~�����W��v�
&��j���U#��B)Yl�T��w�6V�E����k�q�b�^|�aiy�q6�[��G��_����s���V��@��<�������U����h����_X�����f��*�Y2P�]c��l��l$��p����=�(������,�\�	V���a��%�O�����`9y���r����C��!R��}����q�qRG���no�����2Rp��bQU-"����}��W�~�x��E�^R�2�i�0;]/�D��H��Yq��f�R1�2o31����#�m��n�����f��|�}Z���W_��.|G�=G��s�x��E���&!S�d���d����A�`n��{�L���rs��v|����J��H;�����w���=������(z���?� ������w�7U����_J��'�n7����c�b�S,I(����m��9h;*r��Z�8����stq��
C�jA��\S�fW�0�W��l�v�_��o����#�������w����M�	���s0�����s�yIee��NTw�|��wTtV���w`/��2��X!��p�M��#���I�������>�-������5
��Q����C�A;=�0;���6	'0?OAz� D�GO������<I1��'���[�������(�������
�8�-p=���I����v��:�o��Al�	 .f�w��	'bq8Y���T�p�ry������x��
����=����R����(�pj�"��
b�i���Ri����76-�F2�����ee�.�t�K�>���0��n�����Z-h�*}��L	����!��J7�+���|]N��0��a�kek���^�<s���$2�<[:���.P����;C+Vf��?H�#�
������FU�����z�����7��~<w����5w�����F���o��1�������"���4%��U����������VS
����HI��RI*R�E�%}�����[/��D���K�f��*�'tG7e���$�V��r���v;�<Q�L�H���dg�$�f����&���4K��,���i�Cg.d{�}S�����Y[E������s����
��:���m6�`m�r�BF{s�U{�,�������_���
����0,�\�r���I�����q&�mku����D�)5=o�(r�dE�odW����1@5���,%�7���-��&��;6:�Zn1��7
��zvu##��E��B��rh�\cs��,y�6W[��W���t�lMN�e9JYq���r�V�{&mB�=�O,`R
'R�����B\�t��nc���l������U��nO=%3`�����J|.�G5F�� �v����O�T��k�%R) ��t��~v����4���L���/|�fT����K%��vX
pe���*-f%�1�m�_��]����aY���������}$���?y�&�
Y��+�D?:c_D�k�|N���a<��{���.�A%���9��A��;�t>�07��q�8n���$n��F)}#�HksS�;d��@'S��'o �����u���F4��:D��*��q�T����]�����)�=uwf.�)`I�G�\��zQ7����
��i��*��_P=V�Yx�L
|�5�H}7����\��k��^����:3jX�g��jX��r".�����l���������$�T'��:���uD3�TB��~� �E�M-����^�Z��}C3�,�9J`��(ml�`��xy��������?)|HxR���0����s�������K]WH�z�J�&r������NntLw9���o>��#����e���������^�*x$S��&�Sl�t�����".�L���1,|��5G�NH7��Th��4B�5�E5'<�BUC��{��{�p���������Q'��x����WO`��&2Ry�����������D��J�M��@�Y��d�`���B
	e�M4��H��1el�SPQ�8��N�]�gsA���8��14��#>V���p�p���������wS�(;1>�u�k��l2����L��Y~�Go����.��P������X�x���w(�����L�%YM�bK�$�N���j�W�U>��;����\R�K�-���.?�a/h����{�����r�T�tF9�[)Y��J�$��Oa�!F8��)���(��@5�?��J������D��i����%k�	��������x_�?��p��s���Q	����x&�u�J��x���V����v��@��������*��*_�E���ct�t�=:��UV���+X}�����2]�YV���������$�?,R�����������F�i1{H�'X�yr������ya jf�0��M����m�2�v�������Zw���`hoa�T:^6^*;KV������t�O��uEcK�����������fM�E�����z�����=fu�k;�������4��/~@�������k{����}����>mv1���e�zK�!y�X�$%=��@�����Nkv��'4�_��	��/{���\��5~�I���-���g���]��e��2���T�L;��a�I��T������;��p,�������<u��5��"�����NO@������8���p��(��D�]�O�?.|��P����r��%t���h���D���|�l��cm�o�y���G+���CW��l���	;�G�,O�A���@�l��*�j�X�\�@�!zE�/t
Z�vo��uP&E��
�~�X�~�A����x��p��f�p���S��"���e^<48�k���vQb7��
����R��o~��>����i��i�^���:������&]�Yg����S
y������.A~�\!�����F	e�k����v��{��
]"p�2A}1�,��\���������Y��/>0�my������'���������,Z��))@j���y�_�
�4��2
���\x5=�N?G��LVp�eg4�g�-���W]�0�W����iM?�tj��V\�D~Y~��L:~&}�\��	��u����w!iE*/�L#�|	�����X^�F�0_����O�����Pr�M�:��f�����U�.;��D$B���n���=O4���g<��dI���OC8�B���POA��6�r�'3��I����2�u�W���fv�FNB��)��|l&����
� � �;>q����\��$kU����aq�j���.��B8p�@�~��u	�$�
�����Q�7��<�iE����$�^�)2�*9
i,�k�n<�z��!����B"-���,�����G:u�2���dH������.���8���<������#rj
?{1�3�,w�&��I{���.T6X�����}�=��O^�hO�^���Lp8��7QD�+���>U��O�d7E��n}��L�wc�k���i�w�\�%�yW&��CS����f������1i�ept_��A�\��>����������Q*I����P�U��bl�R��;��1�84���0��K��y����L�fzc*E�f��A@M@NF���Y,
Sa������T�X������� �(�(�"��:#��@6*����d:��W�WR.�S��h�������U�M����4��q*�e$� �m�j)��������>����������9IE[�n�d�����}�~������7G'g:��!.�����r�'���!XD\�q��
�+"�}0�H_����'��8t�//&5S :��>/}}i�"�,2A�~v��mI6��d����Frt����P��.�����{�/)�/,�p6�vf1m���g�IXz'A��*�����F��2���K�R��������?q9��3���5�����@a�!�(��8B[��;������j�\���S~e/^$T\h�["����E���av1������2{�H����|�a{�A�;��= ��	�O��>!TG��qp����rm]Sg5#*���u��++�P0�1��
	h�{'���n���]��ad��MW�~0c\������^���I�&����Nt4�VSYG��H��Y��B��^�\�����5���hy~1����&�Y�����3��)E�[�����a[�As��vD`N�`K�*1��i�/Z��"'%M��o�*��|��\�
wu���XYYC�	A��qz~��qM{!��^!!/U����ka��+H~ne��/<��l�8!���'Cnh)9(j�n��I�"��������mA=b�K�{���������yU(�
�(g3},j�����W����Q��W�����,I8/Z
/;����K~�����������0Q�v����3T�����:��+���?��]������!�P�4�����71E���w���w�l�ud����4�*�#�FY�m�?T��B�&4������9K��Fpb��%
"�w(���jj��xb�d��5���l�Jd��7{g�g'�;gr���g���
�_�/\����i�j���	�:q�h��N���|��"��V�3J������Pe3���O�WM8��������
����}�dw�1�!j��5�B����7�nbR-�	3u��KX�m\��W�����=z���X��W1���e��/V�qw
��aou:	��j�7Y%�A�}������&�WT��57��sX�����k��qtp��p}�����*��#��D�J_	��"���r�V��[k<����7��4�]����v�7�h:2`����������m|R�%��s�t���/�aa���W��ALQ��
�x����TQ�.�I����MLQ���f��_�����������������=*m�K�@<�>>�*M������p���Tje ��*��W�����a���UL�����j���	
n�_a�59�|+g�{���x��:'�o��J�
o����p0�i8:D2R���ro_�?r.qU�`2���a9�Mn�T;�.0���)ft<�]��4��v��[���%&��A��1��`?�T�A�G�������d{�1����?�G�����w��N� �\G=sQ��
fR��������'am9!��)B=��_�
!�
PO��E������W��xJ���������m���������0�;�����RI�(v��=�C�����C��`8�a*�f��<2�5	3o�����Aq��xZ��yh	�E�I�����P����5���U���!uX
�6�N�D����Z��78���O��#���uq��q�LX=����JJ��������X�%�1��'I����,��m�2Z��Ef� ;��6Y�|D/:���I�_���{
�2s���u�3��a�)I����_�
J���4A9[�������~�*
w�l`�DHbFB�7P�R�|������2=L��
��X&A��-�|O��Gf�3�E��X��%�J�p�����ntLQ�uvP4�������]��/��K����-��i��9�CT�I-n�>�T��)�!�Tsz>J��3Dj;��M��i��9��Z���@k�L\��p�S�$������Y#e|�(��n���p�{<���R
��0�5@m�+{�bk���
/9t\�6�0�C�[:FEU��D��K���<����Ck	g���LS��=j����	rlh8�R�;���2t��_UFn���R[M������o��~G{�u6���>9�����`M��%Gg�2C��e�O����O�aS��I�F��
/��#��H�F����Dn�D��NI�
PSV\�K��%�e[O����I}���Xs1g����_���\�E#}a����5V���Qj9N�]b�0���C�b�����M�n��F5�V���_w��6�+��D2����!_�UT�vU���i�w��.+b8������t�������w{;�}���������2&���EP6zm�\F�y)y���-vU�!���!@�k+�P����"�����6�|�./�����x�c�2JH<Y
� ��(�`���I
���O8
)UU.���/a�Di�hw�3(�1�N��BM-Y������EkP_W�j��;r�r�UG��+���t���������I9��&�!��O+����d�t9�ve_�X'u0��gV���j��T]q#�[q�P�B+<r��I��h(�ykRf��S[U�����#���*-���R��W�����5&3���>���U�=�������Y�����QZ�����<�C���8}��6�>�S	'O�m!E�����[�a��>��ew�fzdw
�.����3=
��������<���>��OXf��
M�Z�	K���8�l��W���l���<����]9;�!�1�W;�����3�I_-#��x����1%���Qs.����i*(�+hU�%���?W�T�u%,���F��"����(����*w�$�Aa&lT7F���o���"�0/2O��s����A�#�*t.�?�O��@�0�a\��p-���q
0��E��r9��0o�F~�)g���.9�E?o�n�%0+��T�#����J��Ej�@c����fU��#��n�3�s 5�!5<SJ�R p��Y����R�sG���l���+��O��������H,�{���{T%�������I{�e=�����n��_��)1����|gBjZ��J����tp���Rn+e���=z���Q���m�*wh�iFw�+�\�a������-/��Y�T�LY����c���6w��v����{'����W�s�[R^��:�+[{7�����R��l���w��. Z��i��f��������:e�p����z�T�9Oi��]%���f���]�yl������7��7����gs�y���-O1d��[��rx����mv�r��ug�����fl|��_��{���?{����6��=�V;��z����\��M*o��O5��O������KB�2\&���u��) tc����S�a@�4�����mS���E�A|�@]3s�'~F�r������+��P~}d������@^�,(�����Z w|D�!�.�AJ��Q9�p�14��S��lT�%fZ�I���lE�rFa�>
�"i���M�=�o �4���vc�����.�]������V6����=��5zmRm�a7I����>'z\�s]�������6����3&Z�)�m�74�5��)<�a=����<�I#����6�Y��&�]�a�
S������~�k���d��*~�����L��!��r2���U��KgO��?��_r�3fW��Y<�qO�J�i��B'�O���~
�e��A��,��K?d	������prd_m�C��		B���>�&p,��s����fu�����2�Av%�L�������zN��`��n?�Q>N�+N�
�6���.Y���m��p5�
�g%A�%`�,2�v6�g�fpen���I�^�'���}ro��{)�Rv���C�E�h�`La:��<�0�g��9���9	��t��n���]��0�Zo���c�'��>�O�?�������Vk5����l�-���o�������Qw�Vd��/�g�fI�q�
Mo5�rv����]/�O����0C��z���yQ��ly�Y1V��8?��9m������8����� �.%�.^m�m�>�����(@�jH!j��I����qZ_�F�(�
�����)��T_a�'�� �pQ���f1 9[Zn��,���c��z�Y7���gCq���	��GW��E�93k��rN<�$=F�bZ�9�I��cD7�NN�x-z�p�>j��66����/I�!9h�E���	4^�'��I�t����c�h���G�`�q�8k��z������B��Gwk�������,m�����"���V�)�d�#��6�k4��U��.E�0nC8a&�A�T]_S\���N��-��#�Z���������C^�x�T1���	A^R:@m���S�%!(t�������)D�$N���5���Z(�qG@�
��Tz�_KIB!$(W�'�Pm����/SU\�x�O����*��0L1�8A�F��f6�[������Q���7�B
������+PT�rd������x2�� j"]=q44TF#Ecd�H��|�#;�����+���
3�lb%��0(J�j�!I/�4a�-����q2�I�Ml�?�������v<�?�a�0�OKl���OHn����d�N\�g#��R[�M�Dj�Eo��H�r��T71���oA(3�(M�p��_(;��}��X�(lO&c;��*�A�����IP��^$�x��I�s*���2���V�����~������YA�|I�cW/+g��X���`}j6�8H�QL�����e'�8�n�"��t�j�#q����o(��W�|8�x�jV[��x�n�8�<���Zw>���'H��i�3��kk����+�*
�,��� ��}+����~��c|�[E}m�����ot�,5j�M��7Z���>p �?��*7�+L�1T�ao���}��?��K�U(�TXK�K��&��-�mB��N
������{����f��C8v�#�������l�;�0�����[�����(K4�����3������!�q~�$wq�������{�R�@D�}�3@��k���t��_��A�K���R�3�!�1��Z���TE���]
v1�����'n��wI�����j����c����k�����\q�S:�����7��|�M'�s��4����]������=������"����[t*��������aZ��_��>`��D%��HZd�:vM��7��HS����)�y��[��vQ�3����1����E"��[�����hW��`y;���������>|�H�e��:�6�a�d�Og�V*�Vj��Y��p�/H�j�'C�3��O����/�V���� ����RX����K��BS4c�����CJt?��@�[�-5���h@w���6�h��L�b��DU�1N:RVZ����,���	!����������������:��3��d�,|U��:�W��Fu�����'��\9����Z&qr3+��-���^7Z����qje=���c2��g�
�Q"WW�>\�U%����"�v�q 7��)��4��x�`�tZ�`*������
4��Ez���>O���;&�6H��h�%[����\�_x%7��-%���|jEK�<�%�������
WI�������&�1����x|v���l5������M�V��n��72��R�'�2���Z+���e��1���(�O�}	j`x��8��P\�+P�����,'���[�0�C�|;u^�2��oIr�g�
2���6 T~�I�:�Zc���\����G3%g��;��M�������y�;a�^�����5�`nZ��0h�Q'���:��j5��h����c.����nB�%�l(�I��1G��n�t2V��_v&�1F�������h���N�r�N�z����{��Z���7�R���h��\�YNd��T^z�s��������6����;^����R�ks���h�(u�����
�V��a��V]7f@�������3b��~��x!;E;������7o1�
��_��3L���B�m���[�h���}����^�rf�
,���]I�
�L��*�v�~�<��ons�v�p���}|��+;>7�,��[C�����)�]��7�5s{{�\x���%���>.
���4Xr�;nsi��b���i����<��+�$v_�8>��z��C(��Vu�x1��>�V�G���ZY@�C	R��Pz��H���Bx��g��4��p�������U�UY�y�U�=&t�x8���8��
���hOI�������s�2�����}�����k0u��$b�����{�>�O/���*t��>Ndr=�������RdN=����ojr#!�����i���`��Tc��|��w�A'L��PS;�����;v�>���).��.�ZLM:��ON�Z����� �5";k/~\~9a��e���mEC����T����rg?�������X�n��5C��l�k5��kk��A6�G�=���'��_�&�4��
�m��3h�����9)^O�}�D�Z}�L�;�JP�����}��^^���3l����,#�Z�zA�h�~��xe
��W��TE~eb����Dq�r	��N��?�{�$�yu���qW�����H�-ul�+�}���"�^8:��3���kyd`��h:��T�������og4
�={�kI�d�p
�����y�*������L���T�����G�����J"�j���vq�
���V����������'/x5-^�e#�?����S�����7_ce��|}r�V�9[����.��|��m��������D�hN���>�5��_M��V�z�
t��C��5Z|��+�4���8GE�m�}���K�����S�*���������������
���!��!o��������0��
������ u�����_ ���K,�IX;��;��{2��&��	������>D~��s;����F��z$A��?�B�	����i�����Q�������"8��I��_�+�l]`����iOF�oi��	������p+�������w� ({7�Z��:�3u8FL8��n�1���x[�x{���������~k��o�����G���,���9����������>e�qQ�����,ksg?b�)]�th�r�����`j�<��R,@�b�����������9:8���&2�,�=���w�OO�r���?������6���i���$���Ux�/TG���O�*�L!����:.�`���l����r���|3doY���*B��mH`#� �b
���4����!�;��5tz����r�����w�^o����7rU���E�O�j�^��O�SK���Pi;���Xr)�b�{v{�P�g����9�X;��R������@{���'6����-���s?��*[�'���C9�g���.I���&���f��O��R��t�{)��dsEl�
?+����[����	p��a�B��8���E��m���t��0O�i�����F ���+�XMR����l��h�k)����>^B�;`J8� T`&�0��SJ|H��A���(�
X�����2Kp�3yt�Puv�D
������l�I��l/��?�w���pU�&����1.��k��5������W��'w)o.��z�
��!�@�����l���M����S\j�G�F�^�m�6�A�l��\�B?(������o��0 ��S+��xx�}���Q��A'�������Q����%��5k�$rw4=�@�����c\����A7v�6A�B�M`���E��
�q�#B�z�kw��}���:��w_�����Fq�n���m2�sI?I�/�Y�����!�x52k��B���6"�|�4��,iDR~��G��
�����k0�����"=�`����38�}��H8��T6w�s��U_����h�w�N��Q�P:�h��B���*��U���k~����#��r�������\����5���-��5EMT��>�h�����Z��A@��bcS��f����6�L^�B�x�k���Z�n6����`77[�xf�ip��y�4�Mc�6-n�>O�5n�����t����P���b���J�LgC�o���)��F��9OI���m���[��Pu��[�yp[�6�y�lp�����m����i���^�Fks5bN�Z�������H���$���������7�z
�G~��%Ee-�N�\�6[5�]�bq����@J~r����l�LW�����u�.P
�u���o4��F�PJ���(8�w��0���E���(V��u������u��.v)�9���}����'G;�Z���glS����z��P�"\�a��A/f�����sq��|�|M���i54��F���
P&��ni��5/w�����!$@ ��O2t9�L��H
��zcL�5E�=��z����o�hOC�n�<������=.�k*��,f��|�V__�W���:�������`r�b�|�M	���Gm�@_��l}e!^�X��k������K?��X��?jxf���6�v��g}���#�������C�8���W���eI�(�'�I8�\[F��smR�Tn�
~�Q^R(k3�f�}�2�v�������#���0�w|��A�1(�	�u�@�?x�X9��q�Y���_"!�
��0K"��\�Dd�i��\�@$�q3p�`\
��b|$*3��F%�M�����(l��kbX^�}k-�'^<t��l�������������D����d�rj6� ���{���K��Y�U�x.�����8���M�|<���1�{�C��B"���U���T��e,3_�
���XG�s��b�b�Ia��V�/P����9���|R�:�Uq���P�tXz.��\�Q7p�d*���9��]������R��8����.c��*�t�rs����� N���@a����dv�Uc1���H��)%.��4��_�
w��}?�[���������d��������B�`'(���T'�h��;R6����3����$"S�Y'�r��@����[���~�82}GQ��������
t��A����QY�>5�����l���u���`����Y�i}�s�L��w�|��v����"Ws9s�F}�Zo4�YT�o���\��j��\>��`T�ut	��K�7�2f+���y&S��{�(;YJ��]�`���u�*(C-�o��Xhl.��p�����|{m��/t��X+���,0�q��ff�|�S���t<���*�\u��U��y�_�z��?�dn���.e���S��al�i��bi��9��������UNz�[���������f4��J�~�'G�3C�E������Ds�o��I����e�]/�m��L�}���l�������t-�b���Au��lT[���;�&,k��pr������a�LY����6��$�{������ 4C;����L���^'���\�5����#�a�@�l7��

tcM4�g�����B�_=����M�h:)�2mJ��"^Y4d�+��GK�{������z4]7x����y�
*Ma�"�;��a��A-JX������mV��q6���{wE������TQ1��U�blgK�mc�4�a�9^o5+=l���(@����0��{6��`���~T����D���&
G����@��(�b�����CB/2�8k:�����o9�i��P������&���i���C���]�����
�eO��F������:?K��(,�~���Qd�[J�0x�s���|���H�P6��p��<yRd ��������}E�:hcd�[�����e�N�):-����z�H�k_���`�+l�`p.�v�Z�V���EFU���n3E����������o3��_�����{��}�q�;�[M��EA�<=p?�\���m�����_�Kp�p���o����u5z"�������RhN�Kz�.:��k8��~��,��}E&_�p4�A�6#zZdD��������n%}�a�ff�;G�9��8*.�Q�������n0�?����������mh�����X� v�p����|�Y��W7�W�O�u��
�	�v1�[P�ZS:1�E�������B�]X@*�ic%�u�!b�9��������(���<,���ql���� o��B���c�����fbp���t���Jp;�b���4o������f-9���.���"��KPw��c�'��Q�>�,R��� �����3�1fiz�2��|�e@���~A_nI]MEt�{{�����{�)0e��e����h1��[��c����s���cLv3�7�c��4[��<�k3���f�1�uU�����M�a���%
��Y��
�����"G/����
l���Ya��,<��?�Vm�4����Pi<��s����A4��F��A�p:�w%�+���{#����g�Z�����@�b���F3=��cA�v��6?���1'�u��l�O���js�4��[���W�[s�1�fz��b�bS�I<�����^���Vs}n�������dAl�=��3�.�dIl�=�fz����r�Is,����(X����F����X�{�5��3q�q<��`�{�q4���,k������h<�Abs�[s�o.tt��kks�a
@�=���a�1��=��;�[
�a8���7���������}�F��}��a��{~:>����B��]���pPBH����$������".�.��V�Oq�$��W7�;9:-���0�&�.2��
�-]����` 8��V&���p+�-ox%�@�.\s1V1k�c����ht�65�nX������1@~O������M?��������A�G��f�M�����S�7"{/��+���+0		ZM�����lu0�
TV�1�7�,B��|��R*����3�!C���_������������L~�~8��Ab��rb�v��E<�����h*3�� ��VV,������/��x��97�7�L�c��#_BBI~JWH�.�=�J:��a�!���@�9aH7Y=$/�5��.��Vp���ei>������uFUF�����E������}st~�I����#��KE�~^���(Ia�E�3Z��c�6�������v#�
+L�`M4�)��c��9"������j�8�B_S�m4�r�����"����V�n�{V�����y���5���L�i���;�9[�q#�"�L����h��SpB,�=k����4<����B��c�w
{��#FY���|���NX�,<p.M�-�h+3�S1w
k��Ak� �E���I�A�C�|���3���S
c�ao���ZP��WI�{�����9�Tj��,}�r��'����K���j���TIgq)�~�h)(wi�f��M������e�$��Cu�/��3;a�8��tzqF�_��y���v�#^�U!�l����6N1�{���8�0}��3��w�~�A�2���Z���f�����{����66���M�����G�r��ZsC�.���m�����`�
(vIv���@
Z�`#��<vR����%�Brd�@69����������nh���������hY��C�m��k[�YQy[d�:�5��3��#��f���qNO�?�|��[�-h�Y@��u�b"�!
1+��)�����t�mwO8����u�����J6�}/%o�e����@j[�OK*��Qb-D��.x�6�����8q��TtN��A��xD��W�p�F����T~��oe��g�v.�	��p���mpWy�ikY���~�+H��$���[���Y��mx;�4����
s��Y��%�z*H��$���C��,�Y�d��&���]���|+�:	h��P�����R����t���P�3�spOQ�~�~�m���Y��ms�]����=`������:�g�sqO�������;�of������<�o<���=j��}#K�76����{�����w��
:���QL{�2�/^�r����7=�*���(lgx�	�c�d#q�N[MU���J���U��R�������`�b�����f��\�>��;�^?�����U�o������/��3�H�������>�=�;a�5?��gLY��*L3��N$�9p]�ik�6��o�^.h����N��\����$`BiJ[�{�v{��TZ�-���� ��="~�������I�6���|t���kr|�w�{�F��Z-���n@���E�`�s%�-v@:�9:������L����E����l��>^�	|t���7i$5Z���������������M�as�7u����������H��t5rj�,gd0i{'�;�����*<K�pw�x11-�����L8�g'��o��if����{��������:��{'�<c*�[ ��h*�(��t�X/^��<�{�wx���U��5�[C�Y��G�n���*RHW�!�ia��1��Zc�JF�=��*Vbq�p<�8�`�����z�<�|��hU�Q0��x(�	��<�����ht:L���V�I�Z��N�o��f�G��}��V�%��%	[�{T��{��gF�=������_���kO��~��a��S�7m|b�;�`����]�+~�i��bq��;��8���n���������8�"�m���S1�<�p�0�1����[���f�E��h��CnY�Z�u�8��Z�3]:k�����0�!e���!����&��V�T����og��!]�w�7���hx^M�t���Yu������S��h�����
�x�	�/���Td����M&R����;�����G�*�k��;��7-�mb&�3��~��EUB�E�'�g����U �A��\�edl|����B'��*V����3�BI�0�)��,��~0������r����wa�����&9�|�w:	��*������Z��������L`�(��������CNM�}��T�]��HH^�aG�Fx>"�-63]h$��g���?(�������PM8���f�^?�����u��u|���U��Z�4��
&p���uf{~c�$��3j���=�).�v�s�����j����5������T����Pm�.��(��ja,S�����I}]��^�����j��S�5\���O%i���U��A�����#�s��i����C��(��jK~���x��6"��7@>��G��2�m��v����/|U��2��)M��E�����bx9�6�!���~���d�"E���Q(����l��'&b(��uHF���.`���_�u@s�W�F����$�%�;���������`}��2�oA�K�/��z��o(�-��D��s_�x�n�qE�J�1��U��b�0�!,�_myy��v4���&�b������l��R,�X���|��=YP�PH�)b�YWG��2�t��������l^"-.m�0�xqU�����<x�X�%>;6������K�{p��������R��H��T�I~����O(S�0�c�Z�(��SEF(~N���
�j%�I���A�;��yDt���;1Y��b�&��1��U<�e�A<���zw��h�����}v�*U����,���st�}�n	0ct��j�G�
����o��ClQJ����a+9P9��Lh'{g�'����������JA�*�=���k���a�������.�{�W���y~���R�2���+3m,���C��A�p��C�m5n��Y����.(�W$S�p��\�v8���C-�m����0������K�r�GG�)��C������N)
B�Nu�������7��Z�h�s����"`�
�g���^����)8�?����L�r�4���8�r����xmp���&��� ����I�g�����������H�C-��o��}u�^1,�h<�^5�{6�*/N�~q��c����7-{�&�Zt1�@�F%�s+�J&!�<����#9_+�q�v�1�!q�F*��|�0�_���PbZ�g�~��1��C�����y�=����2�x�`���`�z�-�I�z�r)��P�S�h���D;i��"�R/���%�^�-�>FJ����������=Mu�;��,m�;;#����]4��bD�o]M���}e(D�64^h&�t��M�f^j?r��+������3��7j��5y7��o�7�V������1A�j�����&������������=����c�����p��d�+�����sr~�'K}��< ���3h���Nxm�Z_oz�T����3���~������6��-���
��[�xe[�j7��z�+����|��������������5��U|3���U[[��{Q[z+�_������������/6_�s�
�����K�<�M��kSS�V
��P5�+!�1$����Y���j<W�!,|l6�?�k���}��
`�s����Dt�i�'>b���2����?)J7�	����.�a�����X�&���������	���?��)�O�-�7����n�Q����O���?�����Fdu>=�:�,�$y����~{�>�j�;��'�V�x�<���������3���Qs�Ym47��^ 3N�Y2cU�w�M6w��3rV��l��#�t���C���>h���
h	�������H�,W�Vep�	G_��xt��#g�Bh^�A/�:� �X�@�R��G�@�y�������"�v?���\W��\�=��R�qpz��
	T��wq������q���>�P���_R@�s�@op��W�1��:N�������I�j���gxz>��K�U��6Zu�P{�	m�kd��Djc��L����"���%-���<�R
�%������N�0|������g���]���l��yW������G`�I�[�Fc8
���
l���Z��_�jV�k����dw�D��^�f�@��'�%�}Q��k�W�k��j�"rn�E��pi��I�cibz
������?=��B��+�q��U��*F��'h����-:y����)4�:6�rC������E�G���?���63�����FfQ��k=��������Z��k3�f6��L��Zf+�(���,*�7>	�y��p�tA��7p������vC����?������+��.�:�k�/�o#��bn���������U��n�m466L!���9X�c
��)����7a�0�k�H�%�t��ff!F[�.*�n�n�jna3��f^���>��>�]8s��"�d�fN����g��
]�Q�L��s{}����W�l6�����(q����|@������4���
���4��*�.L���!q�Lrc��p�Wn������M��_My;Z�������Q��j�����^��Se��R�?_X66��
_m��[c&���=�����N���/�`��O���@.y�2�����H��s��5^��X�^r``��{�cc&3���S�csf/[4s��u�5� t�x������U���������/�wV�_�G�����r��k>*����U ^��"���������h5Dj���^��*�S�k�H"�nP�E)�������/�:��Y�q�Z'���u�=&���I�>������l�!�+DrN����t�o�8�y��^�.�		�rt�h��-��}%E��R��qE�C�e����e�e��9,t�e��qjk��Um�����������3!~Y(7������Bys���^Y�����EC�������� �aT�{�F����
���+�����7m���7��oc�s������4D"���a��UW����F������I(�|��z����N�E��C�P�3Y�����`!��/k#�rDA�JW�?4�P�=\z��.���*���f�����f�`���"rg���k:��������8�~u����\��p�������{�G�n[F���5<�;��v�w;C�B\JfWX|1�s_���e'Dn�?<�;9����v�m�������� ^iT���������f8�|���D@~�u�j��q;;]e�q���D��m�.����?<?8H�
?���Ig&R���
zs
&��}A�&�A���a���&��\��E&WU<�v��@������P����@�&���p}�b�h�cY/��-���FE�.:��:�3>�:�i>��%������D�V^�*S�n��:tU�?�W��7��J|�=��c���w��1^��u)�
6�f���/�R�R���-e��h2�����#�S	�^�*lX������M��2Hh����*�������+�j����K��X�,�������P\I����	�����`
��o�~{-�bR����d�lT�.@����l����t�M�����?$������n�����n��/�n�����I����@�����9�<�k�~�[!���`
X]�7�a��6D+����1������Y5�#�0����%���6s��d�o �O#�Q�����p7�Q���B�"��=�?�����'0�I�i�{�"p�i<d�,W{jVH0�� �@z*�y�! A���+v:�L��Qx�D�Y
���^�6n�a��jV%�?�0���Ml�;���0,I
��#kKQ�0[ ~�+*^D�G�6��P��n�����?��O��2����v�r����O�z��|9?����m�����u\��{�Z`_'G��(1�N|��tE���-TnQD<x:�#�~�v���B�c2
�hN>H%%��4����3s�{���Zk���p��4��|�j���"�lM��@�b�����	?G����Tx?;��0����A4������*��i�\�{0/]6�`�no:#q�M�9?�_���?�)\*�,��?��s�h����2�y�A�#���1�D���)�r�1�}a�����J���#��9S�0sKW����"�E������Y�Q��s�i���8���!@�G�����[�<��(��L��U`�d��ag2w�k'�{x�q�������5I���a'G������d���=��o�d$���g���HT������)P�����9��!_��&�&%73��n��}���/����$`���T��Ja���sh����0���sH�#>�����"ck��:�b��������[B��4�)�~z��j{����:��I�[`�|R�/Lk��i�>iZP�~��w�T�HaQ��U��%N��j���R��4�p�+$02�e2OVO-����Z��I���m��p1,iWE\�K��Y�0���B���\�|�%����J��`|+Z `��A�g�W{o��v|p��}�����b��rN��mx��B����*�n4N�O%��!�����;����q�"[�7���'j
v���
�3������[o0�z-��z�����O�����'O��nm�n�}�w��������b�Uv����V����*5�9yc��z8d^�����Z���y2e���R��|�iml= e��|.�b-�������gs�q���W�O���/b�����=�������q��=�������jf��+:��$��v���/2����"����/2�v2�{����C�Bo1�CzV�p�=|@�OUGB^���#������Wt������t���(���$��r&��b���/��D����]Q�f],"Be"�8���U�����`����bJF1��o4�^��C�������O�T�[�N3B;�V�����������A�~_���Q?����.$�FD��}X`�����o9�y�����b�*gE�}=�J�^4�l��t�]k��V#�>��_�����k�����k�cM������k	�7X7�}���.��~��0��D�f�Z�/A�{g����?*-����`�M4�m	@�q�����J�
t!��NI�*���]
��#�%5��z�e�X�{\��D��2Q��om&�*��-�o�J�d~��t8g�7P��`~^�m�l�:�?�z�����I���O�E��f����C�_�;�y{�����c�P(n*����rms�:Y�W5E������P���8#a�������Wi&%f���:��brB���FC3Am������Y���z�������f��R��O.��|�VVV�������W��y�a?/���%�~]>Nj|����s���Y�Y�^piU���4�/���)l+�*�V�-$�
����+��
�}^GE�@s������:.����l���;���������R������nt�����������������}��H�� �tNR��>�L�4�7��#�Q�T�85�22���F%_�i}�`*U����*U��P���:nc`�
�m^�1cw�j�$������r�����c�[�1&�L.GY���I�q���M����;�$e
�`����@��������bu��-V����#��`L�K�g�}����<���MMr4uc�S��&�����A*HP[���rGT�X���!���bV���'oQ�����?�%�����E����P3��oM_F���^����9���m�'�����a�]Y�z_���o�ed�,0X�_��:���o��gS�f���D�Ag��87�U�>�!e+���r�����h*��N���iy)@l����Xk�3�Os������I��Et5�5��)���|�(�v��4��CRg���&�x����m�:4N���m����@�������fp��\�C�_ye�q����;i��1t_Z��`�O��T
�y���Kut*�@-�{��Jue�����
#^�X����~�d��z���=r��}�S����O_T$��n;]8��������V����i������~Y�6����*��=
�R`���Q��%/��S��T*�������VLuG��o�����g���~�����h�[�0g�e������V��'_���zY{1l����3h��O�P��*�������0����W�7a��/�h�%Y;�m8Lu��CkU�RJHu��F�'�@k�Rwdu�W2���7*3%���'��k�,	��������w�|RX������W(R�i���wd���&n`N��d�C�=eG���.a��F=��;���}�
����qwa���V���N*jg'��@���
O�����_�����sI��"��C��9�8AQ���i�zM5��&��W�
�UF�}�����u'��3�I��1	C]���eg��
�q����^���1�z�?�����T�z|�� �8���E��*��#��,��I&��I&�������'n����U�M��,~��;�Ts,�X�-'m���,��h,x���3��7��
�v��GW��G����wp�dP[0P������`����p���#,Y��%�F��N2R��������
	��D��G�.�h�������}8�~�x�|z�B,�=�����@���(/^�6��=����b�b:����2���w�N?��/�!C���&�$����FX��Fb@���DX�������C����jT���1����d��tE/���Nf����X����b�5��g��
�c�����t��.�����K��J:�)�2��H9CZ/^#4�.�#��������!E������P<���=�����_�.�1}b$v�>D�]�X�]�v�HH,�	����2z�BX����$�1����eqc����k��5���f#u\'=�����r�V]���T�A����@�?�����OO�{DK��9����u�?]��B��q�������T�=��a������1�o��6���K�/A��
��p���1����
�}�����z�����kx�[�p6���9�|F��;DD�k��[G.��h�^f�E����r�����y�'��}D����p��[���EH�����������G��TV���#��j5�QV�������4��`�w�*z_�?�/���cc�W��G_�T�NA*�'1?N���P�-n���2<�g��3��������}>��pF0�������w�w��zwBrJ8�>X�G_��}��I��=�=��z������,�%D�����p� �'���	b�}��h�"��	�P|��cp�/������sO�_�)��=Ei���+���d���,�/�����]�wf��G��I9��?n���s��B�.0�*N��V]�k�{���EYy��$9q>,9I~�EB}<�L�}�a"x�6�Frr� ;����*��-�d$�{�2}N�2���7������H�@��G�IC������������n�|}��
s�}?<}0�6����To��������/,����)��G�������{��l�z�������D�����������b_d5J/�G���{<~o�G^�otv��MgxB%��c�#�qL��T&����������|��
#4Erik Rijkers
er@xs4all.nl
In reply to: Jeff Davis (#3)
Re: Range Types - typo + NULL string constructor

On Tue, September 13, 2011 10:41, Jeff Davis wrote:

Another updated patch is attached.

Hi,

Below are 2 changes. The first change is an elog saying 'lower' instead of 'upper'.

The second change is less straightforward, but I think it should be changed too:

Rangetypes as it stands uses NULL to indicate INF or -INF:

select int4range(2, NULL);

int4range
------------
[ 2, INF )
(1 row)

but refuses to accept it in the string-form:

select '[ 2 , NULL )'::int4range;
ERROR: NULL range boundaries are not supported
LINE 1: select '[ 2 , NULL )'::int4range;
^

Second part below changes that to accept NULL for INF and -INF
in the string-form construction. (not complete: it still is
case-sensitive).

Thanks,

Erik Rijkers

--- src/backend/utils/adt/rangetypes.c.orig  2011-09-18 12:35:29.000000000 +0200
+++ src/backend/utils/adt/rangetypes.c      2011-09-18 16:03:34.000000000 +0200
@@ -387,7 +387,7 @@
        if (empty)
                elog(ERROR, "range is empty");
        if (upper.infinite)
-               elog(ERROR, "range lower bound is infinite");
+               elog(ERROR, "range upper bound is infinite");

PG_RETURN_DATUM(upper.val);
}
@@ -1579,9 +1579,9 @@
fl = RANGE_EMPTY;

        if (!lb_quoted && strncmp(lb, "NULL", ilen) == 0)
-               elog(ERROR, "NULL range boundaries are not supported");
+               fl |= RANGE_LB_INF;
        if (!ub_quoted && strncmp(ub, "NULL", ilen) == 0)
-               elog(ERROR, "NULL range boundaries are not supported");
+               fl |= RANGE_UB_INF;
        if (!lb_quoted && strncmp(lb, "-INF", ilen) == 0)
                fl |= RANGE_LB_INF;
        if (!ub_quoted && strncmp(ub, "INF", ilen) == 0)
#5Jeff Davis
pgsql@j-davis.com
In reply to: Erik Rijkers (#4)
1 attachment(s)
Re: Range Types - typo + NULL string constructor

On Sun, 2011-09-18 at 18:08 +0200, Erik Rijkers wrote:

Below are 2 changes. The first change is an elog saying 'lower' instead of 'upper'.

Done, thank you. New patch attached.

Changes:
* documentation fixes
* added document for pg_range catalog
* cleaned up errors, increased error checking
* improved pg_dump

TODO:
* Support casts and typmod.
- This requires adding a RangeCoerceExpr, or possibly
overloading ArrayCoerceExpr somehow. This is likely to
require a lot of boilerplate code and a fairly large diff.
* Cache lookups better to avoid unnecessary SearchSysCache calls.
* I need to find a clean way to get the operator class name in pg_dump.

Rangetypes as it stands uses NULL to indicate INF or -INF:

select int4range(2, NULL);

int4range
------------
[ 2, INF )
(1 row)

but refuses to accept it in the string-form:

select '[ 2 , NULL )'::int4range;
ERROR: NULL range boundaries are not supported
LINE 1: select '[ 2 , NULL )'::int4range;

I think this might require more opinions. There is a trade-off here
between convenience and confusion: accepting NULL is convenient in the
constructors, because it avoids the need to have extra constructors just
for unbounded ranges; but could lead to confusion between NULL and INF
(which are not the same).

In the string form, it doesn't add any convenience to accept NULL; but
as you point out, it seems inconsistent without it.

Thoughts?

Regards,
Jeff Davis

Attachments:

rangetypes-20110918.gzapplication/x-gzip; name=rangetypes-20110918.gzDownload
���vN�=kW����+TVW����
�A�$qr�.���i{��[6��g����s���iF��HC���&X����OI<z�H�[�p��"�:��Fn���T����V�%.Vux����E�����v5 nx.���������>%
����$�8Z��^�A�_2���s���V�S�q���h1�w&����u�j������O��0������ "^����k~,��C�5����KV��+��������B���V��p�vv�<uvv��R�'g���m��B�Q�%6���Ix�� ���^��:\�����^0�c���a +���y��\�2kZ�V)>w#W�^J�a���*#��J!i�y�$�����(�u�/f����M�p1��W/7v��R�������&��!����S9��FE�7=�H5��9��r{��d���/��r��5�&���Q0
{c�n�Z�>r� ���Se?vL��+�)�/l���V��m�2ZE�K_����p-��g��J-.�5~�����p4��!���`� �Si,��qvl�mGo�RtoGq����;�3�<��@���nG��X(9��2��(9/�jf�&��P�P��p>����9}W�%u�����XA�>#1Gn���oB�HN�Q8�;MJ���.��,�	%i��%R.U���C��J$����L8'~��KrNP@��JF1J��B���V��pN��Gr�)�0���T#�w��F��a���d��Su�������
�������k�XI��T=t����_�S�d�/�h,�h���u���'r���8��9�����Y��~T1�H������V��-T,.`����P�in��8�B4����f����[f=�(�1
�Q��}(<�p�K� �C����a�te���Pu�n;��3
��Y(>���\\1<�+���>�?���'�C���^p��c�u��I<.Sl�BN��J�1�l:�E�`�j
�\���`����Gb��i�,E����?7H�_�#�����R�qy�X2;;O�����g")���d�s%�0
RLTbU��ju��,�+Rv	����G��D���z���}v��eR%I��V�i��E
�tc�]�Tl��TM�����z���C��Sl�i()���HNR[�������<���0�_z`T��^Cv\*��vq�����	���"wi����
T�`YtHA��v���6������'��&�(Z�`F�F��Tho��6��B!gkyS�p�������"8�g�-�Y8���U�Ai�,,� �X}"�Hxe�<��Z|!}��
��,f��b��w��O�$�R������F{���7�4-����R��%6�7E���.�����^����R,�����p	���1XWsp-�m��8	?���2P��-%IN$
q
�k`�%��a/�[�J��A��<�O�H����r�!rk(���aK��"���2r�\o����4���iD�	�(�:x 8!��u���PJ/Nu�r�ee7)>X��
�4�.$�},qQ^�\,iP
	�q�2-�|OIHy1z�.�@41Z<$h�HCN<m-��[���%
��%�R�2����r!�ISC�*��@Y#l�Rf��������6������Oe������^���zO��U����{��UA�t(�+�e
�L�QD%��0q�r*�M�������2�����ET�0��q�s�9%��j��\m���y3��/�a,�)�j��D��e�>8(�!O$�o
��Y^C��`{�2�iL2�����sw���h)J?G6�X�����L'tU�����w�x��k����p������E,B��hm�0<�d�]f�'�/}O��6?��t��:�k�����"��@�<�$fW��^��Og��{��M�b��'����=uSIg,~z�����t~�1`�u����tN�J����n�Jz�e�3rSI_�K)�70�o�d��q4o5��/K}������	\����oW�����l���fS��m��z��';+l����p��U�Oiw�M�e�':G^(�������e���Ey,�f�ex�{(����W.(8Lva�r]��Tp	���R�daV���U^�-�s+Stu�`Em6������~�l��1�Z����u����x�9��i�RT�G���*F��	�����:�M�Rl��uv~������i�"�xU����
t������E-�Q���P�x|�v�)�T"��v��IP}_*����R�w;��H{��c]��Sr�[#>� �����]o�'����&�/�B��o*L�R���	1-!D��	�]��^o>o�Rq����:�n���9��6���+��4��4�����I�)���]-�`A��B����C�����]F=<����A��@x%#����������`����0h���3F~���"�f�����@�]�RBt�Q���I,�����Lc4���������}[[g$������)��q�hj������H��	A�ZW$����I�{���:M��PDz�Ur2���SWD*�w������KV`0p�g�����Ew��;���^t2`����g������>V��E���R>����e���uCn��z����q�R$�[�p���������,�`j����?�#�0��:�
�����J��<^����-;M"��c�FO��F�R`���
,���e���>Q<�ge:9���+L����mUx
"�V��y\��C��AP��d�-��d\[�|�7�"Cg�����dA�f��VI,���G��E.�v8<���a���v3%����1�g�C:��#�����eB������eP/���Y�KN���\r������\������b@	r�
#b��,�2�p�QY�)�4s���5��HxV��Z9����i��a<l���
�h����J�;�0��|�u��a��K�O�Ui�fuIc�%���y�*�{*�E��;k�w�U�=������b�0�l��s����������J�VpE~65;�����6��5
����(u��)�����C~�z���4�������Z�9���
����7��]�?q}��n���2�_(n��t���6��Yay+_+r6!�,�_(�J��N��W������3��N�����,��c���3���&{g��l��o��c�"#��f}�,Z����(A�^Xt�<�Xq�3
��4�S7���4�D��7��|���+�5f�/=�������Z�N`5�|���1���������`nz?O��e<,�i�K�t�,=B;�����Y����K�x�^%�oJ/��m~��O����c��0���n���+7Z�I��d<�l �G�'�=5Z��z/�q.9}���:���@��-�=q�����W���j�f����]sS�VN�a</�������y�����V�;?|����O��d�����gx���`�*	�[(���D��j`^^D�JP�o,0x�+/,���\kJ���o;�q4���!���5�U*J��s#K3;��\U ����_}@���{�|kM/�&#k]�%
`���?F���g�A�r��2��~k,����_� �.q����J�����x9ZVA��:qnyA��M&K>\��2��1��|�������%y{�nu����n�e"9���������J��9��_�R�":W�D��h,��x�o�*v��tW�������|9jF��.$_�s��&����E`p���?��� @b�dt��9H� Q2{��x�.�>�iV��TV�H�����X�V����J�0��r�
������Fci��n���]f
�l)��M�)�!�p�7�"�jt	���+�`�����������.�{�f�]4�(��U���0�q[�ICD��8B���C�����QwM/�kZ��go���P�|�N�Z��=��n��)�xi-	n�~a�C��9��wN���I�pj�P�����xg����3�B]����|�H-���V~�7A��d^
�A������kP����k���_��l�
�������������?O��[��'���rU��o�����7����Ea���;0�y%a
��Go�3�2�LW�����D`��)xh��`�M�O�@1<|u��F��~4�xA�����&�58>�������t������M�t��� Dwgo���eZ�������Z����������t�	�W��41��a���'����6�������zx�6�e�K�r��:}��w������d������������ S���
S���m�C�����YLL�:Tq��\�z�\��>�:�N��Wi2�N����R��K����T�x��SR�I���Wt��|_���7�iU�]|�jN!E���-!2 �'��.d|-)*�����u#]�s�#a2@��L����G����~�S�k����'�`���D|�k�9��K�����Zs��xV�|�y��=,�l*zV�������j2n���W��x
^[y������h���#
���XJW��*�5����ezU�X��U!h�
g�Q�q�W�F26M���59�A\wP����1���\���`n�E@��q��w���X&���P�����mJ�8�p,��f�7A�5��}��+��y����$�4��.��>�enefyU�0����@��*��ra��w�y���@yyJ��Om%�Bp'uwR&���	���|>�
�"��d�?�d��Q����8o�I-jBwk���H��j�s�)����B|w$�LF����-��d;J;6����_���~z��VJ�m���8�1+�XD�/�nk8NH�w+oF�Y���6�������OoG��`a�vk��M(H5	1s��Q�Gg�]��m]��c����2i'N��k��v�G�O���RVR���{�����F�E��Eh�~�l?���������jA�S�<�v�GRg 9�@�����0+����G�����>���K*�N�����;�}PNn��XcD��}P��.�����(2�F�\�+X+����U�K~�+�����2���Uy�����&>���
�(�v�>yh;��_�f��j�D���}#������}a=��OMs���a���L��2
��(^�1/|+�����^y���G��("���=9��tt�c?%��p�vE����y�e|`�Oj>���ww������V����\c��}����p���������Ifv�4���<�X3\~{��3�'�_�(��F���e������3<H���������/
����1��L��3ht*�������Z����U����Z�2x�s�x���nW���
v2�]����7(�k�`������f�<�eb2�~�������v�^���N��H��\a�a��7&�XQZ���L
��o�"y��	�������H����6cc�0���_��p?����y�~���0��2n�X�7��~N�4����\�Z��.x�c��br?H���&���Y�k�\����H��h��������"s����E�D�T������lK�Z9�U���O ^��������$`��*+��Pt}��/�����$Vj-g�?g�N�����B!�=�cTbn(M^���������&5N~�����5�>dW?�OT^�q����[�E�n�����J5]��]���uh�H�(.-in���}t�)�*��u�"��V ����|���x�iO��(��i���lpr���p,L!������������g�h�
��_Q��"�6�D+��_���6��������<��7l+��+���8���m��?Xg�n8��1	uJ�UZ����.uI�~8j1�{�*��������)�HF�
��������=@X4����?>�F�dg�_+��z���&G����H��_tl��fu�j������K���?���L���lp�N ��Q�k���� ���XN|H}n�}���
��L�W���m���D|���5LJ��&��gP��!PRI�p��O���GR�����%"�g�?��i�����NV@��5�����O�}~<�����C�
]��o���'8��z��������K_s��J���A������x�������{�Q�rc��4[��>.K�`��������7�X�r.o������@�wFuo�;��mS%�,Ka�7�N�6/��&sa�5Vvk�Z��h��?���Y[zu�zx4��������D�n�C�����9�fx@a �fW�nKq0n����Tl�V&bd��\!?�����M	�[(�o�u�:�m��v����-g������wv�3�!���'�{i9�=N�|�K�__y�O�:�T�7lE���
;n�o@�G�����/������EC�h6����k@'Ci��slwJ��F��]'x������K]��6���omk�H�,��1�1��7;����YDvs�=B`��F�H��$�o��������l���twuuuuuuw]+���1,&.1&�����o���Y��~��!���h/���F�%Fo^�����k�I[2��(k!��1�����9&���P,cL8�_���:����Gqch��%�����W��|������5#�����$�����.�Bl�Uk��j9��|��R�[�Y6:�^�1;�a��j���Dq eo����0��_��_��M��;O��^g);�{h��l�O��S������v�uN�n����Q�bE9��Qq���y�	v�
�������@f{u�A���PV���h��W���F�<E���9�T&n^Y@��+KH�������yn�y��������xt+�>�;:
P*�������~�h>lux��y�<��s��;�n���������>��|\u��Tp�����6���&���t���6��{/��X<���9��nnSH']|N.��`��N
0�(��-W+�K�E��$ �����6����+�,�/�d#�X[�����c�h��5�40�zS~V������D\�u�O��3�CQ?^����3#�Q4�u?�����
	�u`�c��6��}u��7��I8��Y�w��{�k(��3$�������1-���d]��<�(�|00g;vz�T���T���*n���6����6��� ��99�a��K������gL���fL���v�}E��	@��o$���S�����S���	���z-���2W���-+�V"�����	�[^2�/K���^���D'���#a]Z�R����fE����0�g\��$Ug��8�2E����k`g�[>��h��P���S<�]"���/:����^��z	{�;M�q��c"F��^�'*���R�����9_2m%��j7��(����]2/�^�A�g�a�9gpOgt�
��D��g��2 %y(*��Y�����?��a���b�~�>oR�����&�b�1���np�[��l��#t#UT��m��-�����������bS0G��K���d�d$�����B��fV�5��2�������������8R�O��y��X&�TY��w�!)RM���z�
,�f,��2r�? �l����R����������L�i�q��K�}��X����
@n�l��/	c�
FV��j����2�-IQ�
gX^M�q��13y�Q�<����I��H� �V���R|���Xn�/9���#����4%+:MjX�����"=v��P#T��Is�piF�n_���`�����7�o�$�E�� ������:t���G����$�l���;�	6�����3k.�#�7N�k]�+��r��e����yg����~�{}q�OF0q�f���~��Xp�=�w���:�z������2���=:������	4�
(���ne_���H��AP�ad7J��l������
jg���F���8C��\t��Y&������������^o��)��N�Y�%@��rM$T�&�-N�q�P?�����q=/)������+c����+�C�����:���6�sy�l �
z7���UH%/��7h�pM+���uGEj�?�Y@�)����CE\n�"F��!��o���`*:�%q�3��D�G�
K����Ce��_v&���D>[��������R��2�@��n��X=~�����G-�6��)�"��|�?�:i���������l�eSg���&�(���'����EQ�������u���:�g���_�0%c���G��aa�.�e�{Gu@��c���N������Y��O�������|���h.K�A����3d��������<��q���K_�uc��yM�V3r���F�YI.��X*�m�P,��&�[�\9��=H�q�N��=��v
���l���!�H��\��cYv���L�YU�"�P(����p6�>���������_(�����"
�}���`���5��A�@�������@9�OV8�Mc5�d
��$`$j$��n�sg:"������;	����73P|8"?Z({���j���������U�����R3�4V�FWD�/�n����
��WT����<~���4�7���;�
�+�����_�Ga�)��=�����yDTx�u������M��??�`YW�t����p�:��F>��x�������%����F'�N��h�]�l8G�� �(]��}�
d����ko��M�A�%�>���i�#bQyb��g"j���s|p�������U��_�Rk@�s����������4�q2,�fy���/����<�����H&ceo%6������(F�[��
r��%K
��nvN�gf�T�7&	r�&F���9`O�f6Uw3��xC�s��IJ^��S&Z`���� 
��[��0��C��q�Hw�^�� ����$wa9�)�����C0����Z�??������lO��0o���C�a����t����yt���9;�x�
r�gB��j~O����3��v����X7q�ig���(�U��X`��^�}m3>|Z[�dy���_<$?���B��u=��+���~�c��;�r
���-|���Y�(F�0���|�9,�����^|s�(�����A"Tn�j7�_b�$�(���D�/un�'�=�d�W��k���.8E(����M���;���������'��E|�DT�R*��F���U�Z���p�<�r�t�"P|���s����eM�k	�*[0i�/A��z�\k4���'�at]\�%��Mx��`�4W��k��JS�������D�lzb'_S������J	c�i}���Y�za����$�7H�8&<y/��?'S���,��z�`�u�������AG^�vZ�����l�����N.�`�<F-�s���LP+.�(:�����#F)�.�rrp
8���i�����3�U��A��O�w+?�$w=^PVv��ei��K�������6��Dma��>�F��j���j��A�����j��������5X5��:A�����5��|f������S��`��i$������&tOU���'8F�I�������	�w����}6f�`U�o9Cmk�\��1w��/��\����%���SG���{�Hr_�XY��]��`�����C����3�����5��
��h6�
����l��r��K���l��D��p|;���^	���:z��A������G�z���@�1M�LN��0����_����raU�����"�|V�U��
�u�
F���?�'��� Y(�b�+������r��2��0��A�����R4��V[�8lm������jx=	�~J���E�fdS0���+������0hy�D
-��`�\���u�$���
6����/���6E�/�r�68������	�c���3��k4h.��>�W���^:���5��Z���0������qw�w���O�Mj��b�]�`��l<���t6�o'�x��,�"o1J��d�S��C�t��kfT �b����
;�����(�5�A/��
��FE�,9�C������I}����C'�"����t������?~xUD�����t��l��v&�k`t�w��?�h^x<����*M����4P����e��
K���4X�U�bc�(5o�AN�Zg#'��E����2��%�
��,V��!�gGX
�Q�Lq�%+b;|�,�NJe��X������!( }8��e r�}��cLs�q^\����3.�;m>��'}�����$�hu�
��I<��d#������
Js=�������}�n]i�0�;���K� �5�n<������O���D�E����1� ��w�O��6�J��>/���qQ����DC@
��0������xJ������f)����w����=\%[rW]^,8\���?\%�n���O;Xu�A�� t����*���OC��g�0|��R��!�M(�I}����a���{�W;�����^��FX��FC�t.�q-A���i�	"P�I^[��Y���B��|
r���=�x!e�u�Nk��Z�
����n#���\�����GsEK`f��pTx//{"�|��a}z~(��)���|EED�$x�V]_�����{�\!�������=(�/��Y�'`�m�H-��O��$���Ygo%�1������Q+�Zj�����2@��VJ%a��^�������7�6T��	�;WY�du�MAB�q3�EV
97�IN|��kj���mcj�w�;���$����c���I���p�_R������Z�������k��;�=a�a���W���R�xK��(a� z@@��3�T���p{5����s�����`���-S��������c�sk�#��,��`

��;��l�Uh�������������"��X���r���Z�����F&�
��Lu�=���tWst��|E� Z��9�
��2'����q�r��������*w����cR�G���e���R/W���+����|����~@���~W�L���5����w
��v��z��7]��|�^\����o���O����o�w�|�x��^���&�UvPyK���h�5����-yoZ�����~��%��o�S�:����B�`�!~�l����gr)���'^E��+Xj�c� �+�#n>����g!/�!E7��UK�/
#2f�~J��)��ux�������;�W����]C���rn���@����#�����]\-�4���|p*6.f��j;�jMF��x�>NQ�/`����x;��">I
����=�~S�F�=9�1I����.�#���
,���O/����s���7AU�����M*V���E��*(��v~GePZ9V�����?�zf����A����#W5%�����:�c�����V�:�-]m���4o���&X�d.�z�yj��6/lE,g}��� ����<�j��O|f�yL|�c�y�����3<(mw@�a�������i��g��<�p�S��'%yX�)��H2
�q�dB�1�����D\���Kh�W�0���.n}�)��=�;�:�B{�{�m@s�E9>Y����vH�OB�
l2��La��L+tq?��00ll}�#���������tt�P��*������/���6�����a`�uD��O�����E�;�`#@X���D�Z`h
?�����
�bi1�������[������w�G-�$vQ2��Q�3��UL|�/b�`�D|^&����#J����&��o�A1��J�Z�!�Sd�(�����@x"�$n	�����8-2��l4��5��^�E�%=|�&��%�
�����|6��	D=z0�$S���&���
����E�Ce�h��.P�Je���a_g��@~���
������9�����
]�a�����s�|�:?m��9A��"����l�x��
OptGh����O��([���
��"�����+���`\2������x��`��/����&x�r��&�VDM�v|~j�1�������RcVJ\{9�T+W����,	@]rp
�A�"x	�3�>)�<3��Ok�#I����BJ�L2�����H8��2�.��v���T�X�0����b�f
)������D�G�3����(�=�e��b�@�GX��<mZ�Inl[QBV&	dA��."t�-���Z���6!�SGf���E������,��;�>_�m@�x�R��L��++��"����G����8p���������lDN�K��nEC"�V?�]p,�K6?<l���
p��5�i�������
��V�H��Mf1Y��k���.N����9y�?���^�j�#z���U��J��b�S��� v��^�R�
^�Hk
j������6�Gz0N'hX���T{�/��}E�WJH�
_X�����Q�)�PIJ��n��C���������������\u#� [x�)>��c�5+�2�������Z��u�AD�t}�1B^
��G)L�W1�nPt�$�4&A��8v��~�L�F���?�R���g���K'�]�"����*q���yJ�!8�uc��G1�����X:f(�3�+v��y�W�e3��tu�K���>����R��A�F!e���7���L>x�P�HNu�����t����l��<�����(���_1�Mp=���06�S��9h0b���(:!����;	��VT	#j��q��OD�}��p�r�Wq�R��
��=����m'Lo�)���l������������wPO�����AU1�1G�4s�S���&�'%&IMM�x�t���� ����B1Q#�o��3C�e`�W�)|9@�2+��q�F!������P��������l�C�XX&�W����E�5y��E��N����%q��Vh�2����e�B��}�H��}t�G7�;���P
��pU��6���g\1��|����h�K�%�I�Yu��P�L��]��q�y5�b�Y�
�*�<Z�[U��85nNZ�7��x#<��99�>����Z��6�1�
����I�F�{zo@k<�~g6�	}���R�|A%��� b0\��kF�sx\fR�c�49tV=�hS]���Y����MlY>���~�:>��%�u����T�����G9���V�
�$���J�"���tz���1�fR^=��$����h�	){/ql��?7�T��)'�1�O�l���>/kb��<_�Qww��`����~@7��"������Dp=�"�::��j���C���:e��I���E�hR�6�k-�t`����(���-���9�V$� ��h��2>op�L��T�&�|6��l	G*�t�����>X�;K%��^1���S+�����P6�+�i����z��'3���D4�I\{;��e����\<�f��9$��m}%7Ak�e��������b�}P2��}0�
R�>�=���x���Q�-��W������I���)�F�����&n����s��]�C��9���C�*m����Q���B�vh������:8h�n��(s7t����+'n��b5�$�y���	���A6��^a�}���������s�����b�����=���~��?�rb"�@��t�������7S����bcsoo��-}{��\���{�e*������Lgi��J�E`��N/H0��1����c^W
�}��m�{]�9�=��Ey��R��M��Rh�wGl�c���hD�QV4D��D-��(|B�o�\=����?Bo�����k�7�WW�I8����:��N�Cv6����W �9|5E�af#_�X����ESo��_w2�����W�>v���l�FWg����Y9���B��P��@���������
z���>O�T�S���0a0(A��x���M���`����Px������=���.�O{�$�0�+�9{4���@�~��v�c�UY�^>���:�uj9��W~S����<)*��M�Q���!Y��t�
,c�L/�J%T���8Y,�i���8K(�#F���z!�rK��`W�S�����������o�:�z�BX5����.B�]�~����*�h�~i���������@o��FA��f�+����*�KG���|w�	N�Z���o/(<U|��9�����&<�H{�����#��T��mba�h@[�����]|�jO.�����*��R����H���Q)=����oX��
����Ng�������sO	�%	J�D�����P	���)�q����d��u�����:��-����7�]����V�0�������,@FK#}
�Mf�#�6�<�����`����"��]����`��(�*�����0R����mK)hx�K�����q���"|��0^�:�#3v�APD�@}X�rq5����tW/�c��B�!Ta~ ���+J,�.�cM��K�dLa����g�V��}��3W�)�����Y���R,��(�[@p�O�YTL����w#�;���[�7��&,6-�[&a�� =ik
3��=Rt��N&�5�2�P(���7p�j�w{y
<�^Q�����(�-\�'*��
5������J�&O�t�V�4��������&�c����c��:H7�Sa3��"�oR.�X��$��m���b��$Oc|��>�,�������-�n�Eo�{���S"E\���������J7}���~��MURr��S��ri������k2L�S�Y���>oC��:/��&J	i��y��"nU�r����h�t�D
������	?�:t�`TD����C��Vw^-{��aM1$`-�)��]�GM��+���"��M���X��� �&~��a�� -H��^@.!�;S
�_�4��*X�br�sVx\Vq��>�d2M+���\�J��:�'������;U�����t8��U�r �k,��[����Y��|��07rf�,t��K�
������9c��v%�	)i�C���t����"�{�Z�OD����������aL����93�S�f/����g�u\��z�^)��{���m����7�Y�D�Fj��VA�����?��3%�~�Pd��
�����Y�R��x>F���Q��r�q���^�����sW���1��`�B���<�����#�`d�	j��������~����D�d�l4j���kd(����=�"��=�)����>���P�N����iE�@=������"�A����V��qm�-�����Q�+W
1
j0g�t�^�����`h[����"s���$ce�n�o�z���=m���8>Q���2��{&���5�����Kf{o��	�������z�'��K:�_���Tm�]�I��w_� ��4dw`�\�
p���:��]�L��N�Q���0�$�D��6gD�����;������TPh{OK#��O��_M���)z��'��<gK\�uTl����>�M�� $�����Y�K�����8�k�����6��j��������h�Axb�:��1�uA)c����������z���ru[mDX�4��)�=�����hRL���H��B-`��y?�����P���ixd>#G�D�fG�P�fC�;��$�lp��@A/��@Pu�;�w]�q���sh>�5d���szk;[�*K{��:,���S
�UK �Fni��[���C�F(G��+(����*�V|��ME~	4Ec�9���������%f8��p��X���W-�������iYR����}#�N��d�8rTd�iZE���
�N��o�$C!Pz�"t(fGd���\��2�>gH���d��3|�@s&:Y����jx�2Y��?��t���z���qhTL�<�Q�|=�R;����P�gg(l.���ep��d(�<0��mYg�������gw��xK`����\������X�W1�LUd��@0"E/?���7Q�n)L�S&V&�#��V��@5�q�o��S�^"��oam����KD6�q�u���*0.��H���)�e�Q8���YiU����M�������I�U@v�&�Ah�t�� ����(�x����-�R�����?�O�y�����AV}|�z%B[��������E�1�=�l�\to�B����d*eJp��I9�v�}i�a���e�'a����=�6����������n�8��/�B���29�5w�yIu3�����#&�n�6���wk|d�+v]��cer6e�hm��n�#���xLgp�:��8��w�O����%*}�e����"��-�Ek�Uh�8�D�������M�o�S�6��z��.��63;��Dl'2�Zw2�%O�s���lx/~�=Vm�J��E�\����7�l�����Ad�7�-`�C�Y��b��j!*��9+#�b�@q����	
����(L���rk�$*��Nh3���\�$M�M���7��
����*Q��h�z��Z�FJ9���4`Tx�qI���|����0���M@��8v[���T��5J��$��0�$����R�s��(��8�Q*��Ygk*IZ�"�>qvr��0�f�4���0������>;�=�V$�@�o����?�,��T!qxLAH��e�0��?���������I�{m�����8��3@���jSNb�t����6��A�`8�}�����q�&�V����f�J\cd��(L��|�`wk�GF�(�����\����o�m1E�2g9����E>��E��e.!O\Ei.O���^��xKV�}�H�_��nY��A�t���l�K����"����8������U����}OV88�(�j��c$9����@`ZU�K�����E���b2o�X) vS�����t$��u�+������~��1B]8��`�����#�}�xH���Ao9M��7����>�����S���F�#�mwV24���#��
?tP1�N��������K�IR�����q�����_�rpH6������K�t��:{��}fL�!�P�%����k0 ��H��>�����b�-�-�vc�����B;u<!��(���.,��m`��R��w��E�����e��y#X�}a��AQ���'x����S~H����O������*!�ya��D�/e�vv0�N���a�b^7�
>��>��Q\��E��|��f;q�3���-~3�����g�kR G�
A��`��CQI/���6���RN��R0��j�7��A��$k����o���o������W`�P�5]�9tT|��+�8��pw�Aq���N�Y�}Y��IF���]5��wy"JY�;{�wKX�������[���X/r	
l�������
�7�*�&y4�Ee�<A<Y�l>��A����#�'�8���"���� ��++vO�P~��c�or����F���[S�-��)k�Ve	2i��]��lYz��D-H��F?�]�L]@��I������;]D�ed����g�x.�1��.M�t�U$�r���6�g�9R)h�S�&���-�=����o������m����z�b51���K0QQ����x<	���.��e���49��_�-~q
VK,0=���x!���M���b���b�E[�E��q%�����4%���p��m~�����I���������i���q����0<��i�--�7��6V�����%�E2���>��N�?��Q�����k�|���Y��;�]��fa$���:Y����;�Txyg�Y1��0�$\I|�/<g�6�'��7��J��E��s�l�il/6�L;���M����^��G��UIb��Lq�<���us���s��u�������{m�5�uK�yX�\7�>���`��A|�6�U�LT�h�$�s�n5������a��B���w�E��Q�_P�r+��/���
����U�V���(�!�74�c��1����s
�	#a"��J�4j����D�8�%pR*W'��F�4��������n�Xq��LX���T�Z�2�y�����������9�b\3]������������1.�p6$�=�^&�\�U��w{\kRY$i������{�Z��pt��X%�����P�����\�����{UqJ�t������`zQt������?�����f�F���v���h=/s�k2}-&��m�klf`7������3N�Y�Zb���Y������^jc#r����n�����Z5�5�^���b���,N'��$�������\E�F�\S�����)p^���A�2jl����y�2��ch��7�����G��b1��!)�P�D���tcc^�!����\����t�>�Y+��	��F���P����??����!�a��f.k\�a'c;�
�Y
��h�?w�|����;YN��A���G��h}�����F�Mb�#*�a��_�	�]�c�l��~H7-��$� �6���8��#��o��/�XVS�)6�v����`��`lc�
�7�Q������`����p��v{DL@�'��4����)��V��3�
� ���;���1���;�u��
|����������G�:\��?:�A4U�����f�F�SyITq	�������xb�zE������<{s�2[�U����Z����N��m���|{Zds��T�b�����s��P���< �S�;
�U���P	�--(+V��H#�1��E�_��E�zV�|��lP��c���T���"�������`�p�t�5�"|�\�'^���"�_�Qo0��pe\������q�b���P���0�9pX��k�Rc
RkI�U����N8���Puw�\�&BQ�VW=|�7�G�����N0*�E��	�A�f�1f�rnyZ���$`���u�N�_��tA�p��������v�@��-wwDeq�	C8!���17j��6E�X@����������y����P�j�@$�Hv��R�d:	L�g�>�����E&�Pp�e�Nr1��n�$���'��+�
��H?^��}���h6d�N�����X�U�zy������y��Yc���������
�O�T����v������oaK��z�^	����z�R����0�^O��o��7��������������:<h�_�7�H����
�r��i��1H�;���#o�t���0E#�</���0�7a���3j��3�i��_
�'�o �79".
GilOH��l�O�����U���TEg� ��(�w��&Y���XA��������is����@���B,���_�
��(����*x�h��:^-I��QX�Z�#N��z{���P�|�TeG�:���XVs�a�,l�����D��Z��������6*6�����9�{rq|P�����c��{���z�� �������1y����R����E����/�;�0:G���I��[�:=��aN�����3C����y��
��Q��
�9��������G���I(��tLfcNd�q&&�61�j�_���3���tp�F}�+>��'��E�\�=�}�'~c��<	�

o!<��g�F��&�H�n�3��+���	��#�Q
�����0�H����YE�e����t4���0�"����BSPa�P��R���*����I��{�o0�xh������ALF�����~;
��,�Y��do&p�=�gIOSB�{ni����I����Q���z��c�����:����������xD9a���z~��7�D�"��wx����5uT`x�=����A��8�ug~�Y_u�f�1q�Bq��U����zd����H��
�*�I�g�����
���Tr�<��S�y<���L�:
r%�f�w��f�\!�
)�D�'�||��y�G��p:t��'rb�W1�`��uQW����z����B��B��s]p0 ��b��6z�&�n&RuV�7���B��) I���Sq�����i�\h\���E�}�<��21��@8�+V���0]4�]��7�X�b��B���]_$�f�su=[�k�~�?	`��ON�?,.B����'D�hD�,�n����*e[3��-�3/L�@`��)����	��~'t���Y�?�j
����%�UF��h��_��Q�W;������xz��%�&���k
,�{Q�������B`�<P�Y�s3�qU��C�1!��\��������y~}a������1�U*��:�y�31��&,�b-^�Z���nr���-�b-t'bB����[0�&�����d_���*�_�/Mv���IB�(�h^��t%(K�0wk�����<��
�����fR� ���9-5(8�Q���#WxW�]�o������)��6<�H�mH��CVd()(��R�5 �G�zE ����kqt
�'�mx�n�F��F��t��:�	,t=��n�n��G�������@�E�;��veH	�R�	/s���2�`0�5�F,S������1�{���
��B�rv����V26��J�hk�J����pB��
���i�zGBl-�z,�k���~}$Xh�Tq6�,(@wW��?w@x����Z�(2�W��i�1:����!�j:V�i	�6�3A�sJ
T4�$���^C����5�	=���q+S�6�Av�\��.,j����|2M�
��������a������%�$
M�
U7�I�D�:��T/�X�,h��Jzw�'��$Se����T�h$�J��j���C�gt����x��I7�G������F<��br-����9<�~��
E�F<}�[�p0f�����	���G	q;���{�c���(`m��`��AO��Q��*���RE�������F\�����0�9t����>6�]A�A��]����[,�K�:~������6��o�?P='D%����F�:�{�Ak�r�)*�m��u	����?2��0}�}����@1��)[-��M��uv�� o�\�i.�dc��D�4$���g}&�]��'�����W�l~���p2�c�
5"�$r�Ij�|*_w�.��Q�V���	`�3���5��-34�����#R��+��'�F��2��D�a�l���}34����!s�C$�C��N�a��8M��X17�]�j6 S���E�tF'�(�j�e%�]����2��������}�~���gS^���TA"-S6�F�K>M�����G�J�����?�^�P�wZ��o����@A9����`R�����X��wo^lQ���m^	 /��KF'�-�Lx�������T��O�yO�s��{_S���L1K�F���CA:99*�B'��Y��h�����������m���-��k�?@������a�������1���������|���!���j��������	H����y� $�
��Z�V%E�������&�d��lT�4
��|�7>��+m����C�������D��b,(�Qx���C��7�c�'q��;��DE=	<������I&Mnhicu��~���u��lNm���W����8T�o�?g����~��R�*2eBM^E�>��XC�
��V��F�]l��kql�<7����eE����x�����h������D)�,�P��(�2J�P��(q�D�W����b�e��l�D�X5��'	V�|6^�>+�7sc�?�GO�����[A�����]Wa��*��
��
��?���T3����-_t�?�n�������+2�.������qk��cs4M��~��hj�Y�����NV�^Ms��~��/���nOp��%s������=��]��fu�����T�m{����U�GY�+�{����yB�V�S"I�-�
��N=���	�@���i(��,�E������7�=���+;�k�*��S���?�D���,�L���`�!8m�vGS�s��`K����������&|o��}9[F��
�1��#o�������M���M��m����y�zOl��'k�]������$<�������h����C���]�mS�����i=�TBGL!���i�$���|�x�l�E���>8-��b�fdt�y���P�"��"��q%���{�����O�N��U�<�o5C�\}�y����k���oP����O��!��!�g~��{I��s�#��6��x����R��RwP��o3��L}���/��F�Hzj%��t�?�-fsZ��Z����_E-R������p�&�G����Y�}"��I������,�%����E��kb��a	�N���32z�!.�31�s�8`����.��l�A=�{n��k����/�F/}8��	u�n�9@���j,j���:��S��0p�����8���YS��^�R�i\����Tr
��i�����d�}��p��\�M��G2*m��4�����y����K�{���c6|�k��4v�����w����������|J8���Q���G]���������j���d�������N-�����e�Gh/$w8{���3$��j�3�X������:��e=�.�Yki�[����~�C�'[._�������0>����������=�}9i-t�J5;�X?������\w�������Q��u�s�3Hh������+8�##c�Lg�n�n�/N�*n��}eXU���Y�eYP������-��/��@�}��nlA'����X�(V���K��%����A�^��e� �.�m@�2�>��o���[�)J��R�G#������#a�x
������j,;���5X�BL*#�r�e"-�A��`&� O��B`�H���=TPp�}�� �`hL�E�!e��Q�d��������d�w�7�,����A���x<�Ep���> 2�}�����w�w�a������.j��0�k}Ld1
r	`���(y���/��u���IW�Musu�:�����,)��e|�G����I>s�Y�r�y!����PH�o:�g'���0�',xivu�$�0�E��Ro��Y���&���-��u������Q��A�c����+�{h���'��vc�v%�Tz�4��lQ�x�#K�����xL��e`tBr�q�$�(+���zt�c$�p��KL$��5����CX�.�YT������U�X����8�y�Zo~�"��Fwr�C�'e{�!l�cU0�T����A�
�bc�����i(|G��=�������!�K��
��\�8�y#~����"�[2N���@�}��W-y���_���U���/��@�XSue�$/�������'�����X4".���V^�h���+���i����/��@(v�ij�SF���/f��w�����6��hP��=�}�jk7x|�����A�q< �B����ge��
�U��>����c�v<��"D/�\i��T������]�KX$-����=Q�X�����������v�|���l�n7�w.�>-�aB�/|w�����A��J<���"���I��9)z��Y&�%=h"H ��C�^��1�=�|�P;�?�{��������ej 2����d_$Z���3sh
�=��b*x�(=�����m�`�#��s�I��'}:�������]���qW(UN�����(�7fT~������b$;�������Ay�"��
�6��<:|s��7��7�����m6z���F�l2�0���-�*�?�1T��l�`e`�g8|GEgE��}f�r��s����`g�8�G*3���T�u	0������N9��x�`8�R�X�<�v���	3��*��`
s�����hQ��?���o�')�������0e�IyaCQ)�}���Y������Q�g��PN�G"D'4��Q��n�V��6��08����N��nF�����]n!����
����Ar�0j���6����'!
94���H|'�#`����P�/|��s��H�f��l)���/�k�����(���Z���>������JR*Sb@�2}H�,�������:_�d+�l��Z�����W��\��%��Li��{4�����.QDE('�#��~�u)	�7��L���-��K�ex9o��������w��~�\�;�q\����8����_�^x�ox�)&�Vc/\;�H���/I���_��1�{>�+!��7��������r��S���H2�)����xT�t�����m����~�ao|[�$�Ob��lN!w ��yj�H��dg�G(�<&3A*�4g�%q�{N�@�������0��B$u2��5_����]l�s8���/���k�M��k'��T���ds�-�(������Yc_��������h8���BE�<^�����p&�cu��E�TnG5o�(b�DE���W���2��A���+s~�U?��/$
-��&��
f�~����`:�o
�����ZF�u�

���u��H�Zp�{�����,�M���J���2���"��_��.�L;�Vg��X�$N��@am��w������o:����~��d��=�ON�=O�\
yc]�?i��MA���'����}i��X+	��)��@��gG�Yn���);K�,K}��+��S;p�$���Kq�W��y���j[p�}m���0lX;�$���aklq�<�A<%U��LW��61�T�������:�SJ+u��(dw<����_�e���x"�8�CL����I�<�v��;����J]&X�Z_����r�?��V������*j-t{��0,� ��y�\��+��(3E����h-ij��e�����iEX���4��^V5k���e�8sj�+�
{�T�Ur^"��b�8��uc<��W��Z������q����s��a�Xj=�������������QT<���$�T��R:���v}���BN�|UI!�A�M
����N��#�F1�(09R`��(mL����xy�^������?�}Hx�����t�n�������Km�K�z9b{��)�ow<Myo`�FxN�C��t�����;��H�+=��[EJj^��>���������>�XYg�t��<aO}���,O=�=;Q���Bw�����|��<��k\����zx>��p[Zj0���jF��������!
0G�����3F"v�k(g��%�j�=7Ze+�D��(�inyx�]�����n��
���Y��u�n��]�F�^��i����o�[��c1��MZ��$1~J!�E&1J�91�	b��na��*�(?l��S��`&k�_������\�����?���K�A�D";��xP�����V~X���R\�u^�NN���S���HH���<I������+eq���'���b��o-x��}�M�As�������x���~�d8(���X���Q��|D��J�%������W~\I�����+H����3��L{>&0�{�&����{
�������]�~N��Ph��8A�g8�K���M�������z��A�����X{O��p��=������|��
�=Y��L��p/��%~������G�QM>`Ko��Z�fs��^����`���������Y2Ki1K��<�(
�~�f/��dD����'�gs���
�R�?,|I#8=���=o�3.��?E����m�/{%~BU�D/���������m'����j~b��;L�;g���6��C�
�Y�,h%�]�����%tB�W��_x�����/����K>���N�'�-Ue������7������e"�g�e%�[8����@��U
����[U��q@n]$mH�[B��Y��=�1/D����JQ��C��s��Q���8Y�$�]���Xj
����i�������Uh�*��%�A�����"il�����g��X�o�&� ��?�t�_��VX�z��:R��s�����$�.@������s���'zB�P��������^o�9�x.�+I���o��2������	��mj�K_�s�{�_|�5~q�5~���[�~Y���"��$��.�}�5?Sk~v�5o��"�����25E��nM�"��`)?w���#5 r'����\
�;��v4�~!�B�*���W��~\)l�U�pM5�?A��@I�AK��q�����?VV���A�3� ��=v��"�j���3��������������Ri#�T�e��J���2�0�������s+��7�(�K5� Wm���0��L���vZ��3����t*���F��9�u�������8�y���{Y`�������K��~s��p��e��H�4�8�)�
��
z1��*v���+F���u��w�K�G�vM���g����a_+�tOD����GU��h^��%D��{f�
]"p��E~�k=aa����g����~g�~���n���O_x*~��a!#]�/t���vi�/�HH��d~��@eF��&�&�{@��=�����p�>Gc�`���-��1acn�5V��y_�|�E7��~R�L��+���������v�L��Kug�i8���R}e�������*��W�Hl*��=��'(�x������)"}��T�b,�'��K���NG0�(�|R�O\�QH!8R n�TH��T@d1���*�,��J��7c��f�^�p���Iv�{b)S'�p�5�{R���SF)T
d%��Om�����S2�`��V.��k�*�_���R�����"���xn"��G��j��<��<�9�S���3
;=~k)�A��|�����}�Y6a<fJ~iu���pTR���|<[Z��m�QpZ~�"�����a������������[pXK���|��5�k:�q3�t�F�G��E��-d�������i���%R�+��

Z6��&�/�3���Q������AQA�$ZX���f������S�N�,�7��k��\7
���J�c�\���.S%:]agB�G)_�������@���*:��x_-�e������5X�L��/�|�l�������N�q�=����H���Z��K.D�2F���wN���h�:j�~2\�w��f���ow�6����sr�V	��I~�l/
U��a,��*z�cn�`�%�9!���TD
����d����CWx�c2C	���7������+��l�"S���p�-�&|=k�S8�HN��k�e�C�G����L���������`ok���y���D�
 f�dTv����\��@���:^�@v}��s���O\l����O�b`��0�`#z�N��}��^dC��'LU�\���S|e�.^$T�k��["���1E���bvo������uv��'|c��t���wN�Gp"���M�]�����yc���ph��'j�rFd��:(B��V��c-��[g��#^7TA����(4y��'�)�1.oE�
� _V��	'A����>�4�F���� I��fa6i�@grq4O
��H."�A����kdB�R�ke����Nb�5l8�
\$#��m�M�����Y
�!4A����f���X'�S!ibl~�U�����p�����S�O���
o��Y��0J������/����SH�;����RQ,���[�cq���%NH�����7JJN|J������G����������c[�W�|�l_�Z�������Q��Z\���?��3rw��QX���7���Q�GG��|���W�a0�=����I^��������I�lz��C�, ��>�'���Z�e�I;=@�?N~-&�>T>������mD����������������������D�PV������� �'�����N>��pb��%
"�w(����L�(�?��x�6���4�p���Z�����������l��meU�����<�jb��d5�X��D���4�u'�~�D���tA���.^�	�XSp��CY����"��U����uF���H������8.�F����
I_�P��x��I��zA��:��;��U�x+��*~{���So�����@���a���&�M4�G���4D���t�HH��5p�F�����G�"�jy���	���{��<i['�g�7�y[�_�	��h�`?�R�Z��%�V�l��*�*z�G�������f^�Fz{� ���f���:<h�_�����$/1���	���H���1�*��Ya�E�^���M��JE�;�6^�#D���w���~I��< ;��N�[ZCUw�q�Jk��P����X����b�yxG����B����� W_}_���=ngVa0���������3���B�59�|/c���m"^%�����o�R5�����i����C���� �����0����#�Wf_&�;~�����E8�����<��~&@`@��3������.ru�3���1��FC��1���9��H����RZ^�4g�A�a����)`b�{��������/*pQ�L���b^/��"� ����S�z�P��C�W`C��q0F��g�7��m��3\O)�=��w�������1�{��F�'bg=���Y(����B�����]�a�FB�3��Y/=G��/`<v�^8��k<��i����$�TD~��hF�P�];B>�:,�c%'_"p]d�B.f��R��OG��q�tz����f�A��Y%!��Kd�kaf������W��Jo@�6g�g��b$��gC��W>�^�$��BDf=�u3���:�kqk���x$T:G��k^A����+cK�{18wXR�P��������A����P���||���O�k��L��$�$����	BR����������`VIn?T~�����)����N���_|R1+��:Rp	��%�:m@�3�xh��Q�=�q�*��������(�����?���yT��!�D�h=�?p���2q5���O���Z���f�������I�S�q���oZK9w����M������
��k��Pa;4��������|{���3	FyaC	A�<������$����1-���ls��v�0�P��~�Ue���4��Fe3��J�P4�����������,b����Y��-K�����6���A���|��5�B�T"��D�9�\��\["�kI"���fY�:)�J@MQq],�j��m]!��7>'��S�c������9��U?�z�]����C2���G���<r���
3Ba?��[0,�,���{M4���F����;�2�]���4��D��
.�3D����MF[�[�vi��y/�G�O��u�O��������>��������U�O�A;H*��l�;H��""�R��1�[d��#�T�B�H����v�S�E��F!m��^]�e�Y��H�f��x�A�A}
�L954l�:�C�Hp
R��X���_������gP@c4�����<Z3[�N�s�������H�l�J����n�W����/$�=�c������x?8?mp�����x��~�b�t�!@���XQA,4��R����o������)�GL�1���D1oMr����j�
�����d\�_'��Qr��
vP���d���b[[��~����4�����u���9v�31Jj��4va��{ p������~"����-$��,z�9�BZ��"<���n�L��h`O�f�59jy&�Bb�2T�>_d:\cr��9�G���T��@� `)��/�o�"�1o4o�%e@�-["���:��d@[��i@�9�����~�):�3�����5�F�{M�/�U���Kn}�z����
Z]i�x,��ev�Z)M�|�L�)���
��D�x�F�S�3�$�
3a���!W|}{��}���^�i�s����f��!���O���#LqA�T��9\�~�]45`<1\N�!�Y���e��e�K�B�B����]Gu	���+�2����S�r�"���2���C����������A�H�tH5������kvV����E�������xU�%x�)��������b�ni�vj���1������.IO����6�!�
���v<%&���LHM��T
���T�
8wS�l%�S�������;��{��MY��My#M��|E]�2l�bx��R����$�>
�)��O�5��^���]�����{�d�p��s��yG�{�D�xek��N4���ZJY��bv�����D�]�/���=��:�1����E��n�P�^/��2g�����$7��8��2"�����q~���E����]�l�>������I��^`��Z����}���Snu��Ly;����/��K���t��gn8w���1���iG�[��b�`[�M]�Ie���f�D�.{��w�$$.�E,�_�7�B�:�=�;�&�J��\��	�4����}����6�O�k`nq�����e�Q����x�2�����@���Q4���)08$��T+���b�.1�!��"6H�;�B��>��0t�x���w�9�a��*6��^Y�0R�|�4�Q�J�b�
��E7GE���w�"�M*C����j�?
8���C
sz�^�T�a�Mb��)��W�\7�-�*2 �
�efbq��Vi�{��w-`�-u
��dPM{��>OkRKkr��
eV�����+FXAM?�2�6�@����.&9Y�1��<�k2�Y"f���O��d������/��?�W�:��3n�_�s�Li�R�u�����@�S�k�_��F�]4���"����
Yq���o,#��WG����fJ��P���+�Ia3�L�XN(2��x��c��0���"Se6���Jh��A�{��9f:�����ix�S��p$�	���u��g�oCe���o�9+X,�f����1>�u0�+3��W��pwZ=�����y���K�������/jE;cJf��1��"3����w�i0�;o�2�&�z.���v�R�[�8�����t��\O{��h�Ua�J�<����^�|{�_�<�g> �n��l7��-kT��P�V1,gw�����%�
���i~�a���
���E>.���nIcX�6�����y��u��_�_$����>�d�z��x}t�l�&=|�3	�KP����B������?=��Y��eq�7TJz.^�t#]}���#b�=.*�F�4$gK��2��5]LX�.���s��I���� ����zS�h�?gj
�R���G����QL�4�9�yp��e�����E���E����n�����%)��� ��[7��&��K��C���K�n]�?��^>x�I��+)����;Q���1.4nt�v��J�n��������q5Xe�����j"��	��^k���j[�2����hu��0c��V�noI���Q��N��x��p���o]q�Ae���e������+O|�N���jb$D�L�*A��>>��?�9t;)�W|��h1��e�*��B�3|"��5�����^0�<��NK��:U�0�6�����*������S�o4�Q�g`w�Q�����%�-|���a�P\�dp�*�_NR�S�O�� DM��#�����h$�h�M�A��Z�O�llF�`w3~�0��aF�M��wE���8$Ia �%R��,�E���=C;I���M�g���)�Q��g�g�7���i�m���	���>�,�����:b��? �U�
G��y��Q���)!��Mus�	��<i����I���&x�/?K���t:1����^T?5�I
�E���p�����>p����:��M�},��6�YA&��c�/+m�~*������>5�K,��(�
����U7�8�v�"���JY�G��B�i��P��/��p���Q/7v�����s<�{��q��|8�)`�}O���S������=V�e�zY`�I�H����F���p�	o����R�����P�4v���hm�B��������P�0�P>�C4��z�����/$V�8�Ra%�/����S�5��	�_$:	�ZG������S�����1;�����FYN�a�]�����q����jN����Uq�%���q8����M����8?E�8S�K���{�R��AD�}�3@��k������_��a�K���R�;�!�1�:J���DE���_
v1��J��'n��wI�����j����c����+����\q��S:�������1��;�M��������w�>Jt�"<4�J���_�W��3K�o��L���yu�7��4��_��>`��X%��HXd�*vM��7��HS����)�Nu�[��v��3������`y�"�O�-���iw99<�)6SX����)��A��i���,�9Ym�
�M�AX-��Z�����X�xV��7�h������A���j�����g�+����Do�G�qJ),�����1QT�)�3@������:�����[�)5�W�pHw�!��6�he�L�%b��D����	N:RVZ���x'K-���Y�MC���Y�{h��ebc��D��H��G�������
q��U��R��ql��q`�w-��7�����b�S�%�2H�8��{���c2����
�Q"VW�<\�U%��������"_l�C�S.}i�	��A�����T
�e�(
8�����q}���w,,L|m�X�h�'[����\�_x;��%���|rE���������WA������&�1����x|v�����������&h��G���[�AG��SJ��Qg��ur�FY���?�6���tu0�F>���N�J
�+P�����,'���(1�C�x;�^�R��oqrz���7`��m@��B�$t���Vy���v���fR���w2ioEk�	�%�r�&B��|s��q����4��0h�Q'���:��j��(����c.����n�%c
l(�I��1G��n�|:���_v��	F������k��V�z���z��/�{��Zk���5�B���h��\�YNd"�dVs�s�����-oWv����;^-��g-������{�Q���q���P������*ok3 V�E�f@��\R�-x������I���[L��"��_=wa�`��G��m�����=���r�e�V��Y�s��tWRi������-a�oW�'j��6�lw�������]���fa<��B����Oy����[�����%r��F��e\�-zi�f�w���`-��k����su�y.�/Wq��\q|�+��:(���P$wj����b(h}P",���e�2�2��$-"���g����6�p����ea.�7���i�G�k?$����Vg�O�� �p&=�Ip}�g���+���7���U���G��N�2�!�`$j���a��bs��A���W�lZ�T���?NEr=��������d�m�
���75���
Uj��4n�*��x-�X�%����p�
$����Q0�{���p�p�rs�K}{�V�����/��z
$���m�D�g��}p_�I!��w{����� R�/'�0������/_x;�z�b��u�c�?���q�jvu�OD0%�=o�v���Gm!f���$�z�~����b^[�\��m�W���^��Q*H�@�e F#*��~�{��-+�X���	��XQ����F�R�y�A�X�������'d�7����M���na'�������u��������WC�zj�Gz�Zx&�J��*X}�l�_s��dO�����7p�`
�@h��j)��h��T ��$�����hL$d��d_-����	VBw�Jj��x�q����'�>9Bg�^U�^�#�����H����l�Y���9��'��
���P6\c&}�� Z���Y�7�=�wI.�S�TA����{*+�����u��1��0cW13������[AU��:�x[R������i��	�����X��Vy�Q�hb�V�`�-P��v�)>�&�G�E�,�#2������������&>�������91i�#����(��|1mD�W�����6yTD�6���A����e�������5��o�[��d�Nq�{pwp�������K���3������H��%$l����"�8#Q��v��\P�qwz#�m8��y8���s�T\��[�^��q����NJ�b^��a��E�wY&o�:�������g(Q��a�����)'8��$�(W��''x9-^�e"�>����������7Wc�qc}�����
q����+_�M����Mi��I*i�1���~5[]1�ZJ�>�v��a�.h�}��������G#�B�� ����w��������e�Q����9k�w��G���?TGl
{����y"��Lzrpvr�
g�����3�y�p��`���=�������DXb�O��o��7Z"���LLQ�]�~ .O#8��������n2�3d/���N%^���������2X��I�$_E�l]
a����)-��[xJ���*z��(��1x+=��H��-�w�$��L�H�O1��y;��A�'C����d�uD�[�o�H:���sy��(�\���Ac�?k5�-I]<-�������+�������P�|���~{M�[g>/�
,�o�F���2s�d��>98��O��(��N�!JD���������Y�y���*�����e�I����B�#i�Y�g�&Vv$�
�+3�$�6���L�c�������~�H����s����!s�H��Wh\�B�$kP�:hE$�)�)��������F����}��z��8j���*
R���'l�u����l(a�Y�t����X����=;�=�����G%���X=��B��/��VG���'�A7OL�e������2OT�t�}������H �^�/UM�a��m��D���z@����:=ka�������y�j�ew<���G=�cj�|��#IV�M�j����7�������n�#$��}�	�	j��"{�O��\-��U���KL	��r�dFNv�@�O��(�JQ�<��V\j	�zj!�.�J�fd>;��{�1�'�=O8�/�h�)�t���|��qc�{eVs>������.����]o�����?f3��0����G'o:����q��j�j��W��27����e�1�TN��=lcTnoL�P���h�����<��:����i��1��F%��G�^�W���A4=�@���^`p�������$*��X�����!�TN��]N'�_��{�����}�m�����	|��Z'G%�>�TVOzhS+��	(���!#,V�Gt�U�l5j><����1�H ��I8�!�G2j��Ka�1��8�n�����$O���(p�Z�	V�4|����{�Y�������p�u.�>Sx����L�u�w����NU����UF��+���uX>������"����5*u�����*�h�����J��C@�����2��.�iXm�H�4�2X�8R��1�{�*���W�G���6���mS�6[���s��"m�f{�6[�f�jc������R�E%�~��J��Z�sC�S:���}}�6���9��vv�%�������������m*����6�m��,D�=n�X�M����j�����P#f�����u=���o:��'��o����l
3O��Z����]�7*n9������?�P�����{)�3�x���"7�k�V]�Zk����;����'h���T����sZ�V^au��
����n���!Vw���]� Rr/r�[�����O�N�s���
�������k�z�&C�������^�^\(���7k�����r��`�)���)�'�����k�LdC�SPk[N��
�3C��@�'���� bh�HEj�i%$��@k�f{�"�`��l_������y�j�b5q{���d��y��������]-��my�9�?+������;�\>>��(�>�o��48����j{��=o�����6�p�]���j ~�Gu���G��������.�WN#�~�w��$�0��t��$q��z2��%E���� =	���kKK�m�Mj�L0X ���&�ke�bJ�L��_��.�w��)��w>J����a�`r"@�s[ 0�f^1VF�[�}���H�����[����v6��b�1"�sIe�\v���4���91Q��`�0x�$'
� �������X����v*�=����d�3���aw�<Q8�LX�8�������6�ao�8Ty��=M��c����]Y��������G����t<���%�	��
���W��|��+�%������'�i s.�@�~ ���Inr����IbbCM3�a����zNF����c$[d �Btm.��JQ����l������7�X��-�����8�`4��z����������^�����#��r��=&��H�U�5�����o��'��
��F0�P�3J����������������H����J39����L���d\�y'U�y"����2�c�x�tEM�s'��N?+���u�Cs7Fe�q���O��sg�q
W'��M���f���=�939Z���u�����9�y��2.����v�Z�U��Z������0�S!�|�5�eP�����������1[�>v�3���cG��B��J
[v����~!j}��������������A�p����k�W�#�9����8�U��"��M&�Ue���J��LV����J�Zmd�2�`-}�k������:c;����F����j�>�����G������V6�$c����7S�
�|���������!�"kM�����9tT��k^`���n��6�W*�.�����e�a���3"�9�G�I��#�:yg
v���N��]�5Rd4��P[{[��0���V�E��?k�l|F��CG��C���J�F&o�p/�bI$2���tfUN��(}�z��tp���������� �B;�<I���u�p6��2mJ��
"�Y4d�/��GK��QvK��d]M�5���~Q��J�������h|#PD����dE����A�����b ��]^$9��|,eh�aU��)�3@�e�}�p��;
����>�-:
�8�@}��>��~0s�������;Q:��I���`#P��4�<����E"���P��"J[D����������x��(����X�FS7���!����s�����0��A���wj��P�����f���-�~����g�J����2���|�2�H��6��p��<y�g ��������}y";�`x�;�����e�^��;-����v����\����`�+l�`p.:f�Z�N���yFU����2E�����������2��_�����{��}�q�;�;M��yA�<=p?�\���]��2���R��p���������m9z"��������kN�Kz��;�Yh8��~������yE&^�p4�A�.#z�gD���������$}s�a��g�7�G����8�*��Q��������1<�d�������mh�����X]#v�p����\����7���O�q���)�v��S���:1�E�������\�]�X@��)c%�u�!d��;���.���(���"����sl;���' o�B�[`�����nlp}�Ow����
p����|���$o.�����n%>���.��"��KPu��c����Q�>�,R��� �����31f��z���s�|�EV���~A_n]MFtZ{{�����;��1i��i����h1��[�c���k�s���c�w��wc��4[��<�+s���f�1�uU�����]�a���
��X4�
^4���.����%1����{��WX>{�����,<��1��6*�Cu�1��1x���Q�a��3�
]	���Jh��^���N��,���#�Y#��0��X
[������ �;�]���z�Y��B~���'X{l���j��;�b��a��9E=9��a1����4��g��P�|�a���0�U��|S�O� vB�B��O�$vG=9��cQ�Y��E�sX�|/�~U�?�W�S,
��B��w�q<��`�{�q����,k���"���=�Abw���/tjt�Xh[�f�[x9��Bc�^xu{����<��o������V�'��S���`6=����B�=���p�SV^����$������o".�.��V�OqEg���w�;9:�/��GF�~x."��
�-]��FS�q<�-'��T4��l�]?P��\�d�Z2����Fd?��MM�W��l��*U�F�������f^���?�h�������f�u���v�\���^���w��x �z�����	d�vN��
{*���s!QT�fZ)%�fE��������/���9�(',��N4�E�$��`�G����q��0��y��;�_n��������00X./���_�����sn�o����G������3���s�T(���Q7<�7{��#&�&���$���{
3u}v$f��a�A��C�1<s�Q���j(cQ�{����?���\�; )��~y�rs����[%),���cF��q�����U��lD�a��D��&*��sl��"1G����14W��g8�q�����"�������F�T�V^�s����?�����l(kP������F���+<��"�����qJ@d
"20{�K�����-���q#�P�����>��z������<E�Q�&,`�8�:�����9�)9;����Bk� �9$��I�E�C��b+��;�F�S�a�c7G3�RG�?T�fU�^(��j)�.�s��B��Lh��lk4��Ba;��dF&�)R�)\
��JJ�-ZE��Y���m~����G��I`��5&�a���'�-N}9�]�i��/�*+�#����|�K���E+��Tw��U�^s&;N�N�t3��;P.�����a��9,l�6��������]��u��`��Q�v���@�R��@��id6���Cj����$�AU�c��n���@�9�Au���K�8�A��Sm�����t{�t;.�P���������R����������<�=2~�b��h�G7�mh�^�3��wA��?�|��k{�=h�)@��m�b"�!zbZ�S�:V������=�\-o���P�:��o�������:�_��@*['�J2���"%D�f.x��o����wf�
����7��x��x����<��=<n7����o����N&�1��p��]po��5���J���K]N��< ��/�Z��NC��;Y�'	������[t�ICo���PN��= ����w��f)��w���Jt��E����$���C>�W�J����t�V�P�2�3pOP�z�~�M�W�i��m}������=`��h_KC/�;��'i_{P�+�-��SP���uw��R���k���&�k;bM�=A����y��I�����8�g�p�#���J�]�����4b�[�;��t���c&��wjO[EV���J���W��B�T����[�]1��KZ<3�n��:7�QsEM�����7��YXW�@�9z�����?;�4��Zg�3���t�)�`\�i�X�
���k&m
�|�a����
��F:�k�v�`����&M9kN�6����*���p�R�?*�#�	q	�h��m}j��Gw���&�����h4�F�j�/T�(�����(�l������������G0
�?VV�����a�u�����u8�M"� ��~���������vr�v���=��)$�[������z�J��t/r���LZ��p��z��V�g��������E��Ss�
��}vx����Vi�m��6����:��3r�2�
�t{4�W(�j���xA�����u�F������5<������O��*�U��.9����kb���20��{��V,����8nq��f-��5��S�C9j�X��(��`���H��Cyx1&��|:�zO��[Id�j��*�������>]2N���]����$l��Q��-��)mZ YE������O������Cs�S�7wm|�a���pF���]�+~�i��bq�����w����p+z���5�(�!�&�d�����;�`���:��.w�|����u4����,�Z�����km��.�;g~��<�0��H�2��`~���n��G5��Ep�[�� �+���6Y����������8�`��4�9T�*9M��U��t���Ok�X����H�����D����~g�q��s��]�9c��y���%����|C<�����
����D��	}��C
W��������QD^�$]G��P�w�@((�>�YB������|=�!��`!���t�.�?h���$��K���� �����}�b�T���V����)��6b:ax}q�y��go���e���efHh����%��f���D���>�C�e7p�8����	�W���D�Q�����B��k����J��F�������Jk�ol���8vF
�b�g6���	�VCU���dM��w�(���{9p����
}�Z��M�y�Y-�D�yw�`4�n��?������U��|�@��MwT�SF"X�h��*�p;Fws�H�4yZ��$���&Je��� i&Np����
�h�����'������_e}��:~J����Q��Cb&�^M|��f G�h2�������U�{���)[b���7�:$#`v�r��
�Z���:�9W+�~#\FQ��'���������IVme���>@��X��������J������B"���/�<I7��������e���!�a�GX��X :������hAwNo���+o"#2��J��b��b��2�dAMC!�'��g�^X[Oa�x�;�n��%����3-7����A�����_��e�w5��(3����]>���n��&�@Z��L�s�a~B���!���D�|�*"<�s����WW)qLBD�v{�0���/����:E�z@,��S5���J�g��>xOKx�>h�O����A�}�*�����,���r�}�j	0ct��j�G�
����o��#lQH�M��a�JP9��\hg�������#�$��'�����Jh�|O�5`YX�09<��l�S_P��=�+����8X|m�]�c���6�ie��R�����g��.�jwiT��h�}���k�����l��;Xv������6w�An�A
L��i��m6��#����q�s���nJ��!w�*kB~��)
�B-T����Hia����s�h���GJt�������Oj�e&G�ha�FH9wu�Y����6�kQ�k�_-�9$-2��K��SH����#.����Y��j��F-�L�W�������t��y�c�3�
BK���]L��V	)��F��J�X��c2�H.�J�f\��b�f�G\���8�X3��5E�:��R���� 9L���T��m{Vu�-}*��.�7�}mt�
1>=9�8�=P�����S�h����v�2�E�$^��K��[�y�R-���5y[����4�!��J�t(�Ld���jwvY3���q5)O�;X�q��P{�����i�7F�E��1������k�I�a�%��u�.�/���D\.�5K��P�7�9O
;�����o����h��A���� c5u�]�i�O����d���������T}�r�,5*9kaeY��p�.�Z�����ROF�6�8���v�����AL&4�s�2��������������
��[�y�[Kk����|���:&�}$������������1��U\3����{���aGx@_���GW�w�C�n~:�F;���/���dq��;�$�N��9���!k<�����p��9k)�d���7�����}n
� �9sC3�V�p��z�p6�{|jW���&�O��5|��w��Y0���l�.�����6�����=��k��0~������
�Z!��6��U���,��M'��3"��������`�%�szt�����N����7��g�V���<���������6�s���S/����b�q����;����o��S�3������Q����}���|`���{�j��-h�����N�I�-���Xfp��)�s�z����{eW�<=���<�^�t6E1 {yF�=Fp�E��?A^�������5QXF����������'�G'�p��`�@E��W�rL��,�F��X
�t�K�N&�]o6����0�����Q�~8b��YZ��OM����s�4*;�Z�*�8��j�����H�M#�)���]�,2����C��C\
!�fA������IZ��Y�l����,�����t
;����w�h���6����x�Q0���
��ZsUw+P�ruKX������W�{���7��r�z����-�W�k����"r�VE��pi��Y�#a�z��~�;8<o�b����I��U����k�O�����[t'���94+[��rC�Q����"�#/�_���E��E�JzQ-��f�����vz_��}m����p7�n*�j%��UkU��;�����i{8N����8ax���!�����Xi����+��6�Z�k�/�o-��`n���������Q��m���vvt!&��9�Z`
��)�.��wa��qK���I:��W=�#8��3
w3
w*����g=��zV��X��Y�si��"
�x�nF����g��
m�Q\�T��s{u����S��������(q����}@��X���$�k��
������ T<�0>�����3���O��N�Q���R��������
^�Vv�5���Q�8��P��������eW���/�
;��d���6���1����U��If'X���Y0��'O�j �<y����{f
$���c�/3als/0���{�cg.;s���S�cwn/{4s�fu�7� t�x������W�������g��/�o^�_�G�����z��k6*�����@��"E
�G��I����y�u�ws�&��cL��� ���A�� ��o��;���*f�w'��}7�n��1����M�������7��6��B$���(�������?����/��`0 �C_N�n��g�����(�Q�>?�(}h�lU?_����7��n���.NmlU�����p�;>i���y�/+��Vyg��R^)���w�K+��S��)?��/�Wi4���n:�Q�;��{ZzE�z����C1E������q.�<��D���"��B���OzA�g�U����
�
G�[	��P>�����>|��9�qW�Q�z���;�B�tUYY�os��tGP��7�U�2]m�P�C�O�p�h�v��,�PJT4���d�4������8���]���g�f������Z*���WMT�2c�D�Q��h���(�#�3@���������D��Q�;�^xW�YF�u�OL���n�a�� �����x�|�����E�����Cu�F��J����N��������Q<���1����
���0<.��::<ny�gw�;���kl����(66�$DV,�I�����B��/4�Dg��vM��&����SMM�����L��h����y�N��_���k�g�&u��S����V����Zv9;Z_����]t\e�vg|��|PC���+������-T2��hsx�����l�����{�%���7���6�7�j�w!�56�f���/���R������+i2U����#�S	�^�*�������I��2(�������W������������N�S�+����<���w������_�V@���6�wG�P( [�+L���Ny]�4�,�f��%�����h�^x ]�C ��/N�����Z���b�.��J��	
�d�Hh��Sj��P�b������
���K�:,�Fh�c�<p}3T?��:t���s?7D���8_���qI����HvT6{�r/��l���*���`�t9Ar��C��	�b�d
�`�tC�n9��(�G���bO�	�$HO):�A6�$>����?��r�s"���?o�V�/��kw�0�L�5���t�����&6P��\E���e��?����HD�-�?�'"��#K�Ll(qR76�`_�L�'Ot}���Z�����I^��/?w���
�b�����������u|T��D��u�cu)�%����P�E�������);��*��r��k#�F
9����(��4��O�����~Jm��*�����p������~���zdb�48��VP���~���(���~v�I�az�����W�}z������N�����yi�A5�p{���l����2?7���LaS1�P)��).��E
���9O5r�������'��R/�j���zY�
�tt�;BqI�1�5=�t����,�s�pr�w�+H�j998��\����|m�A�_L���������X���\�fI�:u��Iw�a���I�/n�wUN�Y�7E��	��7���������;}���a������2����*��[`"S$8;9u�g����/�U'����b��������������t,��Q���Z�
4]�-������~�U	���T\�#le�R]��^�����S��?BJ������Z���{�J��R����S��ie���I�����S�����5
���Rq��Tc������"�A�@#2�PZ�x����.{�kU8I��"S�S\?�%��*y�9����~
��E@&P%�R W?l�.���������x����U�������N��G�M�{�M�U.���;6��Uh10QE`�g�i���1>$��z�����?5�]b{�5�5p�����0wC��+�������Z���Z��p���S�l�����������_w_���n+��je;�lmE=������@�k�
������=2/_.�L}k��p�<Y�2�J�)�d1�4v��2�V��x�V����o��q��^T�O���/b�����=��N����q��=��M����jj����j�zf[������"����/2������v���}?��^���!�jD(�>>��������D����'1N���#R�K�=�A�T������U04�����~8��^�w
vCb�v��� �04b:��[4����I�s�)�id|���}k"�4�e���|����Jv�����*�P��o�k�k����������L���#@�p?�a�IL��W^Yr�b��t�r7��DU��f�y�����<JhXY�T���R���Bv}�K��'�{�WK�WM�W[bu�����U+17X7W�:�����~��A8�����5X^�Z������J�B�u�E�{Mp���w��z�J�D�B�����Q��J
w!H�����8����c��q�n���D������������!*���=k,�����@q����ep��5���Td�%��s�.��>%5��VR�{��
|��,��yM�c�aJa�1�8������U�pd�_��H��W�.���*�-�	��g���T��Js)1�?�U�f���z����G~f��$`1�C,�Nj���s���F������%=������Fr���;����9�>�����L�X��G��#Yw��ION� �@�s�q��qWf�,��]/��,1��	/V76l�8M�^x=
��Q*���9���2���b���om������p�M�p&����������z@XZ��#@\�N������IlL�vrW2��-������U����	K�z?/.-��_�9+|m]�H�T
2L@O�8u���I�P1J�K_9���`c��Fvx+��F��?�1�,��Jq�,�y���	�:vc`��mQ��c��*��������y���CX��7N�L0]��?�!S���g��$�u�/V�WJq�j��3�r�z�+&�
$������������4.[6'�%������z�R@�&&9�����QtM�alU�"�����bQ��
��De<-�9�R�b��[��'oU�����?yk"�_k������@����1})}s��j������a�LJ�i���iZBd
����y��0��`Q�|�CuR7�#N�����6�c	5����w�sj����?�F�,�LY Rx��3o�I��������> -�%�
{�h)�}.�)�S���59qv��g�!�3��J������*������|���?b6c����Qh��y������L$�
����jp��]\�#�u@yc�q����I��2tWV�
�`�O��dV�E���KU�i�81�{��Jtez����
#�����n�d��j���r������A�V@*�Z7�>,����r���*��X����xvCh���{M��J��=����y)�:�{f����K�$M�G��'S��-(c�UR���6^>}� ~+{�@����I�/k���|r��<<��|{������}�����#"O�v���Ob�&�\$��_=�	�����-���n�Q�c����@������8�7bs��#����~z�EP�+I-�<��BsgI�?�f�����d��`&�(���B��H�tV�'{~�4����@��3	.3��|u�v/��F������v�Pd��E�Kc}��z�DTt�AC�}^��x������%n�=8�<�x����s�;?��G��0.n�P�������r�&��� T�Zu��F���qG�r��6a���N8�����ac�7.��7��w1���Q���y��[O��`��G~o���i�7}��d��N2���s�0�*s���������Q�L�i���1�qw�h����ae
	��%C8M<�s�������'���
�v���R��N"���"���`�*��Cf��3o9��_$EY���Kv����#�����d#�i>�tNQ/w{�"������E.���k,�������z���VB�M�1nx��K�z���?|�1^-�t�\�[���c��#
��E�#`�&<�$������~TH�b���+x�A>�1�|h��P��A'�5��
��U���d8��}��� 4��_��F��}�p0�M�z��x���P�(���������vM�?B�����5�K��P3��|C��{���$���P<��JF=�����_��"�;�@�}~
�
������+(���'���X+b�%����Qa(G��I
?b�eC�K��x5/��`#�om�F��V$|>�� .!��F���W������_q����3�N�����R��;�>������������17D~�^��E��Q��������w�~�����������,�;l��v����z�;���#f/�z�����.}��Zt��@���	�|����
�|���K
��Dan��;�-N�(3�����x9}���1���v�=�q��6s6���.�6sPiqf�x���Fi1\���x`U�h	�R��tYH�����9�@���8��S���I��y�P��]����P�F��#;���c^|����s�(���8x6�K
Sx�����w�!�w�����E�{�%�����$���#�^�������w����(K�}���� $�'��	��}��l�"���0��/1>����X����YR��%��YR��e����'���eyY�_�����S�6=�CFn�8�q�7����1�t�q�P�xR��*c\�-9�����c�d�1�$����6����,�2���a"��5XG|�� =^���*d��p����H�>�`����q,C��]Cc�	�#:���$@�&�]cdd��;F�xt��
.�>U���^NGL��
\��9�[v�c�����;`�>�cJ�����|�
�����(�m�@r���cn?��������wt�;���Y������g�I�����������iLo�9�V��.�����__��������zW��V�
#6Pavel Stehule
pavel.stehule@gmail.com
In reply to: Jeff Davis (#5)
Re: Range Types - typo + NULL string constructor

hello

sorry for late assign to discussion.

I don't think so using NULL instead INF is a good idea.

Regards

Pavel Stehule

2011/9/19 Jeff Davis <pgsql@j-davis.com>:

Show quoted text

On Sun, 2011-09-18 at 18:08 +0200, Erik Rijkers wrote:

Below are 2 changes.  The first change is an elog saying 'lower' instead of 'upper'.

Done, thank you. New patch attached.

Changes:
 * documentation fixes
 * added document for pg_range catalog
 * cleaned up errors, increased error checking
 * improved pg_dump

TODO:
 * Support casts and typmod.
  - This requires adding a RangeCoerceExpr, or possibly
    overloading ArrayCoerceExpr somehow. This is likely to
    require a lot of boilerplate code and a fairly large diff.
 * Cache lookups better to avoid unnecessary SearchSysCache calls.
 * I need to find a clean way to get the operator class name in pg_dump.

Rangetypes as it stands uses NULL to indicate INF or -INF:

select int4range(2, NULL);

 int4range
------------
 [ 2, INF )
(1 row)

but refuses to accept it in the string-form:

select '[ 2 , NULL )'::int4range;
ERROR:  NULL range boundaries are not supported
LINE 1: select '[ 2 , NULL )'::int4range;

I think this might require more opinions. There is a trade-off here
between convenience and confusion: accepting NULL is convenient in the
constructors, because it avoids the need to have extra constructors just
for unbounded ranges; but could lead to confusion between NULL and INF
(which are not the same).

In the string form, it doesn't add any convenience to accept NULL; but
as you point out, it seems inconsistent without it.

Thoughts?

Regards,
       Jeff Davis

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#7Robert Haas
robertmhaas@gmail.com
In reply to: Jeff Davis (#5)
Re: Range Types - typo + NULL string constructor

On Mon, Sep 19, 2011 at 1:51 AM, Jeff Davis <pgsql@j-davis.com> wrote:

select '[ 2 , NULL )'::int4range;
ERROR:  NULL range boundaries are not supported
LINE 1: select '[ 2 , NULL )'::int4range;

I think this might require more opinions. There is a trade-off here
between convenience and confusion: accepting NULL is convenient in the
constructors, because it avoids the need to have extra constructors just
for unbounded ranges; but could lead to confusion between NULL and INF
(which are not the same).

I agree with this line of reasoning. I think we will be making pain
for ourselves if we need to invent a bunch more constructors just to
have a way of indicating an unbounded range, but OTOH I don't see any
compelling reason why the type input function needs to accept N-U-L-L.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#8Florian Pflug
fgp@phlo.org
In reply to: Robert Haas (#7)
Re: Range Types - typo + NULL string constructor

On Sep19, 2011, at 15:33 , Robert Haas wrote:

On Mon, Sep 19, 2011 at 1:51 AM, Jeff Davis <pgsql@j-davis.com> wrote:

select '[ 2 , NULL )'::int4range;
ERROR: NULL range boundaries are not supported
LINE 1: select '[ 2 , NULL )'::int4range;

I think this might require more opinions. There is a trade-off here
between convenience and confusion: accepting NULL is convenient in the
constructors, because it avoids the need to have extra constructors just
for unbounded ranges; but could lead to confusion between NULL and INF
(which are not the same).

I agree with this line of reasoning. I think we will be making pain
for ourselves if we need to invent a bunch more constructors just to
have a way of indicating an unbounded range, but OTOH I don't see any
compelling reason why the type input function needs to accept N-U-L-L.

The one reason I can see in favour of supporting N-U-L-L there is
compatibility with arrays. I've recently had the questionable pleasure
of writing PHP functions to parse and emit our textual representations of
arrays, records, dates and timestamps. After that experience, I feel that
the number of similar-yet-slightly-different textual input output format
for non-primitive types is already excessive, and any further additions
should be modeled after some existing ones.

(And BTW, why in heavens sake, is date and time input and output
asymmetric for some DateStyle settings? Asymmetric like in you need to
send one format, but get back another...)

best regards,
Florian Pflug

#9Jeff Davis
pgsql@j-davis.com
In reply to: Florian Pflug (#8)
Re: Range Types - typo + NULL string constructor

On Mon, 2011-09-19 at 17:23 +0200, Florian Pflug wrote:

The one reason I can see in favour of supporting N-U-L-L there is
compatibility with arrays.

But arrays actually do store and produce NULLs; ranges don't.

I've recently had the questionable pleasure
of writing PHP functions to parse and emit our textual representations of
arrays, records, dates and timestamps. After that experience, I feel that
the number of similar-yet-slightly-different textual input output format
for non-primitive types is already excessive, and any further additions
should be modeled after some existing ones.

I'm not clear on how accepting "NULL" would really save effort. With
ranges, the brackets have an actual meaning (inclusivity), and empty
ranges have no brackets at all. So I don't think it's going to be easy
to write one function to parse everything.

What about binary formats?

Regards,
Jeff Davis

#10Kevin Grittner
Kevin.Grittner@wicourts.gov
In reply to: Robert Haas (#7)
Re: Range Types - typo + NULL string constructor

Robert Haas <robertmhaas@gmail.com> wrote:

Jeff Davis <pgsql@j-davis.com> wrote:

select '[ 2 , NULL )'::int4range;
ERROR: NULL range boundaries are not supported
LINE 1: select '[ 2 , NULL )'::int4range;

I think this might require more opinions. There is a trade-off
here between convenience and confusion: accepting NULL is
convenient in the constructors, because it avoids the need to
have extra constructors just for unbounded ranges; but could lead
to confusion between NULL and INF (which are not the same).

I agree with this line of reasoning. I think we will be making
pain for ourselves if we need to invent a bunch more constructors
just to have a way of indicating an unbounded range, but OTOH I
don't see any compelling reason why the type input function needs
to accept N-U-L-L.

FWIW, the existing semantics of NULL include not only "UNKNOWN" but
also "NOT APPLICABLE". It seems fairly natural to think of a range
as being unbounded if the boundary limit is "not applicable".

On a practical level, our shop is already effectively doing this.
We have several tables where part of the primary key is "effective
date" and there is a null capable "expiration date" -- with a NULL
meaning that no expiration date has been set. It would be nice to
be able to have a "generated column" function which used these two
dates to build a range for exclusion constraints and such.

-Kevin

#11Robert Haas
robertmhaas@gmail.com
In reply to: Florian Pflug (#8)
Re: Range Types - typo + NULL string constructor

On Mon, Sep 19, 2011 at 11:23 AM, Florian Pflug <fgp@phlo.org> wrote:

On Sep19, 2011, at 15:33 , Robert Haas wrote:

On Mon, Sep 19, 2011 at 1:51 AM, Jeff Davis <pgsql@j-davis.com> wrote:

select '[ 2 , NULL )'::int4range;
ERROR:  NULL range boundaries are not supported
LINE 1: select '[ 2 , NULL )'::int4range;

I think this might require more opinions. There is a trade-off here
between convenience and confusion: accepting NULL is convenient in the
constructors, because it avoids the need to have extra constructors just
for unbounded ranges; but could lead to confusion between NULL and INF
(which are not the same).

I agree with this line of reasoning.  I think we will be making pain
for ourselves if we need to invent a bunch more constructors just to
have a way of indicating an unbounded range, but OTOH I don't see any
compelling reason why the type input function needs to accept N-U-L-L.

The one reason I can see in favour of supporting N-U-L-L there is
compatibility with arrays. I've recently had the questionable pleasure
of writing PHP functions to parse and emit our textual representations of
arrays, records, dates and timestamps. After that experience, I feel that
the number of similar-yet-slightly-different textual input output format
for non-primitive types is already excessive, and any further additions
should be modeled after some existing ones.

Well, I'm not violently opposed to accepting NULL to mean an unbounded
range. The semantics of "no bound at all" and "an unknown bound"
(i.e. NULL) are pretty close, as Kevin also points out downthread.
But I think the way Jeff actually did it is OK, too. What I really
care about is that we don't talk ourselves into needing a zillion
constructor functions. Making things work with a single constructor
function seems to me to simplify life quite a bit, and allowing there
seems essential for that.

(I am also vaguely wondering what happens if if you have a text
range.... is (nubile, null) ambiguous?)

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#12Florian Pflug
fgp@phlo.org
In reply to: Jeff Davis (#9)
Re: Range Types - typo + NULL string constructor

On Sep19, 2011, at 17:46 , Jeff Davis wrote:

On Mon, 2011-09-19 at 17:23 +0200, Florian Pflug wrote:

The one reason I can see in favour of supporting N-U-L-L there is
compatibility with arrays.

But arrays actually do store and produce NULLs; ranges don't.

Hm, yeah, granted. But OTOH, clients will very likely use NULL, null, nil
or something similar as a bound to represent unbounded ranges. And those
will probably already be mapped to SQL's NULL. So in practice, people will
think of unbounded ranges having the (lower or upper) bound NULL I think.

I've recently had the questionable pleasure
of writing PHP functions to parse and emit our textual representations of
arrays, records, dates and timestamps. After that experience, I feel that
the number of similar-yet-slightly-different textual input output format
for non-primitive types is already excessive, and any further additions
should be modeled after some existing ones.

I'm not clear on how accepting "NULL" would really save effort. With
ranges, the brackets have an actual meaning (inclusivity), and empty
ranges have no brackets at all. So I don't think it's going to be easy
to write one function to parse everything.

No, but more similar the format are the easier it gets to at least factor
the hairy parts of such a parser into a common subroutine. Assume that we
don't support NULL as an alias for INF. What would then be the result of

'[A,NULL)'::textrange?

Presumably, it'd be the same as textrange('A','NULL','[)'). Which think
is a bit surprising, since '[A,NULL]'::text[] produces ARRAY['A',NULL],
*NOT* ARRAY['A','NULL'].

BTW, we currently represent infinity for floating point values as
'Infinity', not 'INF'. Shouldn't we do the same for ranges, i.e. make

int4range(0,NULL,'[)')::text

return

'[0,Infinity)'?

best regards,
Florian Pflug

#13Jeff Davis
pgsql@j-davis.com
In reply to: Kevin Grittner (#10)
Re: Range Types - typo + NULL string constructor

On Mon, 2011-09-19 at 11:00 -0500, Kevin Grittner wrote:

On a practical level, our shop is already effectively doing this.
We have several tables where part of the primary key is "effective
date" and there is a null capable "expiration date" -- with a NULL
meaning that no expiration date has been set. It would be nice to
be able to have a "generated column" function which used these two
dates to build a range for exclusion constraints and such.

Agreed, that's a good convenience argument for accepting NULL boundaries
in the constructors.

Underneath though, we don't use NULL semantics (because they don't make
sense for ranges -- in fact, avoiding the need to constantly
special-case NULLs is one of the reasons to use range types). So, we
want to avoid confusion where possible.

Regards,
Jeff Davis

#14Jeff Davis
pgsql@j-davis.com
In reply to: Florian Pflug (#12)
Re: Range Types - typo + NULL string constructor

On Mon, 2011-09-19 at 18:32 +0200, Florian Pflug wrote:

No, but more similar the format are the easier it gets to at least factor
the hairy parts of such a parser into a common subroutine. Assume that we
don't support NULL as an alias for INF. What would then be the result of

'[A,NULL)'::textrange?

I think that the range input should *parse* NULL in a similar way, but
reject it. So, to make it the range between two definite strings, you'd
do:

'[A,"NULL")'::textrange

which would be equal to textrange('A','NULL','[)'). Without the quotes,
it would detect the NULL, and give an error. Open to suggestion here,
though.

Presumably, it'd be the same as textrange('A','NULL','[)'). Which think
is a bit surprising, since '[A,NULL]'::text[] produces ARRAY['A',NULL],
*NOT* ARRAY['A','NULL'].

BTW, we currently represent infinity for floating point values as
'Infinity', not 'INF'. Shouldn't we do the same for ranges, i.e. make

int4range(0,NULL,'[)')::text

return

'[0,Infinity)'?

I'm open to that, if you think it's an improvement I'll do it (but we
should probably pick one identifiable string and stick with it). What
I'd like to avoid is adding to the NULL/infinity confusion.

Regards,
Jeff Davis

#15Jeff Davis
pgsql@j-davis.com
In reply to: Robert Haas (#11)
Re: Range Types - typo + NULL string constructor

On Mon, 2011-09-19 at 12:26 -0400, Robert Haas wrote:

What I really
care about is that we don't talk ourselves into needing a zillion
constructor functions. Making things work with a single constructor
function seems to me to simplify life quite a bit, and allowing there
seems essential for that.

I think we pretty much all agree on that. However, you did see the note
about the difficulty of using default parameters in built-in functions,
right?

I ultimately ended up with 4 constructors, each with the same name but
0, 1, 2, and 3 parameters. Suggestions welcome.

(I am also vaguely wondering what happens if if you have a text
range.... is (nubile, null) ambiguous?)

There are a few ways to handle that. I would lean toward parsing the
NULL as a special keyword, and then rejecting it (does it matter if it's
upper case?).

Regards,
Jeff Davis

#16Florian Pflug
fgp@phlo.org
In reply to: Jeff Davis (#14)
Re: Range Types - typo + NULL string constructor

On Sep21, 2011, at 09:23 , Jeff Davis wrote:

On Mon, 2011-09-19 at 18:32 +0200, Florian Pflug wrote:

No, but more similar the format are the easier it gets to at least factor
the hairy parts of such a parser into a common subroutine. Assume that we
don't support NULL as an alias for INF. What would then be the result of

'[A,NULL)'::textrange?

I think that the range input should *parse* NULL in a similar way, but
reject it. So, to make it the range between two definite strings, you'd
do:

'[A,"NULL")'::textrange

which would be equal to textrange('A','NULL','[)'). Without the quotes,
it would detect the NULL, and give an error. Open to suggestion here,
though.

Hm, that seems like a reasonable compromise. As long as range types and
arrays agree on the same basic lexical rules regarding quoting and whitespace
(i.e. that spaces outside of double-quotes are non-significant, that keywords
like NULL and INF/Infinity are case-insensitive, ...) I'm happy I guess.

BTW, we currently represent infinity for floating point values as
'Infinity', not 'INF'. Shouldn't we do the same for ranges, i.e. make

int4range(0,NULL,'[)')::text

return

'[0,Infinity)'?

I'm open to that, if you think it's an improvement I'll do it (but we
should probably pick one identifiable string and stick with it). What
I'd like to avoid is adding to the NULL/infinity confusion.

I've thought about this some more, and came to realize that the question
here really is whether

floatrange(0, 'Infinity'::float, '[)')

and

floatrange(0, NULL, '[)')

are the same thing or not. If they're not, then obviously using "Infinity"
to represent omitted bounds is going to be very confusing. If they are,
then using "Infinity" seems preferable. Maybe boundaries should be restricted
to numeric float values (i.e. +/-Infinity and NaN should be rejected), though
I dunno if the range type infrastructure supports that. Thoughts?

best regards,
Florian Pflug

#17Robert Haas
robertmhaas@gmail.com
In reply to: Jeff Davis (#15)
Re: Range Types - typo + NULL string constructor

On Wed, Sep 21, 2011 at 3:29 AM, Jeff Davis <pgsql@j-davis.com> wrote:

On Mon, 2011-09-19 at 12:26 -0400, Robert Haas wrote:

What I really
care about is that we don't talk ourselves into needing a zillion
constructor functions.  Making things work with a single constructor
function seems to me to simplify life quite a bit, and allowing there
seems essential for that.

I think we pretty much all agree on that. However, you did see the note
about the difficulty of using default parameters in built-in functions,
right?

I ultimately ended up with 4 constructors, each with the same name but
0, 1, 2, and 3 parameters. Suggestions welcome.

(I am also vaguely wondering what happens if if you have a text
range.... is (nubile, null) ambiguous?)

There are a few ways to handle that. I would lean toward parsing the
NULL as a special keyword, and then rejecting it (does it matter if it's
upper case?).

Boy, that seems really weird to me. If you're going to do it, it
ought to be case-insensitive, but I think detecting the case only for
the purpose of rejecting it is probably a mistake. I mean, if
(nubile, nutty) is OK, then (nubile, null) and (null, nutty) don't
really seem like they ought to be any different. Otherwise, anyone
who wants to construct these strings programatically is going to need
to escape everything and always write ("cat","dog") or however you do
that, and that seems like an unnecessary imposition.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#18Florian Pflug
fgp@phlo.org
In reply to: Robert Haas (#17)
Re: Range Types - typo + NULL string constructor

On Sep21, 2011, at 14:00 , Robert Haas wrote:

On Wed, Sep 21, 2011 at 3:29 AM, Jeff Davis <pgsql@j-davis.com> wrote:

On Mon, 2011-09-19 at 12:26 -0400, Robert Haas wrote:

(I am also vaguely wondering what happens if if you have a text
range.... is (nubile, null) ambiguous?)

There are a few ways to handle that. I would lean toward parsing the
NULL as a special keyword, and then rejecting it (does it matter if it's
upper case?).

Boy, that seems really weird to me. If you're going to do it, it
ought to be case-insensitive, but I think detecting the case only for
the purpose of rejecting it is probably a mistake. I mean, if
(nubile, nutty) is OK, then (nubile, null) and (null, nutty) don't
really seem like they ought to be any different.

But that's exactly how arrays behave too. '{null,nutty}' is interpreted
as ARRAY[NULL,'nutty'] while '{nubile,nutty}' is interpreted as
ARRAY['nubile','nutty'].

Otherwise, anyone
who wants to construct these strings programatically is going to need
to escape everything and always write ("cat","dog") or however you do
that, and that seems like an unnecessary imposition.

Unless you fully depart from what arrays you, you'll have to do that anyway
because leading and trailing spaces aren't considered to be significant in
non-quoted elements. In other words, '( cat , dog )' represents
textrange('cat', 'dog', '()'), *not* textrange(' cat ', ' dog ', '()').

Also, as long as we need to recognize at least one special value meaning
a non-existing bound ('INF' or 'Infinity' or whatever), I don't see a way
around the need for quotes in the general case. Well, expect making the
representation of

range(X, NULL, '[)') be '[X)',

the one of

range(NULL, X, '(]') be '(X]'

and the one of

range(NULL, NULL, '()') be '()',

but I'm not sure that's an improvement. And even if it was, you'd still
need to quote X if it contained one of "(",")","[","]" or ",". So most
client would probably still choose to quote unconditionally, instead of
detecting whether it was necessary or not.

best regards,
Florian Pflug

#19Robert Haas
robertmhaas@gmail.com
In reply to: Florian Pflug (#18)
Re: Range Types - typo + NULL string constructor

On Wed, Sep 21, 2011 at 8:41 AM, Florian Pflug <fgp@phlo.org> wrote:

Boy, that seems really weird to me.  If you're going to do it, it
ought to be case-insensitive, but I think detecting the case only for
the purpose of rejecting it is probably a mistake.  I mean, if
(nubile, nutty) is OK, then (nubile, null) and (null, nutty) don't
really seem like they ought to be any different.

But that's exactly how arrays behave too. '{null,nutty}' is interpreted
as ARRAY[NULL,'nutty'] while '{nubile,nutty}' is interpreted as
ARRAY['nubile','nutty'].

Oh. Well, never mind then.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#20Tom Lane
tgl@sss.pgh.pa.us
In reply to: Florian Pflug (#18)
Re: Range Types - typo + NULL string constructor

Florian Pflug <fgp@phlo.org> writes:

On Sep21, 2011, at 14:00 , Robert Haas wrote:

Otherwise, anyone
who wants to construct these strings programatically is going to need
to escape everything and always write ("cat","dog") or however you do
that, and that seems like an unnecessary imposition.

Unless you fully depart from what arrays you, you'll have to do that anyway
because leading and trailing spaces aren't considered to be significant in
non-quoted elements. In other words, '( cat , dog )' represents
textrange('cat', 'dog', '()'), *not* textrange(' cat ', ' dog ', '()').

Keep in mind that the array I/O behavior is widely considered to suck.
When we defined the record I/O behavior, we did not emulate that
whitespace weirdness, nor a number of other weirdnesses. I would argue
that ranges ought to model their I/O behavior on records not arrays,
because that's not as much of a legacy syntax.

Also, as long as we need to recognize at least one special value meaning
a non-existing bound ('INF' or 'Infinity' or whatever), I don't see a way
around the need for quotes in the general case.

Right. In the record case, we used an empty string for NULL, and then
had to insist on quotes for actual empty strings.

regards, tom lane

#21Florian Pflug
fgp@phlo.org
In reply to: Tom Lane (#20)
Re: Range Types - typo + NULL string constructor

On Sep21, 2011, at 16:41 , Tom Lane wrote:

Florian Pflug <fgp@phlo.org> writes:

On Sep21, 2011, at 14:00 , Robert Haas wrote:

Otherwise, anyone
who wants to construct these strings programatically is going to need
to escape everything and always write ("cat","dog") or however you do
that, and that seems like an unnecessary imposition.

Unless you fully depart from what arrays you, you'll have to do that anyway
because leading and trailing spaces aren't considered to be significant in
non-quoted elements. In other words, '( cat , dog )' represents
textrange('cat', 'dog', '()'), *not* textrange(' cat ', ' dog ', '()').

Keep in mind that the array I/O behavior is widely considered to suck.
When we defined the record I/O behavior, we did not emulate that
whitespace weirdness, nor a number of other weirdnesses. I would argue
that ranges ought to model their I/O behavior on records not arrays,
because that's not as much of a legacy syntax.

Interesting. Funnily enough, I always assumed it was the other way around.
Probably because I don't care much for the empty-unquoted-string-is-NULL
behaviour of records. But leaving that personal opinion aside, yeah, in that
case we should make range I/O follow record I/O.

Also, as long as we need to recognize at least one special value meaning
a non-existing bound ('INF' or 'Infinity' or whatever), I don't see a way
around the need for quotes in the general case.

Right. In the record case, we used an empty string for NULL, and then
had to insist on quotes for actual empty strings.

Hm, so we'd have

'(X,)' for range(X, NULL, '()'),
'(,X)' for range(NULL, X, '()') and
'(,)' for range(NULL, NULL, '()').

We'd then have the choice of either declaring

'(X,]' to mean '(X,)',
'[,X)' to mean '(,X)' and
'[,]' to mean '(,)'

or to forbid the use of '[' and ']' for unspecified bounds.

(Leaving out the ',' in the case of only one bound as in my reply to Robert's
mail somewhere else in this thread doesn't actually work, since it'd be
ambiguous whether '(X)' means range(X, NULL, '()') or range(NULL, X, '()').)

One nice property is that, apart from the different brackets used, this
representation is identical to the one used by records while still avoiding
the infinity vs. NULL confusion.

best regards,
Florian Pflug

#22Jeff Davis
pgsql@j-davis.com
In reply to: Florian Pflug (#21)
Re: Range Types - typo + NULL string constructor

On Wed, 2011-09-21 at 17:20 +0200, Florian Pflug wrote:

Hm, so we'd have

'(X,)' for range(X, NULL, '()'),
'(,X)' for range(NULL, X, '()') and
'(,)' for range(NULL, NULL, '()').

We'd then have the choice of either declaring

'(X,]' to mean '(X,)',
'[,X)' to mean '(,X)' and
'[,]' to mean '(,)'

or to forbid the use of '[' and ']' for unspecified bounds.

Right now, I just canonicalize it to round brackets if infinite. Seems
pointless to reject it, but I can if someone thinks it's better.

(Leaving out the ',' in the case of only one bound as in my reply to Robert's
mail somewhere else in this thread doesn't actually work, since it'd be
ambiguous whether '(X)' means range(X, NULL, '()') or range(NULL, X, '()').)

One nice property is that, apart from the different brackets used, this
representation is identical to the one used by records while still avoiding
the infinity vs. NULL confusion.

OK, I like that. Slightly strange to require quoting empty strings, but
not stranger than the alternatives.

While we're at it, any suggestions on the text representation of an
empty range?

Regards,
Jeff Davis

#23Jeff Davis
pgsql@j-davis.com
In reply to: Florian Pflug (#16)
Re: Range Types - typo + NULL string constructor

On Wed, 2011-09-21 at 13:24 +0200, Florian Pflug wrote:

I've thought about this some more, and came to realize that the question
here really is whether

floatrange(0, 'Infinity'::float, '[)')

and

floatrange(0, NULL, '[)')

are the same thing or not.

The unbounded side of a range is never equal to a value in the data
type's domain, so no, it's not the same.

I think that we pretty much settled on just using an empty string for
infinity in the other thread, right? So that makes this a non-issue.

Regards,
Jeff Davis

#24Florian Pflug
fgp@phlo.org
In reply to: Jeff Davis (#22)
Re: Range Types - typo + NULL string constructor

On Sep21, 2011, at 19:00 , Jeff Davis wrote:

While we're at it, any suggestions on the text representation of an
empty range?

My personal favourite would be '0', since it resembles the symbol used
for empty sets in mathematics, and we already decided to use mathematical
notation for ranges.

If we're concerned that most of our users won't get that, then 'empty'
would be a viable alternative I think.

From a consistency POV it'd make sense to use a bracket-based syntax
also for empty ranges. But the only available options would be '()' and '[]',
which are too easily confused with '(,)' and '[,]' (which we already
decided should represent the full range).

best regards,
Florian Pflug

#25Florian Pflug
fgp@phlo.org
In reply to: Jeff Davis (#23)
Re: Range Types - typo + NULL string constructor

On Sep21, 2011, at 19:02 , Jeff Davis wrote:

On Wed, 2011-09-21 at 13:24 +0200, Florian Pflug wrote:

I've thought about this some more, and came to realize that the question
here really is whether

floatrange(0, 'Infinity'::float, '[)')

and

floatrange(0, NULL, '[)')

are the same thing or not.

The unbounded side of a range is never equal to a value in the data
type's domain, so no, it's not the same.

I think that we pretty much settled on just using an empty string for
infinity in the other thread, right? So that makes this a non-issue.

Agreed.

best regards,
Florian Pflug

#26Jeff Davis
pgsql@j-davis.com
In reply to: Florian Pflug (#24)
Re: Range Types - typo + NULL string constructor

On Thu, 2011-09-22 at 02:31 +0200, Florian Pflug wrote:

My personal favourite would be '0', since it resembles the symbol used
for empty sets in mathematics, and we already decided to use mathematical
notation for ranges.

If we're concerned that most of our users won't get that, then 'empty'
would be a viable alternative I think.

From a consistency POV it'd make sense to use a bracket-based syntax
also for empty ranges. But the only available options would be '()' and '[]',
which are too easily confused with '(,)' and '[,]' (which we already
decided should represent the full range).

Yes, I think () is too close to (,).

Brainstorming so far:
0 : simple, looks like the empty set symbol
empty : simple
<empty> : a little more obvious that it's special
<> : visually looks empty
- : also looks empty
{} : mathematical notation, but doesn't quite fit ranges

I don't have a strong opinion. I'd be OK with any of those.

Regards,
Jeff Davis

#27Jeff Davis
pgsql@j-davis.com
In reply to: Tom Lane (#20)
1 attachment(s)
Re: Range Types - typo + NULL string constructor

On Wed, 2011-09-21 at 10:41 -0400, Tom Lane wrote:

Florian Pflug <fgp@phlo.org> writes:

On Sep21, 2011, at 14:00 , Robert Haas wrote:

Otherwise, anyone
who wants to construct these strings programatically is going to need
to escape everything and always write ("cat","dog") or however you do
that, and that seems like an unnecessary imposition.

Unless you fully depart from what arrays you, you'll have to do that anyway
because leading and trailing spaces aren't considered to be significant in
non-quoted elements. In other words, '( cat , dog )' represents
textrange('cat', 'dog', '()'), *not* textrange(' cat ', ' dog ', '()').

Keep in mind that the array I/O behavior is widely considered to suck.
When we defined the record I/O behavior, we did not emulate that
whitespace weirdness, nor a number of other weirdnesses. I would argue
that ranges ought to model their I/O behavior on records not arrays,
because that's not as much of a legacy syntax.

Done. Now range types more closely resemble records in parsing behavior.
Patch attached.

Changes:
* new parser + doc changes
* merged with master
* pg_dump now work
* various cleanup

TODO:
* ultimately, there should be a simple cache to avoid repeated syscache
lookups. I have put this off mainly to avoid premature optimization, but
that code has been pretty stable for a while
* support casts and typmod -- this requires the work for the
RangeCoerceExpr that I mentioned before

Regards,
Jeff Davis

Attachments:

rangetypes-20111001.gzapplication/x-gzip; name=rangetypes-20111001.gzDownload
�p��N�}k{���g�W�z[��)�]}ke�vt*K�D�����Y�+i��pI�J����\p��.���N%��]`0��`����"X����d�.���^0
�e������������.���Z��!�B��>�>��|}|	����D}G������h���_���bY��:�\���p���d:����`�_v���u���u�
`��htO��4�G"8�gSA ��z&�J�'B?�}(�s�qM=X��B�S��<'�BV�������o�66��k��M3F������R���@$ao��a�.?�o"�����4��2��-�G�~�iN���x�����h@/
X���kH�8��~�*����H��$LD!���vU#��9woQ^��x0��4I���$��E/$/�7��U�_�<�b�ch$��;�u����"���^��U��0�M�1�"wz�����<�_�-it������(�����<���h���8}�-7�3	��g&������k���G�+f1�
�"JD`�PI93�V������N-�_�B�Z5�]�	�A4����D�	;u��br�y�{3���<>3�u��gp��51K���x����\4����p������{����� H�%����1CXE������x���"�����I��=MJ���6����z��$E{WH9#Ja��"�&B�]��}g�y1���$9/�A���p2E��E(�4�B��@��I���0���\�0�Dg�9������^\��d�OA��G��@��l0��5c$c]�P-���o��*�H��U4��`r9�y���7R���H�>��Z���Y��E?���I8�
�#Poe��,��s�r2��r]�fT�����/�F���5��i������j���7
�]�����$G%����Z[����jZ����������v��vh3$���i8�I���oqp���m��#~�'����3�5q����k�`�io�Ln��	J(���d�I!�
SWRH����_PL���"�������!K�S�S���SG���x,^���@�`:�D��i������������I�mzf��1'���M���[��i��Z����������n�a��,G��&�g����0<F��TKI&C���EG}X��a��\`�t���������!}H)��T�0�?M��� 5F}R���q<����U�
��8���.���eq���M$KX���$��i�)]�j�`Yt0����;?���D���?���x4���&�(Z(��O�i/a��
-���`�(&��l]��%/CS{���Epd���g�0� �%(�&���P�>F��RU{���^����7X����lHOLO��^S��W-T�+O�]�h[��=���i�L�4��T���<)rWP��oj4vwj�F�M�^,lq�:�MKu���YO��Z����zI����K(%K]/IR,����|�!���p��m�!��
����E4I��{����-���D���A�@m�����$���Y���r�����-A^��
��N�x��ed?� ������F*+��H����V���u"����F���k�d �8���L�b�gH����A�v��A�C��)nH��-������4G��}F���&�����3�M����e
�f��2U�,���L��	�1�i7c6U��\)f���f�Qk6����f��l5�����0b�h
�Lh%�U��,��M��8�x	Q�4�3��x�����!��
�$n&�C�)q�yh�����v
#������B�|��j��-���U�A������7�%hf���f��v�>�IL2e����K�%��<	ab�E�	�4�6
�_�Hx�;���g�5|���"ls@~�*l��@��8�%B���{k��"��(����n�4�����$��
5E�?�-�a�;1���I���;����e|DPi/�K�<A[�]R>������UX>R��@a�0O�F���*ly����\=��N�G����C~�)�v��
�U�<R�}��7��K�nV�M}
~o������������`��J�8��T�����������
+1Zt4�ua���)���Z]Fyq"m��#P������*�z�Jv,��&W�G�C��> ������y����:���MV�|}��������\��o9(8�5�����x�=���qU��W_Sx��ws�al�/��R���<�S����>��4j�U�B�|��m�����u��k�����5|t��`�����Y�^�H/�sP@e��@wYkV�jJ�^��_���?��0�w�u��0��/����~I�����t:����w�I��[�t���H3}�KS��,���%!.=��aB���D�w
:o�)�����z��Z��k��� ��	����XQ�u|
�d
K���!-E<�c���x!���m����#�����?�_�('�`,*WZz�7��R�Q�Ev��-��0��f����W��+%�#�i����/"�Y0���^���F�K���e�&�$��Z�����\B�2*�4������ N-�1l_I�$�=����N��/�H���J�Gv���@��,�C9s���E�ap�������j)��=�X��Y%Z1*<�����I�n�n��]�!�-�K��/���o��r��.���0�+����"u{�Yn��9��&�~\���x����r�����[��4��`7������{"��xz]fn�PI�T"�V��L.�I�)�QK��iGt�T_S?������lL�>�	J�s��U�6��1�:��nr��.�kN��x����������;U�q2E��y�2�W��I��1����M<��-*�6�|v7L����2Vo���:��Yl��]3a�3H�K8�.���C�D�dn�^{�1]g����w��@>��
�����t��[F4�![ju��������s�W�����*�OLt��4UoQ�{��0��h��-n	C�qqx������52,�������Xc�����A��=
���Hx��
�wq�a=1+��P<W�&��^���W�i�o~�����h���rHV��fR�Jf���*�Xz���R�}=��V�E�O�nK~����/E��C~y�����&�-�/�ARxvy�����t��Uwn;xu�3���|uC�Z����Y}������pt,=�����q���=�=�1K�����`�\D#h��sQY������G��w3u���)�:��Fw�����'Qp{�l
���Ix��o���������x0�L~�z3:�����Zcc��l�����!��;Z_����q���Y�+<�"���j3�&3��}1��&�w�������{���x���k��}}U��3�T��|����!�\��I<$x����_k����������Q��r�zo��Tt��*�8��������ZE����G^�rpO������gK���1�M��z��Y�fo�?�I��y���-$�gz��/2��C��Sc|��_�<��j(�e@�Jt!0�/���(j�f��J3K���e&ME����n���7�2������a%(G]�pif������?�a�d.�~4���G��[]���[�j�	��7��QN����Q�j��<��~�~X�^!uu�+B�k)�Z�)��O��AAi*������c�\��d8���^����_���c��N�N�������I8��	p$����O0vt�#�/'�x�����9���D<�Q�'�p�&^cD�Q2
F������KG���%�J�����C�4
����(�xtE`����?CBxE��$�|@�<��G����G@"u�J�u*L*�M�t����d�A~>�����	�K$���`|�i�y�f��k�4t'��.<4@XKi��HPG}H6��
�����w�p�'�x6�	_����a@�]�2�������C��&$�����:7L(�MM���Z�:Gj��G�5���Y=�Ep��+|�
��#����u���a��F��}���77�_X�!;b�������S�.��@:��)�����O�v�����@b�q�<',:�*������g=��"�����W�o����/�����
�h�����=
��9t���:{o��v�9y��D���q�>����Bx}��:�9Ha�/�w�����U���b��0\	&���qM"X��K����%>�?mDg��Q[.z��Q�]B�\'�#����}��?���v��}������P������U�	��&<��0D��f�/H�/��Z�@U���h�J'�z�����`��['�,���j�o���z�����(�UZ>w�y��`?5����r�{Z����3i ���|=����_���:\z�iP��~r\-H5)w����!��Y�_c��������k9�Wg�������mR�^���^��@��	+�;7�K��Z�(d�eM������E����!�
����~��<����C2@�>����@#%�����)�5,.8������f���m,��p?�j�t@u?���	�7�zdS1�v
l<Z6.�f��LP<������oME?��$��F���u�!�-�^�Z��.!X�������z��2u�@�7sTf9�NQgy�'��aP
���d��z
��XE���$�S�����2Q�a���w���d�����G�"FS�<�0F��}������{V�G�mQ��"U�/M��sZNa{^v�.��$M5�G�����ASV���0�c
��(�K�_f�1���-�8n�(�`?�p>�EC;_�a�;3%/�r ����s�fd�
�OfS�S��l���t��G��E��[��G��yr=��I� ��s�+����uu�:�|�~Qs�
|��w�G�����x�G��H���+�q<E��^����I�A����������#	�XP2jEG������1��r�Ug2O9J�ap��3��O>x/Q�iT�PQ��f��c��c)DC\�X��*�N#}��x����D�`���bRk���^L�v$����t�����Y��,Vz
G�L��l	���m��y�5&?%U��c�8@A���w}��.����K��9��?�� �u��Yu~����y��)�UU��4�
`��H���`.���b�^FW9P��a����n�VXHc�VZ�]op�
7��:��+���c�bmE���})�#];����]q�
�v	r�L����������;a��<�`���Z����=�k�$����Q\M8�(����+�X*�r�|;Y��76��J��k7������A�O����G��Tw�*[�9�����8f1��rRQ6������-d
2�}s������10��������;?��l!E,��\���)�F}�/�k
��>Z�G���������$��"�������Z�V��J��Z��eM����3�`��]�����'24��0[���{:�����k���0�-/��1����M��n6+y(����
��e��qC�+�.{���q�~�����)}�F�U��r2
���x7�p��
s�l_�j8e���������cu���r��
.Y?���T����4���e�-G�	��Ie��U7��-���-��*D�<L[c%�����(v,�/h���LE�)=E����%
��r
�~<�
I-���m���l�V|��E���W��1���|��'�,W���x�����C�N�=���Y�4w�I"��j���T�1|����c��pKo�=!��u3-���%%T�Sq~,#XD'�"x}u,���/'��{<%xw��?<;<9���Q,���w������^�����g�_Q�"
^��D
���k�,��k[�;C����z�+�_�a+��8��:�g�,�@����'�6�*�Jl��W%=���*{o�&�\�/���;.��3�/i��~��%��F�w�P����r��+�b.�Q)yw[��!J�H�0r;l�� ���-������?���n��$N�����g��o��\t�U���I!�N���O}������>8;_T)*[��p[����,U^��a�6J��G+l�f���H��%sn�#�h�w�sR�/�v�:]������5����}�]�@�%�����%�����w��}c�>%�h�
�
3�J@{(!7G�#k�A;�����c����;�~lnZ.K��I�j���G�@����\}mm
��<�����2UWuM�9h%lj0��U�t�D�\�e��/%��q���	,��������N�4{PM@�T'<���=*��0����������}���6��f��$]2U�4�c���&C��
�:v�3�F�L�����������O��h�����������lK�E������S���Dl�)�����(P/�/��������`��#��7��d����"�1#�4<�����_Z��%���h�=m�Chc�����I���K\�p���Uh���E.�����7MlV2�O�p6d��y4�
��(�������p\z]�Fh���#jFH�#���eO,���!c�;���h�����y� ������`��v���������3�p�j$Z^�DJ�X��=��(�&^���[�e&`����7k��i���}
�.=�/��"=LQ�HM,4Q������[�a��yu��qbAs�����/��:��SF��{s�r��
��g}wv���
��}��o,�Q:q�|e���>l�6tj��Bm�����9@�y8p����k�h��U99����w��>z0���9(�P�5�{�n�h���4���Mte�b�=-�U�<|��wM6�\��{�'���{G�a��{�{�{G��o	�`p�KX
������!�H��j�h��;h��{����)1t2�lWf����u��S�"'�����%��,�9�Sw~N�wJ��3�`^Q��Sk�w�@����@�V�|zn?1��Wx��5��
Vr����K5���A�Ak|ia�|]=�W�i�;d>.n��;[z�	;�,�.^���Jm��`��<�e@d!���X�f�PP��>���0�%lkd�����e�!��LwN`k���O�D������ZU���1�v���R��Mu2d���U�*b��kU����FD����f�;����o���������s��n�����2��d2>JAG��Q�*�]��^T�i!�_Q)�T:lU8t�����O�'d.led��Z�q#�
��2�#:��+�D<���t�f���F�d���0���9����DK��T�\��������&�g&���t�c�s�"��e��E���Q/��w���l�%bd���y��a��)�[
��R�+����;Q�e�{�x\�K��dV��dx�M8����
��f������K�HK
kV+�cr�2�3S�)V� �W���"����[n�3v�3O��+�)*c��?��^��z}#���c2Sg�R6k�%���`�������4����g"�	�J���Y��T���d��������QM9_������
��0��<�:Y���jI�\���^�+�������j_��'�%�����4��P��H��S��4������>��',�P#���I�Xq�����Rxln�LO�HQ��g���������0�����Q����J}#�Z���R�<�A_��/9����Y�
WC��R�&7NM^"c�t��������Y��%�:H�4+|w��~	0��Z���k���R�9-�MT�!�]�5���0��d6�9R��[aG~��Y4��!����7�[���Z����CON�i����~[�~�O#8�w���a��X9p���Y���
�����]���=&}e�%w16��_�g
���[�W���"�hzPD�$Y���@6"�M�P;F��4�?�0�`�������e�Y���S@��{(����[!��Z��E|���5e^e����4wI��I�`*k���������?h2����Vp��&;Wa0^�yS���#lL��dJ�r��w�|�A�X���@s��hZ	�_vu�F�����:��A�J��^1�\9�?E#����l��e�H��t�+|��>\6�=��?�N�A�MB�������:��x	�i��73����z��o����Hm�S�E�v�Sd��M�����G'������A�0�L��{L�.�[�QE��������Y�����cs����AFF�����'���Zh���K���j$n�����1�����4VWB�F��.���~���Y]��z�{���}:<@�;��?��j���\��C����nxM��#re��J�YUM���*�i��,^�&�K��9��5����N�]y��J���$��Mz�d]����1L�o{0�gC����%m���g��3�"��;��$�/-A�W	zE,a{�x�����}��y��(�T�;QxOa��Nf�T�'��Re202%�@t3>f�Q%�@��K�I��Zf����n���g~�a�Ykln�h�������/="Hc=ld"Z}�~���o|�]��.������.�^�	��t6�[YU<�^�7�ZZL�c��=X8�#���FY �b���S~�L���.�i7����he��B��������7s�*����V#v�x�N\��8G�� ��)�"�}Yd�����^��{X�FK2(=
V���UA��H�������{����������m�_�BKX
��%������i�T�f���j�o���1/�,����A�K� A*�2V����wox��bD�e������f���n�u���:�v�T�7&	r�:����9����l��v�Qy���A��nQ��2�9��"G�_[�$qM��6l�x!��x��4���[ ��n6%w`:�j�����c4�]Y�����G?V���%
v�w�����=���Q����������#�������o���

�j�;��<F�iw�/�O�M/�������IS7���Q&"��e|x���"�CA��,xH~�i������,J���mT�W<f��w������n�de���u�%�����pL��!��j��` @���amI�u��M���
q��`p���`S�����SL����I����\����^�Qk6�S������2�yO�f��Ch�9=�;}������@���B"���q�b�jK�,��v�����I�8JO>��`O���wW������&��S����576��'�arYY��}�&o����E��a�Oey�X]X��qg&~6�
�%_[������r��}���Y�za���H �z��������\
�HV�G=`0|��������AW���������*-F�'�H�:�G0�>E-^s=�R�LR+-�(\�����#E)qJy9�	���n�����1�U���{�������.�
k		���]i��w�
�.�
�Jmx��a�����=��!�.�!�
9�~?WC^�������,���1��	���x8�Y���c��|F���Rs�`�D���v�hO&x=U��'>�>JN�$ �]'P�(@����S�gg�`���i��������z��d�9Hs��r�3�=�$1����!�o�q�4Z;*�������A���KX���%��5����d6�oCG��@���	��	K�@��P�����TzUP`�[�x������g?o�TD���c�7����aX��7�>�''~�����wK3�%��:�Y����e��Wx6�$���v�:��/U_�s�������/s�H7��d��-����i��^�
�u�! �6��^N����v����&�@���d"�/���������C�HPV5����c��?V��I�g�1l��&����y�����}5R���HM]�����1����3��kth�I������^����9��Z���0��/����q0E�,��eI]ZB1�/�
�ng6�Pj:��:<��,X"�1l���$�x?����i�	���@�e/���v�qT�^*3�A/��
��F,��C����R}�~����v��gM�tr������0�� Et4rE���l��v'�K`tw��?bo^��a_k�6���,�t*'`�$��2n�-�f�������K��s�������bs�#gI��h
n$�U
,�I������D���S�"��X$+��jM�� dt�#4t	
���c�BMD.�����3�r�_9Ff���z���������9�F�a�{4;h�� �y�����zf�%������R@��>��dSF$�m�*�iRNI��%���^fOF�G�eM<2u�����1� ��u�ON��U��}"O�������i����8��a�-�_�%�u��W]8��9��r
��mO�!���Z����6^,�]�����~��[����,��� NBKz�~ud�RBL�!���p��)�~���f���>�hcg���-�>@��O���
V���|��FC�t.�q��$�?E��#D���2[����U������\xy}L�Bj�u�vkW�� �v:�\'���=/a����8������a��.�Z"�l�a�>=�?�`���mp��&���d��/���Ml�j�{U��X�����.����0�6��+����YW����[go%�3��������I-���+6go��`��SHz|� ����r�-�`�n�������M���� ����eN	56�INB��oh�Z�-kh��k����d7�����^������a?Dr��������vg_7�7����l�v��~���{��^��F}�"g�[*�E�#�r���z����m�mE9<�7���(&�-s���������a�<�@L��?u4��Y�P���vu,B�~I<4Ep]"�)XJ(2��5H*������&�^�<�0�)��.0a����]�e [������Y@���9�
�v���j�������&�����*7���{���G��X�2�eRo���c}��x�N������och�R�g]�F��Y���{�]�|e�E�S3�Z�JKW8���f-^������~����z������$+^��W�����5D��
(�i�������R�V��v��s�~�C�*�����<�|��B�`�!>�l��-m��gs)���7�����,�&X!���t7��q�[����-�!E���uM�_'���J�;�s������5��_�s�5.����������Vmm�d3F]u��4-�0���:�*6>fh4���FSE��x�!Q�
���l:�N���O��hl��|�i~#���������cx�q���������yR������'�3���3A��I�*M*�"����Qf|�\~GePZ}9�����~8,=���)��A����#_1-�������c�%��
]l����d� ���4/���6X�d)���eJ���,lM,oy����$��������<f�yMBs�;�m
gx��M����/�,��S+�:�)yL����;���t�v1�PE��P@��'r�H���\�Y�U�}6B[����`���Qe���w"�-��~�1�
f�I��B4AT�<dAp��'�B��}�,`�!�`
���Z������(����'��`���AfD���k ���u���>���������?����W�V8>�t����(2�i:���G4'�j��)�d�^j�*�������~}��>�t��~{x��E"��"�9�Y���v�}��&��2)�\��J���#7a�����	�$���2�����H�#�N��?�������E�0��F!��b�����L�d�O���qTo�.=���WO"*����L�6�4���7�~f/�+Z]�Q0+Qj���5�Z{�G]���6
���,��M{�o���1o(�]��01������{o�g������ �P7��'1���'�H�#�dB��0$�]�-���C�&���d6p�p��kC��xZ��P��g�����[����@N���d@B7+�	a�����6��3:��-�0v�������Z��\��75Ez���.�P/�wF�'eb�@�g�6	i��x�-�r�0RH��0�d �@;4�%���zg���k�C�]����M�/��6SHS<���%
�0������D	�0_c).�tz�y�7�G2�
BC/�(+��e+���,�,"�~�!�������;SQ^�A�UH�4��������Q}��������#����/[:;�}����	���H��a�#a���t�L����^��IE6"g�%p��k��������+8��%;�I�`V�	K��
�i�������
��N�H��Mn)YQ�i�
�]��;B�v����i�w��������?'?,��X6� W>��xS�Ne��9���k�i@Cm1��8��^P����7�t,�
�*����x��,7��U$@��/=�sN�h�(��C�,���;����K�,�h����t�����1N9]�M�r�la�������sfe�)�K�!����8��d�<�hg��J~AiL��b�mP6�$s4&I���v��~jO�G���?�T�r�spz!�	t��`re�Jnv�8OI<$G�,�|�����
c����]/d��5����Rw�`N��y�q�8_
}�������0�B��P{�1�X��L�x�P��HIu�����Sh�|6�J
nP�]�r����I���������)����9_�G���>}�&������D�&�fG�[G
�y�*wZz�t�?s�_]����-��P����W�Kq9��?NO��H}���x�"�6���cc�`����<�)�X����$�5���#ok"CZ5���b�D����g�\+���x[�Xr��e�N���F!��L�&'1���|��=��P0�Y�U�x�K���n���hg,��|In�\�
u�c*f�_C(Y8�)���v�r��t�Vc*A6_�o��1m?��)��@l+����U�J�9e��P�M��[���A
�����TV���I��N�8N����V�%����[�7'���+��S+�\�W&Y��3E8	�(�@�
������j�#������[j�
T��U?DC��T|�(v�kL
���\�EO�w����_X����-
,Y!�..~�>>��	%���M��T:�X�W��G%*���Z�
�$���]K�".h����fCk����*z&��"%��5�l	�){��o��_��>�B�*����'$.w�f��51c�;�f3
���p��>��GdQ�)Ft�C����p��l+�����v9"b;e>�2�����H����mLf-�t`�Qaw����L|�
9�V"� �3�h��2op�HU�IT�"���?��2�$D���2��`-}Y*s?J����=j%k���i���^YLK��K�?�x3r���S{X�=&c����U�����<tf��9���>J���3�
V��B�]SS��:��m�:�Z��g���]+rj|&�p8����j�,�,jy���E��Q[���_���y�������!�C�-�E��U������*L��R�rh���p)5�p���0�R�j��Uf-�&'���b1�$�q���	���A6��^`��pR����Y���Ur�s+�^�R�]���5���>p����u�t�G����/o��)�����_���[��6��sW����>W���?��g_FQ�j�d^v����t�#�sI8�9�u�1�ZG�����a(�M�UfO�sv"O�a��-�N��h�����h>�x?��Z��YPx�
_g0T�z�K���)����b�r�����N����h�x�&���Lc�_�����)w���B�c
�����r��o7r�����W9�>�~������Lg����%�r�}�/qd�����/Pw��K[X��^o���>�+�(S���0a0(A��t��
�L��`�>�fi������
k�����?�-��]o	���I��
D����[]����s����i�(�,Q����>���.�IQ�5m*��5��d�o���T`#fz�Vj�jM���b�w�������8b�=��L$����*���)t�EuU�u���7�]U�K!��:��../"�f��#�H��~�'�������>����Ao6���$��&:W��j[E(��~�����Lpz���}����Q���3����l�������h���X�3�I�)Q'fi�
�����X�)�:]Df\ku�&1��������I���oy������Nmg�������sOI�%J�D�����P����Sb�a�e��
t����{��{y�|��ovsWM@s&a �"�@:t���KK ���>�&���IN7����>���^����or����66j�zs'����H:���k���4�n�kr)��DEe�c��� �6C����������+U.������K�����bE�H����u�%�`,���rJ��)BE��U�����������+}HP������)��<`T�[@p�o�XL��`��R�����[h7��f<6�Y&a��A,[2�vX9��H��fc��P���B!�@��^���3�������{!*���]��^��xB�r�P��L����Dlj�KVX����it�4�Wk���%g�S|��A����)���|�j��2�f��g����
E�x����)E`	��/�!V;]����TZ;N��a�� ���*A�N�5s�������)�������_)5���f��������>�BM�:�K�M��Q%+�#nEo�J����h�tuD
l���
���	�2���`tD����C�Pko����A�cX[IX��0����f������s�M���X���aH������^�$�RMy/ �y;Sw�_��uvt��������������}�dw�f�����L�v�y|K
Pu������_���t8����n �kM�����]A�c���n���8����3���_��8V��N|���k��}��3�vHY7z�/�M�U>_�t�P
��9�Q�wcT��sg�B��p�������!��l���Uo�k�K���by�~w��7���2m#U���A$�`���?S�3-�2������~�����J��y+�'���U�2z�O�a�*������su������b�?�:r��4��	�����*�=�3�m4�vk�m����.������h��������Rt������tM�7��<�W?I��
O�V&m�4*!>� Z:$�"����_�,	1���i��Z/6Z������.U�3Q��H?:�6���J�0$a�S�V#3C7c=;7S������v�g
��^���b��UH\��L=9g����
Hs��Uk��< �������R�Pt�����
2?������y���!�����l����8��3-��^��jn�6Zn|����|����Qz�����3��OB�

m��:R�y���}���o��Mf�w�����Q���[-��eb���T�����<5����~�����_��������{�����������	!;!�c������0{��p���_�o���5��B�%IS����gSr2�\M��������S�Lr��;��I(s��4<*���F
�}�'O(b�!i�]K�Q���a ��M�#�:����@f\������A	�h�^�����f��������Q���U��+������c���X#�#pt
�*3�F���_���/��h�:'|� �E
��O�Mb60����K�2�����E��;��MK�B�y�o$�	��j�B��\6m�(�.����S0d�7���(Q:�#��?Q�t�E�3�+�=Y���7���vV���>�^�F��}n/�4�
P/�9��	`�A�T;5����GCj{�Po*��
�+v�9CY���eJ�E��9���l}����1�|��E�<�
�6�9��\��������i��F����<�� j��5��{�����u%���j56P�df+r
����:s�t�g�]�[�S����8���#)f��V%F�(����� ��k?�7`�om�nO��r36I
������YBd�����>�"X�NH�����v|��c��6ut�)�[�dhK�}���.*�@�kl`�;�z/�wIa�rH��r*�2%������C?�����c��*���h���.�J�}����o���e�8����B����2��'����v�y{��CL~&%�[���Q�N���W&�:�!�jt��=��O�%�\��0�I���8S��%�u8�	��KT���}SE�;�/%��dg�KB�pa_AF?F	�_-�x����i���l0�����L%a�8������K�����������X�Tj=���r�>5o��@����RoP[�8�J�p������,�&sV F`���������I
�Y��(����r�*��N�����4\��\�m���7��5����
Q��d�z����FI9��n�aTx�~)���|$��F:B�&���_[��u
g+�Q�%FZ�goP�q�E��y���a���h�����9�,-�+�>i�r��0�a�<�q�0r������>��9�V$6A�����6��GY�n,�,Br����|����$�=�����6�7^l2�jq������q<
�bb`4P��x�r�������I�,G�q�$x�,���Q���$h&���y������Fq��f[����9e�P��Lr����P���.�9Z�=���~gK��2K��]��e�<SK1{�������G��WO�,��Y��F�z���f��X��Xv�uX�Z�_���a��j��������s��d�\��H�`��kZ�iV)`|]����W�h|)&�Z��b7}����/����nD�}�|��WU��`41F� �����N)�{4�"�/U)��4��@ ��c�������pe0�;h�T���k#���6u��Z�?�����?vQ1�F��-�0.�� ��XI���L��Ce���l�+W�q��T�v�uv�F����C������%�-�`@(��B\u���(�-�-�r�b�����B�-�H!�(�����x6�����l��lDQ���~ge�8_�wvP�>�����<����-x|rl���T^	9��-$r�N�k{�4�F)u�����;���<�eo�Y��X�C	����9L���7����	_�i8*n^k�FL:�t���%�G��r*v��q�&e���u��[��������7Y�i����0Y�Y��.�^T|
�SqTA��Ae��	:�$�D�9q��g��Rq�����(gn������9��Z��7Ss0��DCMA������EO����e�,������')�;K����E<h9��q��N���Lh��%	������<T^��������fZ>�h�=wi��e�e�����L�nm����^ =Q�aM����W�l]@��)�,����;_D�id����g��\�cz+]�n���H�rZ��e���kr�R���VM,!K���@���I�o9�[�C�;���jft-��`����i��x<����G��v=�]\��a�{��%�^���x��P����ub���21�����6�])��x�m]��2�/����8)�bsR7#y��s�i�uJ��DQ����������:��M�u����2$3���U���#�c�!���Di���>_%�J�v���(q�,���V�N`aw�.9��xf/)��W���;�&���Jq!���E;�s4�ool-6�L;���������B�\iSIfUv��N^nV����U��a��zb�����n�5�6uw`yX|_7*����`�� �b[���&�K���;v67��7���0yE�f��v�E��Q�	(�]+b�����sw�Z��+x�U�x��v4�����1����s-+H�}#�"��J�4����F�[8=���U�4N�+N�i^�����K�r���Z2a��3��z���������i/��8����]��o���f�Y��?cw1�!����
��F/��\�V����$�4WH�+E#�ff����>I��.��X�o����������_����h�vr���������`zI��)�&	��������<���Ua(�^����OdzZ���va?�`3��G|}�i�rz�
��*��R�rD��6L��T����\���C�F�"�4��Ue�����8e�@������"��wmll����sQ3�����C8��F�-��e�P�ms����8��hq"x@,F�98d%��d=�O�16�E4=��S�/�jM)�`�}F���Z�ZN�_�9�yBM�<��??����1�a��f1W%.����~�`�f4�����g�'����S�a����(8O��0���t�����Tj���	t�.�1a6N�Y?&K|���G�3	/�Oc|^bd�4�
��5a5�&!�bC��!��GS�����^H�O�����OT�`����x�|="& ����h���7�R]�5��SX."v��;���Q����B=x�Muya��W���:t8�_��Q2��i��?d�F�Wy��	�������<b�r]M���7:BWw����\��[7�:mw��w;�o�g����*�Q��
Q�P�KMp�:|
�{t�4���g@�7��}K�U�zgd�}�
����2g�=kF���+�P"�1��dj���"��L���q�Y�x8��^�Yk�Oj��	�?��7��b�<���?��ffY�Zv���P��_a�s���>���� �V���aP�������g�j�����L(*]�����6��|j���FKK�2����_3Z�����F�VL0>���|.���3����'��h8����w�NN;���6V�`De���	C8!G���7��66�X@��0�n	���y����P���@$�LvS�RT:	L�{��!�����&�A�8���Nr1��~��$w��'X��+�
*�H?�������h6�N�������
��m�eA�����5>O�k�p��d�������Se5�?.�� G������kX��������P�Zm���x'��Ix��#�f��>@=<�=�
P{l�0����q�����������q��[w���;$�����#�_�UZ�W#�<�~���a_���-�����&��bx9I?����qjx�����h/��,x� 60�r����}3H���]f���/�
��X@��&���Y�����0�%��@���B	L��2��jRG�AS�j�L	t�X�T�t�V��l�Sa����|��T�Tod���������Y����^z�>��Ap^c�������F��N����k��jc����_�wh��?>�)����?�G�b�B�
b��?N���Ky��j�����r����/n�}Q��{t�i����p8�^K�{�d@�3��G�Fa�������/���l��/�j�_�:(���VC]*�����E	6dY��9Oc�[��~�K��������1�V'����s�����*]���|����U�B*d���y�.�k�r�i�����s��X���/5�U�D��Ap~
��K&�^Qj7�74]VI�R��_E��q4��g4Ze�E�k��no8��a�dt	O0k�k���� ��c���[���fg�3	��0e��g��z���T"��. ��J���_�|Wf�;���������m�'���1g��eQ�o8����Q&����;�f����O�gr=b3��3G3Q��3��i�N<&M,��{JO����G�QLI�P�����%�R������Pc@�5�J�#�r��i����{�^�\�������,W��
�HJ�G�@}���o~��K��p8L�Gj`��f0����,�J�Q�-�H�)!�����3�Z��Z������%.������VQ���d]. ���_������J������E5.:�����Y�;�a`��rg����E����,�����0��s�~�m��.��l��%�%�$�u���v�:�;>�X\�B�G������\M���<vz�NvPW>Zl�@be�)�7V���KK�2�d�?����7E��lM�	j�,#��
��~	�y�6[|s������|���IF����z^����c��Zu��"wV�D����e�,D?&gr�_.%~�\;j�G��6����]%%��Kq�vB<����"�i��k_��<2U��6�
�T
��PitVf��r��q�P��Y1t!���������zZ<)� �-+���e���jm&��#W{!�`���g�6�L���7�1��gbZjR��bqM����4����Nl�wb7�L���$�!��J%��k
+]Q�������`x���h�+�6J�� ��'����J\�A/0���?���:����T���
.�f���)��N-�Qy����*��1Jg��I����np�����0�������;�\����%^��;�VsiI��y�Y�[G�+�Zi�i��l	Z�U��0
��U���.P�q\+@��R�0�=4O5��=$;�K����jZF��s�LRp�9��*�F���5�!�y�QVM�Bg|/��%\K���-nP
"W��c^V��f0�l�L�����@$��e�G������3EC[sc��j$�F�:��V/�k.3hT���fu�'��K������P�hd�J������M�W���R[��o��^�������=G���|���i�V�]O�^P�nD���4n�|���e`���&���%��8I3�m�%��[g��6s�P�z$�
�jW�/|�T��.����h�I�NQ��#�ASi)���m�\���@�����o�}U���oN��W.C�����
�������^�t#fM���[�5Eg�-�����>��L.#L_}�i�u�U@���-[��9���q��p�^�"���]���:gI�nHEmS�.fO��E4O�Q�1��.(��]5�ag�.sD�K���T=�yW6���-��R�V��`�=�
!�n5q��14��9�R��oXZ�#���N�5
z����������4�Jx���u����-���������q�o������|n(��H���v�I���zI)�1��1U�N�3���L�����ue2Y}��E:>m���r�X#_
��"��5U���������~���J%�d^z���S����X�	n�6lQ�n��g	 ����FF/�-���������T�;p�NYr�]������~1��O=�}r�� ��U�K/��^�?������������mz�Z,��c���@�����n�����������������r�����=�������U4���5���i�h/�o�A��
ERy���T���RSUj:C���[�~��lOIn�LIF�v�Z"?o���(4D�EV��}�U�`��$��1{�&3��*����I&Mihy}���a���y�lNu���W���'��T�/�?n������Rx*2fBI�E�?��TE�
�~��f�b��l����Lyf��=���~'O�u��^�!��R
��_�RjZ��$�yQ��|(����N$yK�q�dNfl��S$�U���q�`��g��Yg�.,�G���a�{~-�v�Y���,��1���w3������4
�?�.���-����:�����`��6[��&,�]b���h�Jo}��h�Y�����^V.����p��~��p��;�t����pT���W����������o
�1+~/���&���5�����R�Iqm-�8�~��eN�
�Mc�� �I.�P�<'_��h��SvJ� 5U<k��1����S_�[e��c�C�p:�#>FSLx��aXS����������.C1
��������H��pH��b��~4	{���l{��z��m����������)N6��a;c���$<�������b��4�c����-�.�����0z~��1�T������s����]#/�$���iA�S^05� ����B�I}I}&������#�WB?y�g���<�m=B�Rm�ql�m�s(��OP���C�ieB��1)T���g�J���3x�����\{�f�	JI4�
���1>�O3�i������~7�.�"��U��W������1�SCJn]c��F�i��i#�:����yN���c��#�DN��b��M��Y<���4�M��53BN��Bg��[�������P0@�Ba��6���A=L?{f�d3�:sB�����!����u�w��A���aMj������S�~0���s��0���]R��N�r�i�\�tSK*5|�t��l�	��>�n<����"��#�6Oi��`c�eVQ�����Gd��c��]���z�}���"$��%E3��4_�S�!���6w(?�u��oU����j���`������[�Y�bf��2�"��;�-�et��F�&l0�l��e:�N@6�1���|6Z~*5!�b�_hS�����t�_�|�5���!�s��y�+�N7c���i��s���9R�+9�]m�
�vWsTkK���>��y�n�.��Q��H��q��n�
'X����
��n������<(o��������/��@�}$W��S` �E<F�(V��_/qb�`2C!bx]�Vd���;^4@|�=��8���tr-�4�OT��=ZAt��Lt�8�	���C A���Rw<��]�Z�o
�r��������H�����`$h#O��C`�H��*(8�!FD�P0���H�������v*����V��c2
����%k�$��L����Y�{��#"�!�{��p���'L~��������A��3�F���L���aIMA��U�����O����~�N�75�9�)�����K��`�V��h���2�|6����}�D���C!U���;=�����?a����k'���/���p� ������7��}|����Z@��:&u<�i2F}h<����.��/q��t7�sWI����?���1r��oi����i���b@H�>��%WTAY[O������28��B�\��`l�:�����-?9 ��j�a��?}���p��c���x�c��������������O�DP�q��JD	XJ��V*��{�u���?�y�g����p�b��������,�7�����`����J��V��S�������E�*~��_���]V���~p ��������{�XD�{�'���{G�hD�V��N��d�������V���u���@(��a������WN_,����zw���m�&v��;�kFu��>L�H�\���8�o��WA
�V����I�~5��O�a���O;�z��V�vZ*��N���.��#,��xV|���L��\k&f����n�w;Y����j�n'�w>�>/�af�?��6|G�c���k�x��E���&!S���#�������A� �S�{O����$��v~�
��FK��H�w���@�g��}�q6�O��mP���)g�����#sL�kh�
F��s�N���'}���j�����]�{�J�M�48*r��Z��\�Q�9�>�N��#y��n2`�V�_�� (RB�!d��{��;:|s����czXL�6���L6�&�s�a�5���H*+gvtp�0�3�Q�^���(��U�S�R�`O��@g�8���.�a�!L,��eC��Y�+����}0;����Ma,~����N�d��h����|+<H	���������L*�
E��&��_�R?���8��r?�!:�J`zEC����7Z� ���'3�������M�d5��32n!����
���� �\��3k�x,���H�BM��)������;]Z�6|s�����L����l9V����p����-
c����]�c,3���vQz�S����ANa��T�|��\N�����nj�����gW6�\��%��L��=�����7;G���F���<(	����l����{���2DI�8��Vk!J�����1�{����i��lb@��'/��/0���f5������^Ip�%)Y��k&1�m�����3��|��|�$���4)��"�����[���Cua?�MF0���*j'���JB�(5�k�r���v/i>U�L�R�}��NsFZ�QW�r�%��`��p��/��32��=��!p�������r�������wh�����3�=Nl��X�St�]���v�D�7H������zB�O�e�J�D���7�*�������3��Z��.	�j9��q3D��'JU%� ����aZ5������V��)��h�P: ���p�����b:�o�����FF�e�

��3�u���H�����\EO�mEZ�R��@���s�E,�J/]��v	������(He@am���A_�]��7�l��b��{�.	L]�ZJ'�����W.���*��F�� �������
�}n��T+��)�������������Sv�KY����/�*�R;p�d���
Kq�,�V���|SF�]��}m��?v6|���d�5�ak-i�<�A:%U��LW����J*I���xz�l�)����'�2���|VSY$�M>n��16�����>�dw��_��6�VFs����GZ#�o�&�=mj��6^�[U�P��c��h��c�	El�s��WA=N�9���O�^��H�7��9o�^�K����b�@@����am���7�=�����A�X%g�%�{�.��#��T���j6�
Wz	63���a=��5�i�BP����n�<?f�r?0�7��"�EZ�S�J�p�!�����r����J,�fhj,��������0�y�k���}Q��-�QO�	�qP�T�G�7	�J�R������B�d�V����K�z%b{��)���9�o`�Fh
�����By:��Gnn���&��B�,��W�������'�YX�Y�]���:U����	[���<�h�8lD�RJ
���s�yG�y����)�Y�p`*��t�������|�0��������4�]b�����D��k)gKK������U��jYo��%�-���;:<�v��������}�>����]�F��_��h7����o��������)��,1Yb��C�����~��hd�!g������4�|����Q��3Y�`uxR�?���R����=
�@���U<���b�R<g9���?��3~�����
��y�^���?������?�@�H�AO��<���QL�t9�W�5�8eF(�b���X�A��+��5m�Rz"�!}�gI�����Ww��
_�
"��(
��/}*����
P��\s6"�$1��3<��y��0�|�����f@�A��d���J��I/cSZB��F{� , �	'�!
�3�:�l��`�4�A
����TS4�M&�����EN}H�>�R;x&������e(����k���H�C4R8YkBX+SM~y��j*�r@>���)�_�)A�K�����������B2�W��P6]y�GQU�R�y,���i"�DH_\��"����gC�����T�� hG���g�P��c��<���'Olx�4��mJ����/��2��"�e�v��{GF"EgO);�!/5��n���h�l><]t]zK���So�3D*K%�L�Z���S���@o�k���
>�L_���bM�"Vn�,�~X�s��r��+��A��waM0Bv�0w�R����9���"���B����WVAI����&�k���e�KPS���s�L��D��m�&9���{���lcS���/C��0���R[YDk��h������:��U������x��K���.����X�}�%�zm3�K� �V\�Cr�R?�T�R����>�1�|�Sc�&����r���j�]���F
$e�����T:������<�\���o��V�m��4Z�\�7�\e��M��C�6�D���S'g���9gF_�r���b=3���B�R�����|�NR��
;RL���ey��0^�]a��e9=��P��4,Q[Q�*��+X�o@�:l$7������������-�l��f���|[l`u�5qnB��bP�x�u�4���F��5�:?�l�h�J�C����b����
��b��d ��q��%�����T���m��8<+X�~Y<��?�����&S�-
C�j)T�ky�d]�e� .)��7d���V]N�T[}���\�r��B�d�8R��X ��]� 2����%�n���xB�nq�F���e��*���(t�����-l+�� ����*G*I�uDAP�iO�C}�����Id�
z)0OS�J>zKA�$E��qI�T�U_���}��=��A��Han�����R�����,����d|1	�Jl��TM9���;%2Y����7�'&Y\��A�G1�\6
)���iO���������D�']�
���q$��=���v�X$�O���>[�����������d���
a��iw����KCD�Z��p��.�~��Y:�4��d�F�����gW�Lu!g��D�W~-s��|j�T�B
Y�D�p�x���~�
BXDy)�
�2K�#G�}�j_����&�5�>������#r��{�N��\-�i�i�����]TL�H�}�����}��6�ZfK~��@�S�k��h?���2���,y�B�I�DI�z�qP�����K���3��������Q���86���8��(�qL�P]��}����oS�;���{>�$F�*�}3C�����[/'��^����d����������aX��c���j��T9V��_NO�^8��Q:�n4������\��	�UU��=��	��.p��0�����!���h0�Ng�<u�4��t�<���o���������h�6���9M_�B�5$���J�[^j""�1�\����no�o{����M@L�����N���w�}���v������N�'�+��i���
#�}W��<f>������N�2�@���)��y�S*A�_��K���=8f��kV�����'�=��C�����m���]���$o��W6��
���b�B~�&u�"
���r�
{X�m��."`h�|B1/d��>Z�<�+����]?,��2<X���d/�`(3_�2b��0���a��3^$r,����)���/�$���4)7Ep2:�c�8����b$����*_���'o��1���3�����U��L��r�|���:�r\���#�����6g5"*���X(��f�`c-'�����{G<o���]��Ql��M��Vc�Ea�@�T��B����7Vi�����p�fa6i�Ogsq2O��H."�A�����gR�R8gf������b��:l]��(FNu�"
ZBk�.s*�u����u��9��U��*%M��o6+��|����Mwv���X[[#�F"�o�y[��}!Vz+^!!M�jj�K�:O�*��k�}��O�<%H�)���8ZJNBJ�����4G���������e��,����I�q�t/���9jB�^B�H�����5jub�(L�x�A�mT���oR7����0\���a'�/�������I�*l�[����
���z�:���K��3_�L��s�i%sm��C��0�����������������a__"�t����e_�,���P>y������N;���(��PG���	`~���uNlakbmh��,I��*��;g�����	U��3�<�
�/���gr�E���,y
[� 	�S����<��� (
.��c/�_����b�P3�i��������O)�����(��z���j��4�B��	�C7�ujP�����4w`Rwq6�V�*��*~{���c��?�c������'��:z�����l
���?]'�F�{	���������������7�oq1�wO������$o���:&:�Jwo��e����������f�����7x�<�^N����7��4�X��V�7�x66`��A��s��p�\&e����-�py���6ky��J����A�����d�����W�O�u��h�\']���t��Kw��A�{�n��4����mz���=U�h��i������;<���Q����F�R������bp��Va����/������:��/����~�����"^=�����o�P#��{�go8��4"�)�������g#���LF6~��	-��3��x6<�*��
���+��?���u�a��a��Mbb�DNc%RZ�����r����JJ+���S4����?fh9�z?%�A4�pz���'��,����B)*���E��g�>|%6��+@=�S�?�sx��:�)�����{E?G}����;9<~O�Co�D��{w<����bs�K����`c�"�BB��t5Nc���U}&�l�_�y|�[ao]_6��P����=S�����BkD��	��D�\�R���&R�Uwlw��I���@�K���{��5�e��1��������� 9O�?��HyyY|ZXSy�=L��A�o2g@s6g�X��"([��cC��S>��X%��RDZ�w����q��0�H�t��{�ye�?R:��%�����`UC���+Z>0�21'_�(C)��
�l\I�a�D���P���2	"l�����=2�qk��Wc�0E�������p�m
9�A��3����8~~)�Y}�.����%b\\cK�t��:gq���k��u��r��K�`N/F�~�H��Q0�^�Q��I[)��(���K����� �x����h�z������!�E8�v�;�5����������������0����|�F�K=L�w�6UQ����>�I0�;JH:���pz�w�o29�m���� ��n�ku�r�)C����W����F2 k������h��za����2;�L�,����9V�f�����`�����d��n�3Dn�j���%r�K��$r�����9��M��Z�)IW%~*�*�j#O����G�����z�)���0g�k�\���^
�y�a�0@L���S
HN�_`��(�'S�K�g�r��&����x ���\��%Z���L�p!W�Sp��!�U=o
��m���E���Pm�?���={wt����p>,�-�~^�:�\\$�To�����F����yE�a^J�!`��W�QD�n���y�Xc�znPHA���5-����t�`F	�'��]d<�����]�:�������!e����a�%t�(��q%4F����Y���'V��w�GsP��x6��P3��;��k�ivk���P�X�~}~�V"[�j�}����YX_H��GkW������M���?#���X�h�����9��3���XZ���f
�=D#���&5`��9�U�zf�^;2.	/���(5nz{	hH]g2�X3X��<��S��5y%)��3�9���1�j��m�`[�{$q�������~&1���,d��Zz�1,BZ��!<�L�n�������a�'j8������6g0�u�|��p����3���d��
M���;k1pTt��!������h��eO�����V���99�S�Zq?��E'�� ��\p�F���^��FmR���mvU�3X_A��/i�%��&pc7iV�T�{�{�q��(�����(������8H���H�>��i��'�����Q����y���[�e�{�^:���~'�s@�0�
��aW/q���s5�P&�#�����y�4���\Fx�n�c��P��6���M�bd���I���tT��c��G�
������c��Q����������!%^)��n����e��]G���l���+�+��NW�
zE�"5���j�� ��.C�G�e��OQ��p��Md(e����=G������s&��e%UB8{<��p�����
k)����p2�%Z/q������9g�9����Q��_�����������0>�d�r��w�-�����[W�;�@�����u�
Z�y�8G��!���Q�q4����
,���J����A�_A��h��?Y�������j
C���rg�u������.s>�2X��Jq[�����(#��H{W�Soz���x3�+�����:�~�<����,uN��
�����}���� �����7����~�2x��n����&K��-����h7k�V,�m)s�+��������:Q�J�N��}W2�p�!�z���)���S��f@����5PG����?B�1��A<�@]3�[���E��;�Tf#����4��!� ���d�YVc�*-+A�L��A��%�0D�X�)aCI�`���'P�N�Q��b�5����u\�FxQ�I���
��%�"���?���_&�wI�`����VrY�L�/���+��I��]%U�J����q�����TA�����<-�>�,�����^xc+��s 5����gyU�yU������~�0�S�V�4��S�Av��6��$'�6��G�\��M�������Sk�Ye�����F!����'dv�'�����D��C��<M���$ �����kx���4@��`��|M~��>�}k��������5S��H8�@&��>L�)l�	E�8��S�96�8�3s���Q`UB�d<��z\\��)0C����	��i|$
���B��z��3���r���w2��
,�����|�l��R
��������4��^O�5��Z��[)�R~������F�.��R���yla������ �:�4��k��k�v9�����V��6�������t�G��=lM�����Jao�;�oA/�{����	���u3�E����Q%�t����V�<gw����J��S�f�[�����0�x\��"{��T
�U�.���������]�� �G1�����k�l����G'{���A��c:��Q�
/P�Q��{�t�U`1��M��q��7���\4��)��@O�1;�Z�l�eK��e>fK����Uk5��]��T�ens��������9sK�-��"�EI��^�,-�Nzl#zepp�����?�F��G����N�����SR�#�QLQ�(nM�����E;�^��w���1O;����>���0�������.�B��Gww����[��,m���+�
���f��d�#��6�k675��%E�0��#�a��A�:��T\���v��.��y�ZM"�������%e��9��O��@����jc$E�J�*	A��>v�{G!r���)��|��lh1��e�
���%�����B���h�U�vK��*�	0K���������m��`��O��w������5wwv������
���+�
�@QE���EJ�c����D���t����PM�l���0�"UPM��8�,�:��B���0#�"�dVE���8$Ya��e��<�������v�Ci�����N��Dm;��������Kl���!����$K�Q<����������Hm����}�U+"yN��[S���b�s���|�P���l �Pn��)�����P��N'6v�PM���������a�H�������p����6�(�����D6��R�������<'������>5�K�i+&q���Ea�_7H���l�f�#e�0���7����s����������9����?W��������v��Hm��.nnn�67wY�V�}�d��&����	�o}�#p ��6AQ��nh�{�7�V.5�;��7��&�>p �?��7�3L�1T�Q����=n���K�Y(7�����K~�p��
�mB��
�Z��������w�vf��c�v'c�������l��qT���b^��o�6r+S4|��xp=�'����!�q|*$p�������y����>��g����i�w��y���
�_��-(�������jA$��3�V��b������"��v^�*i!#�����]�Q�zh��sM�����+�B�K�x���ZX������4y&~�E���p��D."�C��E�� ��t19�~7�����lkw=���V�������>`��T!�����/:vM��o$����1��G��C�Um��j��-�M���w�-����w��.'���%��-���B:
U���)"������������?�)Z��R���{Lz��� �������7bF=ai�Qj�����D1�qJ)L�����)QT�!��A����!��_�^(�,��D��I<$�hL���M Z<S�p�'+Q��_��p����������d���B8�����{��{�A].�;�%b�E��U-*T��z\�g����F��"��c���ji���bV
����=o�|+ ����z(�!H���<��6��D����\�Y%�m5q��Y�E|z�y(!
�8���v��R�h(k\AS��\d{������&z�����	�;-�dKV������b�
oyC�g�{%���9v�� �������U8��K���_��	��f�CV<�:���Mv�������M�W����/�e��O)eG��f����:��O�I�&*����@��:�D�,W�$!?5�YN�#i�Ve$0R�yv��t�r�_��O�d`��m@���I������fkK��_���-���6]���/�O�����{���kqk���l����QG�h�n�DR���
���"����{���8����Et�l#i��b���m�l:Q�V_���e�'<���j����n5
^gb�M�������1��^j}I��a�K#��L�+�v�c�=5��;�����A����}��1����Fq�����m�V��akc��e��X��5��y��jJ����B6�~<�NO�N����*(��U�_v0	��|����V�G���F�_x�cM[={���X
�u%�6�30�*�����:�D�������f�/����Lv�o�Q������aw����lm�����z{�\x����]
�,j4x�������I���|��W�t�uN�?Li��0q|�V���P$���ms�a���
a��P/���%��� ���	�?��_�����g�Igpi��}n�l�/����
�c�R�a8
������L'��eX�VDkJ�� :��N�W/��[��ol77��Dm��#L[]�����N���x6�	��Sg���2����������������gjz-!e+���7���YT���Le}-�FM�� ���TU;'����;��|G����c����&��h�-�K',I1�3����c�bhsZ�W��&��K�tg��S��^0�`x%V��9��Q��QGR�R�Gj�#��+���	�1`�����Q�E[�������<��e������6��-sK	1::��]����ZU9������*#W_}I��/2'��o�GG]l�'z	�aD����������nQX��}�1�1kkg����mj���#����4Ucd�s��'��4�X��>�0"��2lm�����\}9	��4�6��������V�n���1�����?�_�..�����5!��@���r��1
*���m��a��&��������v�n����#��&vD���yx��X��5�N��(N��M�t|����kc�W�?'X'�8�|z{g��n���'o�\���}��o��m��p�$�����-C���<<���s�BA�S��!�+;��nE"����$��������9@��k�h`	h@��+�J5[�bUy��D�)�Mi-F��H�(K�f��l3��'X����hJ�����;_N�>E(`��d�lG�99��;��e��"����c����.�Pi`�p�����hy=���o�a�I>�����N]���V(yw�j��r�:��jY�R����K�:�>~���!jm3�I9`�����U?3���^bm4vk��
C��z0lcl56r.(����t� !W\/b�GT�(|6	9��hZ�rV^�EfCR@���6�S���"���0�m�Ge�u�\?�-:����PT���T
=�W���{�2���-s��z�t����(\�����`���J�zL����@���E
r������<I�*"��ZbL����C����I/<�B�e#��-�\�!^����7���t�a�v����\��CU�Ga?�+��O���u���f��k���,P�G��>���0��.Z��k����`��SW�O�8u� ��9� �A�G���,��J���P�Q�]�j�SKtv=�7)hzQ������EU��j��m�H#���M�y��rcM���A�}�����%���WY]�s�+zI^_��M�����~�������}�'
�T�_�$F� ��*[�^���F�*���%��+��,[�S�h����(B����}�w?�=P)z�h$��r���5a��n��@m1nMMx����7���n���#�s�7��������*&!���������)�n.f���Y0�H6�H�������Q6��X a����;h��9��&F7�&�o��{�"j O��h�c/���	Jo��N��:�3T?��#��}���o�"ee'�a�Y�O�,��d���!P�3=E���h.�?'�~��[�����6`%�_��UX;p�.mh�H`�F3y�t�!�JO�0��u���Xwr�u��$��k���sm�z�&���i{��V�E�F���,J���������~����h�n���/)8�,�	S�����E��'�*�\uZ�?9:��X�}[�@��4F"e[��.2�i ���Y���}�H���;��]��Q_;_��>I�2���1s��,�����u"u�U����a;&����c�!Z���������p��|Dd��k��\�
y������������3�%�#�_!r�	 �
�i�^>�R���2�+/�>2c5(	"/��)/�B��i�Pc'QW��vY^ ��z�w�w���j��u�����`���iH�!RE!���r2����Y{�'���{GJfY;����~�+������z�H�����"�������!g:+�6���2=w�a�U����_��?���7J��
j9�`)��Vw���&+X5^��N{v��B
�X�����,�9
��*jW���E��eF��QR_�&��0$�A3�l�5i���w�#
3��m[�l�*�M;*lpF��7��T��]�����4W�5QHw��X��N��
pO�Y�9���5����Iwq>���$(l���4:�R���8{�I4�GHv��J&���GE�4�n�j���{���~L	��J�dF^v*@�Y�z���� �
����3�r��������C���H��O=���T�u��Fz��+���M�kW�SMa1�oM�i�+7)M�ru������?�3��aDa1�����~�>=��v|���7���v�!�����Mh���M�V������c
[�[H����y�`�_�q���'%f���E��
y����Z�./��A}	������1r�A����7�]�X��;��1�%t�/���0��|��-4t���m�i�i�Q�<)cI7'|�����������C@�7�{9"��Ffs���a�����O!�$"O4"�HA�G��
�{�a�1C��X�l�Mz�h<}*�g��O3�p���nU��<�2��zxt��9�o��K%9<]	�����L�YO}�����	�vU������N�Ok����6E�w�F�%��*���vL��7 �d�%�w��uv���S��I�BC�2��9;.r)�����i5�W���lX��[��u6���:�E�lp��E�lr�m��E�� �*C���J�������Sjc����:���E�H��������R���_��[��m,����/Rg��,D����v���"uu���P%�����*1+�n;���+H"�{��{{���M�^C��]m�IQY����j���_�n��8��_�T %?��n��LW���������S��W��eS��n��4�g;W(��<j�V��YV@���B�n�+��e���*��ew�Nv)�'9�m�u����NO�K��N<P��������V���������^�W�Q�/-�{����yx�\�)�q
6���	��t�6A�(����67��
 "F{(����Ol?��Ad�r!��"!4��JH��1
����4G��z[X�5�>u!�>��S��j�$]��T�y������������-��9�?�,����*a��M������n�48����]X�*B,�|�L�k����k6A����o��:���I����z���&�@�W���0�����dq���>���
*�$Y��;@zv�������[\��$���@D��m��(�5�9M3�����]��#����7>�i���a���D����D`0-��f���7��<�I�/����%�w�%��b.N#���cD.� ���9�l3.%Q�`|$*s��F�������(���ka���k.�^<tN�|v	�����������D���l��rj>� ���;���S��y�Uo�x,v	����8�����f1iZ�����!ef)��HpZ��h`bR_`�2�e)�@(Qqy(�`1,6���J\��E�6�,@�E����������������s�������#$���H�(@�����h�_�(EY��Fh�\��\�`���<xr�e�9����c�fI^k��^��p�s�����|\��X^��R�%����_uw��m?�K���i�����U�n�2���B�d#(��s��Q<Z�
)�}:w�9���x�+���JZ0oG��yw��ZC���t7����M��dX[�{�\���ih���,{6��*�����LW����g�Y�j���,W����gf{��W��{{x�]��e�\�a��ll��f#������y��$�����,��4�.`�u!"zC�l%��6�dJ[��
����U��9l���.��r�%������e��������������K����9	X`�=L�n%J���&\��w���A������b��hl�2��5��O��
O��vA7�o������,�����mzU�i��;��;��\�I�xg�o��F�z�%����#!h�hN���M�9tuN�s^b�a��*�m��\�}�u��j���k�����D�'�GAu�f�k�6�Lk��hz������a�Y����7[�$������n�� 4];����LY�p-JR�
L{-���8�(��f�[�q�:��)�[s�j5Pb����k����q<��A�%Dv/�,:2�[���%��Qv��zd�;�n<'a���T��4U����6�&���%,,����po��-V��c8��b$��]Y$	t	,U��+�U��0V�S9t����x|_ �7�W���M�
��l@}-�>.�~4s48����_�9Q>��I��{o=��o��2��l�I"�w����t"���6�I�!�KAo�zF�Wo4��{c��r�i�csq�csq���@'���l�Cs/���o;4�;c���e����"J��o4�_����R1
���5���_���� ����On��G��t�u��pG���LGT]�}z���������7e�E5p��[	���RK���>�-��E�nCz��h���L����M������^���[g���M:���j���z�F�{����h8�����t�}cA��7���RS/,���q�>����Rj,�TG���^{���7�J�1��
t�]�3lY�;|�~��<)���D&O���7�@�&=z\�G�����=���n$}K�a�nF�7��G����8��:*��S����+��a0���������-h�����X� vy����|�Y�����������^F�U���T�6�N��h���M��B�m���d0�K;+� ���c�Z�a�����B+�R���`�e��}���p<y��	Yvo���&��s;������=���wp7��q8
����,o.����{��N=����S2D�E�M��n����H��~�Q�p���=����+�l�X���Y����.���-S�x��������TD�E���o���O3%:�|r�PN�	��������[���:����t3�qg�>6H[A����#��>���f�#{Wv������8[,>.�ku��%-x�t2C��z����DXvF���r�����F}�4�����Pi�C����A47�F��A�h6\t&l}
3a��(�FD5����`*l,����q�n��l�\��l7��	A{�i��|��*�����74��]�?�t�e��:�t: n����
����@/Z�^|
�a�]=�����C��L������74��]�?���^�M�%�|�)��p?Z�~|�b��&-0)�_��`�{!���we>��`�{�.4�.���&+������W1)X������yo��E��X}c�i��>b�l.�����pJN�����pZn�m*����<?���L��w��n�x�1{��f��S4'Z5��	��UO8?-'�;k����:�R|�����S\7���y�/�����I����L�GAi#�K@f��d�CX����_:nU����.�=P��\IT�Zr����kFd?_�OM�W��o�6�
�'��Ix��#�f����C8���� �L���3�����I�}��Fd/���O��x �
L�^��2F;�[F�^���:F��,oH��I<$x4S��-��3�.C�����=	s�R�y1g������+�h&���q��L�*Hdj�p�dF#�����5���%�~�?��x��sn�o�������������]x[ZZ��
��	��^���t����$��@���:�6�
�C~�� ����������h�z6��UU���a���oN�w� )����@g3T��Q���0���#�-�������*2U�S�J�S��RUt�gX�d����@*�Z
Cs�=m��7)���8(���U&�%^O�f�a��U��_���i���kP�I����F��:�7�E�����4�4% *�Q�9��:k-
\��,s<���XC���w���'�����e~#��X&0KH�8Or���T���Z<v���	<�	7a�(xh\l��i�����������U��E���/-5�Ji�^Zj��,mnB3�g�s�'.-mS����EJ6������U-��#����d|��6�����cjZX��M��r��1��	���O�f������c�S[��Ox�������Nr��8���k�a�i�����n��|B���\�V1�95�����|��D�����=�n�{��'2*[��.����En{�������T��%�2U���
�E���*4v����#:��>5w�g����������*���<������2>zs�Q�������%��)�IF�8��]G���Q��{:��������J�Z�!&���P�B����:�O�{v��s��Ip���^��Ot��?�U�U��/>�:B������*at�D��n����C5�{"N]�A%�������7�����md��qg��
P\���y��F�[�{�����i~��NO��S������I]I�o�#����u(���8���E�g	�u��W�;t��C-��L�$�w����3��;yh����;K��{%�����n�
������{�z�m�7�y�7���g(���l�	�6����q���K��u��,���y��1�[�{���{�����}+��-^_w�}�>�<�Q;6��yR��-��|�3�o�������o�&���I8���q�xU��V�������������:�u.�w�$1��a����sR)�6wk��@��z7y�]�+FZ��g���E�c�*����yX����W�U�_����
����~�w|p�>e�5?������U�f���0^��������0sx�`�`#�n5������Nsfs���'o����V�+����a����@��$��S9	��T��l���*����N���*Y��5��
DQ(?Yq7:Q�]c������������0��P_A���a�u�/���2�\g��h�C�{+���l��6w�s�v���]��i$������mi�p���d�9����}z���r��W�G�����[I
�.���4�Y����
9�-�9|�>{�w����-���}
@����H��{
!�*2-V��$?��o�������,!�j}�{|r�y�)"�t���&�=�Qv7k�T2��D7����������!�Z��s�7��������Js�����>'#i'� ��0�T&��l:���}�T��6j-���_���a���Sm_t�c������pk	�����*k�G��Oy2{�
�����|��'i<�a���p'���]!?[Z�ES,v�C0����?��������$��a��N�*�Q���Fq?L��w�����omlP�:{u��K�8�Z�����a�M=�K��i�'Ga)S�����0��Z=�C!�:��u�"2������xt]�&dR��y�t�P�)��4��f�����?�^�d���Z"������c~g�q��3u�]�1c��k��9����FB��J��]�TK��x������%��."P!(p������H4�L����$�	@X�*=
1����=�Uuz�B6��B�Y�t�6
?������O���� Y����}��>�ill��
G�S?
�m�t��*���1���;}s&�.Ch�$/��CB#<�m���KT�!�s�x��(�������PI������� �NzA��h�2�q���5��0�����tuZ{>c$��1���=�*N�n�w*��t��J����QNIdp>���$���|9R���<��X�������h��Rea	�����S�;}@��KwT��#@4k�u������q�{�<,Iw,Y��S�� i&^p��H���7h��$�'�������SU�zG
?���@�(��Mb&�^L���n G�d3����H��eT�{���1{b����/��]��9,�����4�z��'�e���}"�(�t��`N�O�Jk�����J�Z��/u�,V�<8����P�
��@�$Y�vETJ������/�!�a�GX��8 ��x�z!z����+1����J����������5u�t�2���V�~}=t��A���)��HwK�/��\\W�{��GE��9�~�������r���R�lD@ �=�H�.SLi�4k��`��y���t���#
�������&G�����Z�c"�b�&q:	������&E�>@,��S���?��g����U�V�;'{g���^��[(T-���h������R�tH��w��f=��\QP^��Ta��l�L9���Z��#P���v���?=�8}"�dp�l'?UK�UI�A���������*��@]B��M�%�/yq�x�R�0���3m,���C��7�t��m��Tj��R�t�a�SX�H�n����J#�h!��K��Z��mG�aF90m����������R��#�U/�.��9�R�����	��C�(X�c����n#��E�;V����9��K�Sr\.?����������+q ���)fq��2�t��MF�_�Bx�Xt!i���y�O!]�O����Z �������6�h�d�?k�v6�,/O�Ay�Y`��,��7-��&�Z�b��T�JH���z�\B��x���Dr�Z&6�b�c6;<���T����a��!�7q�������������}���{|�sqetq����F�b����ba�K����K��f�*�B[�#ZIk��f�9yT��Z�kY�6RJ�l#�(k��m�q�A\��d�R�����y�m��iW�#
|�4�v�;8��q������l2N���i���dF����^�M��q�t��e[��s6"�+����H�����#��zm{S�[�@��:����}�kx�6!�XL���T���2��;=�?�{���p|�N?���Y�;���}��UA�����?j����T��>2*��]�kg���5�Z�1��G�+���G�7�O���+��aW��1���I^�E����^��1Ua�!�x��/���+-�k=khs��Fvc�^�������d��
��`p8���E/w��W������/`JV&!�3�Hr�t����*A�?T�gJ���X�#�I,U��j
a���)�;���������V�xLE/�
��cHB����3�_���P���bM}.v>�}<�
�X�M�;t-��':Vi5��0���1G���B��6����Y�i�1�Nz^ �O���c�'G7���D  ���wo��~��P������SI+���,�����w'g����Qk�Uk�v��2�O�%3vQM�)���N���������"��4��	�&��,5��4��U���KRh+U�*���l�����]�����
��Sh%�AcSd��3�d��!��((:/�	����J�*kB�
����u��*�t3	I��^��,�0(�$P�����Gk���Kc{���������fC������������#vM��U�i���|.�{��F}���h����F��@vlQN�6��O������x�X�RA�>��#.�x�@U�����YF�?q���%�i>2fUq12��V��I��|�z�	�m����6Z�hz�����*�W�Z�����;9=h��W�	�����}L��9����)~����yE�����pi��Y���z��~G�uA����xkz���q3���>=y������T�9_�R���mk����"�����V����W�z��f�����V~[[�mm������N>��|�;���Z��T�f�U���Y8�;��6�����|[ l7�_`3�||�33MX(@��o)�u���^�}��E/-�v����z��U�^nn�`���m��y�l.0��4��;�N��;���t�[+�%Fp�	T.x�S�r�^w_���l��*j��jS�/b.��Z�!�~�S��E���O�^�����`����gaw���i���/(qZ����G�����Y*7������P���X~	���$7v>G{�F��J���(�5����:�G�;���~6��������N�M�H���
l����?���-1�_�ZT��Qa#X���"������%�^��%�ZX����/X�e!�-n���/�`l��c{n_vxh`��me�F���fv��6������yE�oQ3
�X����W���� ����Z��Z�
~�E�Ws����G��I
�����y�W{�f��RL�-�Au��-JAv�_����:f���������f���i�!�^��&��5��L�t��<��i8����Y4	�52
FS1��$�x�wf������ J���+J��.����.��]�rX��e��q���v���z�>==9}*8�4�E�8
�~���U|�0�4(u="��h�\N�	4���N{G_��?9����������Ye/#�q�L��A��8�uXy��H����oT���}��*�h,��OM�������;K��� (8���h�?��^������_��n<\+x=�,���*D���Oa��.:w�T���0f��`�+��/40�YHw�0W��H���Z#{���Z��#��SGv�GU"��
M�H�s���������U��j�[%���L��_B�.������R�^�/�]���X�_V�0
/�����H����"���++O�j�XQ�BG/���`x�0���9lh��H��2�E�i.������_�>��R�	\s..�
0��bUd��qp��Q%����?���J5����h|������`"�)�l�?9�r~��U��/�8��/�8T�/�8T�/�8������U
�����U���p,��J������Uj,������*���w��V>�f�52��za����H([�N�� *��&AW=��
�j
�L+hu4�e�]�?�����A�,&��@��+�oi.�h�h����0�����/?.������U'��	�]��X#�s���:��������cY���S�����~y4D�����u�4x����;+�,e�r��CV��a= ����;zk������:m��{u��Q��T�2�����K���~r�ve���� P��vG��i�&��I/�����O;��r�j�������
L��%��`:�-[�e�������������\���������P���N�gz5�X	�]x~M����4�S�f�UAh��_�#�u4U!>��|��	��{���\�����a6�W����K����$����T��h�����0����W`���]�^G6�{� I����&5a��n
�5x���Yv�c�_�?���{�?d?���.��__�H�k�:��5
�A!`�v�O��}C��j#������r��6=�]��@T����3������*5���|�� ���g�H�=d�]�	���s��P�����no�`�����Oe�$�3@���	z�h6!rC�!��)O��jACx~a����l_�������������;���jv+
n��Q���\��!��=�_�� ��_�K����N�L�@�9�y�[��!���a�~5��V�$�z
���q� ����b�s���=�gLR��gf}���i��X;�%�j�&�>:�w�M�4��M����]��;�l�C |�Nn_A��<����>7^b�HwcmtW���}�����[k�w('�?�;���������'�]G��,����p���j&=O�
�7�P"<O=l�	tE�'7���Z������@��4�v�B|��;��]��YR��\Re��|����6K
oO��,���|��j��B�T;�������`�
�����5
���(u��~��U�13���������=�F�n��r�����q}��U#g��6	M=��)��x��6�x�*���x�`q�h��M=�cok�U�n�����5�2�����Y��75��C�m����2�m�����?}��,��/�L�"m�]M�Y��1h���$�*#��
�x�b��}�\��8��H�����~�?�F�t6	K�;@�U�����GE��t(�1�����~�	����������&�;���%t�SE<g �d�g,ppz��w�R��)}���&�.�'C��f��uj�%��+\j�F���X-	1W'MC������7�u�u(��~TY��_}���	�|;t����9��h����5b5�6����k�A�(s�w�`����	�H��4��2I��,:0�Z%��CV�L�V�d���%Y�>@#�x�8S<3/k��	^(�����[as��%.K������9p7�A�������0>~tT�|��h�7��&�zy�x�~sx���������b?/��[�<����v�)B����"�^<M+�%��.�B��jv�I���Al5�J�O��l�������j~k���]k��F���F�����O�����G�jns�v�=����fQs��V����Zw^����B���J��NQ�wv���/B����q�<Z�2�z�)�h1�ll��#e��x!�b3��������D�_N/*����?D��/����'q���}�����'����=����V|�p���y��?��r�9�������Z���O��+�7�xHo����"�x�&�XH��?Q�x�L8��c���I^����(��4���s"4���b��`�W�_�svMa�glD�*D�I[)j�,��O�$��?���b�X��g��Y�$��EMU���U�k�Fs*B=�����~��p/����?������`�W��x���\V�S�"�]n�,3��X���w����"�����5Q������j��U�?l�d��7a�?����y��'�,���53�52�5������L��=�_��b�I���~
�ehDO^'�\^�����#h�o���b������=�$��?����R�P��5�E�zQ�j��	?�,R=(�V=�������g�6�s��6�2��b�����,�S�y/�P�����_(�����yti�/���>��%h?�C���G��C@?1�����k�|H!?�%O��/6�SJ���=pY_Y���X������Z��^4���d
m�-P��.�_����D�����h6���w���I�au�F}��b&�L;yd����./'����������_�X~'J�����'�*Rc	
�w�7~����EvX N������mMa�9�^�����o6����r��Q�������`�.�SW�4�aQZ��(6��]g,�twvv�vv��������k��[�;�!�:p������u�zNn�k(L�a�i�5���J�G�x����������*��Od�m�<���Jr�s�K�J
q�c�)����2{j�!��
�U.��V�g)^R�]n���^�������2���y�(���;P5YR��PE�JD%��o�a�k{��9Id/����.����%/��@8���@����e����`����+U����	w-�3���m�l��n=�yA�f9��i]�Rr�L�ajM$��5��������51�����)�4�	>r`|@�I�?5�o�(����jV���T�@����5|9ms�<��~t4f2��k���E�(O��� ����Zn�W�}�.��|o������C
sV%�!Nu���c�yD���wrZ���C8#JTG��i{�w�L1����1��iid 6��4���\����y��op��|_�
B�g�m�4_1J��1��z�p<��4�1R���EqQ���Fj������Ge�a�C�La33��#��Gym�~G_Y���H���/#�����'�b*#�"�I�����8$�9WDe��/��z�z"�z���Vy�L��`����=r��}�A�J����+� �u���sS���i�6�6�?�g>��]h����L������|6-,����S6C���.F<Ao��vd����~S�w*�j�G-�,��������o������%��|���~x�����3��-��^��I0��0n�HO�-���wV=���J����.h�q������n6eF��5cj\(��g�S�L�S>��{����S����[���S����\hV����+#����bRX���e��W(R�i����d���&n<l��S���N�m�f��^���;�^�-�n�ld��!��5�zZd"j:�`�AB�����%n���r?����g��D8�?����r2�.�S/�=S�����Uk4�]P��T�k��*H����mSa�s����`
�E�����uc���_c������^���=	?N�i��:	{��<�����c���~�%�Lv=�LM��_��s�e��F�Uvm��|��	�Lu|�yo6�}���X2�=�D��s���"�N�����4�����'��Zwp�����Q����;�so��7�p�/�4]��%��f��N(V����J;�jZ/��L�K�A�1����LWQ����>�H�<z�B�6<��U����@
�������6��_}����J�j�h�\3J��=�U0�.G(�K�W��mx�J2�'(8u�1�������+y�wA>�5�zh�3P��A7�9��
��Y�-�e�e�l�X�)� 4�����E����e8���9�gc�z�v8�B��C	�<�AYQ�6�H9CZ/�
(��s
L�G��
i���	'����g3��#1�������Z���+��e
�J�l�������pua,�)�J��2���BX����$�A{Z���<nL��bk�^��/��Q�)�l�k��3\k�4�����R�����?R��Ij�R�`plS��������wX�"��&�xg�T0�f�`�s+��7c����OYb��.z�����z�o������7g����MB���y�o�,����[O����@z]`~���"�8�3�/2�fO�}��r�y������p��-���7r���O��8�$��/��a����?(	�k�������:���/_0����o��1��8���{?'�:�Al��������9'�\������07\u�J��y
F�.Y�9���h���-�6/
�����A���)7Pr~�����*��f~���u������)\����dV��Jy|K�(�X^h]S���.
)5uQy�kK�)UvQH7�S�����������8�e+��������~uR��X�_a�Q?V�� ��*Nh��j�����F�~���7P�%���1�Y�R���-���?�<~]��y|�%�<��z��3wM��1b�$����s��(-^ w�������rwM��^��&����UL���"��N�!~'"`��K��Yl*/*iA0w�M�i�����1����L�/6�sC�=�]F%+�#�~��������b@��bN�NoH�2��q,�/��#���$�q(s��=���XwS�w'���k��O/���<��"�� *M��w��������Tx�L�9!e�4RL��%��<�J��2�4dL�l�a���d�C�s3Y���	(�i��t�q<�8gZ+�aM���bQ8,���M�D�xp��W���� ?���������L�-<-�tO�_0�E���9c\<�J�L�����zx��o/��w���CL�]Vk�������������Z�Mi���D<l�
#28Florian Pflug
fgp@phlo.org
In reply to: Jeff Davis (#27)
Re: Range Types - typo + NULL string constructor

On Oct2, 2011, at 08:12 , Jeff Davis wrote:

Done. Now range types more closely resemble records in parsing behavior.
Patch attached.

Cool!

Looking at the patch, I noticed that it's possible to specify the default
boundaries ([], [), (] or ()) per individual float type with the
DEFAULT_FLAGS clause of CREATE TYPE .. AS RANGE. I wonder if that doesn't
do more harm then good - it makes it impossible to deduce the meaning of
e.g. numericrange(1.0, 2.0) without looking up the definition of numericrange.

I suggest we pick one set of default boundaries, ideally '[)' since that
is what all the built-in canonization functions produce, and stick with it.

best regards,
Florian Pflug

#29Jeff Davis
pgsql@j-davis.com
In reply to: Florian Pflug (#28)
Re: Range Types - typo + NULL string constructor

On Sun, 2011-10-02 at 11:32 +0200, Florian Pflug wrote:

Looking at the patch, I noticed that it's possible to specify the default
boundaries ([], [), (] or ()) per individual float type with the
DEFAULT_FLAGS clause of CREATE TYPE .. AS RANGE. I wonder if that doesn't
do more harm then good - it makes it impossible to deduce the meaning of
e.g. numericrange(1.0, 2.0) without looking up the definition of numericrange.

I suggest we pick one set of default boundaries, ideally '[)' since that
is what all the built-in canonization functions produce, and stick with it.

That sounds reasonable to me. Unless someone objects, I'll make the
change in the next patch.

Regards,
Jeff Davis

#30Jeff Davis
pgsql@j-davis.com
In reply to: Florian Pflug (#28)
1 attachment(s)
Re: Range Types - typo + NULL string constructor

On Sun, 2011-10-02 at 11:32 +0200, Florian Pflug wrote:

Looking at the patch, I noticed that it's possible to specify the default
boundaries ([], [), (] or ()) per individual float type with the
DEFAULT_FLAGS clause of CREATE TYPE .. AS RANGE. I wonder if that doesn't
do more harm then good - it makes it impossible to deduce the meaning of
e.g. numericrange(1.0, 2.0) without looking up the definition of numericrange.

I suggest we pick one set of default boundaries, ideally '[)' since that
is what all the built-in canonization functions produce, and stick with it.

Done.

Also, made the range parsing even more like records with more code
copied verbatim. And fixed some parsing tests along the way.

Regards,
Jeff Davis

Attachments:

rangetypes-20111002.gzapplication/x-gzip; name=rangetypes-20111002.gzDownload
#31Alexander Korotkov
aekorotkov@gmail.com
In reply to: Jeff Davis (#30)
Re: Range Types - typo + NULL string constructor

Hi, Jeff!

Heikki has recently commited my patch about picksplit for GiST on points and
boxes:
http://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7f3bd86843e5aad84585a57d3f6b80db3c609916
I would like to try this picksplit method on ranges. I believe that it might
be much more efficient on highly overlapping ranges than current picksplit.
Range types patch isn't commited, yet. So, what way of work publishing is
prefered in this case? Add-on patch, separate branch in git or something
else?

------
With best regards,
Alexander Korotkov.

#32Jeff Davis
pgsql@j-davis.com
In reply to: Alexander Korotkov (#31)
Re: Range Types - typo + NULL string constructor

On Thu, 2011-10-06 at 23:26 +0400, Alexander Korotkov wrote:

Hi, Jeff!

Heikki has recently commited my patch about picksplit for GiST on
points and boxes:
http://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7f3bd86843e5aad84585a57d3f6b80db3c609916
I would like to try this picksplit method on ranges. I believe that it
might be much more efficient on highly overlapping ranges than current
picksplit. Range types patch isn't commited, yet. So, what way of work
publishing is prefered in this case? Add-on patch, separate branch in
git or something else?

Sounds great! Thank you.

The repo is available here:

http://git.postgresql.org/gitweb/?p=users/jdavis/postgres.git;a=log;h=refs/heads/rangetypes

I'd prefer to include it in the initial patch. If the current GiST code
is going to be replaced, then there's not much sense reviewing/testing
it.

You may need to consider unbounded and empty ranges specially. I made an
attempt to do so in the current GiST code, and you might want to take a
look at that first. I'm not particularly attached to my approach, but we
should do something reasonable with unbounded and empty ranges.

Regards,
Jeff Davis

#33Jeff Janes
jeff.janes@gmail.com
In reply to: Jeff Davis (#30)
Re: Range Types - typo + NULL string constructor

On Sun, Oct 2, 2011 at 12:05 PM, Jeff Davis <pgsql@j-davis.com> wrote:

On Sun, 2011-10-02 at 11:32 +0200, Florian Pflug wrote:

Looking at the patch, I noticed that it's possible to specify the default
boundaries ([], [), (] or ()) per individual float type with the
DEFAULT_FLAGS clause of CREATE TYPE .. AS RANGE. I wonder if that doesn't
do more harm then good - it makes it impossible to deduce the meaning of
e.g. numericrange(1.0, 2.0) without looking up the definition of numericrange.

I suggest we pick one set of default boundaries, ideally '[)' since that
is what all the built-in canonization functions produce, and stick with it.

Done.

Also, made the range parsing even more like records with more code
copied verbatim. And fixed some parsing tests along the way.

When I apply this to head, "make check" fails with:

create type textrange_en_us as range(subtype=text, collation="en_US");
+ ERROR: collation "en_US" for encoding "SQL_ASCII" does not exist

Is this a problem? e.g. will it break the build-farm?

"make check LANG=en_US" does pass

Cheers,

Jeff

#34Jeff Davis
pgsql@j-davis.com
In reply to: Jeff Janes (#33)
Re: Range Types - typo + NULL string constructor

On Sat, 2011-10-08 at 12:44 -0700, Jeff Janes wrote:

When I apply this to head, "make check" fails with:

create type textrange_en_us as range(subtype=text, collation="en_US");
+ ERROR: collation "en_US" for encoding "SQL_ASCII" does not exist

Is this a problem? e.g. will it break the build-farm?

"make check LANG=en_US" does pass

Thank you for pointing that out. I think I need to remove those before
commit, but I just wanted them in there now to exercise that part of the
code.

Is there a better way to test collations like that?

Regards,
Jeff Davis

#35Tom Lane
tgl@sss.pgh.pa.us
In reply to: Jeff Davis (#34)
Re: Range Types - typo + NULL string constructor

Jeff Davis <pgsql@j-davis.com> writes:

On Sat, 2011-10-08 at 12:44 -0700, Jeff Janes wrote:

When I apply this to head, "make check" fails with:

create type textrange_en_us as range(subtype=text, collation="en_US");
+ ERROR: collation "en_US" for encoding "SQL_ASCII" does not exist

Thank you for pointing that out. I think I need to remove those before
commit, but I just wanted them in there now to exercise that part of the
code.

Is there a better way to test collations like that?

You could add some code that assumes particular collations are present
into collate.linux.utf8.sql. It's not going to work to depend on
anything beyond C locale being present in a mainline regression test
case.

regards, tom lane

#36Thom Brown
thom@linux.com
In reply to: Jeff Davis (#30)
Re: Range Types - typo + NULL string constructor

On 2 October 2011 20:05, Jeff Davis <pgsql@j-davis.com> wrote:

On Sun, 2011-10-02 at 11:32 +0200, Florian Pflug wrote:

Looking at the patch, I noticed that it's possible to specify the default
boundaries ([], [), (] or ()) per individual float type with the
DEFAULT_FLAGS clause of CREATE TYPE .. AS RANGE. I wonder if that doesn't
do more harm then good - it makes it impossible to deduce the meaning of
e.g. numericrange(1.0, 2.0) without looking up the definition of numericrange.

I suggest we pick one set of default boundaries, ideally '[)' since that
is what all the built-in canonization functions produce, and stick with it.

Done.

Also, made the range parsing even more like records with more code
copied verbatim. And fixed some parsing tests along the way.

I don't know if this has already been discussed, but can you explain
the following:

postgres=# select '[1,8]'::int4range;
int4range
-----------
[1,9)
(1 row)

It seems unintuitive to represent a discrete range using an exclusive
upper bound. While I agree that the value itself is correct, it's
representation looks odd. Is it necessary?

--
Thom Brown
Twitter: @darkixion
IRC (freenode): dark_ixion
Registered Linux user: #516935

EnterpriseDB UK: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#37Jeff Davis
pgsql@j-davis.com
In reply to: Thom Brown (#36)
Re: Range Types - typo + NULL string constructor

On Mon, 2011-10-10 at 14:27 +0100, Thom Brown wrote:

I don't know if this has already been discussed, but can you explain
the following:

postgres=# select '[1,8]'::int4range;
int4range
-----------
[1,9)
(1 row)

It seems unintuitive to represent a discrete range using an exclusive
upper bound. While I agree that the value itself is correct, it's
representation looks odd. Is it necessary?

The "canonicalize" function (specified at type creation time) allows you
to specify the canonical output representation. So, I can change the
canonical form for discrete ranges to use '[]' notation if we think
that's more expected.

But then "int4range(1,8)" would still mean "int4range(1,8,'[)')" and
therefore '[1,7]'. I used to have a "default_flags" parameter that could
also be specified at type creation time that would control the default
third parameter (the parameter that controls inclusivity) of the
constructor. However, I removed the "default_flags" parameter because,
as Florian pointed out, it's better to have a consistent output from the
constructor.

I'm open to suggestions, including potentially bringing back
"default_flags".

Regards,
Jeff Davis

#38Tom Lane
tgl@sss.pgh.pa.us
In reply to: Jeff Davis (#37)
Re: Range Types - typo + NULL string constructor

Jeff Davis <pgsql@j-davis.com> writes:

On Mon, 2011-10-10 at 14:27 +0100, Thom Brown wrote:

I don't know if this has already been discussed, but can you explain
the following:

postgres=# select '[1,8]'::int4range;
int4range
-----------
[1,9)
(1 row)

It seems unintuitive to represent a discrete range using an exclusive
upper bound. While I agree that the value itself is correct, it's
representation looks odd. Is it necessary?

The "canonicalize" function (specified at type creation time) allows you
to specify the canonical output representation. So, I can change the
canonical form for discrete ranges to use '[]' notation if we think
that's more expected.

What if I write '[1,INT_MAX]'::int4range? The open-parenthesis form will
fail with an integer overflow. I suppose you could canonicalize it to
an unbounded range, but that seems unnecessarily surprising.

regards, tom lane

#39Florian Pflug
fgp@phlo.org
In reply to: Tom Lane (#38)
Re: Range Types - typo + NULL string constructor

On Oct10, 2011, at 18:53 , Tom Lane wrote:

What if I write '[1,INT_MAX]'::int4range? The open-parenthesis form will
fail with an integer overflow. I suppose you could canonicalize it to
an unbounded range, but that seems unnecessarily surprising.

That is a very good point. Canonicalizing to an unbounded range doesn't work,
because, as it stands, the ranges '[1, INT_MAX]' and '[1,)' are *not* equal. So
the only remaining option is to canonicalize to the closed form always.

I still think we should strive for consistency here, so let's also make
'[]' the default flags for the range constructors.

best regards,
Florian Pflug

#40Jeff Davis
pgsql@j-davis.com
In reply to: Tom Lane (#38)
Re: Range Types - typo + NULL string constructor

On Mon, 2011-10-10 at 12:53 -0400, Tom Lane wrote:

The "canonicalize" function (specified at type creation time) allows you
to specify the canonical output representation. So, I can change the
canonical form for discrete ranges to use '[]' notation if we think
that's more expected.

What if I write '[1,INT_MAX]'::int4range? The open-parenthesis form will
fail with an integer overflow. I suppose you could canonicalize it to
an unbounded range, but that seems unnecessarily surprising.

So, are you suggesting that I canonicalize to '[]' then? That seems
reasonable to me, but there's still some slight awkwardness because
int4range(1,10) would be '[1,9]'.

Regards,
Jeff Davis

#41Thom Brown
thom@linux.com
In reply to: Jeff Davis (#40)
Re: Range Types - typo + NULL string constructor

On 10 October 2011 18:31, Jeff Davis <pgsql@j-davis.com> wrote:

On Mon, 2011-10-10 at 12:53 -0400, Tom Lane wrote:

The "canonicalize" function (specified at type creation time) allows you
to specify the canonical output representation. So, I can change the
canonical form for discrete ranges to use '[]' notation if we think
that's more expected.

What if I write '[1,INT_MAX]'::int4range?  The open-parenthesis form will
fail with an integer overflow.  I suppose you could canonicalize it to
an unbounded range, but that seems unnecessarily surprising.

So, are you suggesting that I canonicalize to '[]' then? That seems
reasonable to me, but there's still some slight awkwardness because
int4range(1,10) would be '[1,9]'.

Why? int4range(1,10,'[]') returns:

int4range
-----------
[1,11)
(1 row)

Which if corrected to display the proposed way would just be '[1,10]'.
So the default boundaries should be '[]' as opposed to '[)' as it is
now.

--
Thom Brown
Twitter: @darkixion
IRC (freenode): dark_ixion
Registered Linux user: #516935

EnterpriseDB UK: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#42Jeff Davis
pgsql@j-davis.com
In reply to: Florian Pflug (#39)
Re: Range Types - typo + NULL string constructor

On Mon, 2011-10-10 at 19:22 +0200, Florian Pflug wrote:

I still think we should strive for consistency here, so let's also make
'[]' the default flags for the range constructors.

For continuous ranges I don't think that's a good idea. Closed-open is a
very widely-accepted convention and there are good reasons for it -- for
instance, it's good for specifying contiguous-but-non-overlapping
ranges.

So, I think we either need to standardize on '[)' or allow different
default_flags for different types. Or, always specify the inclusivity in
the constructor (hopefully in a convenient way).

Regards,
Jeff Davis

#43Jeff Davis
pgsql@j-davis.com
In reply to: Thom Brown (#41)
Re: Range Types - typo + NULL string constructor

On Mon, 2011-10-10 at 18:39 +0100, Thom Brown wrote:

So the default boundaries should be '[]' as opposed to '[)' as it is
now.

Would that vary between range types? In other words, do I bring back
default_flags?

If not, I think a lot of people will object. The most common use-case
for range types are for continuous ranges like timestamps. And (as I
pointed out in reply to Florian) there are good reasons to use the '[)'
convention for those cases.

Regards,
Jeff Davis

#44Thom Brown
thom@linux.com
In reply to: Jeff Davis (#43)
Re: Range Types - typo + NULL string constructor

On 10 October 2011 18:45, Jeff Davis <pgsql@j-davis.com> wrote:

On Mon, 2011-10-10 at 18:39 +0100, Thom Brown wrote:

 So the default boundaries should be '[]' as opposed to '[)' as it is
now.

Would that vary between range types? In other words, do I bring back
default_flags?

If not, I think a lot of people will object. The most common use-case
for range types are for continuous ranges like timestamps. And (as I
pointed out in reply to Florian) there are good reasons to use the '[)'
convention for those cases.

I'm proposing it for discrete ranges. For continuous ranges, I guess
it makes sense to have "up to, but not including". The same boundary
inclusivity/exclusivity thing seems unintuitive for discrete ranges.
This has the downside of inconsistency, but I don't think that's
really a solid argument against it since their use will be different
anyway.

--
Thom Brown
Twitter: @darkixion
IRC (freenode): dark_ixion
Registered Linux user: #516935

EnterpriseDB UK: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#45Thom Brown
thom@linux.com
In reply to: Thom Brown (#44)
Re: Range Types - typo + NULL string constructor

On 10 October 2011 18:53, Thom Brown <thom@linux.com> wrote:

On 10 October 2011 18:45, Jeff Davis <pgsql@j-davis.com> wrote:

On Mon, 2011-10-10 at 18:39 +0100, Thom Brown wrote:

 So the default boundaries should be '[]' as opposed to '[)' as it is
now.

Would that vary between range types? In other words, do I bring back
default_flags?

If not, I think a lot of people will object. The most common use-case
for range types are for continuous ranges like timestamps. And (as I
pointed out in reply to Florian) there are good reasons to use the '[)'
convention for those cases.

I'm proposing it for discrete ranges.  For continuous ranges, I guess
it makes sense to have "up to, but not including".  The same boundary
inclusivity/exclusivity thing seems unintuitive for discrete ranges.
This has the downside of inconsistency, but I don't think that's
really a solid argument against it since their use will be different
anyway.

Okay, a real example of why discrete should be '[]' and continuous
should be '[)'.

If you book a meeting from 09:00 to 11:00 (tsrange), at 11:00
precisely it either becomes free or is available to someone else, so
it can be booked 11:00 to 12:00 without conflict.

If you have raffle tickets numbered 1 to 100 (int4range), and you ask
for tickets 9 to 11, no-one else can use 11 as it aligns with the last
one you bought.

So for me, it's intuitive for them to behave differently. So yes,
default behaviour would vary between types, but I didn't previously
read anything on default_flags, so I don't know where that comes into
it. Shouldn't it be the case that if a type has a canonical function,
it's entirely inclusive, otherwise it's upper boundary is exclusive?

--
Thom Brown
Twitter: @darkixion
IRC (freenode): dark_ixion
Registered Linux user: #516935

EnterpriseDB UK: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#46Florian Pflug
fgp@phlo.org
In reply to: Thom Brown (#45)
Re: Range Types - typo + NULL string constructor

On Oct10, 2011, at 20:06 , Thom Brown wrote:

Okay, a real example of why discrete should be '[]' and continuous
should be '[)'.

If you book a meeting from 09:00 to 11:00 (tsrange), at 11:00
precisely it either becomes free or is available to someone else, so
it can be booked 11:00 to 12:00 without conflict.

If you have raffle tickets numbered 1 to 100 (int4range), and you ask
for tickets 9 to 11, no-one else can use 11 as it aligns with the last
one you bought.

So for me, it's intuitive for them to behave differently. So yes,
default behaviour would vary between types, but I didn't previously
read anything on default_flags, so I don't know where that comes into
it. Shouldn't it be the case that if a type has a canonical function,
it's entirely inclusive, otherwise it's upper boundary is exclusive?

I'm not convinced by this. The question here is not whether which types
of ranges we *support*, only which type we consider to be more *canonical*,
and whether the bounds provided to a range constructor are inclusive or
exclusive by *default*.

Maybe ranges over discrete types are slightly more likely to be closed,
and ranges over continuous types slightly more likely to be open. Still,
I very much doubt that the skew in the distribution is large enough to
warrant the confusion and possibility of subtle bugs we introduce by making
the semantics of a range type's constructor depend on the definition of the
range and/or base type. Especially since we're talking about only *6* extra
characters to communicate the intended inclusivity/exclusivity of the bounds
to the range constructor.

Also, the distinction between types for which ranges should "obviously"
be closed, and those for which they should "obviously" be half-open is nowhere
as clear-cut as it seems at first sight.

First, there's the type "date", which in my book is discrete. So we'd make
date ranges closed by default, not half-open. And there's timestamp, which
is continuous so we'd make its default half-open. That doesn't seem exactly
intuitive to me.

Second, there's int4 and float8, one discrete, one continuous. So would we
make int4range(1, 2) include 2, but float8range(1.0, 2.0) *not* include 2.0?

best regards,
Florian Pflug

#47Florian Pflug
fgp@phlo.org
In reply to: Jeff Davis (#42)
Re: Range Types - typo + NULL string constructor

On Oct10, 2011, at 19:41 , Jeff Davis wrote:

On Mon, 2011-10-10 at 19:22 +0200, Florian Pflug wrote:

I still think we should strive for consistency here, so let's also make
'[]' the default flags for the range constructors.

For continuous ranges I don't think that's a good idea. Closed-open is a
very widely-accepted convention and there are good reasons for it -- for
instance, it's good for specifying contiguous-but-non-overlapping
ranges.

It really depends on what you're using ranges for. Yeah, if you're "convering"
something with ranges (like mapping things to a certain period of time, or
an area of space), then half-open ranges are probably very common.

If, OTOH, you're storing measurement with error margins, then open ranges,
i.e. '()', are probably what you want.

I still firmly believe that consistency trumps convenience here. Specifying
the range boundaries' exclusivity/inclusivity explicitly is quite cheap...

So, I think we either need to standardize on '[)' or allow different
default_flags for different types. Or, always specify the inclusivity in
the constructor (hopefully in a convenient way).

In the light of Tom's argument, my pick would be '[]'. It's seem strange
to normalize ranges over discrete types to closed ranges, yet make the
construction function expect open boundaries by default.

best regards,
Florian Pflug

#48Jeff Davis
pgsql@j-davis.com
In reply to: Florian Pflug (#46)
Re: Range Types - typo + NULL string constructor

On Tue, 2011-10-11 at 03:14 +0200, Florian Pflug wrote:

Maybe ranges over discrete types are slightly more likely to be closed,
and ranges over continuous types slightly more likely to be open. Still,
I very much doubt that the skew in the distribution is large enough to
warrant the confusion and possibility of subtle bugs we introduce by making
the semantics of a range type's constructor depend on the definition of the
range and/or base type.

I think you persuaded me on the consistency aspect.

I'm wondering whether to do away with the default argument entirely, and
just force the user to always specify it during construction. It seems
like a shame that such pain is caused over the syntax, because in a
perfect world it wouldn't be a bother to specify it at all. I even
considered using prefix/postfix operators to try to make it nicer, but
it seems like every idea I had was just short of practical. Maybe a few
extra characters at the end aren't so bad.

I'd like to hear from some potential users though to see if anyone
recoils at the common case.

Regards,
Jeff Davis

#49Thom Brown
thom@linux.com
In reply to: Florian Pflug (#46)
Re: Range Types - typo + NULL string constructor

On 11 October 2011 02:14, Florian Pflug <fgp@phlo.org> wrote:

On Oct10, 2011, at 20:06 , Thom Brown wrote:

Okay, a real example of why discrete should be '[]' and continuous
should be '[)'.

If you book a meeting from 09:00 to 11:00 (tsrange), at 11:00
precisely it either becomes free or is available to someone else, so
it can be booked 11:00 to 12:00 without conflict.

If you have raffle tickets numbered 1 to 100 (int4range), and you ask
for tickets 9 to 11, no-one else can use 11 as it aligns with the last
one you bought.

So for me, it's intuitive for them to behave differently.  So yes,
default behaviour would vary between types, but I didn't previously
read anything on default_flags, so I don't know where that comes into
it.  Shouldn't it be the case that if a type has a canonical function,
it's entirely inclusive, otherwise it's upper boundary is exclusive?

First, there's the type "date", which in my book is discrete. So we'd make
date ranges closed by default, not half-open. And there's timestamp, which
is continuous so we'd make its default half-open. That doesn't seem exactly
intuitive to me.

Ah yes, I agree there. Okay, I see your point.

--
Thom Brown
Twitter: @darkixion
IRC (freenode): dark_ixion
Registered Linux user: #516935

EnterpriseDB UK: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#50David Fetter
david@fetter.org
In reply to: Jeff Davis (#48)
Re: Range Types - typo + NULL string constructor

On Mon, Oct 10, 2011 at 10:25:18PM -0700, Jeff Davis wrote:

On Tue, 2011-10-11 at 03:14 +0200, Florian Pflug wrote:

Maybe ranges over discrete types are slightly more likely to be
closed, and ranges over continuous types slightly more likely to
be open. Still, I very much doubt that the skew in the
distribution is large enough to warrant the confusion and
possibility of subtle bugs we introduce by making the semantics of
a range type's constructor depend on the definition of the range
and/or base type.

I think you persuaded me on the consistency aspect.

I'm wondering whether to do away with the default argument entirely,
and just force the user to always specify it during construction. It
seems like a shame that such pain is caused over the syntax, because
in a perfect world it wouldn't be a bother to specify it at all. I
even considered using prefix/postfix operators to try to make it
nicer, but it seems like every idea I had was just short of
practical. Maybe a few extra characters at the end aren't so bad.

I'd like to hear from some potential users though to see if anyone
recoils at the common case.

I'd recoil at not having ranges default to left-closed, right-open.
The use case for that one is so compelling that I'm OK with making it
the default from which deviations need to be specified.

Cheers,
David.
--
David Fetter <david@fetter.org> http://fetter.org/
Phone: +1 415 235 3778 AIM: dfetter666 Yahoo!: dfetter
Skype: davidfetter XMPP: david.fetter@gmail.com
iCal: webcal://www.tripit.com/feed/ical/people/david74/tripit.ics

Remember to vote!
Consider donating to Postgres: http://www.postgresql.org/about/donate

#51Florian Pflug
fgp@phlo.org
In reply to: David Fetter (#50)
Re: Range Types - typo + NULL string constructor

On Oct11, 2011, at 14:43 , David Fetter wrote:

I'd recoil at not having ranges default to left-closed, right-open.
The use case for that one is so compelling that I'm OK with making it
the default from which deviations need to be specified.

The downside of that is that, as Tom pointed out upthread, we cannot
make [) the canonical representation of ranges. It'd require us to
increment the right boundary of a closed range, but that incremented
boundary might no longer be in the base type's domain.

So we'd end up with [) being the default for range construction,
but [] being the canonical representation, i.e. what you get back
when SELECTing a range (over a discrete base type).

Certainly not the end of the world, but is the convenience of being
able to write somerange(a, b) instead of somerange(a, b, '[)') really
worth it? I kind of doubt that...

best regards,
Florian Pflug

#52David Fetter
david@fetter.org
In reply to: Florian Pflug (#51)
Re: Range Types - typo + NULL string constructor

On Tue, Oct 11, 2011 at 03:20:05PM +0200, Florian Pflug wrote:

On Oct11, 2011, at 14:43 , David Fetter wrote:

I'd recoil at not having ranges default to left-closed,
right-open. The use case for that one is so compelling that I'm
OK with making it the default from which deviations need to be
specified.

The downside of that is that, as Tom pointed out upthread, we cannot
make [) the canonical representation of ranges. It'd require us to
increment the right boundary of a closed range, but that incremented
boundary might no longer be in the base type's domain.

So we'd end up with [) being the default for range construction, but
[] being the canonical representation, i.e. what you get back when
SELECTing a range (over a discrete base type).

Certainly not the end of the world, but is the convenience of being
able to write somerange(a, b) instead of somerange(a, b, '[)')
really worth it? I kind of doubt that...

You're making a persuasive argument for the latter based solely on the
clarity. If people see that 3rd element in the DDL, or need to
provide it, it's *very* obvious what's going on.

Cheers,
David (who suspects that having a syntax like somerange[a,b) just
won't work with the current state of parsers, etc.)
--
David Fetter <david@fetter.org> http://fetter.org/
Phone: +1 415 235 3778 AIM: dfetter666 Yahoo!: dfetter
Skype: davidfetter XMPP: david.fetter@gmail.com
iCal: webcal://www.tripit.com/feed/ical/people/david74/tripit.ics

Remember to vote!
Consider donating to Postgres: http://www.postgresql.org/about/donate

#53Jeff Davis
pgsql@j-davis.com
In reply to: David Fetter (#52)
Re: Range Types - typo + NULL string constructor

On Tue, 2011-10-11 at 06:28 -0700, David Fetter wrote:

Certainly not the end of the world, but is the convenience of being
able to write somerange(a, b) instead of somerange(a, b, '[)')
really worth it? I kind of doubt that...

You're making a persuasive argument for the latter based solely on the
clarity. If people see that 3rd element in the DDL, or need to
provide it, it's *very* obvious what's going on.

That was how I originally thought, but we're also providing built-in
range types like tsrange and daterange. I could see how if the former
excluded the endpoint and the latter included it, it could be confusing.

We could go back to having different constructor names for different
inclusivity; e.g. int4range_cc(1,10). That at least removes the
awkwardness of typing (and seeing) '[]'.

Regards,
Jeff Davis

#54Robert Haas
robertmhaas@gmail.com
In reply to: Jeff Davis (#53)
Re: Range Types - typo + NULL string constructor

On Tue, Oct 11, 2011 at 12:03 PM, Jeff Davis <pgsql@j-davis.com> wrote:

On Tue, 2011-10-11 at 06:28 -0700, David Fetter wrote:

Certainly not the end of the world, but is the convenience of being
able to write somerange(a, b) instead of somerange(a, b, '[)')
really worth it? I kind of doubt that...

You're making a persuasive argument for the latter based solely on the
clarity.  If people see that 3rd element in the DDL, or need to
provide it, it's *very* obvious what's going on.

That was how I originally thought, but we're also providing built-in
range types like tsrange and daterange. I could see how if the former
excluded the endpoint and the latter included it, it could be confusing.

We could go back to having different constructor names for different
inclusivity; e.g. int4range_cc(1,10). That at least removes the
awkwardness of typing (and seeing) '[]'.

The cure seems worse than the disease. What is so bad about '[]'?

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#55David Fetter
david@fetter.org
In reply to: Robert Haas (#54)
Re: Range Types - typo + NULL string constructor

On Tue, Oct 11, 2011 at 12:09:01PM -0400, Robert Haas wrote:

On Tue, Oct 11, 2011 at 12:03 PM, Jeff Davis <pgsql@j-davis.com> wrote:

On Tue, 2011-10-11 at 06:28 -0700, David Fetter wrote:

Certainly not the end of the world, but is the convenience of being
able to write somerange(a, b) instead of somerange(a, b, '[)')
really worth it? I kind of doubt that...

You're making a persuasive argument for the latter based solely on the
clarity. �If people see that 3rd element in the DDL, or need to
provide it, it's *very* obvious what's going on.

That was how I originally thought, but we're also providing built-in
range types like tsrange and daterange. I could see how if the former
excluded the endpoint and the latter included it, it could be confusing.

We could go back to having different constructor names for different
inclusivity; e.g. int4range_cc(1,10). That at least removes the
awkwardness of typing (and seeing) '[]'.

The cure seems worse than the disease. What is so bad about '[]'?

Nothing's bad about '[]' per se. What's better, but possibly out of
the reach of our current lexing and parsing system, would be things
like:

[1::int, 10)

Cheers,
David.
--
David Fetter <david@fetter.org> http://fetter.org/
Phone: +1 415 235 3778 AIM: dfetter666 Yahoo!: dfetter
Skype: davidfetter XMPP: david.fetter@gmail.com
iCal: webcal://www.tripit.com/feed/ical/people/david74/tripit.ics

Remember to vote!
Consider donating to Postgres: http://www.postgresql.org/about/donate

#56Robert Haas
robertmhaas@gmail.com
In reply to: David Fetter (#55)
Re: Range Types - typo + NULL string constructor

On Tue, Oct 11, 2011 at 12:12 PM, David Fetter <david@fetter.org> wrote:

Nothing's bad about '[]' per se.  What's better, but possibly out of
the reach of our current lexing and parsing system, would be things
like:

[1::int, 10)

That's been discussed before. Aside from the parser issues (which are
formidable) it would break brace-matching in most if not all commonly
used editors.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#57Jeff Davis
pgsql@j-davis.com
In reply to: Robert Haas (#54)
Re: Range Types - typo + NULL string constructor

On Tue, 2011-10-11 at 12:09 -0400, Robert Haas wrote:

The cure seems worse than the disease. What is so bad about '[]'?

OK, so we stick with the 3-argument form. Do we have a default for the
third argument, or do we scrap it to avoid confusion?

There were some fairly strong objections to using '[]' as the default or
having the default vary between types. So, the only real option
remaining, if we do have a default, is '[)'.

Regards,
Jeff Davis

#58Robert Haas
robertmhaas@gmail.com
In reply to: Jeff Davis (#57)
Re: Range Types - typo + NULL string constructor

On Tue, Oct 11, 2011 at 12:30 PM, Jeff Davis <pgsql@j-davis.com> wrote:

On Tue, 2011-10-11 at 12:09 -0400, Robert Haas wrote:

The cure seems worse than the disease.  What is so bad about '[]'?

OK, so we stick with the 3-argument form. Do we have a default for the
third argument, or do we scrap it to avoid confusion?

There were some fairly strong objections to using '[]' as the default or
having the default vary between types. So, the only real option
remaining, if we do have a default, is '[)'.

I think using '[)' is fine. At some level, this is just a question of
expectations. If you expect that int4range(1,4) will create a range
that includes 4, well, you're wrong. Once you get used to it, it will
seem normal, and you'll know that you need to write
int4range(1,4,'[]') if that's what you want. As long as the system is
designed around a set of consistent and well-thought-out principles,
people will get used to the details. I don't see that the idea of a
half-open range over a discrete-valued type is particularly confusing
- we use them all the time in programming, when we make the end
pointer point to the byte following the end of the array, rather than
the last element - but even if it is, overall design consistency
trumps what someone may find to be the absolutely perfect behavior in
some particular case. And saving typing is nearly always good -
unless it creates a LOT more confusion than I think this will.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#59Jeff Davis
pgsql@j-davis.com
In reply to: Robert Haas (#58)
Re: Range Types - typo + NULL string constructor

On Tue, 2011-10-11 at 12:40 -0400, Robert Haas wrote:

I think using '[)' is fine. At some level, this is just a question of
expectations. If you expect that int4range(1,4) will create a range
that includes 4, well, you're wrong. Once you get used to it, it will
seem normal, and you'll know that you need to write
int4range(1,4,'[]') if that's what you want. As long as the system is
designed around a set of consistent and well-thought-out principles,
people will get used to the details. I don't see that the idea of a
half-open range over a discrete-valued type is particularly confusing
- we use them all the time in programming, when we make the end
pointer point to the byte following the end of the array, rather than
the last element - but even if it is, overall design consistency
trumps what someone may find to be the absolutely perfect behavior in
some particular case. And saving typing is nearly always good -
unless it creates a LOT more confusion than I think this will.

That sounds very reasonable to me.

Tom made an observation about '[1,INT_MAX]' thowing an error because
canonicalization would try to increment INT_MAX. But I'm not
particularly disturbed by it. If you want a bigger range, use int8range
or numrange -- the same advice we give to people who want unsigned
types. Or, for people who really need the entire range of signed int4
exactly, they can easily make their own range type that canonicalizes to
'[]'.

Regards,
Jeff Davis

#60Tom Lane
tgl@sss.pgh.pa.us
In reply to: Jeff Davis (#59)
Re: Range Types - typo + NULL string constructor

Jeff Davis <pgsql@j-davis.com> writes:

Tom made an observation about '[1,INT_MAX]' thowing an error because
canonicalization would try to increment INT_MAX. But I'm not
particularly disturbed by it. If you want a bigger range, use int8range
or numrange -- the same advice we give to people who want unsigned
types. Or, for people who really need the entire range of signed int4
exactly, they can easily make their own range type that canonicalizes to
'[]'.

I agree we shouldn't contort the entire design to avoid that corner
case. We should, however, make sure that the increment *does* throw
an error, and not just silently overflow.

regards, tom lane

#61David Fetter
david@fetter.org
In reply to: Robert Haas (#56)
Re: Range Types - typo + NULL string constructor

On Tue, Oct 11, 2011 at 12:18:18PM -0400, Robert Haas wrote:

On Tue, Oct 11, 2011 at 12:12 PM, David Fetter <david@fetter.org> wrote:

Nothing's bad about '[]' per se. �What's better, but possibly out
of the reach of our current lexing and parsing system, would be
things like:

[1::int, 10)

That's been discussed before. Aside from the parser issues (which
are formidable) it would break brace-matching in most if not all
commonly used editors.

That being the situation, ubiquitous support for the natural syntax
looks like it's a decade away, minimum. :(

Trying to be cheery,
David.
--
David Fetter <david@fetter.org> http://fetter.org/
Phone: +1 415 235 3778 AIM: dfetter666 Yahoo!: dfetter
Skype: davidfetter XMPP: david.fetter@gmail.com
iCal: webcal://www.tripit.com/feed/ical/people/david74/tripit.ics

Remember to vote!
Consider donating to Postgres: http://www.postgresql.org/about/donate

#62Tom Lane
tgl@sss.pgh.pa.us
In reply to: Florian Pflug (#51)
Re: Range Types - typo + NULL string constructor

Florian Pflug <fgp@phlo.org> writes:

On Oct11, 2011, at 14:43 , David Fetter wrote:

I'd recoil at not having ranges default to left-closed, right-open.
The use case for that one is so compelling that I'm OK with making it
the default from which deviations need to be specified.

I agree with David on this.

The downside of that is that, as Tom pointed out upthread, we cannot
make [) the canonical representation of ranges.

Yeah, we certainly *can* do that, we just have to allow ranges that
include the last element of the domain to be corner cases that require
special handling. If we don't want to just fail, we have to
canonicalize them to closed instead of open ranges. It does not follow
that the default on input has to be closed.

Note that the INT_MAX case is probably not the worst issue in practice.
What is going to be an issue is ranges over enum types, where having the
last element being part of the range is a much more likely use-case.

regards, tom lane

#63Heikki Linnakangas
heikki.linnakangas@enterprisedb.com
In reply to: Jeff Davis (#32)
1 attachment(s)
Re: Range Types - typo + NULL string constructor

On 07.10.2011 06:41, Jeff Davis wrote:

The repo is available here:

http://git.postgresql.org/gitweb/?p=users/jdavis/postgres.git;a=log;h=refs/heads/rangetypes

I took a look at this, fixed a bunch of minor issues, and pushed to my
git repo: git://git.postgresql.org/git/users/heikki/postgres.git.
Attached is an updated patch including those changes, for the archives.

A few issues that I didn't fix straight away:

* Why do you need to be a superuser to create a range type? In
DefineRange, the comment explaining why superuser privilege is required
seems bogus, copy-pasted from base types. So what is the reason?

* The binary i/o format includes the length of the lower and upper
bounds twice, once explicitly in range_send, and second time within the
send-function of the subtype. Seems wasteful.

* In findRangeSubOpclass, I think it's OK to hard-code "btree" into the
error message, no need to look that up from pg_am.

* Do we really need non_empty(anyrange) ? You can just do "NOT empty(x)"

* Range_before and range_after: I think "input range is empty" would
sound better than "undefined for empty ranges".

* In range_hash, rotating the hash of the initial flags byte seems pointless

* range_constructor_internal - I think it would be better to move logic
to figure out the the arguments into the callers.

* The gist support functions frequently call range_deserialize(), which
does catalog lookups. Isn't that horrendously expensive?

* In range_serialize and range_deserialize, reduce the number of catalog
lookups by combining the get_range_subtype, get_typlen, get_typalign,
get_typbyval and get_typstorage calls
with just one catalog lookup, and fetch all those fields at once.
Something like get_typlenbyvalalign()

* Have you tested this on an architecture with strict alignment? I don't
see any alignment bugs, but I think there's a lot of potential for them..

Documentation
-------------
* Section "Built-in Range Types". How about "PostgreSQL comes with the
following built-in range types:" <examples> "In addition, you can define
your own"

* In section "Inclusive and Exclusive Bounds", it is said "An inclusive
lower bound is represented by ...". That begs the question: where is it
represented like that? That doesn't become clear until you read the
section on Input/Output format. Reordering the sections might help. Are
the double-quotes around [ and ( necessary?

* It would be good to have some examples on the input formats in the
Input/Output section. There's one in the Examples section, but it's not
very clear that it's related. Perhaps the whole Examples section should
be moved to the end, or the examples be dispersed into the other sections.

* Likewise it would be nice to have some examples in the Inclusive and
Exclusive Bounds section.

* subtype_float, how is it supposed to work? I couldn't find any
explanation in the docs. Can we come up with a better name for the function?

* Constructing Ranges section: should describe the 0-3 argument forms of
the constructors, not only in the examples but in the main text too.

* What exactly is canonical function supposed to return? It's not clear
what format one should choose as the canonical format when writing a
custom range type. And even for the built-in types, it would be good to
explain which types use which canonical format (I saw the discussions on
that, so I understand that might still be subject to change).

* Defining New RangeTypes section: A more general description in
addition to the example would be good.

* "GiST Indexing" title: how about making it just "Indexing". Also, it
would be nice to list exactly which operators can be sped up by gist.

--
Heikki Linnakangas
EnterpriseDB http://www.enterprisedb.com

Attachments:

rangetypes-20111015-heikki-1.patch.gzapplication/gzip; name=rangetypes-20111015-heikki-1.patch.gzDownload
#64Tom Lane
tgl@sss.pgh.pa.us
In reply to: Heikki Linnakangas (#63)
Re: Range Types - typo + NULL string constructor

Heikki Linnakangas <heikki.linnakangas@enterprisedb.com> writes:

* Have you tested this on an architecture with strict alignment? I don't
see any alignment bugs, but I think there's a lot of potential for them..

Well, fwiw, this patch passes its regression tests on HPPA, except for this
which seems more to do with the already-noted unacceptable dependency on
non-C collations:

*** /home/postgres/pgsql/src/test/regress/expected/rangetypes.out	Fri Oct 14 21:19:19 2011
--- /home/postgres/pgsql/src/test/regress/results/rangetypes.out	Fri Oct 14 21:50:11 2011
***************
*** 842,857 ****
  --
  create type textrange_c as range(subtype=text, collation="C");
  create type textrange_en_us as range(subtype=text, collation="en_US");
  select textrange_c('a','Z') @> 'b'::text;
  ERROR:  range lower bound must be less than or equal to range upper bound
  select textrange_en_us('a','Z') @> 'b'::text;
!  ?column? 
! ----------
!  t
! (1 row)
! 
  drop type textrange_c;
  drop type textrange_en_us;
  --
  -- Test out polymorphic type system
  --
--- 842,858 ----
  --
  create type textrange_c as range(subtype=text, collation="C");
  create type textrange_en_us as range(subtype=text, collation="en_US");
+ ERROR:  collation "en_US" for encoding "SQL_ASCII" does not exist
  select textrange_c('a','Z') @> 'b'::text;
  ERROR:  range lower bound must be less than or equal to range upper bound
  select textrange_en_us('a','Z') @> 'b'::text;
! ERROR:  function textrange_en_us(unknown, unknown) does not exist
! LINE 1: select textrange_en_us('a','Z') @> 'b'::text;
!                ^
! HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
  drop type textrange_c;
  drop type textrange_en_us;
+ ERROR:  type "textrange_en_us" does not exist
  --
  -- Test out polymorphic type system
  --

======================================================================

Also, I notice you forgot to update serial_schedule:

diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index bb654f9c612970ef777e8cc39369a91e343f6afc..2e87d9eefd6fbb70a5603bc000ffe833
5945201f 100644
*** a/src/test/regress/serial_schedule
--- b/src/test/regress/serial_schedule
*************** test: txid
*** 18,23 ****
--- 18,24 ----
  test: uuid
  test: enum
  test: money
+ test: rangetypes
  test: strings
  test: numerology
  test: point

regards, tom lane

#65Jeff Davis
pgsql@j-davis.com
In reply to: Heikki Linnakangas (#63)
1 attachment(s)
Re: Range Types - typo + NULL string constructor

On Sat, 2011-10-15 at 01:46 +0300, Heikki Linnakangas wrote:

On 07.10.2011 06:41, Jeff Davis wrote:

The repo is available here:

http://git.postgresql.org/gitweb/?p=users/jdavis/postgres.git;a=log;h=refs/heads/rangetypes

I took a look at this, fixed a bunch of minor issues, and pushed to my
git repo: git://git.postgresql.org/git/users/heikki/postgres.git.
Attached is an updated patch including those changes, for the archives.

Thank you for the review!

Updated patch attached (and pushed to repo).

A few issues that I didn't fix straight away:

* Why do you need to be a superuser to create a range type? In
DefineRange, the comment explaining why superuser privilege is required
seems bogus, copy-pasted from base types. So what is the reason?

No particular reason. I thought someone might ask me to include such as
restriction. I have removed it to allow non-superuser creation.

* The binary i/o format includes the length of the lower and upper
bounds twice, once explicitly in range_send, and second time within the
send-function of the subtype. Seems wasteful.

Any ideas how to fix that? How else do I know how much the underlying
send function will consume?

* In findRangeSubOpclass, I think it's OK to hard-code "btree" into the
error message, no need to look that up from pg_am.

Done.

* Do we really need non_empty(anyrange) ? You can just do "NOT empty(x)"

To make it a searchable (via GiST) condition, I need an operator. I
could either remove that operator (as it's not amazingly useful), or I
could just not document the function but leave the operator there.

* Range_before and range_after: I think "input range is empty" would
sound better than "undefined for empty ranges".

Done.

* In range_hash, rotating the hash of the initial flags byte seems pointless

Fixed.

* range_constructor_internal - I think it would be better to move logic
to figure out the the arguments into the callers.

Done.

* The gist support functions frequently call range_deserialize(), which
does catalog lookups. Isn't that horrendously expensive?

Yes, it was. I have introduced a cached structure that avoids syscache
lookups when it's the same range as the last lookup (the common case).

* In range_serialize and range_deserialize, reduce the number of catalog
lookups by combining the get_range_subtype, get_typlen, get_typalign,
get_typbyval and get_typstorage calls
with just one catalog lookup, and fetch all those fields at once.
Something like get_typlenbyvalalign()

Done in conjunction with the cache structure I mentioned above.

* Have you tested this on an architecture with strict alignment? I don't
see any alignment bugs, but I think there's a lot of potential for them..

I don't have such an architecture readily available.

Documentation
-------------
* Section "Built-in Range Types". How about "PostgreSQL comes with the
following built-in range types:" <examples> "In addition, you can define
your own"

Done.

* In section "Inclusive and Exclusive Bounds", it is said "An inclusive
lower bound is represented by ...". That begs the question: where is it
represented like that? That doesn't become clear until you read the
section on Input/Output format. Reordering the sections might help. Are
the double-quotes around [ and ( necessary?

I added a forward reference. Rearranging the sections seemed to create
the opposite problem. And I removed the extra double-quotes.

* It would be good to have some examples on the input formats in the
Input/Output section. There's one in the Examples section, but it's not
very clear that it's related. Perhaps the whole Examples section should
be moved to the end, or the examples be dispersed into the other sections.

Done.

* Likewise it would be nice to have some examples in the Inclusive and
Exclusive Bounds section.

I think the new examples in the I/O section cover that, and there's a
forward link from the inclusivity/exclusivity section.

* subtype_float, how is it supposed to work? I couldn't find any
explanation in the docs. Can we come up with a better name for the function?

It's only for the gist penalty function. It's difficult to know how to
penalize without being able to do some math on the boundaries, so
subtype_float it meant to return a float that might be useful for that
purpose.

It's likely that this will change based on Alexander Korotkov's comments
here:

http://archives.postgresql.org/message-id/CAPpHfdsVow
+Yeoq5Be=sxPFPsbYG3Gj3QyVvVdt8dg7XqNyHpg@mail.gmail.com

So I will defer the documentation updates until we work that out.

* Constructing Ranges section: should describe the 0-3 argument forms of
the constructors, not only in the examples but in the main text too.

Done.

* What exactly is canonical function supposed to return? It's not clear
what format one should choose as the canonical format when writing a
custom range type. And even for the built-in types, it would be good to
explain which types use which canonical format (I saw the discussions on
that, so I understand that might still be subject to change).

The canonical function is just supposed to return a new range such that
two equal values will have equal representations. I have listed the
built-in discrete range types and their canonical form.

As far as describing what a custom range type is supposed to use for the
canonical form, I don't know which part is exactly unclear. There aren't
too many rules to defining one -- the only guideline is that ranges of
equal value going in should be put in one canonical representation.

* Defining New RangeTypes section: A more general description in
addition to the example would be good.

Done.

* "GiST Indexing" title: how about making it just "Indexing". Also, it
would be nice to list exactly which operators can be sped up by gist.

Done.

Regards,
Jeff Davis

Attachments:

rangetypes-20111016.gzapplication/x-gzip; name=rangetypes-20111016.gzDownload
��U�N��{�6�0���)��XJdG����:����cgm��=m_�h����DU����>����$HQ�$�n���H`0��`����"x��{��	����4��
~����,��
<t��h�������l��|O�����������G�[8J'W/�
��{���Q���l{y|�<	F���gI:���Q0_�/����c����X�0�l��<��4�G"8��� "��I������d��~�D�k~^�w��_���J��b2X��������fcm}�m��5�667�(�#I�K[4L��g�MD�� �<K�tV.�h�,��Oi8�_�QX_<O�a�4`��XC2���$��O/C!a��X�$�'a"J�dE���t��{���B����p�dI�.&�t,z� y���(�/������[B#E,
X�;��I8��y_����$#-
��hj����U9��F�Q8����.��Q_�	?-B��������r�1�`P2O�~n��D��]�&5�"�_2���2HE������rf�������Z�;">���"\�X��h���D�	��uu�59�����af�	������s8]����&a_|�G�lB.]��I8�����l����NKhs$I���������"�`}Fb��Q<�z�`zN���$����%GP}j�OG=bJ���K���0�c���}�n�s�� ��$�92h<�NR�H[�I)D���1���(!	C����utr
5��x���,e����T8�<��Q�jU�R��&�=�^+�pp$RVoe��4I�th2V9�^Q3*�`t�:4��>J����4�>{��!�Xi��Xa�k�J�'��@���J����V�-�n����@ks���h# N:���p�z'N��������7��S���=:<�O�?���j�;�F����r�Opv�gL&�N
�e`[I!E���A1��N�`�M�)o���;?
���:u��=����7H��$:��!wcmmJ��[�Sg����=��|���~lt�#���Q���*���Mt
�����n����^�>�m������}�l���4#
1�2I��An�a�>0"*���q*�*�{�)��Z����Ixn�(Rc�'55Y���a<_F PX����g�v�E}%�sn����e)�L�+����h��	�Ej>:X�+��D_��=���x4��K�(Z�5�O���a2��5���D19����`�)��H�SG���qC�X�������� ��a�+5P�{�-��E8�@-|e=M������5?y%�B��JL����=���i�D�,��D�,�<'
P��of����V��h^�+lq�*�Nu���OM��U���ZH����K'%O\/I2�h��|����p��m�!��y���<�$)u�qirK(; �4/�CP�&P[�C��,	�>*�g��5� bK����P�W�x�{�����G�d�J��L�c�^���?X�m-�+Xg!���h�9��JH�t
d�cP=C�T���P�{S ���]Q��aO[0G�g�"Y��Q��U�M��I�g2�4x�����V�e�~Uf�r��fc.���l����J��g�v��noX7�v���vnr$w��1�)X1���6Ta��d&����$�Dm�����e*�J��(�*����`<���
�i�ZQj�I4��j��n�.�)���JK�,o�W�?������V��1p*�e+���h&A0���=J��,;��P ��$����'����4$~�#���(�~�M��������t��bM�"u�:�q\K���V|+�y4Q���n�4Yo�6�I_[j�<�;�����C�'�:�����F,�#�J[9]�	�������0��E ����*�
�~9��$���y����p��S:���'����S6�,~�e@�5�Ty�h��-)����5��7�{���[����}��!�j��a}�.VVVx��676�UX���SQ�
�E�iv���2��#i�����.��tY��e2c�f6��?����~�!��.���:�T�������h�z���,�?��eZ�b�A���)�������u��;�������;s�Y�c�|n������)��^kh�x��j���s��c������'��W�E8/-+]h�(���A���E��R�Q�W�9(���+�����B5%2�V�_���?2��0�w�[M��0��/����~A�����p:����w�I��[�t��?�2}�KS��*���!!.<�h~aB���D�7�7����r��v��Zn��
��
� ����yjW,�r�&���a��R��g�_+����*�7�K<�k<7�����/=1��O�W%
��� ��e���8��pD^�xT�F�-��*t^���y��h}q���w��v��4�y*����`L�h��f�����me��	1�..���z��!�P���7�&�t�4!�S���^�WR �t�v2��t���,�n�����-|�5�*�F�����i��e����8��-W"H��W���U��W2��b�����`<���w��-r��0���|d)T��y���YU�5��_�{%�~�P�n/;��u�=c>\��+�{�}�4Um��=x��C�V��:]���j}OD8�WU����M%�n�K����D'����X�vDw�K�5���8�����e�dc�t�M�P��C^����I$g�D��p��Dt� h��p�M�c]oE������CPu')�@�O�i���\N'!���Ox�7	�x���|@,k�����0	�.�X�=����~Gd����~��A��?QvYu�� �'3������:oO����kO�1�mX��/�;g_����R�(�l�?&:��:�u�_�"G�S~a��>1�
��T�A}����� t�Q��t�!���-�1���=����W���c��kk��>E��8L����^�2����zbV:��x�DMT���=�; �����pY�,���e���4s��j���a>U
j��������z�o���������P�3�_������V/���M*xS��������o-�_�������t,���g
K[���"�&��t�$�V��?��Xz�W7:�%����{�G�c����
O��9�F��<s���Tk��g���f�|�cS2u�������9,O�������"����Q�=�C�m��`|��2(�ft�{W���u��	`���-������������k.���:��Aa����z�2�q���	o6q�s�3��������{e@�'X�8-���Z���/������bG���J�O�!��C�$��@��~����N�����~�;#e���������e�=��2����� 8�:���x���w��8[*����o��7����&{+��O�`������!�=��d|����:��+}q��TC��jV���Y~�"FQ�>7���W�Y�\�/3i*��OMkUT�A�!�����&��T�u����m���o����a�����h<M%��[��f���$��;�?o�3��g���5��y'��~���h:�*��^b]Ki5V7��}�O��AAi*������c?��C1�hY��2����lS��Ro�T�%��e-�p<	�H<�S7�`��ZG"�_N$��/Q%�3":�S�8�Q�'�p�"^�E�$
F������K���%�J�����B�3
����(�xtE`����?CBxE��$�|@���qG����G@"u�J�u*Lj�MR:H[�h2� ?	[����D�*$�}�V2>�4�,�S���E��k\ ��4l+���>$���ER�g���i8���`<�����{bgz�0���r�~J����z
J�!H�hCA�i��&S|�a�[iP�H���������5�g�h��z����yd�m���%Y�G����Oz`���t��Y��O�=�����������k�d��2}��t�4���� �j��"���c���c���,��n�6OL
�V�
jGf7���y��}��l������P����woftJt��wU_n�����������y+������S�O��v�����������igRX�K�,�9!k����W��vV��<��u"`����	�����t�����{�r��Oi�i�R��JRy�����a�#�M�:<��G��8�yy���/;��DJ��%g�:���?<�����#��~��]����	����[���d����uxR_b��?��._f�����j�N u��b�T:�+��aL�h�m�����Km��U�m5�*B�_�����3S��o ��������YN�O����~� 
�}�����
�^���UQ��1
J��Q���H�.�r�<�:�6��<c�!4U�D�\������"J����3���'��%9�����<����w��X��5r�� �-+bv(�|im�,L?��;��R&�����=�a�z���[�l����2(�T1�c88G�hAe%[�t�c�������I��*�a:�
��������Y=��Y;6bO��M��w1$�aC�Y��� `Sqx�i/�1$���g!�R_���c��
V�%��><(���O3T�t�"(�<�tp�����kf��3@��)�0X���LT��O�VCDm�z2V�p�+�8&+���MG�l����Q(N�rjK�#WW��N[���
�` E����5uw��PE�G�g�'L���2������S�FS�����pn����U��!����o�������qXC�E@!�4J"�h�*NQeYS���U�����L�s2�H6�|�g���G���q.[�xC������=�8��O#�?K�F�8��P{Re�B:��.S��=�_4�bD_���C� �x�8�.D��6��l�
q�hx��-�pi8���x�e��%�g��OhY���Qk:�>���7�a��S�^:��y�QB�+��aD�.�J��'�kf�8�5:��"@�0v���	���4�����k%�K�x�t��bRk���^N�N$�FT������1����i�T����hq�Vd�j,���a0y��U<����E�R��K�S�5@%[��E�@��_\��>���
j�a����#jgA�}2��� �oBG/��I/��^��L��]�8���r23������ p���rOZ��<����)g�5���//��4�:�jC��U�J���Scz��X���|\�`��������`� �������D���������
M.�i3�k6Vk��`�:���U�������(W�D'��w8����:gV7J�Fz�R�����k8���1^�
&dLO�*�\V��E����O��G�[��� ����qsE���T��\����LX�
��To��[���]�0�3�*#@��� ;&}M:�b0��U<uN�<����-�o�1%�y
SL������-���jFGn�10�P���dK?���h���o��Z��K���,+r�&�/��M?w��:�fsf[�G>A@sXd�1��R�S�C�n�#���B3��y����\OX*����}�\A�YH�+��_�$e����������������sg^��z>x�w��b@=R,94t�g��xg���B%�����eC����������:��C�����|A�T���K�OoM����2����x�1����miD
��R�
������b����9 �0��	�C
�{���?{���e��b������k�L�!����O5fj�U���V����}�v���	K�dDG��
��_LlU*��DM�ij�V������}���ew�8lZV-�U��Y��[!�JB�=N���
[D&��Z�U�"O��.-���-
��r
�~<��T����M���`���%1�S��	���chV||��G��V�&���+����we��Km��@rNS�8�f�	H�y�g8Z�K{t�����d�1�J8�G���5�P��sPx�'��uxO{�&";
20�`���c��.$Hl<f����@�M}���f�^�������:4
����*trz�cNNQ1����Z� R����� 5������&(�|�5-%G�u��Uh7A�Fd�k�Kh��gWm=�f�13��|*��U��8�o��No���8�������
\�c���r)9���Dl�^����+��Yq�%��M�������<���vN��S<Q�_�����QP�8������
�iJ��N2q�?>�{!���C��G�����qgw�d��P"Y������v��O�wN�6'�^R��"^+]K�0K?�V���Z��llnaxWJI��b�2�R���>��������
PXT��7�*[���5*�
�5�u(J=#�[�=~���U�`�ya�����,}t���J���$�)E�U��aP�-��1���dn�7�,��X�4��%;.`���(�P��)lLG�/5*�K��^��^Oa0
�
�NSQK��,�,��l��k;v"��>V>���:��=6�Q��8:t�8�����EQc����� ��;#a�����.��C<��$}aY���'
����E��j-]i c]<�q�q48��Rv$e���|R���z�fb����e�2��j��b���t��)��p���:��
A�7{������j��$����sLG�4J����>�
2�(3�Y���i1�S��6�c�@��:|�����D)�5-w��{�nd�����WVV0��	,E�}�WYZ����('����^�u:�I�R�e��]y$��Q���q,nf^���v@��m���=�	��f?�J�6�m><Rc@�!���2G���>���9A�%z��LI<�����mD���]�����0[}��f�^H�'
xS���������/��z�%�"D�����	�A����Wr��!������������b�E|�{���
 *������b��#
E��1��������m�6=m�Chc��U��I���u*K\�
Kv&r��f��+��?}���M����S4�Jc��z{
�r���,36��"v���6.`#4i]�<N
#$��{���'��5������h:<�M�6��{Y_O��u%������S�}�^���'\����
��4��nO�,
���j��,5r0�g�M���Z��z��>�`��XL��(v�!����	�J�5}�5-�0�������QE"Y��������c�T�����6���7��fcU&��7��G���/�{�/�$2��s���6k:�M!����7�_
F{i�Ap\(K��)Z?�uNtc�l�mB�LO2^>���� u������T��U�	���A�gOd���]�������������l�z�]������W���(\�V����`�t���qU�8\pn��5����o�U:{)���2{���,>�-���[�Vs���/�H.)	e��g���|�75]���`��<��d��;?he������������Hs�Y �Yr�5��J#'@�e�lq��c2&S��h'��jd��{��8@��~���l2�Ga<M���J"�Z��-���(��a:�$2�%�7MV�2��f��a�n/��#��dqp���$�T�������Y7	���E�1��7��}�z�����:���`�;v�������in$Sx�a0l��$�Et�E���^Z���X~Ie��^"��cc���]�x�HL���.:�#��������` ��O��GX��w��<�������|�m��K��#l�zQB���I��R�����1�����,�{I;w�O�%���b������<�E���s��`X�bd<m�G��a�����#Zi��R���D�\�T����ob;�K��X9�e()���8W���>�"�Q�"�z��b\0 -y(��YY����e8H�N�i<A�/�A?�EJy��O�gl�^0�dj����UOq0,��z�����c2U^R6��%���`����w9�4��J7k��
�JE��Y]�]�d�������)�!����j�����x��X��VcaE��$E�k�tK*�y<������X��������[����9p�k�`T���@Tnx�gA�r5|�����L�2o�2Z�$��8e���2�;�&�hD��?V�\D��VV��#�!��
��_�	��H���"�%+�;t��21�-=L8�!,z]�5���/�`�<�T����[�����Y6�������7�W�k����kr;:���;�����.�$`���;z����C�<��g���2t�b\����3���S�-z�������
(��n}_���L��BaIw� ����D0�4�D�"����Q����;��l$����-��.�x������_<~"�z u��">�Zm�9���~��Z��$����N0���A|F=�^�/�e#+��C��=��e�Wb�������!����\7�]��?��z">�h���������EW����Z�U_����:T��-���Q�b�a�)]��(�����	~`#���l�o�����v����g�I<�I����0��[�]�/@0MW��U�p=V�_�m���A�=�b�����|���1�!��# K��-��,A��TL��;L�.��������������.4�=9����T�!���>�)[Op9���h ��GI�H�]
����1���4V�B�F�.=�~���,Y]��z�{����<@�����������	�cg��v�~7�&A��4L}�����
SSN��4Bh�N��%H��^�d�xw����<�y���t��&�F���P��c��&t��=��Y�/�YXX�F��x:J���`����GQa��P�J��}����o<�KqT}5(�`��QxO� ���i��#UB�29�y ���5
���^ ����$
�Q-3�zD��S����n��7�5\���FksK����62-�`�<B�w>FZ��EM{Ccs��xS/_��^�N�t#������_���P�#DE/oS�_TA�m�@�����w;�����i����[���x��*@���f4��C}��7s�:����V#�v�x�S\���E�� ������]Y}0�����~Lw���dPz��7���D���N�4-Qw����{�oj^I���F��8�K���9������	��~�9��Ac^�Y����:�A���+�!3��������~����5k��uA��9���==�[���3I��cN�=�'����nG���_�o� I�/�gT�	-r�����A7�]n����1�wL�)�bpc�zSr���V
a���L>Fi���l���1��N�x~-P�������	?��8L��T�}�P��98���{�r����P��@����3�������CS�K��M���d�T��c-�n4��H<s=z��r_P�/�tN��)���w1��K�+x����Y(��,�����'%Y��yp�`����j�!|]�c��hv0��������Ni��&E�G�8Pi0��@z��]Q���)��B]���_���t�3��j�[���s�P�I��<�'z��������~s���b��d!QPh��R1�f��J���!�g�}Q���e'�O��_����A�M�vsm�)H��n�����'�arQ[��u��(&�:�O7u��S[�1V�|P�K�@�B|���v9�c���U��Rc��]=�G
xMd	#����O^a���I*WC9�5�Q��2�}�s���U���^����>~��J���Q5���L��P��\��<���
,��{?����PJ\�R^n���[a`s��d?���E�n������sj�ZB���|[����i��si��R^�Ema��>|F�gj���j��B��������o�!/��!Kj�j��u�Bd
p���[W�j{�����Rs�@w� y~ /���d�7 u�����$���	A�O	����{��>_q0+�W������h��;��C5i�9S�F����5v6$�
;N������_����m���C�%,d��^��BR��d:���D��@���	��	K�@_E�Pw����2��zuP`��xa�ag�xM�"b/�4����4�����i���.��+,gVW�]��-�����65_.�&�����$y|�`�@�s��� �R��:W((a���������t`-)AF����(Z��f[�5p� y,S��������I���M��j��<�LD����������th	J��^��3z�?���];�d�l��!�����)9E�'�j�6h=b�7�qx�u"YMy+�j�P�:���K��c9	Q@�n������X�>R4��"?[����[����N��J��1=;���>��5�
����LB���+�������F5"���>��8���������6����
R�E����a|^����
�;��P��NF��0, mF5��`���Z����^E�ThVK2J9,�xH��`i������4|99��[��*69r/�t+A��^�(��b!T?�)�hM�V���j���1�w�$�[�]��(������K��@{7�\\���W����!������a�����94F'S4��4�V���}%d3'�Z�bI".g�h�n�O�����3���z����/�4��}���������l��nC�u�va����{xt�f��>�#y$����_��g���0F���x`����LQ_u�L?gtTW+(�v��=U���j�P��z������/�]-��������Yu�A��� �.���(�����BH�c��0��;������icy}���N`��[x��������-VoN�|��F�et�����"��Ei�"��Y�	�j�z����
�I
r.��:�
��{����R�����H�r����,|��GY�;��UKh�'�`���0����*RT���lj��jJ������Q�)� ��b��}k�����"�"��<�oS��Bj�}�����	�Q���3�zoxJ���k�����j�P6s��v7���Uqr+��)���3��[F|�=/���MejSY�Z6��Pc�AE#:��fc��a
��fcs5?4�]j�����.s��k�����}��
��-����������[��m��`B��e��Q��	����S;�(0d�G��Mo�7IH��6^�P�������
`����Z<M������*���B`�����Y\���b��y���cZ�+��)����+�R�Ga�M�8ZP96r��
6p�zg����Mwv�	�.�$�r-G�v����b�m�YT���x��G�f�]��O����lFeT���~��'m����J�I���j��j:�n,�����G=����&��) }��l��59���,�W&��<V0��E�4-�)]�3k�=��6����z������\��c����j�_�����������8�^�~[J��x�9=9=~�{J�:��W�TG������`>f���=m��gs)���7�~�-�����(�dNW�;�q����"���.�)����kr��8!�hW����t�G�p�0l���H+\��R��C:���j[��e�
�t�]���@�l+6��Ul|��j�7���@D�dC�[<��I:�N��e��h�oj/��5��z�@�U�CR��&=�-��{���Ve��<������C���������!�~���B��	�yK��|b�(�

>�n�I�2(-�kOXUn7zv�����m�������T�_L��������.��el�U2m\���;�K���
V"Y	��w��z��
[�W���l�`���e���1
0<r����������r�;���t+���aF�+�����[T=[��]���6��"��e���P��QT�/p�9�t?�W����t	`��4��1�a!�7���A��G�.%��x�9���������X�)�]��=1�������;o:'owv;��0\�J����X�"������g�aH.~W���b9n]"j�ub:�
��������Gq���p���A��r�z]��;�"H�``�v
E8v�����9�=�tz'��.�����3��K�9�z�P�]�����S/��
-��/�]#�$$��tiu��1��.j�E��@.D8dh�H�5=��������P;���%�R���6SHS<3������ZOC�P�
��xZ�uFt���
�d����82����#��e�$Y����"�����X+��3�C6��B���>">D��B�H��X���X9������h��g�:�����2���"�tz�#oj+���_�H��O��;BE���__���h2��u�w����t�@���iNX��Gh�Mb��/�z:^9��(�,�fdE�����y���wo�[��=z����S3��� ����?'?-f�X4� ��4���&;�A��������C�q���W���:�����N��7������{�E��X�#��}�;[`�&uW���PyJ��px���.��q�����=�>����t�/Q������/8�`&Q�+��0���^+�K�L�}��gU
e�<� �4&x����!b�9Z��[C�����RF����l�ELO�/G>����@����T������yJ�!9�gj+���,�M����}F){e�a_e��ms��������j���W�������w!R�����^�Q=�S��Q�k�_�X��7s�Ecl�)�����Qg$�@�(��/��G�>��?E�t6��7�f?����~�������d���������v�����t���j���BT�n�?��_Km��jh�F	������"�y\�[�����r�u�JF����u���6
�#���"!W"�n���dV`����N�Dt�E=�9F�J31Q�UwKOx#@��7��6���[�i�(�j���V�����}�U��.�A@Ytb[=��\w�4�S�=�^��Q��nI��5(��R"2�YnI����T:E���7'���n=[	�F����V��kC<�*�L��)g�p&�f��:��dW����yw@3o�s����d�����#c:_1�������hO\_��w�TV�I--|��������?��Q��R�z�fx'�'�V�e��Q�J�������1I�h�R�K���ed��q;�����u�HIi`
4[ dJ�3�[��Z���#]"b5J���>�K\��M&Okb�@w��5 �_�,�+]>"K��aDGW4�\�����X���D����)�I�9=�99��2��S����|*j|~��k���o���!|Idg$pn��\�G�|��?R���|j����(sj�����h;�+���5���9/~�W�}?6���Z����d���U��(�����,�x��3�z���yk��O`��M��m8J�K�3�J�����]�2����Xl���Y���g����_�jrB|&�p8��j�r�$�j)����B��X���__�����
��e��� �>�-�e��U���U�*L��B�"h��5p�x
�p��5��R���Ue��R��a1t��q��h���?6���cL�pR����Y��BUqis+T^�2�]��������>p����u�t<)t��N��E�8U�L���ZvM+^��x���
^s;��QTx��[�l�m����I���_��F���w�qLiG��z�4��!�r�	������V:m�x32s�a�3�J4hE��9b��(��:��'N�_�0T��������3��4�kV�XZ����$�^\�U���P�k�i��b���aU9u:���+R(t�z�o�]�s�k'8�/vO������^d�R��L.���W���#�-,D�~��x}��m�>��xCM��iQ�V�Bm,��A	R-f�����9����!D0=@��wl�r�@X�*�imQ���N���Lz?�!z�lM�Zm5;;6_�U�L�B�����YcawO���iS�m��[�~��d��1�K�RUkx5N�����7]�?��f"����WAX�C�>���U�W�Wo^wU�.�V�9��vq����R�x�3�o�%�w��3k�f�\\x�~���X/��7��4���m��������0��A�����;
�D?`2LN��
�	w��r�����"�p�d�|�B�L��9*�Rj�����c��H��xt�qi�4��������?�/&�G�
���A#��a�:��\-+X2�Y�����V"�cCNh)������e���mXcY2g0�n�^w��qu_����]pS�������}a����h��Jc�Qpd2��E*���v���1A�dP���Q���Z���V���U$���(��R����IU���s���{�,���_j3�.w�|Z�:L���+U.���S|#B�X���bE�w'S(,�%�cI���S�hL��k�/O�;����R'���Go����V<y{wHA�:{�>A:v��s��E�1�$��`�ET���*?q�����9�G��m�oH,����p��+deO�(	��4�e�:�V����r�����R�{�!�<��t|g�SCh.1'x�'�P3��w���O�-XJ����Y�J}��m��Z��a����MT~hI:|���+���Z+B��Q �i����t�l�����m�V���g������9�$Aiq+�����I�N F�^��*�R��B#�y9Fw))����;_@@yl[��NuJ��,�N���������3_oH�.u+��^U�K���h8��	�v �kM�������6�?�t�Hgne�,��F����c��9�O�������w&���w������$\�s++��~���#��_�"�_:WX���w��{��
;����/���W��������s�������m;���e�*�ln�)"�����~-�r������~��_��J��{+�'���U�2zw��b���W���=s�����d�0���d}qXo�d���y\���	��o�������������W�k��h@�-(��0��)��i�A������}cNP�r�3x�^Z�lx��2H��P	�����!�A����fI�afM��wW����h�����]�0c�
�}t&��m}5�7�\���pbX��������L��7ow�;e�+�gzo\�=W!q-�s�3����^���7 ���F��������������6�Z��k��N� ������J����{0��
�~��\y����+�V�(�����#K#~��D-Q�]t����S��O���(����H=�]��o�-��[��N�0��������\������21k�PH*�CDW�<5���~�����_��w�y
��tv�w���'�c��BvBR�6��yQ/a�4��B����[���5�aI�Tjo��IJ.kc��I19P�r�	�rJ���Cn�tA���C���*�����)�Ah������tH�a�����G�~�)�E)wDf���2�4����#�KJ��w�E���7�-���]�v��5`����X�4uvRE+��0H{��"pt��*3�������T��F'V�6d�vY�2�Ei�������USy��zN�:lx���O���H`SA�8�:���T�8�W�h{���_/���!;�VWE)�I�����V��'�
�������\���C��d�l�n2��"��4��
�]�s{��t(@�x��l��f���S�g�S	����l����v������P')`y�'�0�~�&;�,�5n�>;���W�[��:s�s�?���by����[2#G��)	�R1���wEQ�2��0h]��4�V[k�mv�l�CN�r���XanT.�,#"�ax�z�P]��'W�����DT%T��"Hb��O�5X�W�WoN��UL��d���A/GW	�}����D!�}VE��8��E������&	_�Z��S�^��b6$� �.��>P�
�}�&����]R��R���JI	���4/�������#���Q#=e���������`������_�v���Wy0+u��2���#�_Eu;��=��!&?����?nv����N��GT&(�D2�)^dO[���n�#�H[����y:�g����
���~�D����P�*(�k��Q�(?]����
���1J���
h��;��g+7�=[fv<SI��Jfvsl2�����y���lx#~�5V/�Z�,��jO��u6P}���(���@(k��}+GN����Y ��W���9�������QG��B%��	�b6Z2`����d�+���������XV@�^<�������!��rRZ�V�Q�����������`c�L�:	?8v���u
g+�Q�%���go���q�B��y��/`���h�����>�<-�+�>Y�r��0�a�"�q�Nq�7�����>��9�V$�A�_3Y������X*Py����!�VO�If{��xkm���8�d�����_���8
����
��(�d!h�m(}&/�D���8N���E����^�4�V~�<kT��Q�j��@N���m�i��I�P��Lr����T���.�Z�=���~kK��*K��]��e�<WK1{
�������G���O�,��X��F�~���a��X��Xv�uX���_���a��j
��������s�^�\��Hr\��5+��4�0��K}���t����"���Y) v��H?�{�����F��W��	yU��F#N���`� ^��������P����4�MA �c�������pIe�O%h�0��oS'�������2����c#lD���6��z9��b%3N���nr~���CkQ�\]L%FXR��{k�M��}eL���P������k0 ��H�!�����c�����w��0��������U�H!�(<����x6����ul��tD����~gU��8_�uvP�>�����<�W��9t�S����>�/)��
��W����2^����F����������/S\���Q\��E9�U<�Pn;Y���d�-~������p��)����Q�u�h��CQI'��@[�x�`I)�"1i�pjR5�%&|'o�7�'ovNw���O{�Z��B�b�g)�0,6��>\����;���?'�t�L������gD�K�Es<{�#��9��
spk���^���\���|w�
5%��v���=����E�<Z��*����,�j.�����������e)+��$AZ\t[�%����
��:��L+f���.Mu�L���E��[�I�������HO�EXS���U.[�����++��z�.zY����<���x�J���t�)���fg��2������UK�����
P�7dN������j�c57���K0YPo���m<���ID�#ml��.�����������~c�z�PY(��F�:��RV��*�V�h�����R�����d�-�������o��P�9����<@�9��v��%�*QV!����5l�o�)����f�U��Y�a�����*�D�������.� s�lg���ZK;~�_��~Fbo�['s���tW
Qu���fq����������5s���u���������9�7�6�s���������^��[���$��*;SV'�6�\�\�*g�0k^=2�j�N�?�������,���+��Av���U�MRW���wl��/�K��~��"�����nA��&=�P��U�v/�
�[�ono[+��(��j�a�~�Ro�A<��q��a��n$=�VitF��wr�(`�G9�����	C>�I��u��=:���-+~��?�[��Z�<�]�K{������y��e
�F��l7��M�l�0v��a�Wy����at%y��jm\r=�D��z�h��������G�W�=������Q�1�p��� I�������vkK'���I�K1���S2K�����v�������k����{V���?2��i-I�������'���i��s�p���g�^V *�7a�����L�x\���C�V�"W\���h]�]��2^ UI��ah�A�;����m}F�Io���A�!L���U��a�P��ls����
p����D����3p�K"�1����>����� �H#O!�Dj��<�]�	Y�+1+E7A~�b@F�	5_�X��D�+zV��	���\���n<�z�	c$J��(��[��&�O�{��S�a����(8K�h�G��(��Ia���q����:�V���0'�����M���#�����1�����i:\k�*�&!�bC��!��E)����	�#��p�����'�H0Fa�1������G��<RQ���X=����R�I�Ma�������W�"����^0�P��6���_��?���|��b�w=�fx��G�L`�A�y��\�����nlm�6,�����}�tuw�_�����M��@�����������������5���[1�(P-��&8n�������=�w~O�3����)�mK���zcd�}�����2��hjF���k�O�������&?v�tl.��W�c�&���U��Qo0��pq��y<���e�r�y+�C�������|�(����T[��@�AFj0��f7��,���j���Gr��k���x�f�O�=��haaY��@tkF�1��S���������S����tn�
��w��{����������I#w0�}����<�J8/������665tX@�}�i���D�2�T8�L�B�A 
J�P�F�{*Kfh�����<08�i�$�����.��\,���+$�����	����Q�*q��g��~���h:��N�������-���]��~�qp�y�N�vR�����J�O�����8Wn������`I�LE�W�����n�Z
�6N��Ix���z���C=<�9�5P{l�0�������+L[���$���A�.�;bm����y�a�_�eV�W#���}���a_<��[.)A=.yO+L����b�}R�1�B���y�Y���\����}����+�G���� �JzA������������[, �I�ms���vg�o��T��Q��&Kp�A��#��)i���]�zk,���J�����tS
q^�����?,,4?5[�w/�������{�����6�}��t�|m�WXt+���j�����m����x��Xk�������G��jD�����O���Y������2���c��B�k@�^�5��Z�~���W�8���v�w�b8�W��L�_����q~�X�����P++9�|u�:mP�<^!�"���"�ARB�"KC~y88���>�����U�B�_Z
u��l�%��>�f%4O;�����B��E
�C�ON,����hs�����)[���gRt��5=E�k�r��������v
�L�W����
���D��!sv������W���$��'+��^*�e! S�H>N��5��F�
�i�(�7\�I�Qj��m@�Q+�
:[��DHf*9��������r�)���dt���VYT�[N��R��%�����j���Z?#���T���Clqj�h���t�<e��L"��l�E�_�JN�F=}5���b�}�@��i�{I��o_b�h��?���c�GC�y��y��E�.�y�d��|��K�M�-f~����������J�l	�R�=������xC��T�A|�o�!�O�y��>��c�C��K��J�A�����H���������Jx�k��:k6jKM��j	����������E��b��u1f����
����b�54f:��b���y���`��rS���5
�[�Y(�!mH)�C�6�.�4�]���\MK.M�I���!m:u|w���w�U�? z �#r
���,�	������V�����pK����Xm�yD������Rl�%�(�����4�.*f�gh�0�
�P%u_O�_�=�����w$�c2K3������d���H? ������	�Nv���X.2O��������\������_�#6�5�C��s�-UQ����q���8�M�'r��U���x���W����F\���a�C*-��b��]��p\n�{]��0������zV�)� =���*���ei��
��o��v2W����+�g�7�N���7�.'Eeib.d���[��h����PFP{�/������a&����"JII%�&V��d���M	"�)��T����|%]�]��e�X�"��a����#���%�NG�"o��v8B���}8y��|��#����l���une����K�`!{6=�E��yV����G� ��Ah�W���j{aA��v��u���R��n"��0�
K�{Wg=p���.F"�@a.l�.���x���4��yIm)�x�V��0���~\E���T���[�tA��=i�5�1D	3���q:G|�v?�Z��m��,PmBQsd�)U{�KH�W2i��T��U���
�t�BX���j����X�d_I������LM��� �&�&y��P�s���6k�oW{[�����bn\5����(��~�[��c�6r|
�����*L�������$`M�V�
bK��$K#Id#z�����qD����qa���V�%���b�4�[��p7��*+�k������	��SFF *v�.D���Kg-�0��B}W�$;�n���o�a]k;�(6��1#o�������Q��J��SvN5�5H�{(J���`�h*��0vf�&W�;��;�'������.���w{�'�'Wa�A���F���W;�k���F��n�Y�}+�N,\M��r����\F$������}[0�1���wk�J�;�����;9YR;qL?�)��i]q��S�S'�f�k-�O�Q_���)�|���g���FW��Q�+9(UOb��/�h�� ������3,��#B��&N�
�����h�0�}W|����o�NlPR�������j��i��t�Q���"9	���~a���B�k����@Qt
�D��lI����f�v�������n�i<�ye��m���@���^1�PU�����Q�=��	h�S���r
nU��J^�5��T��+�J��4jd�&u�D��,��={���U��L������ d��7�����T��b���	<V�������s����
X�(���h�?���>������<�7`w���<7gv����	�mps���l�k{���4���.��������3���u^��;8��:��\�q3sL�E	�&�J��g��sy��[�wr+�{�H�{����i�+�&����$�Z�ou�`���f��V����1e�xCVN��������:�\~����%�j��A�Ul
��=OS�5�������$��r�F��-�z
�m�E$�y�,�rQrC��S,6]�� 'Z~�������XBo}�m�����j��$3��=?���LN�,lGG5�����x����3zK�����G�6{*R.��c��=��9�����,�3�?���u�/��/U|�g�C���k�>d��Z����% ��%�v�!�&�������(�R$����R[Uj�JmU��h9��k=��7Z�=%��*%����j�.n���G�}�i�
��.����%����jYR3���f��kC�#��������?,�4��_���KxR��I��/^�)����:��WQJ-dL!��	%�����6����7�������t�����V�b�v�����9m����"�<���!a6J�X���%�R��{���$o��-�
�����7>q�`��f��Yg��.,7G�d�a�{v%�v�Y���,l~���f���B���p&B�'���(#�7���E7��7G����{DxD	7`[�f��Jc}V�b�Y;f*�^&��Jv�o<���o����q�<�8�����*]<�M&/q��6	��&�!���u<��SA_�x���?�*1,'5U���^��;��9�<�
���L<���)�P�4��\���Fw�(��2�p�^�c"���x�O)bC��*�sH8�ts�R�T�#�Y�/��k�/S� ��a?�b����i��,y�JW��pH��bn�~4	{��*s������*�N.�����acaTEi����]�����1^I������F�m��5�'�L�]�1z~��qX��,������N������=�u�l����|J&c�*��oz����
��`O������<+�
kf����V���8���}�9�v5�������Q�]1&E�����8�F����y�{��<'��h4�OPJ�Q*������?M���~6�g��v]z���U����e�������!%��1-j#k��j��]����<#�G��1��#%�0�+�H;�.��4��4�M�y67BN��Bg��[�������P0@�Bi��6���R��>{j�d��:�B��4g!l��\�)�i��A�h�eMj�h���S�~0���sw?���]R����
�i�j�tSK*5|�t��t~�=���O0�������g�(R��#����G�/=�p��������r���^j��/�I8~I��x>����k�����Hm}��y\�r������=��y��{J�-�.o1�ey�i��s���2���`��6G6x�2�h' ���/2�����*M��X����|���,���0_`�~��at���p�|j������\;�B�d��4��x%���-_���j�jm�����AB=�������%w6J�t6�v^�����R^�V���u�z^�X���5{Q���R���H�����t
��5�O����|�P�K����2#�|2�.b+r��
��/���O|E�|:�tr%���O����d�n�����o��H�,��n�R����-�_��~���s�QV,�2���!ec&��e��=��9u�,�/�z�@9"��]
 ���I2�}��vS	�@��
:�LFa�^�i�"��BIez5�aM�����}Dd>�x9xc`�A���i1.�YMJT/HD04�)���r�XP���fgP]�q-�/��H'������6�f�l�~�2��������jI>SJ�.u��#IcZ�����(��w���G��W�G<��q���Q�f'�!���4��{��7U�o����w�{h���e��[9o(�*����G��e��!N�s�h9QX��g��uu�{���8Z�����s�gy{g<���20zh���8,,G�c���49�����#]B�67��T�����
����h���L����v�������`r�c�g���"�3E0_)s<��Q����EN����n�C�{�����]��Z�K_wX��^w�u���!��k�sVVxi���o�
�*�����.<u �M�x�L���7������1���*_v6��M�_�����d�_�[!^9)b�q���1'f]Vf`VVn���H�&�Qu���X�I�h�^�1�=���<o��Y�������gU"{~}�����G�q��!�+�nC���!f[Jtg��/
���]5���R;=�g`��b�i�y�<+�O�TI|��s|����n�w[y��X�j�n+�w>�>/�an�o|w�C
v���k�x��E���&!Sl���$����A����Uv�Y����6�u~�������voSQ��O%�n�}`�����L���s��Y���9�&W
4�#�K�sq�����>��c��\Jt�]	��s���PZ��9�e�^�^���8��;#yA�nD�R��S�-�����	������s�`��a�_;P�@NG����U���'i�)������8U�JI&}�������p�$E�?n�C�x6��N�J_6��i�=��k�*FW���0����^@<�^0���v�D�q��[�A���R�_� =�"��)r�}+�"R{�4����U\se|�8�A�dxc���X��(��#Jq����
U�+��� �������8������v��(]��h��p�P�<Lb���Z�W���h4B��m����#)
9��Z�H|��a��n��0�l�
c�Z�R`�u��21��g-�����������l��1�������"g�5�n1e��1g25�9��������!�"���������Ef��Rd�6'i��+�YD���;����]t��^��'	����4�,�\��x�\2���Fs��XG���h^��3���m�ca�	���d2�������@f�i~c�Q�bD��x

>��+�W.� �M�_C����3NoF�Q���	g�f#%iw;He�Hi����W�&7o����alrc�G�PQ;��7���S���e�5����r���I`�H;��hs���'�{����Vt��7f��}9�0�1�s`���Lk�o�8��vU�!�X������<�+�����Zl��]�S��]��5|��:2H����:o�dWu�1�M���R28���dj�h	R��K���$L�����hH$�R��PqA,����!����*spV���|���FY�L#��SP���S��iF���a��*6L���b�������y��W���N����+w������,�V2�v�Z5�|G���Q�^�szW��r�N�R�H3+��X�*����]���d�:0Q�%|�c~�R''�p<���U���<��t#�LUo��>o��$Eu}j)�w
[��k������2e�����������g�����U@����(;��(;�L�i1e�����@d�8�(]��,V�7Zv)�%����ig���������������2[��FI l�U&���0��p(�����V`���L�z�����cC���`�PR�`<���AX���w�	�?"o��+1�13&I�d`����Z �����<�VZI����k�?�v��[���[7)��2����
��	bG���j�����p�����"-�AH�{�w[������Y�v{\P����Z�Zf.���Y���	��J���T�{�v�0�NFr/l��zn*�z�[��+����9tf���������`!��V!�#�����0���c�,Ea`"C��@�N��-qq��:+iim���"u���Rx-/�-�*g�Y���PJ��7=����!�p������M	(�*o:T�ud\R�����z�)��o���.����������qC���5$�'�sc�)~����������;�`TAU���:/�qvp	�����X��T�/|��)(j���T�����<n:���z�e+1�>��8H������r��0\�jS�r�������g�G�S�2�&|�&7�0��{���b�u)H<w����UBc�b-�F���_a/��k���|%}G�hh��X;���?����*%��GO������
�J�Gs�����������)5�k.@}O'�o{�;��-��������w\����ux�T!���W�����0HB5PnwK�\�R>��;G�{�7=�>��:�������-8����}4�K�Y%��=�m�R��xH>*�"k*���
�/�����[���i?{�8�%Q�O	5�������V!^��u������u�V-zg�t�;4�����1C�);3H����PT��T��+bSK~>5��ve��JV6W�|I�f/W3�D>W]&/�X�?W�Z�� S�Y%�"�]6f	���V�G0�'��6wY2S��|xAyb�-�0��F�����(��~��{Z��%��Z/T%*�g��g�GN�"��k�hAS�;��g�"/@��Q���T�����>S\��wN�)�d���
W3��S�
4����9�2
�l�]�z��r�a[5B���j|��(�i�(r���7�t�{�WF�W��������|�����C����G�{���.�`�=�����R������m���_��|t]��9����U��S��{���O�%u���k��k��[|7������;��R!_`o�L#�������S����"����K���?/5�w��3��j����%�w����Q�@>��'RN�>"�)v�0x���US��7r4����y�4�nH(=��j���s���R���G-)/�Q�-�������f�mo���-�?��7�H�"�27��C�SX<) T����+=[��gT����sA�,��P��o���l9�^�g,�_4�'�l��<U�����0������gzY_����e���8�iH���(f������]7C.
1���=�(�=��+����.���@�7���e�����r|�|[
'�i��E��V���p���)�S1�kX�j���d�/y���St��eC�8f/#��4���A��{�6�����#K�_�z��=$@���6Pc4�fF�FA���A�A��a
�B�,��� �Ch�����^0�w�9=��	ly.W$B1���y�[�9�XO���{���V^��2BXKpC~y�'�(2������yf�~�����d��_g��t�:��Q2�Mk��������t�b��9J�=�J9|z��I*I&����J�s��F��3`�d�{��9�90BV`���k�Rv@v^[t7=��������"�.LR��0G�9�R�6n���H�zv_!�^�&�j6���9������uO;�<�w�wN:��&x/|���C���9�D������E���,����)l�k���@� �@N�psT*��9K���s)��km)s�b�$yX�xi����C�B�kP2CH��o���0��-I��8��,l���GM	vY4�F<p��m='�^��1�z����9�����1������6�v&r%jO�������?r��E\������Oc�3����xY�P�"��+��wy>��e�/�����_�x��;�(�%x��=��{�Z�/�$'��
�7�,R������cMC}BuU$<���[����D0����4��UV��a0J�����Y�p�c��4[�Cx�]$��F33�1��RT��M�����H)��E#�B3�����L�E#%���r��2������Z��5��R����*�V���\K_�),si,����:&��2�����_����z���v~!��p�7��@����J�.�S���H��#�}���\���T��kpN ����{q����L���������u����n�gS�w)[P��+D��JD�G��/xK3��P*����!u6��Z�O<;�����n��Qr��K�x�����t\�7���?I�fZ`=��\O�b��9W��^�S���&��!^����"l���sc3������L��/f�{�?K�A����T�/i �F�S��<�r�������@&�����������'E��#���m��_(>��<�O*T�9�Y��+����k)��$ O�G�/�-f��W��D��W�EZ�����V������{��������y�t��t�p��M�����6������g��XS�a��aG������{��wHP��T���~��U�X8Q�er�[���Kp����91���0/��������I8[�$t.���:�DAm;���e�������T
�n���0*R/`���>s����\�#��j����$�}c]g�
�^�G�A7E�Z�	I!'�	�������W2S3���V��y��,���B�����J��j""��u���}�������Z��t�Rc|�s�sz���9����[�{�����N�*�A��M��1#]~�0�	&����2��NR&@��$�0(�C C�`�["����c'������x9�c�C�l���g.X��7��'G��w�$w�K?��)�4�p�[�����3���m�i��e�,(@F	�
{X�M���#`h�|B�w�e��>�z�W���:8X��3�i��Rz�#I�1�sgJ�<M��;�:���;�;��c�'OO��m�<I�u�iRm��dt��q����<���mMN�Gd���9�����H��L�W����=tn;��c�Z��or�5�jDTZ&u�[���B�u�
I���]:�9�yc�l��(�y���'�K�1����h����(������v�h����Z;]kCo�fa6i/jsq2O��H�#�A�����gR�R4.gf./��.�b��:lE\��(F�t�"�x$`�W�S���h���9�T������46������uF�pv����������;���2����������-y��<�VS{Wn�yj���\���_x���.�G����l���$<'�]�Zcb:�$T�J�����A�gY�Z�>|(�����o����d�{���!{<M�A�8���I�%��{%�J��?�)�#j5���B:E=��O���������$}�^G'�&��sW'��ov����zu�n67���V��'��$<���x=��`����cb���x:6`��^��t���.��&U����.��g���A���8�^%+����U���I������W���*��{4H����m:k��e4dS��)��n��d5n��v�m��������,��/�����!���7kH�KU���?,����7J�0���M���WG���-��W�G�����w^����e��_��Z�����]�`��v����A]�Y�D��,5�<��Xf�}N`24�$���gj'2��tx�96T<F 0�{U�~��4�\Ulp��l��I������b�J������36
a=S����L?E�E.�j2:�z��z�Ylz���'��,����)@����k��xPO�	 ��Jl!W�zbDf(Z\����)p�1N������4��s\DM���G����*C�������)��K����'TQ#���/��A������	]�29�a2���S�(��C�P�A:�������3#5���?���2K�T#B��<kn�Z��F����Ouw�#��y�EY�����{�\5�>�55F�B��1_xe�����o������.���4�q��������I�� .�::�{R�^��c��jmA�A�s�X7��-������U����vn���	e����u@:*����+�A���q�dI0k187X�����pE+��)� f�t~
e(E��a��J�~{$R����5+�I)`�/>����I:M<^kp�1;S�H����yE	7�C�V�n=�xf!2���U|^���J
p�w���cA�1�h,��I�5�q�����h�R/���Q��_!R�v��U��a��9��j���\�Bm�L�eW�>�HR��=�WkgjB��6��Nw���#�E5UW���973��������b���P����!wz�me�,��C�iS_�.
�e�"���OH%������d�7��2=a4�hK�.u�`S�YJ��m���{�)���N����k��RDk��8���������$v������V��B��|�Z1gS
�tN@�s ���X��A��{�����B��4n{i���4n���y�g����X�K%,�@LYpY��V��!��.��^��#��V�6�=;����Bz9g���1����Q/�,����
���Q�O���0�C���M��C��t�SW\�s�zIc�`�\�%��c*'G�2���e�$�+�����2|.��{��`����.���`6��y��zt~�����GyU��~)W������d�r&?%��:��$>�t��������"�����6>������9��Hkf��x��#Lt�P�Y���Eu���f�D���
���+*�����y�4B����M�sf�*�Y�I�N�����6x�d�i�&*6n��;x�3�n�v����_���Zd�zh������yr�K��G{Y����+�m��� �����h6����9��3���x,��$��D{�F�5/Lj���sJ�����rd\^���Qj�������d���d{�O���iwM�X�n�d�lm����~�1���I�����>�����K�{�.9rg���j����qO53�[%�# +�C`���==�c��-z�5��3�>��������U*4=�La��p�>�0�C����q���Rs������[1�+ggT �����Uf���`+
26s�cw�m�b�.���Y\G�-1��=��\ ��P��K�}	i��M��"
�����i;`R2�PG ��y6����	WP	�5�:���^���^�%Z��D�-@x�VEe[�c�������J{��e<�'-�z��g������,Ot���i�7��Q~�m��t?W��6���M���4�Ls�2K��t��g���Q�l��3��x�mTc�!u	�v1��gH�W*D2�k8�}9B}�n�4�s.�J��C��Y��L�����5�����Qx����7�1��U�����9���]�T!5-;������������PZKy��[�?��A0��z��QU��-8e-h�>���2�@#kf������xf/�����Z���s����m�����
�k#�o����n^5����Iy���k
��j�E�;�����*f��W�C�p-v�'���`Vy\�`h���S��nV�����2g���������8��2"���w�q>7������s��ym}]��g�S�2�R��]s��l���\�|
����jv�_%�W,��^��o�^p�����bf����v�Vm����2��r�*[)�]�m���D�0o��?g�������N) ��WF� ��6�*U��l�N�X�����6A������@�I��k��1	��MG��=s� YA�AB������"UZT�j�n�"��JMva����
R*�����D|���<��Lt�q>��-������N/������t�k;m1�	�(`����m�o��Q�T�&�Pa\�������_t7�K��E��]%S�
8���q�wnW�LA��������>�,�]���hs�s+��s ����8z��J�����6�c��Z�/t<�5�����]*3��3Q%���.#9Y��^?x�
�|�\(Uf9�~��*���06
�~��9�#�+���o�s�l����y���T	!H@��)"?����Ei��q��s?d	����5�ppd[]�B����"��+�Iq�S-�mA<��g v�����l�=s1���?%�V%�m���������3�����������#�L =�,;�l*'��l7 �YY��b.����f�,���,m;[8K����dZS�O�E���
(�_}~!0�Jb�����������<#��+���i4&�Wz�/�r�+�k���Z���BO���|G{��������������t��[sb&�3�>@����V�	��*���8G�����{��I&�?�9�t�n�{x��f�����Ev<�����xw��=���w����8��.��A�����.^��n�������ux����"W�������q�&zF��)��%=�)Ab��0�cbDL���E��*[��t]���Y����>&lo4V[��/~m+�2�AA������4�7BKp���"�E��9�^�,-�Nzl#z%epp�����?�F��G����V�����SS���eS0�b���8�r	��(%�2�nY����ixy����?8�67��������7�?����v��������V��-1��j��CM���A1b�j��v{���_R�
�n8�f�jB��u�u�3*j���O�����$B�+.9��\Pb#����YW��A)�6FR�����X��%������9����2�q�7������a8P���ZX�TL�;aM��(���D���[����(N�i������z~m�C�L���������Z�����+J�[��*T7�(V^	���9^���EJ�;5��q:wP�������������)�_I6O��'�Wf2b���A�{�����KJ�q����91�L~V@i�#����������0�j������6�s�\m�o$�����d��\�_G�L����v��^Ys�����6�����_�g(�3�r����4�IH�n��c,?Rh��������6�@*v3�|��Mi����~��?����*���Q�~'���\����9����
�C�~�A���|P���A7����2���-��l����������/�����w	��^#�$������98�y�9<y�xagvqa;��0k����B�d���(G%�)����fc�%�T�b��C����a<_F=���S#a��#%�4D�?��N��g��&	����F���y���
[��J;8����+�����<����.���|��1�Ep/��f�e!#����.��x
��
Yj�&M��wX�'��?aU
�z%�Q�s��4M��_�Q�=�Ay��\D���Q��/A�G�br�aF���:���n{\��
�0k��?_J����2�xH�W������$�W���F�R���F<�}�V�7��q��\���>f�^�H����������I��"����|�`�P��p��O�������y'�F����;S�^��r3�f�V�
?�'��ICD�k1����4�.9;��S*���	^�-&���(����������R���i/h���Q�|�j��k�V	�� \'��KT5��(���#�a��V���eT�rzNg��������P����:��3��e�"|U��:�7���fc��jK�����r���Y��3ln1���5����7Z����~nf����}:����]J��
,��U�����4	�">=�,���@�d�����}}1�PV����w�������)1�M�F %s��-��Y�%/\�����{���.���3���O�h����|�P����\�*	���y�����sQ�9��W'����v����u��	z��B���Ly����rpDQkf�;EY�wL5�"j���` A�B�L�J
�+P�����,gR��[�3�M�<�r� 
��/Yr�'�2�F��Q�7
���������
�:~}4Sr���SJ�l-�+��f����3����������Y���A��:�V����TkjF�E
gW�V7q��c��@�F������m�$��B�/�4�`��G��L��w�-g�7��t����{�M�mcj�
�������.�F���>T�TRF��I���oo56��j���
G�f�yT��cL:hG�9#�w�7�Z�;������q�`E_�n���)�����(zX�=>�9~�������7�y�YK����-�J_�oU���F��{�cM[={���X
�E��5?0�*��-���&�D��������f�/����Lv�o���-��ov��J����Vc�i������0�>��������F�G���u��r���M�*���sr~3qd��f��&��UP$��B��l�56�����J���^VQ++(Cs(A�#"�J:���+������n�����R�_�1yY���X���0
�u��\z�Itq�����y=����<����I�?>l�[�m���.m"Q;��p�yFk;��%�6{xO���/(���S*�{��:����5E�,�S�A.<|���+	)_�%���+w`U��(W����N�{�0�r$�T/��I�^�q�n<��(��
�|����\o���Z���T�����	KR���w�{����s��%r����uG�����)�d/S~'��(��1:�	��R����#��K�����*����X/��/��	3w���y��5��������-s	1:�K�\����Z]9��a���+#W_~A��S^d���'�u��(O" �&z���?Ak3)��H-���<���c�c��������v[3?��0�O���c��������tJ��AxHV�a[h��Eg���I8���{����s��\m6-3q0�|��������y8�1n�F"��	�{����9cL�@�`=B�(}�lk�Eb:��vcu���������f;�������NG�J��T'�d'�2��\1�
|���������a���
cY�����7B.�b����w���VC8Q\\�^�����������s�[BA�S��!���]lI"����$�������9@��+�h`	h@��K�R=_�fUy��D�)�Mi-F��H�(K�f��h3��'Xo1�lWJ�����;_L�>��.a��d�
lG�9:�Q8��E��<����c�����.�Pi`�p�����hE=�����a�I>���^�NS��UV(yw��^����IW^�b�Je�y����Nu���k�Z��{T
/z�}r��n�*��Xk����Z{����[[�	Q�����=yu��$���F�
�����&!����eN����f�2gP��o�)��������
����2,�U��g��|(+�Z�*��K=��=UyH���9�w����Q�y�����a�����y��K���������(I�2"��Jb������IN����P�����:M����,FT�dR��K�X�[Yj��h�3a\��]�<���S4�6�\��@�r/?�evQ��e�P��(�F���n��4��:���Q��E
>����+X|�������^�`�����
o2��N+�sa���������F2%�4���(7,�%���������+o�K�%�>��*�H�^����$m�G��"g��Qp_��8�����N"�K~b=U�����
�UKZ9i��<]Z�&�Z�h�D{L�`�Q���?�=�z�h$zrD-�j�8���2��X���
���q��{����9��n�����}��+F��	t������4Iq�r>��x�L��F����rD��"(�$��	����^G��q01�\4`|����#�Dy��D��6�?>���.�.�HS2y8�c�[I��:���P^D���E��pNV��:���1�3��.o���s���Q�uk��
����@<}�6\�:������\�"CF	��a`�X�U�Y!r�u�$��+���Kc�zV ���qg��������1Q��'�^Z�����)u��������_P,�i��	����#
��O��l����{tp��!�d������4F"�[�])r�i ������}���H7���������Q_{T��:����l3'Hw�k0�\%R%Y��6^av��m�@�l�o���
C���3�����bE��]S� w��s��=z�{�sr"�d����+D;��6����GQJMz^�qe�E�GaLA$�E�����RV�;�j�$��?��.�Kd�+Cvw~�?-7��~�Qu����5
I��R�($]�UMft�2k���pw�@�,ksrm��Q%��V\�C��Q@5��2��2:Lg��u��^��.����j��|�YGe��o���\��+Y�+������h��
�!�����p�i�]�m����d��qC�.B��/~�]{tI���I��L��_��t'�T������vt�_�����m�[���u4�(����^8N\$y�nM�=<N��udI
�I��N��J ���(�xXLR���l��h��)���>�`�0%K�0�Ey���{d��
`���N�0I'��3�
������C��\7�\����~��C	�c��DzE<V>����W.-���b^��Ut(����4����
~��~���M�����t���u����	N����v��j5[k-� C��
4��&g6A���7����@�)���p��Id�]q%t��A����6���Q�*�=^m�6V����^�-�@�������u�Y��=p��%�
����.^�\��,��a-��Ml�����n�N�L#��F��H���8�#gEe�3��Vd4���E�H���h42�km�[�lD�9i$y��E�!>B��T�VP�1�O8��b�"��e2�M�q�����suN03��"��Bf������7���y�����+�0���)�=�hn76[�x��Z4���������
�gu�����E7��ZsU4E]:/�5�@���l;@6	�����R@f���:kN�{&	
���1�������l!����j!���5�?3�����<uV�N{�:k\gc�:�\g��c��2H.�Pi�G%�~��utrZjk����:���������X�����h�=��h����
�����&���n[\g.�ms��y���\i}�J�	�sUbV��t*�UW�D~������m��r���#�������w%^�h��5�rt}�����?�)��U��g��:0]�@nn�7��@-��/��Xvc����?��B)+>�Q���"�����nTPv�Z�5,[D�L�u,�]u��H�<��lK�s�~{|�[��uX�r�6�|��n�6�*&��8L>��%|M����������w�{����S����,O0����
�D9�m
����nX1�C1�d~b��@�]+�@*����+!��,�S4�i���������������sN}�In%^S�<g1�.�����F��6���d���H�\�e0�46!Z���<��n��48��>�mX�jB,�x�H�^�g��k�A����o��&���I���oz�_H�p�?�+�V�{��dO��J}U�dZ��E���� =	;��?��e$��&5I�V,���G
e�bA�L�g/
h�m{�P�����G��0Xc*"@�sC"0H�;����un��y��K$d�a��f)@d������3�d���2n.��KET����1�Q)�`�0x��"
[ �V1���5���q��m����d�=���ak�<�8�$��8�������6�a�Vqh��k�|��$�m�a�97h��*��]�G�M��u�xH�YId!�4�:�6Q��%��|Q�+J�ZJ�V����i����?A���5K�a���29t���$����%���\�m�"�n��T��1R5Ja!�h&��6JQ���Z6��?�1��:"���fYn��=���F�iR�(���$���&��,&V�)�W=��Y	�F���We��ns����k|bo2�Ai�3�e���%����
>��kd��uC�q���t���$Nc����#P��g�t9��`u��R1�=�M�o+j�@�;�F�^�6��-h��2*���g������;������qV����lV�����3����+_���?������i��0�j�6�v�U�@�����,�Tw���j�AM�G���:=�!c��ml�c2�-|�����������h^�B5�z�^���E�M������������K����9	X`f0Lm%J��M'\��w���E����8�[b��j���2�[������
O��vI76o������<�����Mz��j���;��;��\�I�xg�og�F�z�%����#�!h�lN�����9tu��
s^b�f����m��B�}�umu���_���/<S�g<��9�)�T�l��m���VaZ#EF�e�����C���v{E�n����c4�����
��t�f��3e����/9�!�
M{��g�Q`�QqG�h���:����ho����@������X{_]u0��i�iQBd����#�M�%>�[��e�
�w@������s�>�KUPi*S���M�o�hU���^����x��bE��g���GqWI]K��Rz�,%����%�e����M��:�Ugt`�����P_+�O�+�
����@���}NT�=k�����Y4�k��J'�[z�H��E'4�*�H�����h}�R����w�
|��Xs�ZoV��9���9�����fig������h�7����T���*}i[}��/������{K��w��Q��_��g/�t��upg]�'
����U:B��:���#x�W�#��.���Vo�ZiX�o��������l4�����Y�%^uF���w��k�!���5k�Z�W����:CD��a�xK/O���3�@�:Y�m�JOh�g����C���5��t��y:��������t�E��������8J�_ka�4�#tD~�=���ku���XF:�������>l�NWU���m"�'�w�s�~�=��#Z��i���N	������4�������:��8W�:*.�S����+��e0����������-h�������A����������w7��������U��VT���N��h���M�WB�m����(�J;+� ���c�Z�a�����\+�R����`�e��}��
�p<y3�	Yvo���&��s[������=���wp;��q8
����y���Ae[w���f��Q�}2D�E�u��n��������}�Q���w�=����+�l�����]��������-�f�x��������T�y�������O3:�|r�PN�	������-������:����l3s�qk�>�H[A����#��9���f��#{W�v�����o9[.>��kM��-xI:��_n���Ka"��%��s�ofX5���w`�9w�V*�dX����������A������t���t8�L��f�������l6����6o�N�5�q�a}�n����uL������a����s"����vQ��a��6��@����F/n6l�7��X���k�����&��sN�V�+���s�����v��,bs�.��.T��Y�����X�������6i�I��&+�s������+�9&��su��tA\�w0)X�����~|��5qm��>)�w��������7���#�����h[s���t��s�a����M7���'W��x�)�����O�1&�`��t8z����B�F=4a}�)�=y�R����~x���_)&�
�7Mz�VC����_���s�h�/a�"��QP�H��Y�*I���x��[�KG���������Jt��K��YK�x;|�������+���������v�����$���'?����?��x�>��$��-03�m
�vN���E8:{��2����9�5O #`�s
�`4�(��c�o�}�D9��C�G3�N���=��2���?����0�(%]�q�
N�X���1`0�Far�!H�W�c����Df��W�T&�N����X�./������G�;x����t��gB;����K�SRv�v�miaAX6��"Do<x)G�M�����
Fj��*8�����4K���cx��*�u����Wu��o����~w����y���t>?�)�HAI
�-�8����:���8���"39��4�0�h,SEg�y�uL>;�/
�2�504W��f<�q��
h��"��i\e^��TnV��Y�-�U�����*���x�Laid���y3[�� ��p~���Y��5ti ����>�	�8&w2�B��H�)��	�3����\�2��g���fv��ABMx�Pp�*6�i��F)���zg45(u�B�VY!9n��R�-Vg@��6�J�����������\'Q��y�������`�������u-����C��MR����_�i:���5�%�.��a���o�s"�''��S�������sN���x.6�qx�fS���\Q'fT�e�+$)P��pz�������o������6*����-�9�jk�����d��������js�������:�]<�_�%�!P��M.�YPV���lk�{���0���kL����0�m��j82qp��;3��� 8��Oa]�n5��7�B�����4��0�('�������=��xG��?!������m��)7��
�b.!
�(�
�������4�c7O87A��Wx��?��v�D���#]�^����i"D�����(f�M�l�������U:Tc�'��%TR�0o��xK��x�G�h�F4���[��{�u��vKq����;7����������E�]�>�H��;$���7�7�G�s��<�7���
s���E���Y��T$��������V�,e���}�N�.�vh�]�|��6�W�z�u�T?�?���f�-�{	�9���!����M�V��hL6����_�C�����"��x�-�=O����^���~���
^_���}�.�<�Q[6��ER��)��b�s�o�������o������$���e���O�*��j����I!��NW��U�\����a,����T����Rn�o70�T)�&���,W�<�R?������e0�2W?�0��#���8
���j��#������n�p��s�8j~��k(5��2�4�;a�����M[��6�3sx�`
�`��n4�������r&���{Gov���K����a����@�����S9	��T��l���*oO:������*Y��5��
DQ(?Yr7:1�]c�����������0,��\BC��a���/���"�\���h�C�;K��[_ml�o���mA[����HvN�qt�����%�_��T���g0h���������"<J��v��RfXt)54��pNN��_C���"��o:'ow�N��;��wC���n���B��Z�L�u��9�������)B��7��n	�>�?<:t����B����K���(��
*�K�[�Z��Y��Xq��F-y�s�7��c����J{�����5'#i	� ������&��$��a>�e�����������j�Of�T[��{��{$akl�/�Z��t@����)��S���}.iag����_�K�n<�I�R�kd�g[���D<��&
q����x3z���v�$�!����Q
1�?�p�(��	������7��k��u�ZL��%��ip�����N��p�=����(�#e��!���&�G��z(dQ��������,���*�n7�G�	Y��u���4�Ts
y'���z����e��^�d���Z"����	9�c`g�qF�ub��M�~3{�!�D73��R2����Z@���E���A�O�t�A�wk��h���B�B#��"��u�8&aA�0�(�P��� �����g���&��Q���7'%�|�w�F��1������qN�SKM:9���&E���(�`x������>���!�3��a�1����7��L�*���m<�t�Op��}��
HL�$lO|E�Fo�\%��wY6�v�8no7Z�5gQ�_�)l�]�G����Iql�*�gF���������`�U���F%�������Th���H��.��8�bQ"���F������
��>��w���|m��(��C	�
���D�������G������t'���%q)u�=�$���������;����db���C��>��V��w��C>
���k�$fr���$��7r4I1��?�Q0J�z�F��r�>d�;L��������������2 K�o�y@c�g}"\FI��G���J��	�������S�X�����k��R��b��������b1������!��g�7���}����Xq@t�1$��B�@;��K1�����J��������U��.u�T�*��������t��n|{!�.���"�m�*�����cg9������q��<v����&���`c�5����T�r��RG�pa���1
��@Wk=�`�N��))f��K�.[��+����<^��j��}1g)����5?R�r��q��g�*�b@5z��D=��/�4I�Ipa�����e����j��yGO��$�fq����^jr��#
��a����Y���j��xXG;�^��h�����s��
��A[4Nw���`�$���[v��Zu.�4(cl����B�o�wcT/���(gB;���;>�8}"�dt�|'?�+�ImH�"�'H��#��*���^A��m���y~�x|T�00�3m,���C��u�f��������N��������:^�����s�F��\�+���:����*��
`�.\�/\�kq��NG�^�]V��$
��i�3��q0_����c���FA
��
���IG'�x<
�[W�����R}P�O3��y+P+W�H���S����e���K�s?_��|��F�<�����b�V�`q�@��-C��)^�H`����x�����Y^�����3�sQ���0�ZqMT�2 xGE������������';
�|�Lp�����lv|�9+����U�(�eC�k�i5�/#$��?4]<��_V�s%�WF�|�mt!���n&F�,�=P���jv��!-�
a?����ki��T��&�*�����R����HYEa{s
�J�%K���$N�Zncgm���Q��[�Ve<(�#LV|
{y�t���C��|���(�/=��p�&�u���x�a3�L��}��I�Tn�N=����"��}�>waG��lb����*��8k�l66��!��O��],���'������A%�>��#��������7�X�'o�3z,��Co�;XX��
�����|�;e�����N�e����Fkc�sR�R���ye"G��Z�1a��V<e�
��5fi>*�7�y�:��|l�*�<=���E��@~�uv�g
ma���m7k����qW�����Ba7H���P���
W���T��v`J�&$�B�V�S]��X%�^�*�TI�p�����*=*��J<U�!,<�7�Vx����bo<?4��{�/�T����/>�$���Y�E����x^���g�h��C���=���)]�������V��u�����\gO�V���������|�s�y��N����"��������b���������tO����������x�ob�������S������j���%}Y��x\/���������;���)����s�9���`�&x��������+Pa��Q�L.H3�����`pg��K"�=�Z���c*�'�J2��Rd��S��p�>��x	(:/�	����L'T+B�����u��2�t�5	I��^��.�0(�$P���T���F��;����QF@��oR@tK�@��!|O�uhs�G������I�����gxz>��Se���h�����5t��D [�('R��'Z���gQ<M,i� ����R<r�*��D��<#�9�\����������4����$���q�	�-
��Y��+�h4��2M��V`a�����y�����HA���(nq<=D�	�9��@��EV������xK����8�yy��Z�9�>Z#/?��^������~vn�T��������NA���$��������a�>_���N~���6�{w���p�Y�,$jK;K���[�c����'O�%���J�O���~�Zb��m9����`�Y����������l����n�����f����Ur�!V=:����?`�6r�����q]���.~��{W�+�y�_���@���H�Dz�����{*��ON�A+���x�����!���#�����
F|��.b��5��m�3��m�����E���������W[��Z��W��Wm�����6���(nk����b�[��
�����W�Z���Zk��p�w2m���h������{�?�f���p��f��P�.��2��2���6�"���^Z��r7���r}�i�\��������e����c�>���C��c�o��c�\o���l�Y�o��/1K�K�r���������r�����6W��\��)��s1�K!j����*y�"���GE/]�Q|�B��s{k����W�l�����8�����C��6��y*���v���h����_f��KH��&���Y8��Gm���\]�(�
�*M�M��7��^T��5N���{���"�n�|}n��Z�x��"���L�kY	d���`�g/�`���J �<xQ�
��ki	$����`��06��X��=/��9���}���-��5��m������E�H<(C�J<�ff����i�����/��Y%~+�
���o�eP��o�����WV�x����fY��RDio��En������"����X#���A�� �v/��{����&����w��X'�2�J3P�!J�D�7��
CR�o�cq���i��$�eM�~�,�Q
@�!F���A��&�����tD)��sE�]�e����e��K��+Y���>N][�l5��\�:��G�O�egG
~e�y:/"�J]���N���x���V���Wew�O;�<�o�/0����XD��`�n��q�[���0ui����jt���g`�O-<�h�Om�w�����e���[�#�[�
a�X���I/J������_/�n<\)x=�,���2D���������5gA�=���L��/8�����&���}�j-�?���n��?S�=u\�m�J�D^�5�>,�R��E��E��\.�D8��G��d&�������b�-���x��X>y*�K:�>�����4wX����0`@�P�.�g���X�c���zR%����^�tg� ����G]`������	���M�OR������G�����C�E�	�X�#�j��.�Z���NG��?N�0��b#����m/�2�����(1�s�*���c�z86�p��+��4����� �`��L
�~=��E���UaXr�c$��F�:�a5/~>x���?_��?���f4��z4����yx�DSX�j�L{�0�[���)�r��C�����N�y������]����,��dm��-6��X/�`��E���?���]�M��,��	A���_�+���[��(�
��<�T(�c�������B`��s����h�9��H�Q2��~q^�T����z�^s�b,���x�Z�`�	��/�]���J�or5J�O��
S�L@�&�o��Z����h�5]r���H�$�q~�?�����	�~p,�������������H�!o��H@�A�
����@U�=���v��

O�F�6����CP4�����]��g�>T��s
��I�K�F��8�7��'��St	;��������I
�V}�^��*��eb�*`���ZA���L�1�Z��oD��G
|�(��N��z���������J����4+S�f��]h��_�#�<6U!>4�� ���w�����k?5�s%�l�o������A"3q�U4I�<Bk�%���������_rk{���CI}{v4ik|������?0�����u��ND�C�C\V������f�������8(L�����a����Zn���e�PB���������*���~f�>r��^ef�W��
[:�B��d���2��n^�
��Ds��Y��x���`0�u[���$�����) s��]�4���D���[{���V�!<G1�W���l�O	_��7��[iq+���T�m5��GX���AP?��y��%�F�0�u�!����C��E�
�jaK�u��)��rJ���lH$>���^�q9�W��d������Y�N{�vfK�NC2�]t�#�&i�u�6��+����w����@�����X�}����}n��:�%���:��������yG�7V�oQN<{v{���������Oh���X�o�l�,n�J�Lz���o��Dx�y�������95���J���Ny�3�����j%����<�F�5����������
D���ma."�W���x���'���2?^��xzb�/���h>�9��k
}^�R9�m��c�O��{�W��,=|�	��MZ�6����;V���*�$H4���������r�X��R�dg����i���6�d���M���Q�S�����Rhrj�ek_�v�	��;��V2�m3�z'���*2���j3y����v5�vE.�`u&�&a���#�6���������_q4z~�y1'���x���t:	Kg;@^�����GE��t(�6�����~f	������L���D�LP������"�3�L2U<����l�E����&�7������3c�:�Y��~�.�V�H��A�W�X��f!�*���������:�iX?�-�����l���>��z����4�*>	�6�����E�(s
���`����
[wH��4��2I��,:0�a-��C^���V�d�����}�F��q�xn6^4��#�0P(B�f�q���*uK\T���33����6�.!U��ua|����q�PI���ELM�	������z�P-�G�;��~���[�,J���v;��I�pd�m/����C�c�K�PGt��j �wm����6|n/yx��^���o�t��,i��z��@s��E9�o���s5��u�����mn���Vs��h�\������Eb���A�Ir���[�w���s!����vw�<��2�f�)�`>��mn�!e��x.�b=�����7��s�r���W���D�7Q�������H\6xW"�x��H�7xG�������\����}�79�MN�����79}}9����M�~��xo����(2�OE��BC$��~�������	ff#�����Q��4��epZB���|��`e�I��svEa[dlD�jD�I[	Q�,���p�}��b�w�&�3�Y?t�"I�z�P������Z����P�����t��D��`��?w��u��`�W��x��T.��t�.�C��D�l��[n[vw���t����)��H
��z��u�?l7[d�n�a�?i���y��'�,����s��r��o��UO�Z���T{����9�U���>��!Jt(=y�p$3y��u-�o���b������=&<�\<	R���U)��(��b�y��_��s)F�O0�T/�h�Y�^�no�z��v�A�F{�3��s1�o���Br����3����<\�_8���a�Yta�3����Z��%h�E���G��D@?1�����#k�|h!?-�I���zJ�f0g.�K���%k?dq\K4��������~�E�M�
�%*���
����j��r����jK��z����70��I��a�{I�}���) �V��s$���K��/��nee%?����},��e����'�*�c	��O����0E�Y��������*���+�6����������z>����Z�������~b[G���~����s�}]��	�������p[:��,��lC���o�T�Lz�f��A������h"z��{Ibv!����=����T�S�r��6���)pi|������8���:k�A�q+�l�g�����U�%��U�0�"��dm��>:����o����f�hW�/�i��-�0��^�������Sp�����s�O��CT>�J�p�-�otE����g���ECL�zW�o�N'#L�r4� �8XK� j���Y<�w����?]�<
���/k�
���x�T����d=�w&���L�:�7�����|�5���f\�}��S���}�4���zM�<��w����06���wr����C8#J��E%������T)\�(�X�A�H�<�a/H�D��3�Os���������Y|1M4��9��Rz�h�vp�<��]M0����i8b8Ly����H��w';/n�*���Y
[�A����T��+s�;��:�ERA�}9�V<�e>S�o��OR.�������"*��}���>����b����e�=a{��=r��}�A�Z��;�+� �u�b�s
������W��?gg>��k����H^���g���h���{Q���
}�F��7�)R��]��^�MqG���������w��i� �C��
~/�Dd`�k���������
�:�t����8����`W��dm�b>�|g}�����?	����~�K�,���f�Q�aY3���rk��?�������K������T���<�����>��\c�D��?/���_F�Ia1c���J\�H��A1���=�j��A�Uhr�A�"�;�e"�sX�{qV� �,Z��0��>�C�3k~��>�D�tR����	�����'��2~�+z6O%9�b���Pvv�B�8��������*xs
�6�v�����D�p�jt?\	nqPm*��cB�x|���HcT.~=��n��t�kL�����^��k�4�'��I��E���7��A���~8�����^2�t�3�0�����M���)��V������Lr��5&�Ys��-s
F`��@�c������C8���k��i0�/8I�+������$�����:G�]wf��:3k:���'�g���K6�U�G8kX�d+��i	��'L�1Y.=��G�2'E��`��_`�>���s���<k��}5�>
��t��@��W���K��iCr�(Q��,V� ��/�_C���*IOPp�Jc,�I#1$�.q%V���|�k����`2�5��ns�?�E� _������)o���Ah$����������h���$��q����T
�J�%��8ea$P���G��z�n@	;���P`�>���IS�8�(�J8���'x=�F:C�?�X�����!!�LL���\R@Tz�`�
�4Gs���c��X*a�%����Qa)G�K�~���s�0fI
��n�7V�6�G�n���������!a��;'�;{;T|[gz�w'9����g�<#�6����d�.�%������p�<��$�v����b^�h6�K����|A�F���?����nj�c�b��$�nX��--���=��E�6C��:	�V7VU���F�ssM�9�1��eR���v��� �����K�_�������)��/c�~�K
b����p�es���fg���������x|i#��x�@XcW������7������`��?�)p�|�m)�|��K_*�e>����<��u�@���x��{�������W9b��q��m��q(�[3?g���#��4��5c�A��^�~F�tu�x��E�U�k^�tF���8W�?�EafX�l�
���*�^�F{v�Q�e���������_3Sa@��*�A��U��.��x��X1�K;U��R
'>q�6����-W�Q�����-D5�R>����"W�S)�������
Qv�}��������x�U+���^����~u�l����_axX?V�`��n+�k��z�����F�~�0��P�!���1(X�2���,��o�8�.��K�q���8�D�i|����s�X>���V���J4/��
Ky{MF���&
c��bw���88&�Mup������?�(2�)3�T.���`3��,Sq�}������)�m��)^:��2z\���@�x��-��������	V8�U�+��v�1��X��;��T�����a��G��@�?LX�����(�6t��
8t� B���G���%dhU%�P�hI�{����Bl�{_IxC��F�)����ys�f�g|}��3s�};�_<m0��6���\k��W��R1���/h�����@&������J�L�� �����3��)����F�i��#�2�?gH�{_IX�
x|����{�c��.�j���}���K`mX�7�����[�L�o���K����

#66Erik Rijkers
er@xs4all.nl
In reply to: Jeff Davis (#65)
Re: Range Types - typo + NULL string constructor

On Mon, October 17, 2011 00:09, Jeff Davis wrote:

To facilitate would-be testers let me mention that to apply this patch one needs to remove the
catversion changes from the patch.

(as discussed before: http://archives.postgresql.org/pgsql-hackers/2011-02/msg00817.php )

Erik Rijkers

#67Heikki Linnakangas
heikki.linnakangas@enterprisedb.com
In reply to: Jeff Davis (#65)
Re: Range Types - typo + NULL string constructor

On 17.10.2011 01:09, Jeff Davis wrote:

On Sat, 2011-10-15 at 01:46 +0300, Heikki Linnakangas wrote:

* The binary i/o format includes the length of the lower and upper
bounds twice, once explicitly in range_send, and second time within the
send-function of the subtype. Seems wasteful.

Any ideas how to fix that? How else do I know how much the underlying
send function will consume?

Oh, never mind. I was misreading the code, it's not sending the length
twice.

* range_constructor_internal - I think it would be better to move logic
to figure out the the arguments into the callers.

Done.

The comment above range_constructor0() is now outdated.

* The gist support functions frequently call range_deserialize(), which
does catalog lookups. Isn't that horrendously expensive?

Yes, it was. I have introduced a cached structure that avoids syscache
lookups when it's the same range as the last lookup (the common case).

Hmm, I don't think that's safe. After Oid wraparound, a range type oid
might get reused for some other range type, and the cache would return
stale values. Extremely unlikely to happen by accident, but could be
exploited by an attacker.

* What exactly is canonical function supposed to return? It's not clear
what format one should choose as the canonical format when writing a
custom range type. And even for the built-in types, it would be good to
explain which types use which canonical format (I saw the discussions on
that, so I understand that might still be subject to change).

The canonical function is just supposed to return a new range such that
two equal values will have equal representations. I have listed the
built-in discrete range types and their canonical form.

As far as describing what a custom range type is supposed to use for the
canonical form, I don't know which part is exactly unclear. There aren't
too many rules to defining one -- the only guideline is that ranges of
equal value going in should be put in one canonical representation.

Ok. The name "canonical" certainly hints at that, but it would be good
to explicitly state that guideline. As the text stands, it would seem
that a canonical function that maps "[1,7]" to "[1,8)", and also vice
versa, "[1,8)" to "[1,7]", would be valid. That would be pretty silly,
but it would be good to say something like "The canonical output for two
values that are equal, like [1,7] and [1,8), must be equal. It doesn't
matter which representation you choose to be the canonical one, as long
as two equal values with different formattings are always mapped to the
same value with same formatting"

--
Heikki Linnakangas
EnterpriseDB http://www.enterprisedb.com

#68Jeff Davis
pgsql@j-davis.com
In reply to: Heikki Linnakangas (#67)
Re: Range Types - typo + NULL string constructor

On Mon, 2011-10-24 at 13:15 +0300, Heikki Linnakangas wrote:

Hmm, I don't think that's safe. After Oid wraparound, a range type oid
might get reused for some other range type, and the cache would return
stale values. Extremely unlikely to happen by accident, but could be
exploited by an attacker.

Any ideas on how to remedy that? I don't have another plan for making it
perform well. Plugging it into the cache invalidation mechanism seems
like overkill, but I suppose that would solve the problem.

Aren't there a few other cases like this floating around the code? I
know the single-xid cache is potentially vulnerable to xid wraparound
for the same reason.

Regards,
Jeff Davis

#69Heikki Linnakangas
heikki.linnakangas@enterprisedb.com
In reply to: Jeff Davis (#68)
Re: Range Types - typo + NULL string constructor

On 25.10.2011 19:37, Jeff Davis wrote:

On Mon, 2011-10-24 at 13:15 +0300, Heikki Linnakangas wrote:

Hmm, I don't think that's safe. After Oid wraparound, a range type oid
might get reused for some other range type, and the cache would return
stale values. Extremely unlikely to happen by accident, but could be
exploited by an attacker.

Any ideas on how to remedy that? I don't have another plan for making it
perform well. Plugging it into the cache invalidation mechanism seems
like overkill, but I suppose that would solve the problem.

I think we should look at the array-functions for precedent. array_in et
al cache the information in fn_extra, so that when it's called
repeatedly in one statement for the same type, the information is only
looked up once. That's good enough, it covers repeated execution in a
single query, as well as COPY and comparison calls from index searches,
for example.

Aren't there a few other cases like this floating around the code?

Not that I know of. That said, I wouldn't be too surprised if there was.

I know the single-xid cache is potentially vulnerable to xid wraparound
for the same reason.

True.

--
Heikki Linnakangas
EnterpriseDB http://www.enterprisedb.com

#70Robert Haas
robertmhaas@gmail.com
In reply to: Jeff Davis (#68)
Re: Range Types - typo + NULL string constructor

On Tue, Oct 25, 2011 at 12:37 PM, Jeff Davis <pgsql@j-davis.com> wrote:

On Mon, 2011-10-24 at 13:15 +0300, Heikki Linnakangas wrote:

Hmm, I don't think that's safe. After Oid wraparound, a range type oid
might get reused for some other range type, and the cache would return
stale values. Extremely unlikely to happen by accident, but could be
exploited by an attacker.

Any ideas on how to remedy that? I don't have another plan for making it
perform well. Plugging it into the cache invalidation mechanism seems
like overkill, but I suppose that would solve the problem.

Aren't there a few other cases like this floating around the code? I
know the single-xid cache is potentially vulnerable to xid wraparound
for the same reason.

I believe that we're in trouble with XIDs as soon as you have two
active XIDs that are separated by a billion, because then you could
have a situation where some people think a given XID is in the future
and others think it's in the past. I have been wondering if we should
have some sort of active guard against that scenario; I don't think we
do at present.

But OID wraparound is not the same as XID wraparound. It's far more
common, I think, for a single transaction to use lots of OIDs than it
is for it to use lots of XIDs (i.e. have many subtransactions).

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#71Heikki Linnakangas
heikki.linnakangas@enterprisedb.com
In reply to: Robert Haas (#70)
Re: Range Types - typo + NULL string constructor

On 26.10.2011 18:42, Robert Haas wrote:

On Tue, Oct 25, 2011 at 12:37 PM, Jeff Davis<pgsql@j-davis.com> wrote:

Aren't there a few other cases like this floating around the code? I
know the single-xid cache is potentially vulnerable to xid wraparound
for the same reason.

I believe that we're in trouble with XIDs as soon as you have two
active XIDs that are separated by a billion, ...

That's not what Jeff is referring to here, though (correct me if I'm
wrong). He's talking about the one-item cache in
TransactionIdLogFetch(). You don't need need long-running transactions
for that to get confused. Specifically, this could happen:

1. In session A: BEGIN; SELECT * FROM foo WHERE id = 1; COMMIT;
The row has xmin = 123456, and it is cached as committed in the
one-item cache by TransactionLogFetch.
2. A lot of time passes. Everything is frozen, and XID wrap-around
happens. (Session A is idle but not in a transaction, so it doesn't
inhibit freezing.)
3. In session B: BEGIN: INSERT INTO foo (id) VALUES (2); ROLLBACK;
By coincidence, this transaction was assigned XID 123456.
4. In session A: SELECT * FROM foo WHERE id = 2;
The one-item cache still says that 123456 committed, so we return
the tuple inserted by the aborted transaction. Oops.

--
Heikki Linnakangas
EnterpriseDB http://www.enterprisedb.com

#72Robert Haas
robertmhaas@gmail.com
In reply to: Heikki Linnakangas (#71)
Re: Range Types - typo + NULL string constructor

On Wed, Oct 26, 2011 at 11:52 AM, Heikki Linnakangas
<heikki.linnakangas@enterprisedb.com> wrote:

On 26.10.2011 18:42, Robert Haas wrote:

On Tue, Oct 25, 2011 at 12:37 PM, Jeff Davis<pgsql@j-davis.com>  wrote:

Aren't there a few other cases like this floating around the code? I
know the single-xid cache is potentially vulnerable to xid wraparound
for the same reason.

I believe that we're in trouble with XIDs as soon as you have two
active XIDs that are separated by a billion, ...

That's not what Jeff is referring to here, though (correct me if I'm wrong).
He's talking about the one-item cache in TransactionIdLogFetch(). You don't
need need long-running transactions for that to get confused. Specifically,
this could happen:

1. In session A: BEGIN; SELECT * FROM foo WHERE id = 1; COMMIT;
  The row has xmin = 123456, and it is cached as committed in the one-item
cache by TransactionLogFetch.
2. A lot of time passes. Everything is frozen, and XID wrap-around happens.
(Session A is idle but not in a transaction, so it doesn't inhibit
freezing.)
3. In session B: BEGIN: INSERT INTO foo (id) VALUES (2); ROLLBACK;
  By coincidence, this transaction was assigned XID 123456.
4. In session A: SELECT * FROM foo WHERE id = 2;
  The one-item cache still says that 123456 committed, so we return the
tuple inserted by the aborted transaction. Oops.

Oh, hmm. That sucks.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#73Alvaro Herrera
alvherre@commandprompt.com
In reply to: Robert Haas (#72)
Re: Range Types - typo + NULL string constructor

Excerpts from Robert Haas's message of mié oct 26 13:19:47 -0300 2011:

On Wed, Oct 26, 2011 at 11:52 AM, Heikki Linnakangas
<heikki.linnakangas@enterprisedb.com> wrote:

1. In session A: BEGIN; SELECT * FROM foo WHERE id = 1; COMMIT;
  The row has xmin = 123456, and it is cached as committed in the one-item
cache by TransactionLogFetch.
2. A lot of time passes. Everything is frozen, and XID wrap-around happens.
(Session A is idle but not in a transaction, so it doesn't inhibit
freezing.)
3. In session B: BEGIN: INSERT INTO foo (id) VALUES (2); ROLLBACK;
  By coincidence, this transaction was assigned XID 123456.
4. In session A: SELECT * FROM foo WHERE id = 2;
  The one-item cache still says that 123456 committed, so we return the
tuple inserted by the aborted transaction. Oops.

Oh, hmm. That sucks.

Can this be solved by simple application of the Xid epoch?

--
Álvaro Herrera <alvherre@commandprompt.com>
The PostgreSQL Company - Command Prompt, Inc.
PostgreSQL Replication, Consulting, Custom Development, 24x7 support

#74Jeff Davis
pgsql@j-davis.com
In reply to: Robert Haas (#72)
Re: Range Types - typo + NULL string constructor

On Wed, 2011-10-26 at 12:19 -0400, Robert Haas wrote:

1. In session A: BEGIN; SELECT * FROM foo WHERE id = 1; COMMIT;
The row has xmin = 123456, and it is cached as committed in the one-item
cache by TransactionLogFetch.
2. A lot of time passes. Everything is frozen, and XID wrap-around happens.
(Session A is idle but not in a transaction, so it doesn't inhibit
freezing.)
3. In session B: BEGIN: INSERT INTO foo (id) VALUES (2); ROLLBACK;
By coincidence, this transaction was assigned XID 123456.
4. In session A: SELECT * FROM foo WHERE id = 2;
The one-item cache still says that 123456 committed, so we return the
tuple inserted by the aborted transaction. Oops.

Yes, that's the scenario I was talking about.

Oh, hmm. That sucks.

It didn't seem like a major concern a while ago:
http://archives.postgresql.org/message-id/28107.1291264452@sss.pgh.pa.us

Regards,
Jeff Davis

#75Tom Lane
tgl@sss.pgh.pa.us
In reply to: Heikki Linnakangas (#71)
Re: Range Types - typo + NULL string constructor

Heikki Linnakangas <heikki.linnakangas@enterprisedb.com> writes:

That's not what Jeff is referring to here, though (correct me if I'm
wrong). He's talking about the one-item cache in
TransactionIdLogFetch(). You don't need need long-running transactions
for that to get confused. Specifically, this could happen:

1. In session A: BEGIN; SELECT * FROM foo WHERE id = 1; COMMIT;
The row has xmin = 123456, and it is cached as committed in the
one-item cache by TransactionLogFetch.
2. A lot of time passes. Everything is frozen, and XID wrap-around
happens. (Session A is idle but not in a transaction, so it doesn't
inhibit freezing.)
3. In session B: BEGIN: INSERT INTO foo (id) VALUES (2); ROLLBACK;
By coincidence, this transaction was assigned XID 123456.
4. In session A: SELECT * FROM foo WHERE id = 2;
The one-item cache still says that 123456 committed, so we return
the tuple inserted by the aborted transaction. Oops.

I think this is probably a red herring, because it's impossible for a
session to remain totally idle for that long --- see sinval updating.
(If you wanted to be really sure, we could have sinval reset clear
the TransactionLogFetch cache, but I doubt it's worth the trouble.)

regards, tom lane

#76Tom Lane
tgl@sss.pgh.pa.us
In reply to: Robert Haas (#70)
Re: Range Types - typo + NULL string constructor

Robert Haas <robertmhaas@gmail.com> writes:

I believe that we're in trouble with XIDs as soon as you have two
active XIDs that are separated by a billion, because then you could
have a situation where some people think a given XID is in the future
and others think it's in the past. I have been wondering if we should
have some sort of active guard against that scenario; I don't think we
do at present.

Sure we do. It's covered by the XID wraparound prevention logic.

regards, tom lane

#77Jeff Davis
pgsql@j-davis.com
In reply to: Heikki Linnakangas (#67)
1 attachment(s)
Re: Range Types - typo + NULL string constructor

On Mon, 2011-10-24 at 13:15 +0300, Heikki Linnakangas wrote:

* range_constructor_internal - I think it would be better to move logic
to figure out the the arguments into the callers.

Done.

The comment above range_constructor0() is now outdated.

Removed.

* The gist support functions frequently call range_deserialize(), which
does catalog lookups. Isn't that horrendously expensive?

Yes, it was. I have introduced a cached structure that avoids syscache
lookups when it's the same range as the last lookup (the common case).

Hmm, I don't think that's safe. After Oid wraparound, a range type oid
might get reused for some other range type, and the cache would return
stale values. Extremely unlikely to happen by accident, but could be
exploited by an attacker.

Done.

Ok. The name "canonical" certainly hints at that, but it would be good
to explicitly state that guideline. As the text stands, it would seem
that a canonical function that maps "[1,7]" to "[1,8)", and also vice
versa, "[1,8)" to "[1,7]", would be valid. That would be pretty silly,
but it would be good to say something like "The canonical output for two
values that are equal, like [1,7] and [1,8), must be equal. It doesn't
matter which representation you choose to be the canonical one, as long
as two equal values with different formattings are always mapped to the
same value with same formatting"

Used your wording, thank you.

Regards,
Jeff Davis

Attachments:

rangetypes-20111031.gzapplication/x-gzip; name=rangetypes-20111031.gzDownload
#78Heikki Linnakangas
heikki.linnakangas@enterprisedb.com
In reply to: Jeff Davis (#65)
Re: Range Types - typo + NULL string constructor

On 17.10.2011 01:09, Jeff Davis wrote:

On Sat, 2011-10-15 at 01:46 +0300, Heikki Linnakangas wrote:

* Do we really need non_empty(anyrange) ? You can just do "NOT empty(x)"

To make it a searchable (via GiST) condition, I need an operator. I
could either remove that operator (as it's not amazingly useful), or I
could just not document the function but leave the operator there.

Looking at the most recent patch, I don't actually see any GiST support
for the empty and non-empty operators (!? and ?). I don't see how those
could be accelerated with GiST, anyway; I think if you want to use an
index for those operators, you might as well create a partial or
functional index on empty(x).

So I'm actually inclined to remove not only the nonempty function, but
also the ? and !? operators. They don't seem very useful, and ? and !?
don't feel very intuitive to me, anyway. I'll just leave the empty(x)
function.

--
Heikki Linnakangas
EnterpriseDB http://www.enterprisedb.com

#79Jeff Davis
pgsql@j-davis.com
In reply to: Heikki Linnakangas (#78)
Re: Range Types - typo + NULL string constructor

On Thu, 2011-11-03 at 10:37 +0200, Heikki Linnakangas wrote:

Looking at the most recent patch, I don't actually see any GiST support
for the empty and non-empty operators (!? and ?). I don't see how those
could be accelerated with GiST, anyway; I think if you want to use an
index for those operators, you might as well create a partial or
functional index on empty(x).

So I'm actually inclined to remove not only the nonempty function, but
also the ? and !? operators. They don't seem very useful, and ? and !?
don't feel very intuitive to me, anyway. I'll just leave the empty(x)
function.

That's fine with me. At best, they were only marginally useful.

Regards,
Jeff Davis