简单的NHibernate helper类,支持同一事务的批量数据处理
今天为了处理批量数据操作写了个简单的NHibernate helper类,支持同一事务的批量数据处理.
using System;
using System.Threading;
using System.Collections;
using System.Collections.Specialized;
using Nullables;
using Nullables.NHibernate;
using NHibernate;
using NHibernate.Cfg;
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
namespace NHibernate.Utils
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 简单的NHibernate Helper类。支持同一事务内的批量数据处理。
/// </summary>
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public class NHHelper
{
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
local variables#region local variables
private NHibernate.Cfg.Configuration _cfg = null;
private ISessionFactory _sessionFactory = null;
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 用于保存线程中的数据库会话。
/// </summary>
private HybridDictionary _sessionMap;
#endregion
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
singleton pattern#region singleton pattern
private static NHHelper _theInstance = null;
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
private NHHelper()
{
this._cfg = new NHibernate.Cfg.Configuration();
this._cfg.AddAssembly( "Entities.Assembly" );
this._sessionFactory = this._cfg.BuildSessionFactory();
this._sessionMap = new HybridDictionary();
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public static NHHelper Instance
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if( NHHelper._theInstance == null )
{
NHHelper._theInstance = new NHHelper();
}
return NHHelper._theInstance;
}
}
#endregion
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
transaction relax#region transaction relax
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void BeginTransaction()
{
ISession session;
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
lock( this._sessionMap.SyncRoot )
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if( this._sessionMap[Thread.CurrentThread] != null )
{
session = (ISession)this._sessionMap[Thread.CurrentThread];
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if( session.IsOpen )
{
if( session.Transaction == null || session.Transaction.WasCommitted ||
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
session.Transaction.WasRolledBack )
{
session.BeginTransaction();
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} else
{
throw new Exception("当前不支持嵌套事务!");
}
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} else
{
session = this._sessionFactory.OpenSession();
session.BeginTransaction();
this._sessionMap[Thread.CurrentThread] = session;
}
}
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void CommitTransaction()
{
ISession session;
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
lock( this._sessionMap.SyncRoot )
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if( this._sessionMap[Thread.CurrentThread] != null )
{
session = (ISession)this._sessionMap[Thread.CurrentThread];
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if( session.IsOpen )
{
if( session.Transaction == null || session.Transaction.WasCommitted ||
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
session.Transaction.WasRolledBack )
{
throw new Exception("当前已打开的会话或没有未提交的事务!");
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} else
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
try
{
session.Transaction.Commit();
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} catch(Exception ex)
{
session.Transaction.Rollback();
throw ex;
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} finally
{
session.Close();
this._sessionMap.Remove( Thread.CurrentThread );
}
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} else
{
throw new Exception("当前已打开的会话或没有未提交的事务!");
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} else
{
throw new Exception("当前已打开的会话或没有未提交的事务!");
}
}
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void RollbackTransaction()
{
ISession session;
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
lock( this._sessionMap.SyncRoot )
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if( this._sessionMap[Thread.CurrentThread] != null )
{
session = (ISession)this._sessionMap[Thread.CurrentThread];
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if( session.IsOpen )
{
if( session.Transaction == null || session.Transaction.WasCommitted ||
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
session.Transaction.WasRolledBack )
{
throw new Exception("当前已打开的会话或没有未提交的事务!");
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} else
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
try
{
session.Transaction.Rollback();
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} catch(Exception ex)
{
throw ex;
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} finally
{
session.Close();
this._sessionMap.Remove( Thread.CurrentThread );
}
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} else
{
throw new Exception("当前已打开的会话或没有未提交的事务!");
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} else
{
throw new Exception("当前已打开的会话或没有未提交的事务!");
}
}
}
#endregion
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
public methods - CRUD#region public methods - CRUD
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void Add( object entity )
{
bool autoCommit = true;
ISession session;
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
lock( this._sessionMap.SyncRoot )
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if( this._sessionMap[Thread.CurrentThread] != null )
{
session = (ISession)this._sessionMap[Thread.CurrentThread];
if( session.Transaction == null || session.Transaction.WasCommitted ||
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
session.Transaction.WasRolledBack )
{
autoCommit = true;
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} else
{
autoCommit = false;
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} else
{
session = this._sessionFactory.OpenSession();
session.BeginTransaction();
}
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
try
{
session.Save( entity );
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if( autoCommit )
{
session.Transaction.Commit();
session.Close();
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} catch (Exception ex)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
try
{
session.Transaction.Rollback();
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} catch
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} finally
{
session.Close();
}
throw ex;
}
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void Update( object entity, object key )
{
bool autoCommit = true;
ISession session;
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
lock( this._sessionMap.SyncRoot )
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if( this._sessionMap[Thread.CurrentThread] != null )
{
session = (ISession)this._sessionMap[Thread.CurrentThread];
if( session.Transaction == null || session.Transaction.WasCommitted ||
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
session.Transaction.WasRolledBack )
{
autoCommit = true;
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} else
{
autoCommit = false;
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} else
{
session = this._sessionFactory.OpenSession();
session.BeginTransaction();
}
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
try
{
session.Update( entity, key );
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if( autoCommit )
{
session.Transaction.Commit();
session.Close();
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} catch (Exception ex)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
try
{
session.Transaction.Rollback();
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} catch
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} finally
{
session.Close();
}
throw ex;
}
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void Delete( object entity )
{
bool autoCommit = true;
ISession session;
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
lock( this._sessionMap.SyncRoot )
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if( this._sessionMap[Thread.CurrentThread] != null )
{
session = (ISession)this._sessionMap[Thread.CurrentThread];
if( session.Transaction == null || session.Transaction.WasCommitted ||
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
session.Transaction.WasRolledBack )
{
autoCommit = true;
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} else
{
autoCommit = false;
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} else
{
session = this._sessionFactory.OpenSession();
session.BeginTransaction();
}
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
try
{
session.Delete( entity );
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if( autoCommit )
{
session.Transaction.Commit();
session.Close();
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} catch (Exception ex)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
try
{
session.Transaction.Rollback();
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} catch
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} finally
{
session.Close();
}
throw ex;
}
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void Save( object entity )
{
bool autoCommit = true;
ISession session;
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
lock( this._sessionMap.SyncRoot )
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if( this._sessionMap[Thread.CurrentThread] != null )
{
session = (ISession)this._sessionMap[Thread.CurrentThread];
if( session.Transaction == null || session.Transaction.WasCommitted ||
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
session.Transaction.WasRolledBack )
{
autoCommit = true;
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} else
{
autoCommit = false;
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} else
{
session = this._sessionFactory.OpenSession();
session.BeginTransaction();
}
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
try
{
session.SaveOrUpdate( entity );
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if( autoCommit )
{
session.Transaction.Commit();
session.Close();
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} catch (Exception ex)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
try
{
session.Transaction.Rollback();
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} catch
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} finally
{
session.Close();
}
throw ex;
}
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void Save( IList entities )
{
this.BeginTransaction();
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
try
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
foreach( object entity in entities )
{
this.Save(entity);
}
this.CommitTransaction();
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} catch (Exception ex)
{
this.RollbackTransaction();
throw ex;
}
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void Save( params object[] entities )
{
this.BeginTransaction();
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
try
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
foreach( object entity in entities )
{
this.Save(entity);
}
this.CommitTransaction();
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} catch (Exception ex)
{
this.RollbackTransaction();
throw ex;
}
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public object Get( Type entityType, object id )
{
object entity = null;
bool closeSession = true;
ISession session;
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
lock( this._sessionMap.SyncRoot )
{
if( this._sessionMap[Thread.CurrentThread] != null &&
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
((ISession)this._sessionMap[Thread.CurrentThread]).IsOpen )
{
session = (ISession)this._sessionMap[Thread.CurrentThread];
closeSession = false;
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} else
{
session = this._sessionFactory.OpenSession();
closeSession = true;
}
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
try
{
entity = session.Get( entityType, id );
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} catch(Exception ex)
{
closeSession = true;
throw ex;
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} finally
{
if( closeSession ) session.Close();
}
return entity;
}
#endregion
}
}
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)