@tripsnek/tmf
Version:
TypeScript Modeling Framework - A TypeScript port of the Eclipse Modeling Framework (EMF)
244 lines • 32.6 kB
JavaScript
import { BasicEList } from '../basicelist.js';
import { EAttributeImpl } from './eattribute-impl.js';
import { EClassifierImpl } from './eclassifier-impl.js';
import { EReferenceImpl } from './ereference-impl.js';
export class EClassImpl extends EClassifierImpl {
classIsAbstract = false;
classIsInterface = false;
eSuperTypes = new BasicEList();
eStructuralFeatures = new BasicEList();
eOperations = new BasicEList();
// pre-computed and cached lists
eReferences;
eAllSuperTypes;
eAllStructuralFeatures;
eAttributes;
eAllAttributes;
eAllReferences;
eAllContainments;
eAllOperations;
constructor(owner, name, abstract, isInterface) {
super(owner, name);
if (abstract)
this.classIsAbstract = abstract;
if (isInterface)
this.classIsInterface = isInterface;
}
isAbstract() {
return this.classIsAbstract;
}
isInterface() {
return this.classIsInterface;
}
setAbstract(value) {
this.classIsAbstract = value;
}
setInterface(value) {
this.classIsInterface = value;
}
getEAttributes() {
if (this.eAttributes === undefined) {
this.computeEAllAttributes();
}
return this.eAttributes;
}
getEAllAttributes() {
if (this.eAllAttributes === undefined) {
this.computeEAllAttributes();
}
return this.eAllAttributes;
}
computeEAllAttributes() {
this.eAllAttributes = new BasicEList();
this.eAttributes = new BasicEList();
// Add features from this type
const features = this.getEStructuralFeatures();
for (let i = 0; i < features.size(); i++) {
const feature = features.get(i);
if (feature instanceof EAttributeImpl) {
this.eAllAttributes.add(feature);
this.eAttributes.add(feature);
}
}
// Add features from all super types
const allSuperTypes = this.getEAllSuperTypes();
for (let i = 0; i < allSuperTypes.size(); i++) {
const superType = allSuperTypes.get(i);
const superAttributes = superType.getEAttributes();
for (let j = 0; j < superAttributes.size(); j++) {
this.eAllAttributes.add(superAttributes.get(j));
}
}
}
getEIDAttribute() {
return this.getEAllAttributes().find((e) => e.isId());
}
createInstance() {
return this.getEPackage().getEFactoryInstance().create(this);
}
isSuperTypeOf(someClass) {
if (someClass === this) {
return true;
}
else if (someClass === null) {
return false;
}
else {
return someClass.getESuperTypes().some((e) => this.isSuperTypeOf(e));
}
}
getESuperTypes() {
return this.eSuperTypes;
}
getEAllSuperTypes() {
if (this.eAllSuperTypes === undefined) {
this.computeEAllSuperTypes();
}
return this.eAllSuperTypes;
}
computeEAllSuperTypes() {
this.eAllSuperTypes = new BasicEList();
for (let i = 0; i < this.eSuperTypes.size(); i++) {
const st = this.eSuperTypes.get(i);
const allSuperTypes = st.getEAllSuperTypes();
for (let j = 0; j < allSuperTypes.size(); j++) {
this.eAllSuperTypes.add(allSuperTypes.get(j));
}
this.eAllSuperTypes.add(st);
}
}
getEStructuralFeatures() {
return this.eStructuralFeatures;
}
getEAllStructuralFeatures() {
if (this.eAllStructuralFeatures === undefined) {
this.computeAllStructuralFeatures();
}
return this.eAllStructuralFeatures;
}
computeAllStructuralFeatures() {
this.eAllStructuralFeatures = new BasicEList();
// Add features from this type
for (let i = 0; i < this.eStructuralFeatures.size(); i++) {
this.eAllStructuralFeatures.add(this.eStructuralFeatures.get(i));
}
// Add features from all super types
const superTypes = this.getESuperTypes();
for (let i = 0; i < superTypes.size(); i++) {
const superType = superTypes.get(i);
const allStructuralFeatures = superType.getEAllStructuralFeatures();
for (let j = 0; j < allStructuralFeatures.size(); j++) {
this.eAllStructuralFeatures.add(allStructuralFeatures.get(j));
}
}
}
/**
* Returns the feature identified by either it's feature ID (a number) or
* name (a string).
* @param featureIdOrName
*/
getEStructuralFeature(featureIdOrName) {
if (typeof featureIdOrName === 'number')
return this.getEAllStructuralFeatures().find((e) => e.getFeatureID() === featureIdOrName);
else
return this.getEAllStructuralFeatures().find((e) => e.getName() === featureIdOrName);
}
getFeatureCount() {
return this.getEAllStructuralFeatures().size();
}
getFeatureID(feature) {
const features = this.getEStructuralFeatures();
if (feature.getFeatureID() >= 0)
return feature.getFeatureID();
for (let i = 0; i < features.size(); i++) {
if (features.get(i) === feature) {
return i;
}
}
return -1;
}
//======================================================================
// References
getEReferences() {
if (this.eReferences === undefined) {
this.computeEAllReferences();
}
return this.eReferences;
}
getEAllReferences() {
if (this.eAllReferences === undefined) {
this.computeEAllReferences();
}
return this.eAllReferences;
}
computeEAllReferences() {
this.eAllReferences = new BasicEList();
this.eReferences = new BasicEList();
// Add features from this type
for (let i = 0; i < this.eStructuralFeatures.size(); i++) {
const feature = this.eStructuralFeatures.get(i);
if (feature instanceof EReferenceImpl) {
this.eAllReferences.add(feature);
this.eReferences.add(feature);
}
}
// Add features from all super types
const allSuperTypes = this.getEAllSuperTypes();
for (let i = 0; i < allSuperTypes.size(); i++) {
const superType = allSuperTypes.get(i);
const references = superType.getEReferences();
for (let j = 0; j < references.size(); j++) {
this.eAllReferences.add(references.get(j));
}
}
}
getEAllContainments() {
if (this.eAllContainments === undefined) {
this.computeEAllContainments();
}
return this.eAllContainments;
}
computeEAllContainments() {
this.eAllContainments = new BasicEList();
const allReferences = this.getEAllReferences();
for (let i = 0; i < allReferences.size(); i++) {
const f = allReferences.get(i);
if (f.isContainment()) {
this.eAllContainments.add(f);
}
}
}
//======================================================================
// Operations
getEOperations() {
return this.eOperations;
}
getEAllOperations() {
if (this.eAllOperations === undefined) {
this.computeEAllOperations();
}
return this.eAllOperations;
}
computeEAllOperations() {
this.eAllOperations = new BasicEList();
this.eAllOperations.addAll(this.getEOperations());
const allSuperTypes = this.getEAllSuperTypes();
for (let i = 0; i < allSuperTypes.size(); i++) {
const superType = allSuperTypes.get(i);
const operations = superType.getEOperations();
for (let j = 0; j < operations.size(); j++) {
this.eAllOperations.add(operations.get(j));
}
}
}
//hacky method for when a metamodel is being manipulated at runtime (e.g. in Ecore Editor)
recomputeAllLists() {
this.computeEAllSuperTypes();
this.computeAllStructuralFeatures();
this.computeEAllAttributes();
this.computeEAllReferences();
this.computeEAllContainments();
this.computeEAllOperations();
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNsYXNzLWltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21ldGFtb2RlbC9pbXBsL2VjbGFzcy1pbXBsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUtBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUc5QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXhELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV0RCxNQUFNLE9BQU8sVUFBVyxTQUFRLGVBQWU7SUFDckMsZUFBZSxHQUFHLEtBQUssQ0FBQztJQUN4QixnQkFBZ0IsR0FBRyxLQUFLLENBQUM7SUFFekIsV0FBVyxHQUFrQixJQUFJLFVBQVUsRUFBRSxDQUFDO0lBQzlDLG1CQUFtQixHQUE4QixJQUFJLFVBQVUsRUFBRSxDQUFDO0lBQ2xFLFdBQVcsR0FBc0IsSUFBSSxVQUFVLEVBQUUsQ0FBQztJQUUxRCxnQ0FBZ0M7SUFDeEIsV0FBVyxDQUFxQjtJQUNoQyxjQUFjLENBQWlCO0lBQy9CLHNCQUFzQixDQUE2QjtJQUNuRCxXQUFXLENBQXFCO0lBQ2hDLGNBQWMsQ0FBcUI7SUFDbkMsY0FBYyxDQUFxQjtJQUNuQyxnQkFBZ0IsQ0FBcUI7SUFDckMsY0FBYyxDQUFxQjtJQUUzQyxZQUNFLEtBQWdCLEVBQ2hCLElBQWEsRUFDYixRQUFrQixFQUNsQixXQUFxQjtRQUVyQixLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ25CLElBQUksUUFBUTtZQUFFLElBQUksQ0FBQyxlQUFlLEdBQUcsUUFBUSxDQUFDO1FBQzlDLElBQUksV0FBVztZQUFFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxXQUFXLENBQUM7SUFDdkQsQ0FBQztJQUVNLFVBQVU7UUFDZixPQUFPLElBQUksQ0FBQyxl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LENBQUM7SUFFTyxxQkFBcUI7UUFDM0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLFVBQVUsRUFBYyxDQUFDO1FBQ25ELElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQy9DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxhQUFhLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM5QyxNQUFNLFNBQVMsR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZDLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUM5QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQzNDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3QyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCwwRkFBMEY7SUFDbkYsaUJBQWlCO1FBQ3RCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQy9CLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVQYWNrYWdlIH0gZnJvbSAnLi4vYXBpL2VwYWNrYWdlLmpzJztcclxuaW1wb3J0IHsgRU9wZXJhdGlvbiB9IGZyb20gJy4uL2FwaS9lb3BlcmF0aW9uLmpzJztcclxuaW1wb3J0IHsgRUF0dHJpYnV0ZSB9IGZyb20gJy4uL2FwaS9lYXR0cmlidXRlLmpzJztcclxuaW1wb3J0IHsgRVJlZmVyZW5jZSB9IGZyb20gJy4uL2FwaS9lcmVmZXJlbmNlLmpzJztcclxuaW1wb3J0IHsgRVN0cnVjdHVyYWxGZWF0dXJlIH0gZnJvbSAnLi4vYXBpL2VzdHJ1Y3R1cmFsLWZlYXR1cmUuanMnO1xyXG5pbXBvcnQgeyBCYXNpY0VMaXN0IH0gZnJvbSAnLi4vYmFzaWNlbGlzdC5qcyc7XHJcbmltcG9ydCB7IEVMaXN0IH0gZnJvbSAnLi4vYXBpL2VsaXN0LmpzJztcclxuaW1wb3J0IHsgRU9iamVjdCB9IGZyb20gJy4uL2FwaS9lb2JqZWN0LmpzJztcclxuaW1wb3J0IHsgRUF0dHJpYnV0ZUltcGwgfSBmcm9tICcuL2VhdHRyaWJ1dGUtaW1wbC5qcyc7XHJcbmltcG9ydCB7IEVDbGFzc2lmaWVySW1wbCB9IGZyb20gJy4vZWNsYXNzaWZpZXItaW1wbC5qcyc7XHJcbmltcG9ydCB7IEVDbGFzcyB9IGZyb20gJy4uL2FwaS9lY2xhc3MuanMnO1xyXG5pbXBvcnQgeyBFUmVmZXJlbmNlSW1wbCB9IGZyb20gJy4vZXJlZmVyZW5jZS1pbXBsLmpzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBFQ2xhc3NJbXBsIGV4dGVuZHMgRUNsYXNzaWZpZXJJbXBsIGltcGxlbWVudHMgRUNsYXNzIHtcclxuICBwcml2YXRlIGNsYXNzSXNBYnN0cmFjdCA9IGZhbHNlO1xyXG4gIHByaXZhdGUgY2xhc3NJc0ludGVyZmFjZSA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIGVTdXBlclR5cGVzOiBFTGlzdDxFQ2xhc3M+ID0gbmV3IEJhc2ljRUxpc3QoKTtcclxuICBwcml2YXRlIGVTdHJ1Y3R1cmFsRmVhdHVyZXM6IEVMaXN0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4gPSBuZXcgQmFzaWNFTGlzdCgpO1xyXG4gIHByaXZhdGUgZU9wZXJhdGlvbnM6IEVMaXN0PEVPcGVyYXRpb24+ID0gbmV3IEJhc2ljRUxpc3QoKTtcclxuXHJcbiAgLy8gcHJlLWNvbXB1dGVkIGFuZCBjYWNoZWQgbGlzdHNcclxuICBwcml2YXRlIGVSZWZlcmVuY2VzITogRUxpc3Q8RVJlZmVyZW5jZT47XHJcbiAgcHJpdmF0ZSBlQWxsU3VwZXJUeXBlcyE6IEVMaXN0PEVDbGFzcz47XHJcbiAgcHJpdmF0ZSBlQWxsU3RydWN0dXJhbEZlYXR1cmVzITogRUxpc3Q8RVN0cnVjdHVyYWxGZWF0dXJlPjtcclxuICBwcml2YXRlIGVBdHRyaWJ1dGVzITogRUxpc3Q8RUF0dHJpYnV0ZT47XHJcbiAgcHJpdmF0ZSBlQWxsQXR0cmlidXRlcyE6IEVMaXN0PEVBdHRyaWJ1dGU+O1xyXG4gIHByaXZhdGUgZUFsbFJlZmVyZW5jZXMhOiBFTGlzdDxFUmVmZXJlbmNlPjtcclxuICBwcml2YXRlIGVBbGxDb250YWlubWVudHMhOiBFTGlzdDxFUmVmZXJlbmNlPjtcclxuICBwcml2YXRlIGVBbGxPcGVyYXRpb25zITogRUxpc3Q8RU9wZXJhdGlvbj47XHJcblxyXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcclxuICAgIG93bmVyPzogRVBhY2thZ2UsXHJcbiAgICBuYW1lPzogc3RyaW5nLFxyXG4gICAgYWJzdHJhY3Q/OiBib29sZWFuLFxyXG4gICAgaXNJbnRlcmZhY2U/OiBib29sZWFuXHJcbiAgKSB7XHJcbiAgICBzdXBlcihvd25lciwgbmFtZSk7XHJcbiAgICBpZiAoYWJzdHJhY3QpIHRoaXMuY2xhc3NJc0Fic3RyYWN0ID0gYWJzdHJhY3Q7XHJcbiAgICBpZiAoaXNJbnRlcmZhY2UpIHRoaXMuY2xhc3NJc0ludGVyZmFjZSA9IGlzSW50ZXJmYWNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzQWJzdHJhY3QoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5jbGFzc0lzQWJzdHJhY3Q7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNJbnRlcmZhY2UoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5jbGFzc0lzSW50ZXJmYWNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEFic3RyYWN0KHZhbHVlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLmNsYXNzSXNBYnN0cmFjdCA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEludGVyZmFjZSh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5jbGFzc0lzSW50ZXJmYWNlID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RUF0dHJpYnV0ZXMoKTogRUxpc3Q8RUF0dHJpYnV0ZT4ge1xyXG4gICAgaWYgKHRoaXMuZUF0dHJpYnV0ZXMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmNvbXB1dGVFQWxsQXR0cmlidXRlcygpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZUF0dHJpYnV0ZXM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RUFsbEF0dHJpYnV0ZXMoKTogRUxpc3Q8RUF0dHJpYnV0ZT4ge1xyXG4gICAgaWYgKHRoaXMuZUFsbEF0dHJpYnV0ZXMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmNvbXB1dGVFQWxsQXR0cmlidXRlcygpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZUFsbEF0dHJpYnV0ZXM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbXB1dGVFQWxsQXR0cmlidXRlcygpOiB2b2lkIHtcclxuICAgIHRoaXMuZUFsbEF0dHJpYnV0ZXMgPSBuZXcgQmFzaWNFTGlzdDxFQXR0cmlidXRlPigpO1xyXG4gICAgdGhpcy5lQXR0cmlidXRlcyA9IG5ldyBCYXNpY0VMaXN0PEVBdHRyaWJ1dGU+KCk7XHJcbiAgICAvLyBBZGQgZmVhdHVyZXMgZnJvbSB0aGlzIHR5cGVcclxuICAgIGNvbnN0IGZlYXR1cmVzID0gdGhpcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZlYXR1cmVzLnNpemUoKTsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGZlYXR1cmUgPSBmZWF0dXJlcy5nZXQoaSk7XHJcbiAgICAgIGlmIChmZWF0dXJlIGluc3RhbmNlb2YgRUF0dHJpYnV0ZUltcGwpIHtcclxuICAgICAgICB0aGlzLmVBbGxBdHRyaWJ1dGVzLmFkZChmZWF0dXJlKTtcclxuICAgICAgICB0aGlzLmVBdHRyaWJ1dGVzLmFkZChmZWF0dXJlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gQWRkIGZlYXR1cmVzIGZyb20gYWxsIHN1cGVyIHR5cGVzXHJcbiAgICBjb25zdCBhbGxTdXBlclR5cGVzID0gdGhpcy5nZXRFQWxsU3VwZXJUeXBlcygpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxTdXBlclR5cGVzLnNpemUoKTsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IHN1cGVyVHlwZSA9IGFsbFN1cGVyVHlwZXMuZ2V0KGkpO1xyXG4gICAgICBjb25zdCBzdXBlckF0dHJpYnV0ZXMgPSBzdXBlclR5cGUuZ2V0RUF0dHJpYnV0ZXMoKTtcclxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBzdXBlckF0dHJpYnV0ZXMuc2l6ZSgpOyBqKyspIHtcclxuICAgICAgICB0aGlzLmVBbGxBdHRyaWJ1dGVzLmFkZChzdXBlckF0dHJpYnV0ZXMuZ2V0KGopKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEVJREF0dHJpYnV0ZSgpOiBFQXR0cmlidXRlIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLmdldEVBbGxBdHRyaWJ1dGVzKCkuZmluZCgoZSkgPT4gZS5pc0lkKCkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNyZWF0ZUluc3RhbmNlKCk6IEVPYmplY3Qge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkuY3JlYXRlKHRoaXMgYXMgRUNsYXNzKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc1N1cGVyVHlwZU9mKHNvbWVDbGFzczogRUNsYXNzKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoc29tZUNsYXNzID09PSB0aGlzKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSBlbHNlIGlmIChzb21lQ2xhc3MgPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHNvbWVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLnNvbWUoKGUpID0+IHRoaXMuaXNTdXBlclR5cGVPZihlKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RVN1cGVyVHlwZXMoKTogRUxpc3Q8RUNsYXNzPiB7XHJcbiAgICByZXR1cm4gdGhpcy5lU3VwZXJUeXBlcztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRFQWxsU3VwZXJUeXBlcygpOiBFTGlzdDxFQ2xhc3M+IHtcclxuICAgIGlmICh0aGlzLmVBbGxTdXBlclR5cGVzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5jb21wdXRlRUFsbFN1cGVyVHlwZXMoKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmVBbGxTdXBlclR5cGVzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb21wdXRlRUFsbFN1cGVyVHlwZXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmVBbGxTdXBlclR5cGVzID0gbmV3IEJhc2ljRUxpc3Q8RUNsYXNzPigpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmVTdXBlclR5cGVzLnNpemUoKTsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IHN0ID0gdGhpcy5lU3VwZXJUeXBlcy5nZXQoaSk7XHJcbiAgICAgIGNvbnN0IGFsbFN1cGVyVHlwZXMgPSBzdC5nZXRFQWxsU3VwZXJUeXBlcygpO1xyXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGFsbFN1cGVyVHlwZXMuc2l6ZSgpOyBqKyspIHtcclxuICAgICAgICB0aGlzLmVBbGxTdXBlclR5cGVzLmFkZChhbGxTdXBlclR5cGVzLmdldChqKSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5lQWxsU3VwZXJUeXBlcy5hZGQoc3QpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKTogRUxpc3Q8RVN0cnVjdHVyYWxGZWF0dXJlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5lU3RydWN0dXJhbEZlYXR1cmVzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKTogRUxpc3Q8RVN0cnVjdHVyYWxGZWF0dXJlPiB7XHJcbiAgICBpZiAodGhpcy5lQWxsU3RydWN0dXJhbEZlYXR1cmVzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5jb21wdXRlQWxsU3RydWN0dXJhbEZlYXR1cmVzKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5lQWxsU3RydWN0dXJhbEZlYXR1cmVzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb21wdXRlQWxsU3RydWN0dXJhbEZlYXR1cmVzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5lQWxsU3RydWN0dXJhbEZlYXR1cmVzID0gbmV3IEJhc2ljRUxpc3Q8RVN0cnVjdHVyYWxGZWF0dXJlPigpO1xyXG4gICAgLy8gQWRkIGZlYXR1cmVzIGZyb20gdGhpcyB0eXBlXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZVN0cnVjdHVyYWxGZWF0dXJlcy5zaXplKCk7IGkrKykge1xyXG4gICAgICB0aGlzLmVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMuYWRkKHRoaXMuZVN0cnVjdHVyYWxGZWF0dXJlcy5nZXQoaSkpO1xyXG4gICAgfVxyXG4gICAgLy8gQWRkIGZlYXR1cmVzIGZyb20gYWxsIHN1cGVyIHR5cGVzXHJcbiAgICBjb25zdCBzdXBlclR5cGVzID0gdGhpcy5nZXRFU3VwZXJUeXBlcygpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdXBlclR5cGVzLnNpemUoKTsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IHN1cGVyVHlwZSA9IHN1cGVyVHlwZXMuZ2V0KGkpO1xyXG4gICAgICBjb25zdCBhbGxTdHJ1Y3R1cmFsRmVhdHVyZXMgPSBzdXBlclR5cGUuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpO1xyXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGFsbFN0cnVjdHVyYWxGZWF0dXJlcy5zaXplKCk7IGorKykge1xyXG4gICAgICAgIHRoaXMuZUFsbFN0cnVjdHVyYWxGZWF0dXJlcy5hZGQoYWxsU3RydWN0dXJhbEZlYXR1cmVzLmdldChqKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGZlYXR1cmUgaWRlbnRpZmllZCBieSBlaXRoZXIgaXQncyBmZWF0dXJlIElEIChhIG51bWJlcikgb3JcclxuICAgKiBuYW1lIChhIHN0cmluZykuXHJcbiAgICogQHBhcmFtIGZlYXR1cmVJZE9yTmFtZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRFU3RydWN0dXJhbEZlYXR1cmUoXHJcbiAgICBmZWF0dXJlSWRPck5hbWU6IG51bWJlciB8IHN0cmluZ1xyXG4gICk6IEVTdHJ1Y3R1cmFsRmVhdHVyZSB8IHVuZGVmaW5lZCB7XHJcbiAgICBpZiAodHlwZW9mIGZlYXR1cmVJZE9yTmFtZSA9PT0gJ251bWJlcicpXHJcbiAgICAgIHJldHVybiB0aGlzLmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5maW5kKFxyXG4gICAgICAgIChlKSA9PiBlLmdldEZlYXR1cmVJRCgpID09PSBmZWF0dXJlSWRPck5hbWVcclxuICAgICAgKTtcclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpLmZpbmQoXHJcbiAgICAgICAgKGUpID0+IGUuZ2V0TmFtZSgpID09PSBmZWF0dXJlSWRPck5hbWVcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRGZWF0dXJlQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5zaXplKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RmVhdHVyZUlEKGZlYXR1cmU6IEVTdHJ1Y3R1cmFsRmVhdHVyZSk6IG51bWJlciB7XHJcbiAgICBjb25zdCBmZWF0dXJlcyA9IHRoaXMuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpO1xyXG4gICAgaWYgKGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkgPj0gMCkgcmV0dXJuIGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZlYXR1cmVzLnNpemUoKTsgaSsrKSB7XHJcbiAgICAgIGlmIChmZWF0dXJlcy5nZXQoaSkgPT09IGZlYXR1cmUpIHtcclxuICAgICAgICByZXR1cm4gaTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIC0xO1xyXG4gIH1cclxuXHJcbiAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgLy8gUmVmZXJlbmNlc1xyXG5cclxuICBwdWJsaWMgZ2V0RVJlZmVyZW5jZXMoKTogRUxpc3Q8RVJlZmVyZW5jZT4ge1xyXG4gICAgaWYgKHRoaXMuZVJlZmVyZW5jZXMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmNvbXB1dGVFQWxsUmVmZXJlbmNlcygpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZVJlZmVyZW5jZXM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RUFsbFJlZmVyZW5jZXMoKTogRUxpc3Q8RVJlZmVyZW5jZT4ge1xyXG4gICAgaWYgKHRoaXMuZUFsbFJlZmVyZW5jZXMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmNvbXB1dGVFQWxsUmVmZXJlbmNlcygpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZUFsbFJlZmVyZW5jZXM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbXB1dGVFQWxsUmVmZXJlbmNlcygpOiB2b2lkIHtcclxuICAgIHRoaXMuZUFsbFJlZmVyZW5jZXMgPSBuZXcgQmFzaWNFTGlzdDxFUmVmZXJlbmNlPigpO1xyXG4gICAgdGhpcy5lUmVmZXJlbmNlcyA9IG5ldyBCYXNpY0VMaXN0PEVSZWZlcmVuY2U+KCk7XHJcbiAgICAvLyBBZGQgZmVhdHVyZXMgZnJvbSB0aGlzIHR5cGVcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5lU3RydWN0dXJhbEZlYXR1cmVzLnNpemUoKTsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGZlYXR1cmUgPSB0aGlzLmVTdHJ1Y3R1cmFsRmVhdHVyZXMuZ2V0KGkpO1xyXG4gICAgICBpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIEVSZWZlcmVuY2VJbXBsKSB7XHJcbiAgICAgICAgdGhpcy5lQWxsUmVmZXJlbmNlcy5hZGQoZmVhdHVyZSk7XHJcbiAgICAgICAgdGhpcy5lUmVmZXJlbmNlcy5hZGQoZmVhdHVyZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIEFkZCBmZWF0dXJlcyBmcm9tIGFsbCBzdXBlciB0eXBlc1xyXG4gICAgY29uc3QgYWxsU3VwZXJUeXBlcyA9IHRoaXMuZ2V0RUFsbFN1cGVyVHlwZXMoKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsU3VwZXJUeXBlcy5zaXplKCk7IGkrKykge1xyXG4gICAgICBjb25zdCBzdXBlclR5cGUgPSBhbGxTdXBlclR5cGVzLmdldChpKTtcclxuICAgICAgY29uc3QgcmVmZXJlbmNlcyA9IHN1cGVyVHlwZS5nZXRFUmVmZXJlbmNlcygpO1xyXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJlZmVyZW5jZXMuc2l6ZSgpOyBqKyspIHtcclxuICAgICAgICB0aGlzLmVBbGxSZWZlcmVuY2VzLmFkZChyZWZlcmVuY2VzLmdldChqKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRFQWxsQ29udGFpbm1lbnRzKCk6IEVMaXN0PEVSZWZlcmVuY2U+IHtcclxuICAgIGlmICh0aGlzLmVBbGxDb250YWlubWVudHMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmNvbXB1dGVFQWxsQ29udGFpbm1lbnRzKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5lQWxsQ29udGFpbm1lbnRzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb21wdXRlRUFsbENvbnRhaW5tZW50cygpOiB2b2lkIHtcclxuICAgIHRoaXMuZUFsbENvbnRhaW5tZW50cyA9IG5ldyBCYXNpY0VMaXN0PEVSZWZlcmVuY2U+KCk7XHJcbiAgICBjb25zdCBhbGxSZWZlcmVuY2VzID0gdGhpcy5nZXRFQWxsUmVmZXJlbmNlcygpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxSZWZlcmVuY2VzLnNpemUoKTsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGYgPSBhbGxSZWZlcmVuY2VzLmdldChpKTtcclxuICAgICAgaWYgKGYuaXNDb250YWlubWVudCgpKSB7XHJcbiAgICAgICAgdGhpcy5lQWxsQ29udGFpbm1lbnRzLmFkZChmKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgLy8gT3BlcmF0aW9uc1xyXG5cclxuICBwdWJsaWMgZ2V0RU9wZXJhdGlvbnMoKTogRUxpc3Q8RU9wZXJhdGlvbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZU9wZXJhdGlvbnM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RUFsbE9wZXJhdGlvbnMoKTogRUxpc3Q8RU9wZXJhdGlvbj4ge1xyXG4gICAgaWYgKHRoaXMuZUFsbE9wZXJhdGlvbnMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmNvbXB1dGVFQWxsT3BlcmF0aW9ucygpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZUFsbE9wZXJhdGlvbnM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbXB1dGVFQWxsT3BlcmF0aW9ucygpOiB2b2lkIHtcclxuICAgIHRoaXMuZUFsbE9wZXJhdGlvbnMgPSBuZXcgQmFzaWNFTGlzdDxFT3BlcmF0aW9uPigpO1xyXG4gICAgdGhpcy5lQWxsT3BlcmF0aW9ucy5hZGRBbGwodGhpcy5nZXRFT3BlcmF0aW9ucygpKTtcclxuICAgIGNvbnN0IGFsbFN1cGVyVHlwZXMgPSB0aGlzLmdldEVBbGxTdXBlclR5cGVzKCk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbFN1cGVyVHlwZXMuc2l6ZSgpOyBpKyspIHtcclxuICAgICAgY29uc3Qgc3VwZXJUeXBlID0gYWxsU3VwZXJUeXBlcy5nZXQoaSk7XHJcbiAgICAgIGNvbnN0IG9wZXJhdGlvbnMgPSBzdXBlclR5cGUuZ2V0RU9wZXJhdGlvbnMoKTtcclxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBvcGVyYXRpb25zLnNpemUoKTsgaisrKSB7XHJcbiAgICAgICAgdGhpcy5lQWxsT3BlcmF0aW9ucy5hZGQob3BlcmF0aW9ucy5nZXQoaikpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvL2hhY2t5IG1ldGhvZCBmb3Igd2hlbiBhIG1ldGFtb2RlbCBpcyBiZWluZyBtYW5pcHVsYXRlZCBhdCBydW50aW1lIChlLmcuIGluIEVjb3JlIEVkaXRvcilcclxuICBwdWJsaWMgcmVjb21wdXRlQWxsTGlzdHMoKXtcclxuICAgIHRoaXMuY29tcHV0ZUVBbGxTdXBlclR5cGVzKCk7XHJcbiAgICB0aGlzLmNvbXB1dGVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKTtcclxuICAgIHRoaXMuY29tcHV0ZUVBbGxBdHRyaWJ1dGVzKCk7XHJcbiAgICB0aGlzLmNvbXB1dGVFQWxsUmVmZXJlbmNlcygpO1xyXG4gICAgdGhpcy5jb21wdXRlRUFsbENvbnRhaW5tZW50cygpO1xyXG4gICAgdGhpcy5jb21wdXRlRUFsbE9wZXJhdGlvbnMoKTtcclxuICB9XHJcbn1cclxuIl19