A Big thanks from me as well for the easiest and simplest explanation. :)<div><br></div><div><div><br><div class="gmail_quote">On Wed, Jan 18, 2012 at 2:45 PM, Herman Griffin <span dir="ltr">&lt;<a href="mailto:herman.griffin@gmail.com">herman.griffin@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello Michael,<br>
<br>
That response was prefect. I get it know! Thanks for taking the time to respond.<br>
<span class="HOEnZb"><font color="#888888"><br>
Herman<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
On Mon, Jan 16, 2012 at 4:29 PM, Michael Collins &lt;<a href="mailto:msc@freeswitch.org">msc@freeswitch.org</a>&gt; wrote:<br>
&gt; Hi Herman,<br>
&gt;<br>
&gt; These are common questions when dealing with the dialplan. I highly<br>
&gt; recommend that you acquire the FreeSWITCH &quot;bridge book&quot; (see link near top<br>
&gt; of <a href="http://wiki.freeswitch.org" target="_blank">wiki.freeswitch.org</a>) and read chapters 5 and 8. (Full disclosure: I wrote<br>
&gt; chapter 5 and Darren Schreiber wrote chapter 8.) Both of these chapters<br>
&gt; cover the break attribute in detail. I think you might be confusing the<br>
&gt; purpose of the break attribute.<br>
&gt;<br>
&gt; Consider this dp fragment:<br>
&gt; &lt;extension name=&quot;test&quot;&gt;<br>
&gt;   &lt;condition field=&quot;foo&quot; expression=&quot;bar&quot;/&gt;<br>
&gt;   &lt;condition field=&quot;foo2&quot; expression=&quot;bar2&quot;&gt;<br>
&gt;     &lt;!-- actions here get added to task list only if both conditions are<br>
&gt; true --&gt;<br>
&gt;     &lt;!-- anti-actions here get added to task list only if foo is true and<br>
&gt; foo2 is false --&gt;<br>
&gt;   &lt;/condition&gt;<br>
&gt; &lt;/extension&gt;<br>
&gt;<br>
&gt; When the dialplan parser gets to this extension, the first thing it does is<br>
&gt; test the &quot;foo&quot; field. If the test fails then the parser does not even look<br>
&gt; at the rest of this extension. Why not? Because all conditions have an<br>
&gt; implied break=&quot;on-false&quot;. The following two conditions are identical in<br>
&gt; function:<br>
&gt;   &lt;condition field=&quot;foo&quot; expression=&quot;bar&quot;/&gt;<br>
&gt;   &lt;condition field=&quot;foo&quot; expression=&quot;bar&quot; break=&quot;on-false/&gt;<br>
&gt;<br>
&gt; So, if you want a set of actions to be included only if more than one<br>
&gt; condition is met then &quot;stacking&quot; will work, however you cannot do<br>
&gt; break=&quot;never&quot;. Why not? Because break=&quot;never&quot; tells the dialplan parser,<br>
&gt; &quot;Hey, even if this condition fails, go ahead and evaluate the next condition<br>
&gt; in this extension.&quot; If you have break=&quot;on-false&quot; (or no &#39;break&#39; attribute at<br>
&gt; all) then that tells the dialplan parser, &quot;Hey, if this condition fails then<br>
&gt; &#39;break out&#39; of this extension and continue parsing the dialplan.&quot;<br>
&gt;<br>
&gt; Using what we&#39;ve just discussed, let&#39;s look at the example you cited in your<br>
&gt; second post.<br>
&gt; Dialplan extension &quot;emergency_set_variables&quot;:<br>
&gt;<br>
&gt;<br>
&gt; &lt;condition field=&quot;${caller_id_name}&quot; expression=&quot;^Emerg_&quot; break=&quot;never&quot;&gt;<br>
&gt;    &lt;action application=&quot;set&quot; data=&quot;emergency_call=true&quot; inline=&quot;true&quot;/&gt;<br>
&gt;  &lt;/condition&gt;<br>
&gt;<br>
&gt;  &lt;condition wday=&quot;2-6&quot; time-of-day=&quot;22:00-23:59&quot; break=&quot;never&quot;&gt;<br>
&gt;     &lt;action application=&quot;set&quot; data=&quot;open=true&quot; inline=&quot;true&quot;/&gt;<br>
&gt;  &lt;/condition&gt;<br>
&gt;<br>
&gt;  &lt;condition wday=&quot;1,7&quot; time-of-day=&quot;05:00-23:59&quot; break=&quot;never&quot;&gt;<br>
&gt;     &lt;action application=&quot;set&quot; data=&quot;open=true&quot; inline=&quot;true&quot;/&gt;<br>
&gt;  &lt;/condition&gt;<br>
&gt;<br>
&gt; The dialplan parser logged this:<br>
&gt;<br>
&gt;<br>
&gt; Dialplan: sofia/external/<a href="mailto:Unknown@72.37.252.18">Unknown@72.37.252.18</a> Regex (FAIL)<br>
&gt; [emergency_set_variables] ${caller_id_name}(Unknown) =~ /^Emerg_/<br>
&gt; break=never<br>
&gt; Dialplan: sofia/external/<a href="mailto:Unknown@72.37.252.18">Unknown@72.37.252.18</a> Date/TimeMatch (FAIL)<br>
&gt; [emergency_set_variables] break=never<br>
&gt; Dialplan: sofia/external/<a href="mailto:Unknown@72.37.252.18">Unknown@72.37.252.18</a> Date/Time Match (PASS)<br>
&gt; [emergency_set_variables] break=never<br>
&gt; Dialplan: sofia/external/<a href="mailto:Unknown@72.37.252.18">Unknown@72.37.252.18</a> Action set(open=true) INLINE<br>
&gt; EXECUTE sofia/external/<a href="mailto:Unknown@72.37.252.18">Unknown@72.37.252.18</a> set(open=true)<br>
&gt;<br>
&gt; Note: I added the color so that you could see which dialplan lines<br>
&gt; correspond to the log output.<br>
&gt;<br>
&gt; The first condition (purple) fails. ({$caller_id_name} has the value<br>
&gt; &quot;Unknown&quot; which fails the regex test against /^Emerg_/) However, since you<br>
&gt; have break=&quot;never&quot;, the parser continues on to the next condition inside<br>
&gt; this extension. Had you done break=&quot;on-false&quot; (or no break attribute) then<br>
&gt; the parser would have moved on to the next extension in the dialplan.<br>
&gt;<br>
&gt; The second condition (orange) also fails. Again, you have break=&quot;never&quot;, so<br>
&gt; even though it fails, the parser moves on to the next condition.<br>
&gt;<br>
&gt; The third condition (green) passes, so the parser adds the &lt;action&gt; to the<br>
&gt; task list. (Since you have inline=&quot;true&quot; the action gets executed<br>
&gt; immediately during dialplan parsing instead later on during the &quot;execution<br>
&gt; phase&quot;.)<br>
&gt;<br>
&gt; In other words, the log output is exactly what I would expect it to be.<br>
&gt;<br>
&gt; As to your other question about anti-actions in a stack: this also is a<br>
&gt; common question. It looks like you are trying to do something like this:<br>
&gt;<br>
&gt; IF (cond1 AND cond2 AND cond3) THEN<br>
&gt; do actions<br>
&gt; ELSE<br>
&gt; do other actions<br>
&gt; ENDIF<br>
&gt;<br>
&gt; You cannot do this particular construct just with conditions and<br>
&gt; anti-actions. Instead you&#39;ll need the brand spanking new &quot;regex&quot; syntax<br>
&gt; mentioned here:<br>
&gt; <a href="http://wiki.freeswitch.org/wiki/Dialplan_XML#Multiple_Conditions_.28Logical_OR.2C_XOR.29" target="_blank">http://wiki.freeswitch.org/wiki/Dialplan_XML#Multiple_Conditions_.28Logical_OR.2C_XOR.29</a><br>
&gt;<br>
&gt; So, to do what you wanted to do in the second example (in your second post)<br>
&gt; you could try this:<br>
&gt;<br>
&gt; &lt;condition regex=&quot;all&quot;&gt;<br>
&gt;   &lt;regex field=&quot;${sip_gateway}&quot; expression=&quot;^${default_provider}$&quot;/&gt;<br>
&gt;   &lt;regex field=&quot;${emergency_call}&quot; expression=&quot;^true$&quot;/&gt;<br>
&gt;   &lt;regex field=&quot;${db(select/emergency/autoanswer)}&quot; expression=&quot;^1$&quot;/&gt;<br>
&gt;   &lt;!-- the following actions get executed if all regexes PASS --&gt;<br>
&gt;<br>
&gt;    &lt;action application=&quot;set&quot; data=&quot;call_timeout=60&quot;/&gt;<br>
&gt;    &lt;action application=&quot;set&quot;<br>
&gt; data=&quot;effective_caller_id_name=${regex(${caller_id_name}|^Emerg(_.*)$|Auto%1)}&quot;/&gt;<br>
&gt;    &lt;action application=&quot;set&quot; data=&quot;autoanswered=true&quot;/&gt;<br>
&gt;    &lt;action application=&quot;answer&quot; data=&quot;&quot;/&gt;<br>
&gt;    &lt;action application=&quot;set&quot;<br>
&gt; data=&quot;group_confirm_file=/usr/local/freeswitch/sounds/en/us/callie/emergency/press_to_accept.wav&quot;/&gt;<br>
&gt;    &lt;action application=&quot;set&quot; data=&quot;group_confirm_key=1&quot;/&gt;<br>
&gt;    &lt;action application=&quot;bridge&quot;<br>
&gt; data=&quot;user/1000@${domain_name},sofia/gateway/1006_7217/${mobile_number}&quot;/&gt;<br>
&gt;   &lt;!-- the following anti-actions are executed if any of the regexes FAIL<br>
&gt; --&gt;<br>
&gt;<br>
&gt;    &lt;anti-action application=&quot;set&quot;<br>
&gt; data=&quot;effective_caller_id_name=${regex(${caller_id_name}|^Emerg(_.*)$|NotAuto%1)}&quot;/&gt;<br>
&gt;    &lt;anti-action application=&quot;set&quot; data=&quot;call_timeout=30&quot;/&gt;<br>
&gt;    &lt;anti-action application=&quot;set&quot; data=&quot;autoanswered=false&quot;/&gt;<br>
&gt;    &lt;anti-action application=&quot;set&quot;<br>
&gt; data=&quot;group_confirm_file=/usr/local/freeswitch/sounds/en/us/callie/emergency/press_to_accept.wav&quot;/&gt;<br>
&gt;    &lt;anti-action application=&quot;set&quot; data=&quot;group_confirm_key=1&quot;/&gt;<br>
&gt;    &lt;anti-action application=&quot;bridge&quot;<br>
&gt; data=&quot;user/1000@${domain_name},sofia/gateway/1006_7217/${mobile_number}&quot;/&gt;<br>
&gt; &lt;/condition&gt;<br>
&gt;<br>
&gt;<br>
&gt; The &lt;condition regex=&quot;all&quot;&gt; tells the parser, &quot;Hey, execute the &lt;action&gt;&#39;s<br>
&gt; only if all regexes PASS, otherwise execute any &lt;anti-action&gt;&#39;s&quot;. That<br>
&gt; should give you what you need.<br>
&gt;<br>
&gt; Hope this helps!<br>
&gt;<br>
&gt; -Michael<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; On Sat, Jan 14, 2012 at 7:39 PM, Herman Griffin &lt;<a href="mailto:herman.griffin@gmail.com">herman.griffin@gmail.com</a>&gt;<br>
&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; Hello everyone,<br>
&gt;&gt;<br>
&gt;&gt; In irc SwK said that freeswitch AND operator is lazy. To me this means<br>
&gt;&gt; that if a condition is set to break=true and it evaluates to FAIL,<br>
&gt;&gt; then the that break=never will invert the meaning of FAIL; Change it<br>
&gt;&gt; to a PASS . But why doesn&#39;t break=false behave in this same manner<br>
&gt;&gt; when there is only a single condition?<br>
&gt;&gt;<br>
&gt;&gt; Take this call trace and dialplan for example. I use a single<br>
&gt;&gt; condition with break=false. However, unlike the stacked conditions,<br>
&gt;&gt; the action is not executed when the single condition evaluates to<br>
&gt;&gt; FAIL. Why doesn&#39;t break=never cause the action to be executed in a non<br>
&gt;&gt; stacked condition?<br>
&gt;&gt;<br>
&gt;&gt; Call trace:<br>
&gt;&gt;<br>
&gt;&gt; Dialplan: sofia/external/<a href="mailto:Unknown@72.37.252.18">Unknown@72.37.252.18</a> Regex (FAIL)<br>
&gt;&gt; [emergency_set_variables] ${caller_id_name}(Unknown) =~ /^Emerg_/<br>
&gt;&gt; break=never<br>
&gt;&gt; Dialplan: sofia/external/<a href="mailto:Unknown@72.37.252.18">Unknown@72.37.252.18</a> Date/TimeMatch (FAIL)<br>
&gt;&gt; [emergency_set_variables] break=never<br>
&gt;&gt; Dialplan: sofia/external/<a href="mailto:Unknown@72.37.252.18">Unknown@72.37.252.18</a> Date/Time Match (PASS)<br>
&gt;&gt; [emergency_set_variables] break=never<br>
&gt;&gt; Dialplan: sofia/external/<a href="mailto:Unknown@72.37.252.18">Unknown@72.37.252.18</a> Action set(open=true) INLINE<br>
&gt;&gt; EXECUTE sofia/external/<a href="mailto:Unknown@72.37.252.18">Unknown@72.37.252.18</a> set(open=true)<br>
&gt;&gt;<br>
&gt;&gt; Dialplan:<br>
&gt;&gt;<br>
&gt;&gt; &lt;condition field=&quot;${caller_id_name}&quot; expression=&quot;^Emerg_&quot; break=&quot;never&quot;&gt;<br>
&gt;&gt;    &lt;action application=&quot;set&quot; data=&quot;emergency_call=true&quot; inline=&quot;true&quot;/&gt;<br>
&gt;&gt;  &lt;/condition&gt;<br>
&gt;&gt;<br>
&gt;&gt;  &lt;condition wday=&quot;2-6&quot; time-of-day=&quot;22:00-23:59&quot; break=&quot;never&quot;&gt;<br>
&gt;&gt;     &lt;action application=&quot;set&quot; data=&quot;open=true&quot; inline=&quot;true&quot;/&gt;<br>
&gt;&gt;  &lt;/condition&gt;<br>
&gt;&gt;<br>
&gt;&gt;  &lt;condition wday=&quot;1,7&quot; time-of-day=&quot;05:00-23:59&quot; break=&quot;never&quot;&gt;<br>
&gt;&gt;     &lt;action application=&quot;set&quot; data=&quot;open=true&quot; inline=&quot;true&quot;/&gt;<br>
&gt;&gt;  &lt;/condition&gt;<br>
&gt;&gt;<br>
&gt;&gt; -------------------------------------------------<br>
&gt;&gt;<br>
&gt;&gt; I also getting confusing behavior with anti-action and stacked<br>
&gt;&gt; condition. I expect the anti-action to be executed if any of the<br>
&gt;&gt; stacked conditions evaluates to FAIL. However, in the case below, the<br>
&gt;&gt; extension simply breaks if any of the condition evaluates to FAIL.<br>
&gt;&gt;<br>
&gt;&gt; Call trace:<br>
&gt;&gt;<br>
&gt;&gt; Dialplan: sofia/external/<a href="mailto:Unknown@72.37.252.18">Unknown@72.37.252.18</a> parsing<br>
&gt;&gt; [public-&gt;emergency_bridge] continue=true<br>
&gt;&gt; Dialplan: sofia/external/<a href="mailto:Unknown@72.37.252.18">Unknown@72.37.252.18</a> Regex (PASS)<br>
&gt;&gt; [emergency_bridge] ${sip_gateway}(1006_7217) =~ /^1006_7217$/<br>
&gt;&gt; break=on-false<br>
&gt;&gt; Dialplan: sofia/external/<a href="mailto:Unknown@72.37.252.18">Unknown@72.37.252.18</a> Regex (FAIL)<br>
&gt;&gt; [emergency_bridge] ${emergency_call}() =~ /^true$/ break=on-false<br>
&gt;&gt; Dialplan: sofia/external/<a href="mailto:Unknown@72.37.252.18">Unknown@72.37.252.18</a> parsing<br>
&gt;&gt; [public-&gt;public_did] continue=false &lt;-- [[MOVES ON TO ANOTHER<br>
&gt;&gt; EXTENSION WITH EXECUTING THE anti-action]]<br>
&gt;&gt;<br>
&gt;&gt; Dialplan:<br>
&gt;&gt;<br>
&gt;&gt; &lt;condition field=&quot;${sip_gateway}&quot; expression=&quot;^${default_provider}$&quot;/&gt;<br>
&gt;&gt;    &lt;condition field=&quot;${emergency_call}&quot; expression=&quot;^true$&quot;/&gt;<br>
&gt;&gt;    &lt;condition field=&quot;${db(select/emergency/autoanswer)}&quot; expression=&quot;^1$&quot;&gt;<br>
&gt;&gt;      &lt;action application=&quot;set&quot; data=&quot;call_timeout=60&quot;/&gt;<br>
&gt;&gt;      &lt;action application=&quot;set&quot;<br>
&gt;&gt;<br>
&gt;&gt; data=&quot;effective_caller_id_name=${regex(${caller_id_name}|^Emerg(_.*)$|Auto%1)}&quot;/&gt;<br>
&gt;&gt;      &lt;action application=&quot;set&quot; data=&quot;autoanswered=true&quot;/&gt;<br>
&gt;&gt;      &lt;action application=&quot;answer&quot; data=&quot;&quot;/&gt;<br>
&gt;&gt;      &lt;action application=&quot;set&quot;<br>
&gt;&gt;<br>
&gt;&gt; data=&quot;group_confirm_file=/usr/local/freeswitch/sounds/en/us/callie/emergency/press_to_accept.wav&quot;/&gt;<br>
&gt;&gt;      &lt;action application=&quot;set&quot; data=&quot;group_confirm_key=1&quot;/&gt;<br>
&gt;&gt;      &lt;action application=&quot;bridge&quot;<br>
&gt;&gt; data=&quot;user/1000@${domain_name},sofia/gateway/1006_7217/${mobile_number}&quot;/&gt;<br>
&gt;&gt;<br>
&gt;&gt;      &lt;anti-action application=&quot;set&quot;<br>
&gt;&gt;<br>
&gt;&gt; data=&quot;effective_caller_id_name=${regex(${caller_id_name}|^Emerg(_.*)$|NotAuto%1)}&quot;/&gt;<br>
&gt;&gt;      &lt;anti-action application=&quot;set&quot; data=&quot;call_timeout=30&quot;/&gt;<br>
&gt;&gt;      &lt;anti-action application=&quot;set&quot; data=&quot;autoanswered=false&quot;/&gt;<br>
&gt;&gt;      &lt;anti-action application=&quot;set&quot;<br>
&gt;&gt;<br>
&gt;&gt; data=&quot;group_confirm_file=/usr/local/freeswitch/sounds/en/us/callie/emergency/press_to_accept.wav&quot;/&gt;<br>
&gt;&gt;      &lt;anti-action application=&quot;set&quot; data=&quot;group_confirm_key=1&quot;/&gt;<br>
&gt;&gt;      &lt;anti-action application=&quot;bridge&quot;<br>
&gt;&gt; data=&quot;user/1000@${domain_name},sofia/gateway/1006_7217/${mobile_number}&quot;/&gt;<br>
&gt;&gt;    &lt;/condition&gt;<br>
&gt;&gt;  &lt;/extension&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; SwK suggested that I use a script language, which is probably what<br>
&gt;&gt; I&#39;ll end up doing. However, I&#39;m very interested in understanding why<br>
&gt;&gt; the scenarios above. Are these bugs or are they just counter intuitive<br>
&gt;&gt; rules that we must simply memorize?<br>
&gt;&gt;<br>
&gt;&gt; Thanks for your input.<br>
&gt;&gt; Herman Griffin<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; On Sat, Jan 14, 2012 at 11:42 AM, Jeff Lenk &lt;<a href="mailto:jeff@jefflenk.com">jeff@jefflenk.com</a>&gt; wrote:<br>
&gt;&gt; &gt; By putting the break=never you are defeating the &quot;and&quot; processing.<br>
&gt;&gt; &gt; Remove<br>
&gt;&gt; &gt; that.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Move the second group into its own extension.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; --<br>
&gt;&gt; &gt; View this message in context:<br>
&gt;&gt; &gt; <a href="http://freeswitch-users.2379917.n2.nabble.com/Stacked-conditions-are-not-acting-like-logical-AND-tp7188082p7188271.html" target="_blank">http://freeswitch-users.2379917.n2.nabble.com/Stacked-conditions-are-not-acting-like-logical-AND-tp7188082p7188271.html</a><br>

&gt;&gt; &gt; Sent from the freeswitch-users mailing list archive at Nabble.com.<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
</div></div><div class="HOEnZb"><div class="h5">&gt; _________________________________________________________________________<br>
&gt; Professional FreeSWITCH Consulting Services:<br>
&gt; <a href="mailto:consulting@freeswitch.org">consulting@freeswitch.org</a><br>
&gt; <a href="http://www.freeswitchsolutions.com" target="_blank">http://www.freeswitchsolutions.com</a><br>
&gt;<br>
&gt; FreeSWITCH-powered IP PBX: The CudaTel Communication Server<br>
&gt; <a href="http://www.cudatel.com" target="_blank">http://www.cudatel.com</a><br>
&gt;<br>
&gt; Official FreeSWITCH Sites<br>
&gt; <a href="http://www.freeswitch.org" target="_blank">http://www.freeswitch.org</a><br>
&gt; <a href="http://wiki.freeswitch.org" target="_blank">http://wiki.freeswitch.org</a><br>
&gt; <a href="http://www.cluecon.com" target="_blank">http://www.cluecon.com</a><br>
&gt;<br>
&gt; FreeSWITCH-users mailing list<br>
&gt; <a href="mailto:FreeSWITCH-users@lists.freeswitch.org">FreeSWITCH-users@lists.freeswitch.org</a><br>
&gt; <a href="http://lists.freeswitch.org/mailman/listinfo/freeswitch-users" target="_blank">http://lists.freeswitch.org/mailman/listinfo/freeswitch-users</a><br>
&gt; UNSUBSCRIBE:<a href="http://lists.freeswitch.org/mailman/options/freeswitch-users" target="_blank">http://lists.freeswitch.org/mailman/options/freeswitch-users</a><br>
&gt; <a href="http://www.freeswitch.org" target="_blank">http://www.freeswitch.org</a><br>
&gt;<br>
<br>
_________________________________________________________________________<br>
Professional FreeSWITCH Consulting Services:<br>
<a href="mailto:consulting@freeswitch.org">consulting@freeswitch.org</a><br>
<a href="http://www.freeswitchsolutions.com" target="_blank">http://www.freeswitchsolutions.com</a><br>
<br>
FreeSWITCH-powered IP PBX: The CudaTel Communication Server<br>
<a href="http://www.cudatel.com" target="_blank">http://www.cudatel.com</a><br>
<br>
Official FreeSWITCH Sites<br>
<a href="http://www.freeswitch.org" target="_blank">http://www.freeswitch.org</a><br>
<a href="http://wiki.freeswitch.org" target="_blank">http://wiki.freeswitch.org</a><br>
<a href="http://www.cluecon.com" target="_blank">http://www.cluecon.com</a><br>
<br>
FreeSWITCH-users mailing list<br>
<a href="mailto:FreeSWITCH-users@lists.freeswitch.org">FreeSWITCH-users@lists.freeswitch.org</a><br>
<a href="http://lists.freeswitch.org/mailman/listinfo/freeswitch-users" target="_blank">http://lists.freeswitch.org/mailman/listinfo/freeswitch-users</a><br>
UNSUBSCRIBE:<a href="http://lists.freeswitch.org/mailman/options/freeswitch-users" target="_blank">http://lists.freeswitch.org/mailman/options/freeswitch-users</a><br>
<a href="http://www.freeswitch.org" target="_blank">http://www.freeswitch.org</a><br>
</div></div></blockquote></div><br></div></div>