diff --git a/xfa/fgas/crt/fgas_utils.h b/xfa/fgas/crt/fgas_utils.h
index ab94f6e..24224a0 100644
--- a/xfa/fgas/crt/fgas_utils.h
+++ b/xfa/fgas/crt/fgas_utils.h
@@ -12,9 +12,6 @@
 
 class FX_BASEARRAYDATA;
 
-template <class baseType>
-class CFX_CPLTree;
-
 class CFX_BaseArray : public CFX_Target {
  protected:
   CFX_BaseArray(int32_t iGrowSize, int32_t iBlockSize);
@@ -496,243 +493,4 @@
   }
 };
 
-template <class baseType>
-class CFX_CPLTreeNode : public CFX_Target {
- public:
-  typedef CFX_CPLTreeNode<baseType> CPLTreeNode;
-  CFX_CPLTreeNode()
-      : m_pParentNode(NULL),
-        m_pChildNode(NULL),
-        m_pPrevNode(NULL),
-        m_pNextNode(NULL),
-        m_Data() {}
-  enum TreeNode {
-    Root = 0,
-    Parent,
-    FirstSibling,
-    PreviousSibling,
-    NextSibling,
-    LastSibling,
-    FirstNeighbor,
-    PreviousNeighbor,
-    NextNeighbor,
-    LastNeighbor,
-    FirstChild,
-    LastChild
-  };
-  CPLTreeNode* GetNode(TreeNode eNode) const {
-    switch (eNode) {
-      case Root: {
-        CPLTreeNode* pParent = (CPLTreeNode*)this;
-        CPLTreeNode* pTemp;
-        while ((pTemp = pParent->m_pParentNode) != NULL) {
-          pParent = pTemp;
-        }
-        return pParent;
-      }
-      case Parent:
-        return m_pParentNode;
-      case FirstSibling: {
-        CPLTreeNode* pNode = (CPLTreeNode*)this;
-        CPLTreeNode* pTemp;
-        while ((pTemp = pNode->m_pPrevNode) != NULL) {
-          pNode = pTemp;
-        }
-        return pNode == (CPLTreeNode*)this ? NULL : pNode;
-      }
-      case PreviousSibling:
-        return m_pPrevNode;
-      case NextSibling:
-        return m_pNextNode;
-      case LastSibling: {
-        CPLTreeNode* pNode = (CPLTreeNode*)this;
-        CPLTreeNode* pTemp;
-        while ((pTemp = pNode->m_pNextNode) != NULL) {
-          pNode = pTemp;
-        }
-        return pNode == (CPLTreeNode*)this ? NULL : pNode;
-      }
-      case FirstNeighbor: {
-        CPLTreeNode* pParent = (CPLTreeNode*)this;
-        CPLTreeNode* pTemp;
-        while ((pTemp = pParent->m_pParentNode) != NULL) {
-          pParent = pTemp;
-        }
-        return pParent == (CPLTreeNode*)this ? NULL : pParent;
-      }
-      case PreviousNeighbor: {
-        if (m_pPrevNode == NULL) {
-          return m_pParentNode;
-        }
-        CPLTreeNode* pNode = m_pPrevNode;
-        CPLTreeNode* pTemp;
-        while ((pTemp = pNode->m_pChildNode) != NULL) {
-          pNode = pTemp;
-          while ((pTemp = pNode->m_pNextNode) != NULL) {
-            pNode = pTemp;
-          }
-        }
-        return pNode;
-      }
-      case NextNeighbor: {
-        if (m_pChildNode != NULL) {
-          return m_pChildNode;
-        }
-        if (m_pNextNode != NULL) {
-          return m_pNextNode;
-        }
-        CPLTreeNode* pNode = m_pParentNode;
-        while (pNode != NULL) {
-          if (pNode->m_pNextNode != NULL) {
-            return pNode->m_pNextNode;
-          }
-          pNode = pNode->m_pParentNode;
-        }
-        return NULL;
-      }
-      case LastNeighbor: {
-        CPLTreeNode* pNode = (CPLTreeNode*)this;
-        CPLTreeNode* pTemp;
-        while ((pTemp = pNode->m_pParentNode) != NULL) {
-          pNode = pTemp;
-        }
-        while (TRUE) {
-          CPLTreeNode* pTemp;
-          while ((pTemp = pNode->m_pNextNode) != NULL) {
-            pNode = pTemp;
-          }
-          if (pNode->m_pChildNode == NULL) {
-            break;
-          }
-          pNode = pNode->m_pChildNode;
-        }
-        return pNode == (CPLTreeNode*)this ? NULL : pNode;
-      }
-      case FirstChild:
-        return m_pChildNode;
-      case LastChild: {
-        if (m_pChildNode == NULL) {
-          return NULL;
-        }
-        CPLTreeNode* pChild = m_pChildNode;
-        CPLTreeNode* pTemp;
-        while ((pTemp = pChild->m_pNextNode) != NULL) {
-          pChild = pTemp;
-        }
-        return pChild;
-      }
-      default:
-        break;
-    }
-    return NULL;
-  }
-  void SetParentNode(CPLTreeNode* pNode) { m_pParentNode = pNode; }
-  int32_t CountChildNodes() const {
-    int32_t iCount = 0;
-    CPLTreeNode* pNode = m_pChildNode;
-    while (pNode) {
-      iCount++;
-      pNode = pNode->m_pNextNode;
-    }
-    return iCount;
-  }
-  CPLTreeNode* GetChildNode(int32_t iIndex) const {
-    int32_t iCount = 0;
-    CPLTreeNode* pNode = m_pChildNode;
-    while (pNode) {
-      if (iIndex == iCount) {
-        return pNode;
-      }
-      iCount++;
-      pNode = pNode->m_pNextNode;
-    }
-    return NULL;
-  }
-  int32_t GetNodeIndex() const {
-    int32_t index = 0;
-    CPLTreeNode* pNode = m_pPrevNode;
-    while (pNode != NULL) {
-      index++;
-      pNode = pNode->m_pPrevNode;
-    }
-    return index;
-  }
-  FX_BOOL IsParentNode(const CPLTreeNode* pNode) const {
-    CPLTreeNode* pParent = m_pParentNode;
-    while (pParent != NULL) {
-      if (pParent == pNode) {
-        return TRUE;
-      }
-      pParent = pParent->GetTreeNode(Parent);
-    }
-    return FALSE;
-  }
-  FX_BOOL IsChildNode(const CPLTreeNode* pNode) const {
-    if (pNode == NULL) {
-      return FALSE;
-    }
-    return pNode->IsParentNode((const CPLTreeNode*)this);
-  }
-  void SetChildNode(CPLTreeNode* pNode) { m_pChildNode = pNode; }
-  void SetPrevNode(CPLTreeNode* pNode) { m_pPrevNode = pNode; }
-  void SetNextNode(CPLTreeNode* pNode) { m_pNextNode = pNode; }
-  int32_t GetNodeLevel() const {
-    int32_t iLevel = 0;
-    CPLTreeNode* pNode = (CPLTreeNode*)this;
-    while ((pNode = pNode->m_pParentNode) != NULL) {
-      iLevel++;
-    }
-    return iLevel;
-  }
-  bool IsRootNode() const { return !m_pParentNode; }
-  baseType GetData() const { return m_Data; }
-  void SetData(baseType data) { m_Data = data; }
-
- protected:
-  CPLTreeNode* m_pParentNode;
-  CPLTreeNode* m_pChildNode;
-  CPLTreeNode* m_pPrevNode;
-  CPLTreeNode* m_pNextNode;
-  baseType m_Data;
-  friend class CFX_CPLTree<baseType>;
-};
-
-template <class baseType>
-class CFX_CPLTree {
- public:
-  typedef CFX_CPLTreeNode<baseType> CPLTreeNode;
-  CFX_CPLTree() : m_Root() {}
-  ~CFX_CPLTree() {
-    CPLTreeNode* pNode = m_Root.GetNode(CPLTreeNode::LastNeighbor);
-    while (pNode != NULL) {
-      if (pNode->IsRootNode()) {
-        break;
-      }
-      CPLTreeNode* pTemp = pNode->GetNode(CPLTreeNode::PreviousNeighbor);
-      delete pNode;
-      pNode = pTemp;
-    }
-  }
-  CPLTreeNode* GetRoot() { return &m_Root; }
-  CPLTreeNode* AddChild(baseType data, CPLTreeNode* pParent = NULL) {
-    if (pParent == NULL) {
-      pParent = &m_Root;
-    }
-    CPLTreeNode* pChild = new CPLTreeNode;
-    pChild->SetParentNode(pParent);
-    pChild->SetData(data);
-    if (pParent->m_pChildNode == NULL) {
-      pParent->m_pChildNode = pChild;
-    } else {
-      CPLTreeNode* pLast = pParent->GetNode(CPLTreeNode::LastChild);
-      pChild->SetPrevNode(pLast);
-      pLast->SetNextNode(pChild);
-    }
-    return pChild;
-  }
-
- protected:
-  CPLTreeNode m_Root;
-};
-
 #endif  // XFA_FGAS_CRT_FGAS_UTILS_H_
